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

Azure 资源的托管标识是 Microsoft Entra ID 的一项功能。 支持 Azure 资源的托管标识的每个 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. 选择创建

    Create new storage account

在存储帐户中创建 Blob 容器

稍后我们会将文件上传和下载到新存储帐户。 由于文件需要 blob 存储,我们需要创建用于存储文件的 blob 容器。

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

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

  3. 选择页面顶部的“+ 容器”,此时会滑出一个“新建容器”面板。

  4. 为容器指定名称,选择访问级别,然后选择“确定”。 在本教程中的后面部分将使用所指定的名称。

    Create storage container

授权 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 虚拟机,然后在“概述”页中选择顶部的“连接”。 复制用于连接到 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 资源管理器中获取 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 系统分配的托管标识通过 SAS 凭据来访问 Azure 存储。 若要深入了解 Azure 存储 SAS,请参阅: