使用 AAD 令牌在 Databricks 中创建 Azure Key Vault 支持的秘密范围

Xop*_*ter 8 azure azure-active-directory azure-keyvault azure-databricks databricks-cli

我的最终目标是将 ADLS gen2 容器安装到我的 Databricks 工作区中,作为在 Azure 服务主体的支持下由 Terraform 管理的部署的一部分。这是一个单一部署,它创建所有 Azure 资源(网络、防火墙、存储帐户、Databricks 工作区等),然后使用 Databricks Terraform 提供程序配置 Databricks 工作区。

这个答案说我无法使用服务主体进行 AAD 直通安装,这意味着我必须使用 OAuth2 身份验证。为此,我需要 Databricks 中的 Azure Key Vault 支持的秘密范围。Terraform 文档说我只能通过基于用户的身份验证来做到这一点,而不能通过我的服务主体来做到这一点。

所以我想也许我可以实现一个 hack:在 Terraform 中创建一个 Databricks PAT(同样,始终作为服务主体),然后使用 Terraform 资源external“外壳”到 Databricks CLI,使用此 PAT 进行身份验证。我手动尝试了此操作并收到此错误:

{
  "error_code": "INVALID_PARAMETER_VALUE",
  "message": "Scope with Azure KeyVault must have userAADToken defined!"
}
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为 PAT 是为服务主体创建的。但是,作为替代方案,此答案建议使用 Azure AD 令牌身份验证,而不是 PAT。所以,我就从那个兔子洞里走下去!

我可以按照Microsoft 的文档获取 Azure AD 令牌,然后使用它对 Databricks CLI 进行身份验证:

export ARM_TENANT_ID="..."
export ARM_CLIENT_ID="..."
export ARM_CLIENT_SECRET="..."

export DATABRICKS_AAD_TOKEN="$(curl -X POST \
                                    -H 'Content-Type: application/x-www-form-urlencoded' \
                                    -d "client_id=${ARM_CLIENT_ID}" \
                                    -d 'grant_type=client_credentials' \
                                    -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
                                    -d "client_secret=${ARM_CLIENT_SECRET}" \
                                    https://login.microsoftonline.com/${ARM_TENANT_ID}/oauth2/v2.0/token \
                             | jq -r .access_token)"

databricks configure --aad-token --host https://my-databricks-host.com
Run Code Online (Sandbox Code Playgroud)

此身份验证有效:我可以运行各种 CLI 命令(例如,databricks tokens list)来返回预期结果。但是,现在当我尝试创建秘密范围时,它给了我一个完全不同的错误:

databricks secrets create-scope --scope "test" \
                                --scope-backend-type AZURE_KEYVAULT \
                                --resource-id "/subscriptions/my/key/vault/resource/id" \
                                --dns-name "https://my-vault-name.vault.azure.net/"

Error: Your authentication information may be incorrect. Please reconfigure with ``dbfs configure``
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是:我的黑客技术还能发挥作用吗?如果是,我的 AAD 令牌身份验证哪里出了问题?如果它不起作用,我的最终目标是否可能实现,或者我是否必须在不同的 AAD 身份(服务主体和普通用户)下分阶段运行多个 Terraform 部署(每个部署都有自己的状态)?

Ale*_*Ott 10

2023 年 5 月更新:现在可以使用服务主体在 Azure KeyVault 之上创建秘密范围。

\n

是的,您可以\xe2\x80\x99t 使用为服务主体颁发的 AAD 令牌来执行此操作 - 它仅适用于真实用户的 AAD 令牌。它\xe2\x80\x99 是 Azure 众所周知且有据可查的限制,希望将来能得到修复。

\n

这是实现 Azure Databricks 工作区端到端自动化预配的主要障碍之一

\n

  • 我强烈建议通过解决方案架构师、客户主管或 Azure 支持进行升级 (2认同)