祕密管理
有時候存取資料需要您透過 JDBC 向外部資料源進行驗證。 與其直接在筆記本中輸入您的認證,您可以使用 Azure Databricks 秘密來儲存您的認證,並在筆記本和作業中參考它們。 本文提供 Azure Databricks 秘密的概觀。
秘密概觀
若要設定及使用秘密,請:
- 建立秘密範圍。 秘密範圍是名稱所識別的秘密集合。
- 將秘密新增至範圍
- 指派秘密範圍的許可權。
- 使用 Databricks 公用程式存取秘密,請參閱 秘密公用程式 (dbutils.secrets) 。
如需如何在工作流程中使用秘密的端對端範例,請參閱 教學課程:建立和使用 Databricks 秘密。 若要在Spark組態屬性或環境變數中使用秘密,請參閱 在Spark組態屬性或環境變數中使用秘密。
警告
系統管理員、祕密建立者和獲授與權限的使用者可以讀取 Azure Databricks 祕密。 雖然 Databricks 會努力編輯可能顯示在筆記本中的秘密值,但無法防止這類使用者讀取秘密。 請參閱 秘密修訂。
管理秘密範圍
秘密範圍是名稱所識別的秘密集合。 Databricks 建議將秘密範圍與角色或應用程式對齊,而不是個人。
秘密範圍有兩種類型:
- Azure 金鑰保存庫 支援:您可以使用 Azure 金鑰保存庫 支援的秘密範圍來參考儲存在 Azure 金鑰保存庫 中的秘密。 Azure 金鑰保存庫 支援的秘密範圍是 金鑰保存庫 的只讀介面。 您必須在 Azure 中管理 Azure 金鑰保存庫 支援的秘密範圍中的秘密。
- Databricks 支援:D atabricks 支援的秘密範圍會儲存在 Azure Databricks 所擁有和管理的加密資料庫中。
建立秘密範圍之後,您可以指派許可權,授與使用者讀取、寫入及管理 Scret 範圍的存取權。
建立 Azure 金鑰保存庫 支援的秘密範圍
本節說明如何使用 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 Databricks 的 Azure 金鑰保存庫實例
登入 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
increateScope
必須使用大寫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 CLI
databricks 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 CLI
當您在 Databricks 支援的範圍內建立秘密時,您可以使用下列三種方式之一來指定秘密值:
- 使用 –string-value 旗標將值指定為字串。
- 以互動方式提示時輸入秘密(單行秘密)。
- 使用標準輸入傳遞秘密(多行秘密)。
例如:
databricks secrets put-secret --json '{
"scope": "<scope-name>",
"key": "<key-name>",
"string_value": "<secret>"
}'
如果您要建立多行密碼,您可以使用標準輸入來傳遞秘密。 例如:
(cat << EOF
this
is
a
multi
line
secret
EOF
) | 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>")
讀取秘密
若要讀取筆記本或作業中的秘密,您必須使用 Secrets 公用程式 (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 許可權。 這可讓範圍建立者讀取範圍中的秘密、將秘密寫入範圍,以及管理範圍的許可權。
注意
秘密 ACL 位於範圍層級。 如果您使用 Azure 金鑰保存庫 支援的範圍,則授與範圍存取權的使用者可以存取 Azure 金鑰保存庫 中的所有秘密。 若要限制存取,請使用個別的 Azure 金鑰保存庫實例。
本節說明如何使用 Databricks CLI (0.205 版和更新版本) 來管理秘密訪問控制。 您也可以使用 秘密 API。 如需秘密許可權等級,請參閱 秘密 ACL
給用戶授予秘密範圍的權限
若要使用 Databricks CLI 為用戶授予機密範圍的權限:
databricks secrets put-acl <scope-name> <principal> <permission>
對已套用許可權的主體提出放置要求會覆寫現有的許可權等級。
欄位 principal
會指定現有的 Azure Databricks 主體。 使用者會使用其電子郵件位址、使用其 applicationId
值的服務主體,以及使用其組名的群組來指定。 如需詳細資訊,請參閱 主體。
檢視秘密範圍許可權
若要檢視指定秘密範圍的所有秘密範圍許可權:
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()
來修訂讀取的所有秘密值。 在筆記本資料格輸出中顯示時,秘密值會被替換為 [REDACTED]
。
例如,如果您使用 dbutils.secrets.get()
將變數設定為秘密值,然後列印該變數,則該變數會取代為 [REDACTED]
。
警告
筆記本數據格輸出的秘密修訂僅適用於常值。 秘密修訂功能不會防止秘密常值的刻意和任意轉換。 若要確保正確控制秘密,您應該使用 存取控制清單 來限制執行命令的許可權。 這可防止未經授權的共享筆記本內容存取。