为服务主体获取 Azure AD 令牌

本文介绍在 Azure Active Directory (Azure AD) 中定义的服务主体如何还可以充当在 Azure Databricks 中强制执行身份验证和授权策略的主体。 Azure Databricks 工作区中的服务主体可以有不同于常规用户(用户主体)的精细访问控制。

服务主体充当客户端角色,并使用 OAuth 2.0 客户端凭据流来授权访问 Azure Databricks 资源。

可以使用 Databricks 适用于工作区的 SCIM API 2.0(服务主体)API 管理服务主体,也可以从 Azure 门户中使用以下过程。

还可以使用 Microsoft 身份验证库 (MSAL) 以编程方式为用户获取 Azure AD 访问令牌,而不是服务主体。 请参阅使用 MSAL 为用户获取 Azure AD 令牌

在 Azure 门户中预配服务主体

  1. 登录 Azure 门户

    注意

    要使用的门户根据 Azure AD 应用程序是在 Azure 公有云中运行还是在国家云或主权云中运行而异。 有关详细信息,请参阅国家云

  2. 如果有权访问多个租户、订阅或目录,请单击顶部菜单中的“目录 + 订阅”(目录包含筛选器)图标,以切换到要预配服务主体的目录。

  3. 搜索并选择“Azure Active Directory” 。

  4. 在“管理”中,单击“应用注册”>“新建注册”。

  5. 对于“名称”,请输入应用程序的名称。

  6. 在“支持的帐户类型”部分中,选择“仅组织目录中的帐户(单一租户)”。

  7. 单击“注册”。

  8. 在“管理”中,单击“证书和机密”。

  9. 在“客户端密码”选项卡上,单击“新建客户端密码” 。

    新建客户端机密

  10. 在“添加客户端机密”窗格中的“说明”,输入客户端机密的说明。

  11. 对于“过期”,选择客户端机密的过期时间段,然后单击“添加”。

  12. 复制客户端密码的“值”并将其存储在安全位置,因为此客户端密码是应用程序的密码。

  13. 在应用程序页的“概述”页上的“概要”部分中,复制以下值:

    • 应用程序(客户端) ID
    • 目录(租户)ID

    关于 Azure 已注册的应用的概述

使用 Azure CLI 预配服务主体

请参阅使用 Azure CLI 创建 Azure 服务主体

使用 Microsoft 标识平台 REST API 获取 Azure AD 访问令牌

如果要使用服务主体访问 Databricks REST API,需要获取然后使用服务主体的 Azure AD 访问令牌。 有关详细信息,请参阅第一种情况:使用共享密钥访问令牌请求

提示

有关如何获取 Azure AD 访问令牌的详细分步说明,请参阅 Azure Databricks 自动化的服务主体

还可以使用 Azure CLI 获取 Azure AD 访问令牌。 请参阅使用 Azure CLI 获取 Azure AD 访问令牌

  1. 收集以下信息:

    参数 说明
    租户 ID 在 Azure AD 中注册的应用程序的目录(客户端)ID。
    客户端 ID 在 Azure AD 中注册的应用程序的“应用程序(客户端)ID”。
    客户端机密 Azure AD 中注册的应用程序的客户端密码的值。
  2. 使用上述信息以及 curl 获取 Azure AD 访问令牌。

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \
    -d 'client_id=<client-id>' \
    -d 'grant_type=client_credentials' \
    -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
    -d 'client_secret=<client-secret>'
    

    将:

    • <tenant-id> 替换为已注册应用程序的租户 ID。
    • <client-id> 与已注册应用程序的客户端 ID。
    • <client-secret> 与已注册应用程序的客户端密码值。

    不要更改 scope 参数的值。 它表示 Azure Databricks 的编程 ID(2ff814a6-3304-4ab8-85cb-cd0e6f879c1d),以及默认作用域(/.default,URL 编码为 %2f.default)。

    例如:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/token \
    -d 'client_id=12a34b56-789c-0d12-e3fa-b456789c0123' \
    -d 'grant_type=client_credentials' \
    -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
    -d 'client_secret=abc1D~Ef...2ghIJKlM3'
    

    Azure AD 访问令牌位于调用输出中的 access_token 值中。

使用 Azure CLI 获取 Azure AD 访问令牌

