祕密管理
有時候存取資料需要您透過 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 金鑰保存庫實例。
在 [設定] 底下,按兩下 [存取組態] 索引標籤。
將許可權模型設定為保存庫存取原則。
注意
建立 Azure 金鑰保存庫 支援的秘密範圍角色,會使用密鑰保存庫存取原則,將取得和列出許可權授與 Azure Databricks 服務的應用程式識別碼。 Azure Databricks 不支援 Azure 角色型訪問控制許可權模型。
在 [設定] 底下,選取 [網路]。
在 [防火牆和虛擬網络] 中,將 [允許從:存取] 設為 [允許來自特定虛擬網络和IP 位址的公用存取]。
在 [例外狀況] 底下,核取 [允許信任 Microsoft 服務 略過此防火牆。
注意
您也可以將 [允許從: 存取] 設定為 [允許來自所有網络的公用存取]。
建立 Azure Key Vault 支援的秘密範圍
移至
https://<databricks-instance>#secrets/createScope
。 將<databricks-instance>
替換為 Azure Databricks 部署的工作區 URL。 此 URL 區分大小寫。 例如,scope
increateScope
必須使用大寫S
。輸入秘密範圍的名稱。 秘密範圍名稱不區分大小寫。
在 [管理主體 ] 中,選取 [ 建立者 ] 或 [所有工作區使用者 ],以指定哪些使用者具有秘密範圍的 MANAGE 許可權。
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 中建立秘密 金鑰保存庫 請使用 Azure 入口網站 或 Azure Set Secret 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]
。
警告
筆記本數據格輸出的秘密修訂僅適用於常值。 秘密修訂功能不會防止秘密常值的刻意和任意轉換。 若要確保正確控制秘密,您應該使用 訪問控制清單 來限制執行命令的許可權。 這可防止未經授權的共享筆記本內容存取。