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

Create Azure Key Vault backed secret scope in Databricks with AAD Token

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

says I cannot do AAD passthrough mounting with a Service Principal, which means I have to use OAuth2 authentication. For which, I need an Azure Key Vault backed secret scope in Databricks. The Terraform documentation 说我只能使用基于用户的身份验证来执行此操作,而不能使用我的服务主体。

所以我想也许我可以实施黑客攻击:在 Terraform 中创建一个 Databricks PAT(同样,始终作为服务主体),然后使用 Terraform external 资源“shell out”到 Databricks CLI,使用此 PAT 进行身份验证。我手动尝试了这个并得到了这个错误:

{
  "error_code": "INVALID_PARAMETER_VALUE",
  "message": "Scope with Azure KeyVault must have userAADToken defined!"
}

按理说,PAT是为Service Principal创建的。但是,作为替代方案, 建议使用 Azure AD 令牌身份验证,而不是 PAT。所以在那个兔子洞里,我走了!

我可以在 Microsoft's documentation 之后获取 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

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

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``

我的第一个问题是:我的 hack 是否有效?如果是,AAD 令牌身份验证哪里出错了?如果它不起作用,我的最终目标是否可能,或者我是否必须 运行 多个 Terraform 部署——每个都有自己的状态——分阶段,在不同的 AAD 身份(服务主体和常规用户)?

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

这是实施 end-to-end Azure Databricks 工作区自动配置的主要障碍之一