如果要使用服务主体访问 Databricks REST API,需要获取然后使用服务主体的 Azure AD 访问令牌。

  1. 收集以下信息:

    参数 说明
    租户 ID 在 Azure AD 中注册的应用程序的目录(客户端)ID。
    客户端 ID 在 Azure AD 中注册的应用程序的“应用程序(客户端)ID”。
    客户端机密 Azure AD 中注册的应用程序的客户端密码的值。
  2. 使用 Azure CLI 运行 az login 命令登录到 Azure。 使用 --service-principal 选项,同时指定已在 Azure AD 中注册的应用程序的租户 ID(“目录(租户) ID”)、客户端 ID(“应用程序(客户端) ID”)和客户端机密(“值”)的参数值。 使用 --output 选项以便以不同的格式显示命令的输出(本例中的格式为表而不是 JSON),从而更便于阅读。

    az login \
    --service-principal \
    --tenant <Tenant-ID>
    --username <Client-ID> \
    --password <Client-secret> \
    --output table
    
  3. 确认已登录到 Azure AD 服务主体的、要为其创建 Azure AD 访问令牌的正确订阅。 为此,请在 az login 命令的输出中,查看 IsDefault 设置为 True 的表行。 订阅的 Name 表示当前订阅。 另请参阅在 Azure 门户中获取订阅和租户 ID

    如果需要切换到其他订阅,请运行 az account set 命令。 使用 --name--subscription 选项指定所需的订阅名称或 ID。 可以通过在工作区导航栏中单击“Azure 门户”并查看 Resource ID: /subscriptions/00000000-0000-0000-0000-000000000000 来获取 Azure Databricks 工作区的订阅 ID,其中的 00000000-0000-0000-0000-000000000000 即是订阅 ID。

    az account set --name "<subscription-name>"
    
    # Or ...
    
    az account set --subscription <subscription-id>
    

    如果显示了以下消息,则表示登录到了错误的租户:The subscription of '<subscription-id>' doesn't exist in cloud 'AzureCloud'. 若要登录到正确的租户,必须再次运行 az login 命令,并使用 --tenant 选项指定正确的租户 ID。 可以通过运行命令 curl -v <per-workspace-URL>/aad/auth 并查看输出 < location: https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000 来获取 Azure Databricks 工作区的租户 ID,其中的 00000000-0000-0000-0000-000000000000 即是租户 ID。 另请参阅在 Azure 门户中获取订阅和租户 ID

    az login --tenant <tenant-id> --output table
    
  4. 通过运行 az account get-access-token 命令为已登录的 Azure AD 服务主体生成 Azure AD 访问令牌。 使用 --resource 选项指定 Azure Databricks 服务的唯一资源 ID,即 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d。 可以使用 --query--output 选项以便仅在命令的输出中显示 Azure AD 令牌的值。

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

使用服务主体 Azure AD 访问令牌访问 Databricks REST API

使用服务主体和 Azure AD 访问令牌访问 Databricks REST API 的方法取决于服务主体是否添加到目标 Azure Databricks 工作区,以及服务主体是否具有对工作区的管理员访问权限。

对作为 Azure Databricks 工作区用户和管理员的服务主体的 API 访问

若要完成此过程,必须先使用添加服务主体终结点将服务主体添加到 Azure Databricks 工作区,例如:

curl -X POST \
-H 'Authorization: Bearer <access-token>' \
https://adb-1234567890123456.7.azuredatabricks.net/api/2.0/preview/scim/v2/ServicePrincipals \
-H 'Content-type: application/scim+json' \
-d @create-service-principal.json

create-service-principal.json:

{
  "displayName": "My Service Principal",
  "applicationId": "12a34b56-789c-0d12-e3fa-b456789c0123",
  "entitlements": [
    {
      "value": "allow-cluster-create"
    }
  ],
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:ServicePrincipal"
  ],
  "active": true
}

如果以下任一情况成立,请直接跳到非工作区用户的服务主体的 API 访问

  • 不希望将服务主体添加到 Azure Databricks 工作区。
  • 服务主体已添加到 Azure Databricks 工作区;但是,要调用的 Databricks REST API 需要管理员访问权限,并且服务主体当前没有对工作区的管理员访问权限。
  1. 收集以下信息。

    参数 说明
    Azure AD 访问令牌 使用 Microsoft 标识平台 REST API 获取 Azure AD 访问令牌使用 Azure CLI 获取 Azure AD 访问令牌中的请求返回的 Azure AD 访问令牌。
  2. 使用 Azure AD 访问令牌与 curl,调用 Databricks REST API。 例如:

    curl -X GET \
    -H 'Authorization: Bearer <access-token>' \
    https://<databricks-instance>/api/2.0/clusters/list
    

    将:

    • <access-token> 与 Azure AD 访问令牌。
    • <databricks-instance> 与 Azure Databricks 部署的每个工作区 URL
    • GET/api/2.0/clusters/list(具有目标 Databricks REST API 的相应 HTTP 操作和终结点)。

    例如:

    curl -X GET \
    -H 'Authorization: Bearer <access-token>' \
    https://adb-1234567890123456.7.azuredatabricks.net/api/2.0/clusters/list
    

