教學課程:使用Linux VM系統指派的身分識別,透過SAS認證存取 Azure 儲存體

Azure 資源的受控識別是 Microsoft Entra ID 的功能。 每個支援適用於 Azure 資源的受控識別 Azure 服務均受限於其本身的時間表。 開始之前,請務必檢閱 資源受控識別的可用性 狀態和 已知問題

本教學課程說明如何使用 Linux 虛擬機 (VM) 的系統指派受控識別來取得記憶體共用存取簽章 (SAS) 認證。 具體而言,是服務 SAS 認證

注意

本教學課程中產生的SAS 金鑰不會限制/系結至 VM。

服務 SAS 會授與記憶體帳戶中物件的有限存取權,而不會公開帳戶存取密鑰。 也可以針對有限的時間和特定服務授與存取權。 您可以在執行記憶體作業時如常使用 SAS 認證,例如使用 儲存體 SDK。 在本教學課程中,我們會示範如何使用 Azure 儲存體 CLI 上傳和下載 Blob。 您將了解如何:

  • 建立儲存體帳戶
  • 在儲存體帳戶中建立 Blob 容器
  • 在 Resource Manager 中將記憶體帳戶 SAS 的存取權授與 VM
  • 使用 VM 的身分識別取得存取令牌,並使用它從 Resource Manager 擷取 SAS

必要條件

建立儲存體帳戶

如果您還沒有記憶體帳戶,您現在將會建立記憶體帳戶。 您也可以略過此步驟,並將 VM 系統指派的受控識別存取權授與現有記憶體帳戶的密鑰。

  1. 選取位於 Azure 入口網站 左上角的 [+/建立新服務] 按鈕。

  2. 選取 [儲存體],然後 儲存體 [帳戶],並顯示新的 [建立記憶體帳戶] 面板。

  3. 輸入記憶體帳戶的名稱,以供稍後使用。

  4. 部署模型帳戶種類 應該分別設定為 「Resource Manager」和「一般用途」。

  5. 確定訂用帳戶和資源群組符合您在上一個步驟中建立 VM 時所指定的訂用帳戶和資源群組

  6. 選取 建立

    顯示新記憶體帳戶建立畫面的螢幕快照。

在儲存體帳戶中建立 Blob 容器

稍後我們將上傳檔案並下載到新的記憶體帳戶。 因為檔案需要 Blob 記憶體,所以我們需要建立用來儲存檔案的 Blob 容器。

  1. 流覽回新建立的記憶體帳戶。

  2. 選取左面板中的 [Blob 服務] 底下的 [容器] 連結。

  3. 選取 頁面頂端的 [+ 容器 ],並顯示 [新增容器] 面板。

  4. 為容器指定名稱、選取存取層級,然後選取 [ 確定]。 您稍後將在教學課程中使用您指定的名稱。

    顯示記憶體容器建立畫面的螢幕快照。

授與 VM 系統指派的受控識別存取權,以使用記憶體 SAS

Azure 儲存體 原生支援 Microsoft Entra 驗證,因此您可以使用 VM 的系統指派受控識別,從 Resource Manager 擷取記憶體 SAS,然後使用 SAS 來存取記憶體。 在此步驟中,您會將 VM 系統指派的受控識別存取權授與記憶體帳戶 SAS。 在包含記憶體帳戶的資源群組範圍內,將 儲存體 帳戶參與者角色指派給受控識別。

如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色

注意

如需可用來授與記憶體許可權的各種角色詳細資訊,請參閱 使用 Microsoft Entra ID 授權 Blob 和佇列的存取權。

使用 VM 的身分識別取得存取令牌,並用它來呼叫 Azure Resource Manager

在本教學課程的其餘部分,我們將從稍早建立的 VM 中運作。

您需要 SSH 用戶端才能完成這些步驟。 如果您使用 Windows,您可以在 Windows 子系統 Linux 版 中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱:

現在您已讓 SSH 用戶端繼續執行下列步驟:

  1. 在 Azure 入口網站 中,流覽至 [虛擬機器],移至您的Linux虛擬機,然後從 [概觀] 頁面選取頂端的 [連線]。 複製字串以連線到您的 VM。

  2. 使用 SSH 用戶端 連線 至 VM。

  3. 接下來,系統會提示您輸入您在建立Linux VM時新增的密碼。 然後,您應該成功登入。

  4. 使用 CURL 取得 Azure Resource Manager 的存取令牌。

    存取權杖的 CURL 要求和回應如下:

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

    注意

    在先前的要求中,“resource” 參數的值必須完全符合 Microsoft Entra ID 的預期值。 使用 Azure Resource Manager 資源識別碼時,您必須在 URI 中包含尾端斜線。 在下列回應中,access_token元素已縮短為簡潔。

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

從 Azure Resource Manager 取得 SAS 認證以進行記憶體呼叫

現在,使用我們在上一節中擷取的存取令牌來呼叫 Resource Manager,以建立記憶體 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 認證之參數的詳細資訊,請參閱 列出服務 SAS REST 參考

使用下列 CURL 要求來取得 SAS 認證。 請務必將<SUBSCRIPTION ID><RESOURCE GROUP>、 、 <CONTAINER NAME><STORAGE ACCOUNT NAME><EXPIRATION TIME> 參數值取代為您自己的值。 將 <ACCESS TOKEN> 值取代為您稍早擷取的存取權杖:

curl https://management.azure.com/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 中的文字會區分大小寫,因此請確定您是否使用大寫來反映資源群組。 此外,請務必知道這是 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

接下來,使用 SAS 認證向 CLI az storage 命令進行驗證,並將檔案上傳至 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,請參閱: