【问题标题】:Databricks API 2.0 - Can't create KEYVAULT secrets scopes using SPN credentialsDatabricks API 2.0 - 无法使用 SPN 凭据创建 KEYVAULT 机密范围
【发布时间】:2020-11-18 12:44:25
【问题描述】:

我想通过 Databricks REST API 2.0 创建一个 Secret Scope。

当我使用 SPN 进行 az login 时,运行请求 /api/2.0/secrets/scopes/create 时出现下一个错误

{"error_code":"CUSTOMER_UNAUTHORIZED","message":"Unable to grant read/list permission to Databricks service principal to KeyVault 'https://dtbrcks-kvxxx.vault.azure.net/': key not found: https://management.core.windows.net/"}% 

但是当我使用用户登录时,相同的代码运行良好!

SPN 和用户对 Databricks(所有者/管理员)和 Keyvault(所有者)资源具有相同的权限。

使用 SPN 进行此操作需要什么?

为了获取访问令牌,我使用命令

az login --service-principal

access_token=$(az account get-access-token \
                   --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
                   --query "accessToken" \
                   --output tsv)

下一个使用 Azure Keyvault 创建 Secret Scope 的代码:

curl -X POST \-H "Authorization: Bearer $access_token" \
-H 'Content-Type: application/json' \
-d '{"scope":"keyvault-scope","scope_backend_type":"AZURE_KEYVAULT","backend_azure_keyvault":{"resource_id":"/subscriptions/$subid/resourceGroups/$rg/providers/Microsoft.KeyVault/vaults/$kvname","dns_name":"$kv_url"}}' \
"$dtbrcks_url/api/2.0/secrets/scopes/create"

【问题讨论】:

    标签: azure-devops azure-active-directory azure-keyvault azure-databricks


    【解决方案1】:

    如果您的服务主体是databricks 工作区的Owner,并且满足以下任一条件,

    调用 API 时,您必须为 Azure 资源管理终结点提供 X-Databricks-Azure-Workspace-Resource-Id 标头和管理访问令牌。

    要获取管理访问令牌,只需将resource 更改为https://management.core.windows.net

    management_access_token=$(az account get-access-token \
                       --resource 'https://management.core.windows.net' \
                       --query "accessToken" \
                       --output tsv)
    

    然后像link这样在请求中传递它。

    curl -X POST \-H "Authorization: Bearer $access_token" \
    -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \
    -H 'Content-Type: application/json' \
    -d '{"scope":"keyvault-scope","scope_backend_type":"AZURE_KEYVAULT","backend_azure_keyvault":{"resource_id":"/subscriptions/$subid/resourceGroups/$rg/providers/Microsoft.KeyVault/vaults/$kvname","dns_name":"$kv_url"}}' \
    "$dtbrcks_url/api/2.0/secrets/scopes/create"
    

    或者您可以使用Non-admin user login,在此登录之前,服务主体必须作为admin user login 的一部分或使用Add service principal 端点添加到工作区,然后您可以直接use the AAD token to call the API

    【讨论】:

    • 当我使用 X-Databricks-Azure-SP-Management-Token 时它不起作用。此外,SPN 已经注册为 Databricks 管理员用户并拥有个人令牌。当我尝试使用个人令牌时,我得到了下一个有趣的 api 响应:{"error_code":"INVALID_PARAMETER_VALUE","message":"Scope with Azure KeyVault must have userAADToken defined!"}。这意味着我只能使用 userAADToken !!! - 为什么?
    • 当我使用 X-Databricks-Azure-SP-Management-Token 时,它不适用于错误 {"error_code":"INTERNAL_ERROR","message":"Internal error happened while granting read/list permission to Databricks service principal to KeyVault: https://dtbrcks-kvxxx.vault.azure.net/"}
    • @SergeyElchinskiy 您是否将X-Databricks-Azure-SP-Management-Token 与 AAD 令牌一起使用?
    • 是的,我使用管理令牌和来自 SPN 的 AAD 令牌,但它失败了。但是如果我使用带有 AAD 用户凭据的 az login 并运行相同的命令 - 它正在工作!!!
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2020-12-17
    • 2022-12-18
    相关资源
    最近更新 更多