对非工作区用户的服务主体的 API 访问

如果以下任一情况成立,请执行此过程:

  • 服务主体尚未使用添加服务主体终结点添加到目标 Azure Databricks 工作区。
  • 服务主体已添加到 Azure Databricks 工作区;但是,要调用的 Databricks REST API 需要管理员访问权限,并且服务主体当前没有对工作区的管理员访问权限。

否则,请跳回对作为 Azure Databricks 工作区用户和管理员的服务主体的 API 访问

  1. 确保为服务主体分配了 Azure 中目标工作区资源的“参与者”或“所有者”角色。 请参阅使用 Azure 门户分配 Azure 角色。 若要访问此资源,请参阅开放资源。 若要打开目标资源,可以在 Azure 中搜索 Azure Databricks 服务类型以及 Azure 中有关目标 Azure Databricks 工作区的任何其他信息。

  2. 收集以下信息:

    参数 说明
    租户 ID Azure 门户预配服务主体中 Azure AD 中注册的应用程序的目录(租户) ID
    客户端 ID 在 Azure AD 中注册的应用程序的“应用程序(客户端)ID”。
    客户端机密 Azure 门户预配服务主体中创建的 Azure AD 中注册的应用程序的客户端密码的
    Azure AD 访问令牌 使用 Microsoft 标识平台 REST API 获取 Azure AD 访问令牌使用 Azure CLI 获取 Azure AD 访问令牌中的请求返回的 Azure AD 访问令牌。
    订阅 ID 与目标 Azure Databricks 工作区关联的 Azure 订阅的 ID(而不是名称)。 若要获取此信息和以下信息,请参阅开放资源。 若要打开目标资源,可以在 Azure 中搜索 Azure Databricks 服务类型以及 Azure 中有关目标 Azure Databricks 工作区的任何其他信息。
    资源组名称 与目标 Azure Databricks 工作区关联的 Azure 资源组的名称。
    工作区名称 目标 Azure Databricks 工作区在 Azure 中的名称。
  3. 使用上述某些信息与 curl,获取 Azure AD 管理终结点访问令牌。

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/<tenant-id>/oauth2/token \
    -d 'client_id=<client-id>' \
    -d 'grant_type=client_credentials' \
    -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \
    -d 'client_secret=<client-secret>'
    

    将:

    • <tenant-id> 替换为已注册应用程序的租户 ID。
    • <client-id> 与已注册应用程序的客户端 ID。
    • <client-secret> 与已注册应用程序的客户端密码值。

    不要更改 resource 参数的值。 它表示 Azure AD 管理终结点(https://management.core.windows.net/,URL 编码为 https%3A%2F%2Fmanagement.core.windows.net%2F)。

    例如:

    curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
    https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/token \
    -d 'client_id=12a34b56-789c-0d12-e3fa-b456789c0123' \
    -d 'grant_type=client_credentials' \
    -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \
    -d 'client_secret=abc1D~Ef...2ghIJKlM3'
    

    Azure AD 管理终结点访问令牌位于调用输出中的 access_token 值中。

  4. 使用 Azure AD 管理终结点访问令牌、上述其余信息与 curl,调用 Databricks REST API,例如:

    curl -X GET \
    -H 'Authorization: Bearer <access-token>' \
    -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \
    -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \
    https://<databricks-instance>/api/2.0/clusters/list
    

    将:

    • <access-token> 与 Azure AD 访问令牌。
    • <management-access-token> 与 Azure AD 管理终结点访问令牌。
    • <subscription-id> 与目标 Azure Databricks 工作区关联的订阅 ID。
    • <resource-group-name> 与目标 Azure Databricks 工作区关联的资源组的名称。
    • <workspace-name> 与目标 Azure Databricks 工作区的名称。
    • <databricks-instance> 与 Azure Databricks 部署的每个工作区 URL
    • GET/api/2.0/clusters/list(具有目标 Databricks REST API 的相应 HTTP 操作和终结点)。

    例如:

    curl -X GET \
    -H 'Authorization:Bearer <access-token>' \
    -H 'X-Databricks-Azure-SP-Management-Token: abC1dE...ghIj23kl' \
    -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/12a345...bcd6789e/resourceGroups/my-resource-group/providers/Microsoft.Databricks/workspaces/my-workspace' \
    https://adb-1234567890123456.7.azuredatabricks.net/api/2.0/clusters/list