教程:使用 Linux VM/VMSS 访问 Azure 资源

Azure 资源的托管标识是 Microsoft Entra ID 的一项功能。 支持 Azure 资源的托管标识的每个 Azure 服务都受其自己的时间线限制。 在开始之前,请务必查看资源的托管标识的可用性状态以及已知问题

先决条件

使用 Linux VM 系统分配的托管标识访问 Azure 存储

本教程介绍如何使用 Linux 虚拟机 (VM) 的系统分配托管标识访问 Azure 存储。

将了解如何执行以下操作:

  • 创建存储帐户
  • 在存储帐户中创建 Blob 容器
  • 向 Linux VM 的托管标识授予对 Azure 存储容器的访问权限
  • 获取访问令牌并使用它来调用 Azure 存储

创建存储帐户

首先创建存储帐户。

  1. 选择 Azure 门户左上角的“+ 创建资源”按钮。

  2. 单击“存储”,然后单击“存储帐户 - Blob、文件、表、队列”。

  3. 在“名称”下,输入存储帐户的名称。

  4. “部署模型”和“帐户类型”应分别设置为“资源管理器”和“存储(常规用途 v1)”。

  5. 确保“订阅”和“资源组”与上一步中创建 VM 时指定的名称匹配。

  6. 选择创建

    屏幕截图显示了新存储帐户创建屏幕。

创建 blob 容器,并将文件上传到存储帐户

文件需要 blob 存储,因此你需要创建用于存储文件的 blob 容器。 然后将文件上传到新存储帐户中的 blob 容器。

  1. 导航到新创建的存储帐户。

  2. 选择“Blob 服务”,然后选择“容器”。

  3. 选择页面顶部的“+ 容器”。

  4. 选择“新建容器”,然后输入容器的名称。

  5. 确保“公共访问级别”为默认值。

    屏幕截图显示了存储容器创建屏幕。

  6. 使用你选择的编辑器,在本地计算机上创建一个标题为 hello world.txt 的文件。 打开该文件并添加文本“Hello world!”,然后保存它。

  7. 选择容器名称,然后选择“上传”。 这会将文件上传到新创建的容器。

  8. 在“上传 Blob”窗格的“文件”部分中,选择文件夹图标并浏览到本地计算机上的文件 hello_world.txt。

  9. 选择该文件,然后选择“上传”。

    显示上传文本文件部分的屏幕截图。

向 VM 授予对 Azure 存储容器的访问权限

可以使用 VM 的托管标识检索 Azure 存储 blob 中的数据。 Azure 资源的托管标识可以用来对支持 Microsoft Entra 身份验证的资源进行身份验证。 通过向包含存储帐户的资源组范围中的托管标识分配 storage-blob-data-reader 角色来授予访问权限。

有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

有关可用于授予存储权限的各种角色的信息,请查看使用 Microsoft Entra ID 对 Blob 和队列授予访问权限

获取访问令牌并使用它来调用 Azure 存储

Azure 存储原生支持 Microsoft Entra 身份验证,因此可以直接接受使用托管标识获取的访问令牌。 在某种程度上,这是将 Azure 存储与 Microsoft Entra ID 集成,不同于在连接字符串中提供凭据。

若要完成以下步骤,需在此前创建的 VM 中工作,并且需要一个可以连接到它的 SSH 客户端。

如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

  1. 在 Azure 门户中,导航到“虚拟机”,转到 Linux 虚拟机,然后在“概述”页中选择“连接”。 复制用于连接到 VM 的字符串。

  2. 使用所选的 SSH 客户端连接 到 VM。

  3. 在终端窗口中,使用 CURL 向本地托管标识终结点提出请求,以获取 Azure 存储的访问令牌。

    curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F' -H Metadata:true
    
  4. 使用访问令牌访问 Azure 存储。 例如,若要读取之前上传到容器的示例文件的内容,请将 <STORAGE ACCOUNT><CONTAINER NAME><FILE NAME> 的值替换为之前指定的值,并将 <ACCESS TOKEN> 的值替换为上一步中返回的令牌。

    curl https://<STORAGE ACCOUNT>.blob.core.chinacloudapi.cn/<CONTAINER NAME>/<FILE NAME> -H "x-ms-version: 2017-11-09" -H "Authorization: Bearer <ACCESS TOKEN>"
    

    响应包含文件内容:

    Hello world! :)
    

最后,还可以将令牌存储在变量中,并将其传递给第二个命令,如下所示:

