教學課程:使用Linux VM系統指派的受控識別,透過存取密鑰存取 Azure 儲存體

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

本教學課程說明如何使用 Linux 虛擬機 (VM) 的系統指派受控識別來擷取記憶體帳戶存取密鑰。 您可以在執行記憶體作業時如往常使用記憶體存取金鑰,例如使用 儲存體 SDK。 在本教學課程中,我們會使用 Azure CLI 上傳和下載 Blob。 您將了解如何:

  • 將 VM 存取權授與 Resource Manager 中的記憶體帳戶存取金鑰
  • 使用 VM 的身分識別取得存取令牌,並使用它從 Resource Manager 擷取記憶體存取密鑰

必要條件

建立儲存體帳戶

如果您沒有想要在本教學課程中使用的現有記憶體帳戶,您需要建立一個記憶體帳戶。 您也可以略過此步驟,並將 VM 系統指派的受控識別存取權授與現有記憶體帳戶的密鑰。

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

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

  3. 輸入記憶體帳戶的 [名稱]。

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

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

  6. 選取 建立

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

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

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

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

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

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

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

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

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

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 用戶端金鑰的協助,請參閱 如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或 如何建立和使用 Azure 中 Linux VM 的 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 取得記憶體帳戶存取金鑰,以呼叫記憶體

現在,使用我們在上一節中擷取的存取令牌來呼叫 Resource Manager,以擷取記憶體存取密鑰。 一旦我們有記憶體存取密鑰,我們可以呼叫記憶體上傳/下載作業。 請務必將 <SUBSCRIPTION ID><RESOURCE GROUP><STORAGE ACCOUNT NAME> 參數值取代為您自己的值。 將 <ACCESS TOKEN> 值取代為您稍早擷取的存取權杖:

curl https://management.azure.com/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 中的文字會區分大小寫,因此請確定您是否使用大寫來反映資源群組。 此外,請務必知道這是 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 儲存體。 若要深入瞭解 Azure 儲存體 存取金鑰,請參閱: