透過 JDBC 存取外部資料源時,通常需要驗證。 與其直接在筆記本中輸入認證,不如使用 Databricks Secrets 安全地儲存認證,然後在筆記本和作業中參考這些認證。 此方法可增強安全性並簡化認證管理。 此頁面提供 Databricks 秘密的概觀。
Databricks 建議使用 Unity 目錄來設定雲端記憶體中數據的存取權。 請參閱
使用 Unity Catalog 連接到雲端物件存儲
。
若要設定及使用秘密,請:
建立秘密範圍。 秘密範圍是名稱所識別的秘密集合。
將秘密新增至範圍
設定機密範圍的權限。
參考程序代碼中的秘密。
如需如何在工作流程中使用秘密的端對端範例,請參閱
教學課程:建立和使用 Databricks 秘密
。 若要在Spark組態屬性或環境變數中使用秘密,請參閱
在Spark組態屬性或環境變數
中使用秘密。
已授與許可權的工作區管理員、機密創建者和使用者可以存取及讀取 Databricks 機密。 雖然 Databricks 嘗試在筆記本輸出中修訂秘密值,但無法完全防止這些用戶檢視秘密內容。 請務必小心指派秘密訪問許可權,以保護敏感性資訊。
管理秘密範圍
秘密範圍是名稱所識別的秘密集合。 Databricks 建議將秘密範圍與角色或應用程式對齊,而不是個人。
秘密範圍有兩種類型:
Azure 金鑰保存庫 支援
:您可以使用 Azure 金鑰保存庫 支援的秘密範圍來參考儲存在 Azure 金鑰保存庫
中的
秘密。 Azure 金鑰保存庫 支援的秘密範圍是 金鑰保存庫 的只讀介面。 您必須在 Azure 中管理由 Azure 金鑰保管庫支援的秘密範圍。
Databricks 支援
:由 Databricks 支援的秘密範疇會儲存在 Azure Databricks 所擁有和管理的加密資料庫中。
建立秘密範圍之後,您可以指派許可權,授與使用者讀取、寫入及管理秘密範圍的許可權。
建立使用 Azure Key Vault 支援的秘密範圍
本節說明如何使用 Azure 入口網站 和 Azure Databricks 工作區 UI 來建立 Azure 金鑰保存庫 支援的秘密範圍。 您也可以使用
Databricks CLI
建立 Azure 金鑰保存庫 支援的秘密範圍。
您必須有 Azure 金鑰保存庫實例。 如果您沒有金鑰保存庫實例,請遵循使用 Azure 入口網站
建立 金鑰保存庫 中的
指示。
您必須在想要用來支援秘密範圍的 Azure 鑰匙庫實例上擁有 鑰匙庫貢獻者、貢獻者或擁有者角色。
建立以 Azure 金鑰庫支援的秘密範疇,需要在 Azure 金鑰庫實例上具有協作者或擁有者角色,先前即使已授予 Azure Databricks 服務金鑰庫的存取權也是如此。
如果密鑰保存庫存在於與 Azure Databricks 工作區不同的租使用者中,則建立秘密範圍的 Azure AD 用戶必須具有在密鑰保存庫租使用者中
建立服務主體的許可權
。 否則,會發生下列錯誤:
Unable to grant read/list permission to Databricks service principal to KeyVault 'https://xxxxx.vault.azure.net/': Status code 403, {"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."},"requestId":"XXXXX","date":"YYYY-MM-DDTHH:MM:SS"}}
登入 Azure 入口網站,尋找並選取 Azure 金鑰保存庫實例。
在 設定 中,點選存取組態索引標籤。
將 權限模型 設定為 Vault 存取原則。
建立由 Azure Key Vault 支援的機密範圍角色時,將會透過金鑰保存庫存取政策,為 Azure Databricks 服務的應用程式 ID 授予 讀取 和 列表 的許可權。 Azure Databricks 不支援 Azure 角色型訪問控制許可權模型。
在 [設定]下,選取 [網路]。
在 防火牆和虛擬網路中, 設定 [允許從: 存取] [允許來自特定虛擬網路和 IP 位址的公用存取。
在 例外狀況 底下,勾選 允許信任的 Microsoft 服務略過此防火牆。
您也可以將 允許存取來源: 設定為 允許來自所有網路的公用存取。
建立以 Azure Key Vault 作為支援的機密範圍
移至 https://<databricks-instance>#secrets/createScope
。 將 <databricks-instance>
替換為 Azure Databricks 部署的工作區 URL。 此 URL 區分大小寫。 例如, scope
in createScope
必須使用大寫 S
。
在 [管理主體] 選取 [Creator] 或 [所有工作區使用者],以指定哪些使用者具有秘密範圍的管理許可權。
MANAGE 許可權允許使用者在該範圍內讀取、寫入及授予許可權。 您的帳戶必須有 進階方案 ,才能選擇 [建立者]。
輸入 DNS 名稱 (例如https://databrickskv.vault.azure.net/
) 和資源識別碼,例如:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/databricks-rg/providers/Microsoft.KeyVault/vaults/databricksKV
這些屬性可從您 Azure 入口網站 中 Azure 金鑰保存庫 的 [設定>屬性] 索引標籤取得。
按一下 [建立]。
使用 Databricks CLIdatabricks secrets list-scopes
命令來確認已成功建立範圍。
建立 Databricks 支援的機密範圍
本節說明如何使用 Databricks CLI #0.205 版和更新版本建立秘密範圍。 您也可以使用 秘密 API。
秘密範圍名稱:
工作區內必須是唯一的。
必須包含英數位元、破折號、底線、 @
和句號,且不能超過 128 個字元。
不區分大小寫。
秘密範圍名稱會視為非敏感性,而且可由工作區中的所有用戶讀取。
若要使用 Databricks CLI 建立範圍:
databricks secrets create-scope <scope-name>
根據預設,系統會使用建立範圍之使用者的 MANAGE 許可權來建立範圍。 建立 Databricks 支援的秘密範圍之後,您可以將秘密新增至其中。
列出秘密範圍
若要使用 CLI 列出工作區中的現有範圍:
databricks secrets list-scopes
您也可以使用 秘密 API列出秘密範圍。
刪除秘密範圍
刪除祕密範圍會刪除應用於該範圍的所有祕密和 ACL 的設定。 若要使用 CLI 刪除範圍,請執行下列命令:
databricks secrets delete-scope <scope-name>
您也可以使用 秘密 API 刪除秘密範圍。
秘密是金鑰/值組,會使用秘密範圍內唯一的金鑰名稱來儲存機密數據。
本節說明如何使用 Databricks CLI #0.205 版和更新版本建立秘密範圍。 您也可以使用 秘密 API。 秘密名稱不區分大小寫。
建立秘密的方法取決於您使用的是 Azure 金鑰保存庫 支援的範圍或 Databricks 支援的範圍。
在 Azure 金鑰保存庫 支援的範圍內建立秘密
若要在 Azure Key Vault 中建立秘密,請使用 Azure 入口網站或 Azure 設定秘密 REST API。 如需範例,請參閱步驟 4:將客戶端密碼新增至 Azure 金鑰保存庫。
在 Databricks 支援的範圍內建立密鑰
本節說明如何使用 Databricks CLI(0.205 版和更新版本)或在筆記本中使用適用於 Python 的Databricks SDK 建立秘密。 您也可以使用 秘密 API。 秘密名稱不區分大小寫。
Databricks 命令行介面
當您在 Databricks 支援的範圍內建立秘密時,您可以使用下列三種方式之一來指定秘密值:
使用 –string-value 旗標將值指定為字串。
在互動提示時輸入密碼(單行密碼輸入)。
使用標準輸入傳遞秘密(多行秘密)。
databricks secrets put-secret --json '{
"scope": "<scope-name>",
"key": "<key-name>",
"string_value": "<secret>"
如果您要建立多行密碼,您可以使用標準輸入來傳遞秘密。 例如:
(cat << EOF
multi
secret
) | databricks secrets put-secret <scope-name> <key-name>
適用於 Python 的 Databricks SDK
from databricks.sdk import WorkspaceClient
w = WorkspaceClient()
w.secrets.put_secret("<secret_scope>","<key-name>",string_value ="<secret>")
本節說明如何使用 Databricks CLI (0.205 版和更新版本)或使用 Secrets 公用程式 (dbutils.secrets) 在筆記本中讀取秘密。
Databricks 命令行介面
若要使用 Databricks CLI 讀取秘密的值,您必須將base64編碼的值譯碼。 您可以使用 jq
來擷取值,並將該值 base --decode
解碼:
databricks secrets get-secret <scope-name> <key-name> | jq -r .value | base64 --decode
秘密工具程式 (dbutils.secrets)
password = dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>")
若要列出指定範圍中的秘密:
databricks secrets list-secrets <scope-name>
回應會顯示秘密的相關元數據資訊,例如秘密的金鑰名稱。 您可以使用筆記本或作業中的 Secrets 公用程式 (dbutils.secrets) 來列出此元數據。 例如:
dbutils.secrets.list('my-scope')
若要使用 Databricks CLI 從一個範圍內刪除機密,請遵循以下步驟:
databricks secrets delete-secret <scope-name> <key-name>
您也可以使用 秘密 API。
若要從 Azure 金鑰保存庫 所支援的範圍中刪除秘密,請使用 Azure SetSecret REST API 或 Azure 入口網站 UI。
管理秘密範圍許可權
根據預設,建立秘密範圍的使用者會被授與 MANAGE 許可權。 這可讓範圍建立者讀取範圍中的秘密、將秘密寫入範圍,以及管理範圍的許可權。
在範圍層級的 ACLs(存取控制列表)屬於機密。 如果您使用 Azure 金鑰保存庫 支援的範圍,則授與範圍存取權的使用者可以存取 Azure 金鑰保存庫 中的所有秘密。 若要限制存取,請使用個別的 Azure 金鑰保存庫實例。
本節說明如何使用 Databricks CLI (0.205 版和更新版本) 來管理秘密訪問控制。 您也可以使用 秘密 API。 如需秘密許可權等級,請參閱 秘密 ACL
給用戶授予秘密範圍的權限
若要使用 Databricks CLI 為用戶授予機密範圍的權限:
databricks secrets put-acl <scope-name> <principal> <permission>
對於已套用許可權的主體提出 PUT 請求會覆寫現有的許可權等級。
欄位 principal
會指定現有的 Azure Databricks 主體。 指定使用者時,使用其電子郵件地址;當指定服務主體時,使用其 applicationId
值;指定群組時,則使用其組名。 如需更多資訊,請參閱 Principal。
檢視秘密範圍許可權
若要檢視指定秘密範圍的所有許可權:
databricks secrets list-acls <scope-name>
若要取得套用至指定機密範疇之主體的機密範疇許可權:
databricks secrets get-acl <scope-name> <principal>
如果指定的主體和範圍沒有 ACL,則此要求會失敗。
刪除秘密範圍許可權
若要刪除套用至指定秘密範圍中某個主體的許可權:
databricks secrets delete-acl <scope-name> <principal>
將認證儲存為 Azure Databricks 秘密可讓您在執行筆記本和作業時輕鬆地保護您的認證。 不過,很容易不經意地將秘密送出到標準輸出緩衝區,或在變數指派期間顯示其值。
為避免這種情況,Azure Databricks 會隱藏使用 dbutils.secrets.get()
讀取並在 Spark 組態屬性中參考的所有秘密值。 顯示時,秘密值會取代為 [REDACTED]
。
例如,如果您使用 dbutils.secrets.get()
將變數設定為秘密值,然後列印該變數,則該變數會取代為 [REDACTED]
。
修訂僅適用於字面上的秘密值。 秘密遮蔽功能無法防止對秘密字面值的刻意和隨意轉換。 若要確保正確控制秘密,您應該使用 存取控制清單 來限制執行命令的許可權。 這可防止未經授權的共享筆記本內容存取。
SQL 中的秘密修訂
Azure Databricks 會嘗試隱藏所有叫用秘密函式的 SQL DQL(數據查詢語言)命令,包括所引用的檢視和使用者定義函式。 使用 函 secret
式時,輸出會盡可能取代為 [REDACTED]
。 如同筆記本編輯,這只適用於文字值,不適用於已轉換或間接參考的秘密。
針對 SQL DML(資料操作語言)命令,如果秘密被認為是安全的,Azure Databricks 允許查閱,例如,當秘密被包裝在諸如 sha()
或 aes_encrypt()
這類的加密函式中時,可以防止未加密的原始值被儲存。
SQL 中的秘密驗證
Azure Databricks 也會套用驗證來封鎖可能導致未加密的秘密儲存至數據表的 SQL DML 命令。 查詢分析器會嘗試識別並防止這些案例,這有助於避免以純文本意外儲存敏感性資訊。