# Run the first curl command and capture its output in a variable
access_token=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F' -H Metadata:true | jq -r '.access_token')

# Run the second curl command with the access token
curl "https://<STORAGE ACCOUNT>.blob.core.chinacloudapi.cn/<CONTAINER NAME>/<FILE NAME>" \
  -H "x-ms-version: 2017-11-09" \
  -H "Authorization: Bearer $access_token"

使用 Linux VM 系统分配的托管标识通过 SAS 凭据访问 Azure 存储

本教程介绍了如何使用系统分配的托管标识为 Linux 虚拟机 (VM) 获取存储共享访问签名 (SAS) 凭据,具体来说是服务 SAS 凭据

注意

本教程中生成的 SAS 密钥不会受 VM 限制/绑定到 VM。

服务 SAS 可授予有限的访问权限,允许在不公开帐户访问密钥的情况下访问存储帐户中的对象。 授予的访问权限存在时间限制,针对特定的服务。 可以像平常在执行存储操作时一样使用 SAS 凭据,例如使用存储 SDK 时。 在本教程中,你将使用 Azure 存储 CLI 上传和下载 Blob。

将了解如何执行以下操作:

  • 创建存储帐户
  • 在存储帐户中创建 Blob 容器
  • 向 VM 授予对资源管理器中的存储帐户 SAS 的访问权限
  • 使用 VM 的标识获取一个访问令牌,并使用它从资源管理器检索 SAS

创建存储帐户

如果你还没有存储帐户,则需要创建一个。 你可以选择跳过此步骤,并向 VM 的系统分配的托管标识授予对现有存储帐户密钥的访问权限。

  1. 选择 Azure 门户左上角的“+/创建新服务”按钮。

  2. 依次选择“存储”、“存储帐户”,然后“创建存储帐户”面板会出现。

  3. 输入存储帐户的“名称”。 请记住此名称,因为稍后需要它。

  4. 确保将“部署模型”设置为“资源管理器”,将“帐户类型”设置为“常规用途”。

  5. 确保“订阅”和“资源组”与你创建 VM 时指定的名称匹配。

  6. 选择“创建”以完成存储帐户的创建。

    屏幕截图显示了新存储帐户创建屏幕。

在存储帐户中创建 Blob 容器

在本教程中,稍后你会将文件上传和下载到新存储帐户。 由于文件需要 blob 存储,你需要创建用于存储文件的 blob 容器。

  1. 导航到新创建的存储帐户。

  2. 在左侧面板中,选择“Blob 服务”下的“容器”链接。

  3. 选择页面顶部的“+ 容器”,此时会显示“新建容器”面板。

  4. 为容器指定名称,选择访问级别,然后选择“确定”。 你稍后在本教程中需要用到你指定的名称。

    屏幕截图显示了存储容器创建屏幕。

授权 VM 的系统分配的托管标识使用存储 SAS

Azure 存储原生支持 Microsoft Entra 身份验证,因此你可以使用 VM 的系统分配的托管标识从资源管理器检索存储 SAS。 然后,可以使用 SAS 访问存储。

在此部分中,你将向 VM 的系统分配的托管标识授予对存储帐户 SAS 的访问权限。 向包含存储帐户的资源组的范围中的托管标识分配存储帐户参与者角色。

有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

有关可用于授予存储权限的各种角色的信息,请查看使用 Microsoft Entra ID 对 Blob 和队列授予访问权限

使用 VM 标识获取访问令牌,并使用它调用 Azure 资源管理器

在本教程的剩余部分中,你将从先前创建的 VM 进行操作。

若要完成这些步骤,需要使用 SSH 客户端。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果在配置 SSH 客户端的密钥时需要帮助,请参阅:

拥有 SSH 客户端后,请执行以下步骤:

  1. 在 Azure 门户中,导航到“虚拟机”,然后转到你的 Linux 虚拟机。
  2. 在“概述”页中,选择屏幕顶部的“连接”。
  3. 复制用于连接到 VM 的字符串。
  4. 使用 SSH 客户端连接到 VM。
  5. 输入在创建 Linux VM 时添加的密码。 然后应可以成功登录。
  6. 使用 CURL 获取 Azure 资源管理器的访问令牌。

下面是用于获取访问令牌的 CURL 请求和响应:

curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.chinacloudapi.cn%2F' -H Metadata:true    

注意

在上面的请求中,“resource”参数的值必须与 Microsoft Entra ID 预期的值完全一致。 如果使用 Azure 资源管理器资源 ID,必须在 URI 的结尾添加斜线。

