当前位置: 首页 > 知识库问答 >
问题:

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

欧阳山
2023-03-14

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

这个回答说我不能使用服务主体进行AAD passthrough挂载,这意味着我必须使用OAuth2身份验证。为此,我需要一个Azure密钥库支持的Databricks秘密范围。Terraform文档说我只能用基于用户的认证来做这件事,而不能用我的服务主体。

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

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

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

我可以按照微软的文档获取 Azure AD 令牌,然后使用它来对数据砖 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命令(例如< code > data bricks tokens list )来返回预期的结果。然而,现在当我试图创建secret范围时,它给出了一个完全不同的错误:

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

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

共有1个答案

魏彦
2023-03-14

是的,您不能使用为服务主体颁发的AAD令牌来做到这一点——它只能与真实用户的AAD令牌一起工作。众所周知,Azure的局限性是有据可查的,希望将来能得到解决。

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

 类似资料:
  • 问题: > 已装入ADLS gen2容器,将服务主体机密用作Azure Key Vault支持的机密作用域中的机密。一切都很好,可以访问数据。 删除了AAD中服务主体的机密,添加了新的、更新的Azure密钥库机密(添加了新版本,禁用了旧机密)。一切都很好,可以访问数据。 重新启动的集群。无法访问挂载点,错误: 卸载/安装使用相同的配置帮助。 有没有办法刷新用于装载点的秘密,我可以将其添加到init

  • 因此,我尝试在浏览器上使用oauth使用者密钥、密钥、访问令牌和令牌密钥对rest客户端进行API调用,其工作正常,如下所示。 请告知如何在Java中实现这一点? http://imgur.com/AtYVLH5 所有oauth都显示了整个过程,但在第一次保存密钥和令牌后,如何进行API调用是个问题。 提前感谢

  • 问题内容: 我正在使用Apache Oltu框架实现OAuth 2.0提供程序服务器,以寻找有关如何在Java中生成访问令牌和秘密令牌的想法。请指教。 问题答案: OAuth 2.0 规范并未说明如何生成令牌和秘密令牌。因此,由您决定是使用一些现有的/锚定数据来生成令牌,还是要使用随机序列来生成令牌。唯一的区别是,如果您使用大概已知的数据(例如,用户数据,例如用户名,创建日期等),则可以在需要时随

  • 我有一个Android应用程序,用户必须登录才能使用它,当一个请求(在PHP中)需要一个令牌时,问题是,我需要将令牌保存在Android的共享首选项中,我知道有办法加密它,但是如果有人会打开应用程序,看到源代码,他们会知道它是如何加密的。 如何安全保存令牌? 提前感谢。

  • 我们有一个基于ASP.NET网络应用编程接口项目。NET Core 2.2,我们通过open id使用不记名令牌进行身份验证。 实际上,我只能使用postman创建一个承载令牌,其中我可以定义一个x-www-form-urlencoded正文,其中包含用户名和密码等授权属性。 我已经在启动类中的 swaggergen 选项中添加了一个安全定义: 但我仍然必须通过邮递员创建持有者令牌。如何通过 Sw

  • 我成功地实现了在terraform中创建敏感资源的流程,在任何时候都不会透露敏感细节是什么,因此在我们的github repo中不会以纯文本存储。我让TF创建一个服务帐户,它与SA密钥相关,然后创建一个引用SA密钥输出的GCP密钥。 我现在想看看是否有任何方法可以对一些预定义的数据库密码执行相同的操作。流量会略有不同: 手动创建GCP secret(在secrets manager中),该密码的值