在下面的响应中,为简洁起见,已缩短了 access_token 元素。

{
  "access_token":"eyJ0eXAiOiJ...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.chinacloudapi.cn",
  "token_type":"Bearer"
}

从 Azure 资源管理器中获取 SAS 凭据,以便调用存储

接下来,使用 CURL 通过上一部分中检索到的访问令牌调用资源管理器。 使用它创建存储 SAS 凭据。 获取 SAS 凭据后,便可以调用存储上传/下载操作。

对于此请求,请使用以下 HTTP 请求参数来创建 SAS 凭据:

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite.  Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

在针对 SAS 凭据的 POST 请求的正文中包含这些参数。 有关用于创建 SAS 凭据的参数的详细信息,请参阅 List Service SAS REST reference(列出服务 SAS REST 参考)。

使用以下 CURL 请求来获取 SAS 凭据。 请务必将 <SUBSCRIPTION ID><RESOURCE GROUP><STORAGE ACCOUNT NAME><CONTAINER NAME><EXPIRATION TIME> 参数值替换为你自己的值。 将 <ACCESS TOKEN> 值替换为前面检索到的访问令牌:

curl https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE ACCOUNT NAME>/listServiceSas/?api-version=2017-06-01 -X POST -d "{\"canonicalizedResource\":\"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>\",\"signedResource\":\"c\",\"signedPermission\":\"rcw\",\"signedProtocol\":\"https\",\"signedExpiry\":\"<EXPIRATION TIME>\"}" -H "Authorization: Bearer <ACCESS TOKEN>"

注意

上述 URL 中的文本区分大小写,因此如果对资源组使用了大小写格式,请务必在 URL 中相应地体现出来。 此外,必须知道这是 POST 请求,而不是 GET 请求。

CURL 响应返回 SAS 凭据:

{"serviceSasToken":"sv=2015-04-05&sr=c&spr=https&st=2017-09-22T00%3A10%3A00Z&se=2017-09-22T02%3A00%3A00Z&sp=rcw&sig=QcVwljccgWcNMbe9roAJbD8J5oEkYoq%2F0cUPlgriBn0%3D"} 

在 Linux VM 上,使用以下命令创建要上传到 Blob 存储容器的示例 Blob 文件:

echo "This is a test file." > test.txt

接下来,运行 CLI az storage 命令使用 SAS 凭据进行身份验证,然后将文件上传到 blob 容器。 对于此步骤,需要在 VM 上安装最新的 Azure CLI(如果尚未安装)。

 az storage blob upload --container-name 
                        --file 
                        --name
                        --account-name 
                        --sas-token

响应:

Finished[#############################################################]  100.0000%
{
  "etag": "\"0x8D4F9929765C139\"",
  "lastModified": "2017-09-21T03:58:56+00:00"
}

你也可以使用 Azure CLI 下载文件,并使用 SAS 凭据对其进行身份验证。

请求:

az storage blob download --container-name
                         --file 
                         --name 
                         --account-name
                         --sas-token

响应:

{
  "content": null,
  "metadata": {},
  "name": "testblob",
  "properties": {
    "appendBlobCommittedBlockCount": null,
    "blobType": "BlockBlob",
    "contentLength": 16,
    "contentRange": "bytes 0-15/16",
    "contentSettings": {
      "cacheControl": null,
      "contentDisposition": null,
      "contentEncoding": null,
      "contentLanguage": null,
      "contentMd5": "Aryr///Rb+D8JQ8IytleDA==",
      "contentType": "text/plain"
    },
    "copy": {
      "completionTime": null,
      "id": null,
      "progress": null,
      "source": null,
      "status": null,
      "statusDescription": null
    },
    "etag": "\"0x8D4F9929765C139\"",
    "lastModified": "2017-09-21T03:58:56+00:00",
    "lease": {
      "duration": null,
      "state": "available",
      "status": "unlocked"
    },
    "pageBlobSequenceNumber": null,
    "serverEncrypted": false
  },
  "snapshot": null
}

使用 Linux VM 系统分配的托管标识通过访问密钥访问 Azure 存储

本教程介绍如何使用 Linux 虚拟机 (VM) 的系统分配托管标识来检索存储帐户访问密钥。 可以像平常在执行存储操作时一样使用存储访问密钥,例如使用存储 SDK 时。 在本教程中,你使用 Azure CLI 上传和下载 blob。

将了解如何执行以下操作:

  • 授予 VM 对资源管理器中存储帐户访问密钥的访问权限
  • 使用 VM 的标识获取一个访问令牌,并使用它从资源管理器检索存储访问密钥

创建存储帐户

如果在开始本教程之前没有现有的存储帐户,则需要创建一个。 如果有现有的存储帐户,请执行以下步骤,向 VM 系统分配的托管标识授予对现有存储帐户密钥的访问权限。

  1. 选择 Azure 门户左上角的“+/创建新服务”按钮。

  2. 依次选择“存储”、“存储帐户”,然后“创建存储帐户”面板会出现。

  3. 输入存储帐户的“名称”。 请记住此名称,因为稍后需要它。

  4. 确保将“部署模型”设置为“资源管理器”,将“帐户类型”设置为“常规用途”。

  5. 确保“订阅”和“资源组”与你创建 VM 时指定的名称匹配。

  6. 选择“创建”以完成存储帐户的创建。

    屏幕截图显示如何新建存储帐户。

在存储帐户中创建 Blob 容器

在本教程中,稍后你会将文件上传和下载到新存储帐户。 由于文件需要 blob 存储,你需要创建用于存储文件的 blob 容器。

  1. 导航到新创建的存储帐户。

  2. 在左侧面板中,选择“Blob 服务”下的“容器”链接。

  3. 选择页面顶部的“+ 容器”,此时会显示“新建容器”面板。

  4. 为容器指定名称,选择访问级别,然后选择“确定”。 你稍后在本教程中需要用到你指定的名称。

    屏幕截图显示如何创建存储容器。

授权 VM 的系统分配的托管标识使用存储帐户访问密钥

Azure 存储原本不支持 Microsoft Entra 身份验证。 但是,可以使用 VM 的系统分配的托管标识从资源管理器检索存储 SAS,然后使用 SAS 来访问存储。 在此步骤中,将向 VM 的系统分配的托管标识授予对存储帐户 SAS 的访问权限。 通过向包含存储帐户的资源组范围中的托管标识分配存储帐户参与者角色来授予访问权限。

有关详细步骤,请参阅使用 Azure 门户分配 Azure 角色

注意

有关可用于授予存储权限的各种角色的信息,请查看使用 Microsoft Entra ID 对 Blob 和队列授予访问权限

使用 VM 标识获取访问令牌,并使用它调用 Azure 资源管理器

在本教程的剩余部分,我们从先前创建的 VM 入手。

若要完成这些步骤,需要使用 SSH 客户端。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

  1. 在 Azure 门户中,导航到“虚拟机”,选择你的 Linux 虚拟机,然后在“概述”页中选择顶部的“连接”。 复制用于连接到 VM 的字符串。

  2. 使用 SSH 客户端连接到 VM。

  3. 接下来,你需要输入创建 Linux VM 时添加的“密码”

  4. 使用 CURL 获取 Azure 资源管理器的访问令牌。

    下面是用于获取访问令牌的 CURL 请求和响应:

    curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.chinacloudapi.cn%2F' -H Metadata:true
    

    注意

    在上面的请求中,“resource”参数的值必须与 Microsoft Entra ID 预期的值完全一致。 如果使用 Azure 资源管理器资源 ID,必须在 URI 的结尾添加斜线。 在下面的响应中,为简洁起见,已缩短了 access_token 元素。

    {
      "access_token": "eyJ0eXAiOiJ...",
      "refresh_token": "",
      "expires_in": "3599",
      "expires_on": "1504130527",
      "not_before": "1504126627",
      "resource": "https://management.chinacloudapi.cn",
      "token_type": "Bearer"
    }
    

从 Azure 资源管理器中获取存储帐户访问密钥,以便调用存储

现在,使用在上一部分中检索到的访问令牌通过 CURL 调用资源管理器,以便检索存储访问密钥。 获得存储访问密钥后,便可以调用存储上传/下载操作。 请务必将 <SUBSCRIPTION ID><RESOURCE GROUP><STORAGE ACCOUNT NAME> 参数值替换为你自己的值。 将 <ACCESS TOKEN> 值替换为前面检索到的访问令牌:

curl https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE ACCOUNT NAME>/listKeys?api-version=2016-12-01 --request POST -d "" -H "Authorization: Bearer <ACCESS TOKEN>" 

注意

上述 URL 中的文本区分大小写,因此如果对资源组使用了大小写格式,请务必在 URL 中相应地体现出来。 另外,请注意,这是 POST 请求而不是 GET 请求,请务必使用 -d 来传递一个值,以捕获长度限制,此值可以为 NULL。

CURL 响应将提供一个密钥列表:

{"keys":[{"keyName":"key1","permissions":"Full","value":"iqDPNt..."},{"keyName":"key2","permissions":"Full","value":"U+uI0B..."}]} 

创建要上传到 blob 存储容器的示例 blob 文件。 在 Linux VM 上,可使用以下命令执行该操作。

echo "This is a test file." > test.txt

接下来,运行 CLI az storage 命令并使用存储访问密钥进行身份验证,然后将文件上传到 blob 容器。 对于此步骤,需要在 VM 上安装最新的 Azure CLI(如果尚未安装)。

az storage blob upload -c <CONTAINER NAME> -n test.txt -f test.txt --account-name <STORAGE ACCOUNT NAME> --account-key <STORAGE ACCOUNT KEY>

响应:

Finished[#############################################################]  100.0000%
{
  "etag": "\"0x8D4F9929765C139\"",
  "lastModified": "2017-09-12T03:58:56+00:00"
}

此外,可以使用 Azure CLI 下载文件,并使用存储访问密钥对其进行身份验证。

请求:

az storage blob download -c <CONTAINER NAME> -n test.txt -f test-download.txt --account-name <STORAGE ACCOUNT NAME> --account-key <STORAGE ACCOUNT KEY>

响应:

{
  "content": null,
  "metadata": {},
  "name": "test.txt",
  "properties": {
    "appendBlobCommittedBlockCount": null,
    "blobType": "BlockBlob",
    "contentLength": 21,
    "contentRange": "bytes 0-20/21",
    "contentSettings": {
      "cacheControl": null,
      "contentDisposition": null,
      "contentEncoding": null,
      "contentLanguage": null,
      "contentMd5": "LSghAvpnElYyfUdn7CO8aw==",
      "contentType": "text/plain"
    },
    "copy": {
      "completionTime": null,
      "id": null,
      "progress": null,
      "source": null,
      "status": null,
      "statusDescription": null
    },
    "etag": "\"0x8D5067F30D0C283\"",
    "lastModified": "2017-09-28T14:42:49+00:00",
    "lease": {
      "duration": null,
      "state": "available",
      "status": "unlocked"
    },
    "pageBlobSequenceNumber": null,
    "serverEncrypted": false
  },
  "snapshot": null
}

使用 Linux VM 系统分配的托管标识访问 Azure Key Vault

本教程介绍 Linux 虚拟机 (VM) 如何使用系统分配的托管标识来访问 Azure Key Vault。 Key Vault 随后可让客户端应用程序使用机密访问未受 Microsoft Entra ID 保护的资源。 托管服务标识由 Azure 自动管理,可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中包含身份验证信息了。

将了解如何执行以下操作:

  • 授予 VM 对 Key Vault 中存储的密钥的访问权限
  • 使用 VM 标识获取访问令牌,并使用它来检索 Key Vault 中的密钥

创建密钥保管库

还需要启用了系统分配的托管标识的 Linux 虚拟机。

提示

本文中的步骤可能因开始使用的门户而略有不同。

本部分说明如何授予 VM 访问密钥保管库中存储的密钥的权限。 使用 Azure 资源托管标识时,代码可以获取访问令牌,以向支持 Microsoft Entra 身份验证的资源进行身份验证。

但是,并非所有 Azure 服务都支持 Microsoft Entra 身份验证。 若要将 Azure 资源的托管标识用于这些服务,请将服务凭据存储在 Azure Key Vault 中,然后使用 VM 的托管标识访问 Key Vault 以检索凭据。

首先,你需要创建一个 Key Vault 并授予 VM 的系统分配托管标识对该 Key Vault 的访问权限。

  1. 登录到 Azure 门户

  2. 在左侧导航栏的顶部,选择“创建资源”

  3. 在“搜索市场”框中,键入“Key Vault”,然后按 Enter 。

  4. 从结果中选择“Key Vault”。

  5. 选择创建

  6. 为新密钥保管库提供一个“名称”

    屏幕截图显示了 Azure Key Vault 创建屏幕。

  7. 填写所有必填信息,以确保选择在其中创建了本教程所用虚拟机的订阅和资源组。

  8. 依次选择“查看 + 创建”、“创建”。

创建机密

接下来,你需要将机密添加到 Key Vault,以便稍后可以使用在 VM 中运行的代码检索此机密。 在本部分中,你将使用 PowerShell。 但相同的概念适用于在此虚拟机中执行的任何代码。

  1. 导航到新创建的密钥保管库。

  2. 选择“机密”,然后选择“添加”。

  3. 选择生成/导入

  4. 在“创建机密”部分中,转到“上传选项”,并确保选择了“手动”。

  5. 输入密钥的名称和值。  该值可以是任何需要的内容。 

  6. 将激活日期和到期日期保持清除状态,并确保“启用”设置为“是”。 

  7. 选择“创建”以创建机密。

    屏幕截图显示了机密创建。

授予访问权限

虚拟机使用的托管标识需要有权读取存储在 Key Vault 中的机密。

  1. 导航到新创建的密钥保管库。

  2. 从左侧导航中选择“访问策略”。

  3. 选择“添加访问策略”。

    屏幕截图显示了“密钥保管库创建访问策略”屏幕。

  4. 在“从模板配置(可选)”下的“添加访问策略”部分的下拉菜单中选择“密钥管理”

  5. 选择“选择主体”,然后在搜索字段中输入你之前创建的 VM 的名称。  在结果列表中选择该 VM,然后选择“选择”。

  6. 选择“添加” 。

  7. 选择“保存”。

访问数据

若要完成这些步骤,需要使用 SSH 客户端。  如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

重要

所有 Azure SDK 都支持 Azure.Identity 库,这使你可以轻松获取 Microsoft Entra 令牌来访问目标服务。 详细了解 Azure SDK 以及如何访问 Azure.Identity 库。

  1. 在门户中导航到 Linux VM,然后在“概述”中选择“连接”。 
  2. 使用所选的 SSH 客户端连接 到 VM。 
  3. 在终端窗口中,使用 cURL 向 Azure 资源终结点的本地托管标识发出请求,以获取 Azure Key Vault 的访问令牌。   下面是用于获取访问令牌的 CURL 请求。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.cn' -H Metadata:true
  ```
The response includes the access token you need to access Resource Manager. 
  
Response:
  
```bash
{"access_token":"eyJ0eXAi...",
"refresh_token":"",
"expires_in":"3599",
"expires_on":"1504130527",
"not_before":"1504126627",
"resource":"https://vault.azure.cn",
"token_type":"Bearer"} 

可以使用此访问令牌对 Azure Key Vault 进行身份验证。  下一个 CURL 请求显示如何使用 CURL 和 Key Vault REST API 从 Key Vault 读取密钥。  你需要 Key Vault 的 URL,该 URL 位于 Key Vault 的“概述”页的“基本信息”部分。  另外,你还需要在前面的调用中获取的访问令牌。 

curl 'https://<YOUR-KEY-VAULT-URL>/secrets/<secret-name>?api-version=2016-10-01' -H "Authorization: Bearer <ACCESS TOKEN>" 

响应如下所示:

{"value":"p@ssw0rd!","id":"https://mytestkeyvault.vault.azure.cn/secrets/MyTestSecret/7c2204c6093c4d859bc5b9eff8f29050","attributes":{"enabled":true,"created":1505088747,"updated":1505088747,"recoveryLevel":"Purgeable"}} 

检索 Key Vault 中的机密后,可以使用该机密向需要名称和密码的服务进行身份验证。

清理资源

当你准备好清理资源时,请登录到 Azure 门户,选择“资源组”,找到并选择在本教程中创建的资源组(例如 mi-test)。 可以使用“删除资源组”命令或通过 PowerShell 或 CLI

使用 Linux VM 系统分配的托管标识访问资源管理器中的资源组

提示

本文中的步骤可能因开始使用的门户而略有不同。

本教程介绍如何创建系统分配的标识、将其分配给 Linux 虚拟机 (VM),再使用此标识访问 Azure 资源管理器 API。 托管服务标识由 Azure 自动管理。 此标识可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中嵌入凭据了。

你将学习如何执行以下操作:

  • 授予 VM 对 Azure 资源管理器的访问权限。
  • 使用 VM 的系统分配的托管标识获取访问令牌以访问资源管理器。
  1. 使用管理员帐户登录 Azure 门户

  2. 导航到“资源组”选项卡。

  3. 选择要向其授予 VM 的托管标识访问权限的“资源组”

  4. 在左侧面板中,选择“访问控制(IAM)”。

  5. 依次选择“添加”和“添加角色分配”。

  6. 在“角色”选项卡中,选择“读取者”。 使用此角色可以查看所有资源,但不能进行任何更改。

  7. 在“成员”选项卡中,在“将访问权限分配给”选项中,选择“托管标识”,然后选择“+ 选择成员”。

  8. 确保“订阅”下拉列表中列出的订阅正确无误。 对于“资源组”,请选择“所有资源组”

  9. 在“管理标识”下拉列表中选择“虚拟机”。

  10. 在“选择”选项中,选择下拉列表中的 VM 并选择“保存”

    屏幕截图显示了向托管标识添加读取者角色。

获取访问令牌

使用 VM 的系统分配的托管标识并调用资源管理器以获取访问令牌。

若要完成这些步骤,需要使用 SSH 客户端。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

  1. 在 Azure 门户中导航到你的 Linux VM。
  2. 在“概述”中选择“连接”。
  3. 使用所选的 SSH 客户端连接 到 VM。
  4. 在终端窗口中,使用 curl 向 Azure 资源终结点的本地托管标识发出请求,以获取 Azure 资源管理器的访问令牌。   下面是对访问令牌的 curl 请求。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.chinacloudapi.cn/' -H Metadata:true

注意

resource 参数的值必须完全匹配 Microsoft Entra ID 预期的值。 若为资源管理器资源 ID,必须在 URI 的结尾添加斜线。

响应包括访问 Azure 资源管理器所需的访问令牌。

响应:

{
  "access_token":"eyJ0eXAiOi...",
  "refresh_token":"",
  "expires_in":"3599",
  "expires_on":"1504130527",
  "not_before":"1504126627",
  "resource":"https://management.chinacloudapi.cn",
  "token_type":"Bearer"
}

使用此访问令牌访问 Azure 资源管理器。 例如,若要阅读之前向其授予此 VM 访问权限的资源组的详细信息。 将值 <SUBSCRIPTION-ID><RESOURCE-GROUP><ACCESS-TOKEN> 替换为之前创建的值。

注意

URL 区分大小写。因此,请确保大小写与之前在命名资源组时使用的大小写完全相同,并确保“resourceGroup”中使用的是大写“G”。

curl https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS-TOKEN>" 

返回的响应包含具体的资源组信息:

{
"id":"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/DevTest",
"name":"DevTest",
"location":"chinanorth",
"properties":
{
  "provisioningState":"Succeeded"
  }
} 

使用 Linux VM 用户分配的托管标识访问资源管理器中的资源组

提示

本文中的步骤可能因开始使用的门户而略有不同。

本教程介绍如何创建用户分配标识、将其分配给 Linux 虚拟机 (VM),再使用此标识访问 Azure 资源管理器 API。 托管服务标识由 Azure 自动管理。 此标识可用于向支持 Microsoft Entra 身份验证的服务进行身份验证,这样就无需在代码中嵌入凭据了。

将了解如何执行以下操作:

  • 授予 VM 对 Azure 资源管理器的访问权限。
  • 使用 VM 的系统分配的托管标识获取访问令牌以访问资源管理器。

使用 az identity create 创建用户分配托管标识。 -g 参数指定要创建用户分配托管标识的资源组,-n 参数指定其名称。 请务必将 <RESOURCE GROUP><UAMI NAME> 参数值替换为自己的值:

重要

创建用户分配的托管标识时,只能使用字母数字字符(0-9、a-z、A-Z)和连字符 (-)。 要使虚拟机或虚拟机规模集的分配正常工作,该名称限制为 24 个字符。 有关详细信息,请参阅 FAQ 和已知问题

az identity create -g <RESOURCE GROUP> -n <UAMI NAME>

响应包含所创建的用户分配托管标识的详细信息,与以下示例类似。 记下用户分配托管标识的 id 值,因为下一步会用到它:

{
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"clientSecretUrl": "https://control-chinanorth.identity.chinacloudapi.cn/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<UAMI NAME>/credentials?tid=5678&oid=9012&aid=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
"id": "/subscriptions/<SUBSCRIPTON ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<UAMI NAME>",
"location": "chinanorth",
"name": "<UAMI NAME>",
"principalId": "9012",
"resourceGroup": "<RESOURCE GROUP>",
"tags": {},
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}

为 Linux VM 分配标识

用户分配托管标识可以由多个 Azure 资源上的客户端使用。 使用以下命令将用户分配托管标识分配给单个 VM。 将上一步返回的 Id 属性用于 -IdentityID 参数。

使用 az vm identity assign 将用户分配托管标识分配给 Linux VM。 请务必将 <RESOURCE GROUP><VM NAME> 参数值替换为自己的值。 将上一步返回的 id 属性用于 --identities 参数值。

az vm identity assign -g <RESOURCE GROUP> -n <VM NAME> --identities "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<UAMI NAME>"

授予对 Azure 资源管理器中资源组的访问权限

托管标识是代码可以用来请求访问令牌以向支持 Microsoft Entra 身份验证的资源 API 进行身份验证的标识。 在本教程中,你的代码将访问 Azure 资源管理器 API。

需先向标识授予对 Azure 资源管理器中资源的访问权限,代码才能访问 API。 在此情况下,即为包含 VM 的资源组。 根据环境适当地更新 <SUBSCRIPTION ID><RESOURCE GROUP> 的值。 另外,请将 <UAMI PRINCIPALID> 替换为在创建用户分配托管标识中由 az identity create 命令返回的 principalId 属性:

az role assignment create --assignee <UAMI PRINCIPALID> --role 'Reader' --scope "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP> "

响应包含所创建的角色分配的详细信息,与以下示例类似:

{
  "id": "/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Authorization/roleAssignments/00000000-0000-0000-0000-000000000000",
  "name": "00000000-0000-0000-0000-000000000000",
  "properties": {
    "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
    "roleDefinitionId": "/subscriptions/<SUBSCRIPTION ID>/providers/Microsoft.Authorization/roleDefinitions/00000000-0000-0000-0000-000000000000",
    "scope": "/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>"
  },
  "resourceGroup": "<RESOURCE GROUP>",
  "type": "Microsoft.Authorization/roleAssignments"
}

使用 VM 标识获取访问令牌,并使用它调用资源管理器

提示

本文中的步骤可能因开始使用的门户而略有不同。

在本教程的剩余部分中,你将从先前创建的 VM 进行操作。

若要完成这些步骤,需要使用 SSH 客户端。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。

  1. 登录 Azure 门户

  2. 在门户中,导航到“虚拟机”并转到 Linux 虚拟机,然后在“概述”中,单击“连接”。 复制用于连接到 VM 的字符串。

  3. 使用所选的 SSH 客户端连接到 VM。 如果使用的是 Windows,可以在适用于 Linux 的 Windows 子系统中使用 SSH 客户端。 如果需要有关配置 SSH 客户端密钥的帮助,请参阅如何在 Azure 上将 SSH 密钥与 Windows 配合使用如何创建和使用适用于 Azure 中 Linux VM 的 SSH 公钥和私钥对

  4. 在终端窗口中,使用 CURL 向 Azure 实例元数据服务 (IMDS) 标识终结点发出请求,以获取 Azure 资源管理器的访问令牌。

    以下示例展示了用于获取访问令牌的 CURL 请求。 请务必将 <CLIENT ID> 替换为在创建用户分配托管标识中由 az identity create 命令返回的 clientId 属性:

    curl -H Metadata:true "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.chinacloudapi.cn/&client_id=<UAMI CLIENT ID>"
    

    注意

    resource 参数的值必须完全匹配 Microsoft Entra ID 预期的值。 如果使用资源管理器资源 ID,必须在 URI 的结尾添加斜线。

    响应包括访问 Azure 资源管理器所需的访问令牌。

    响应示例:

    {
    "access_token":"eyJ0eXAiOi...",
    "refresh_token":"",
    "expires_in":"3599",
    "expires_on":"1504130527",
    "not_before":"1504126627",
    "resource":"https://management.chinacloudapi.cn",
    "token_type":"Bearer"
    } 
    
  5. 使用访问令牌访问 Azure 资源管理器,并读取之前授予用户分配托管标识访问权限以使其有权访问的资源组的属性。 确保将 <SUBSCRIPTION ID><RESOURCE GROUP> 的值替换为先前指定的值,将 <ACCESS TOKEN> 替换为上一步返回的令牌。

    注意

    URL 区分大小写。因此,请确保使用的大小写与之前在命名资源组时使用的大小写完全相同,以及 resourceGroups 使用的是大写“G”。

    curl https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>?api-version=2016-09-01 -H "Authorization: Bearer <ACCESS TOKEN>" 
    

    响应包含特定资源组信息,类似于下面的示例:

    {
    "id":"/subscriptions/<SUBSCRIPTION ID>/resourceGroups/DevTest",
    "name":"DevTest",
    "location":"chinanorth",
    "properties":{"provisioningState":"Succeeded"}
    } 
    

了解详细信息