教學課程:使用 Linux VM/VMSS 存取 Azure 資源
Azure 資源受控識別是 Microsoft Entra ID 的一項功能。 每個支援適用於 Azure 資源的受控識別 Azure 服務均受限於其本身的時間表。 在開始之前,請務必先檢閱資源的受控識別可用性狀態和已知問題。
必要條件
- 了解受控識別。 如果您不熟悉適用於 Azure 資源的受控識別功能,請參閱此概觀。
- Azure 帳戶,註冊免費帳戶。
- 若要執行所需的資源建立和角色管理步驟,需要在適當的範圍 (您的訂閱或資源群組) 上具備「擁有者」權限。 如果您需要角色指派的協助,請參閱指派 Azure 角色來管理對您的 Azure 訂用帳戶資源的存取。
- 已啟用系統指派受控識別的 Linux 虛擬機器 (VM)。
- 如果您需要建立本教學課程的 VM,請參閱建立已啟用系統指派身分識別的虛擬機器 (英文)。
使用 Linux VM 系統指派的受控識別來存取 Azure Data Lake Store
本教學課程說明如何將系統指派的受控識別用於 Linux 虛擬機器 (VM),以存取 Azure Data Lake Store。
您將學習如何:
- 將您的 VM 存取權授與 Azure Data Lake Store。
- 使用 Linux VM 系統指派的受控識別來取得存取權杖,以存取 Azure Data Lake Store。
授予存取權
本節說明如何授權給 VM 存取 Azure Data Lake Store 中的檔案和資料夾。 在這個步驟,您可以使用現有的 Data Lake Store 執行個體或建立新的執行個體。 若要使用 Azure 入口網站建立 Data Lake Store 執行個體,請遵循 Azure Data Lake Store 快速入門。 在 Azure Data Lake Store 文件中,也有使用 Azure CLI 和 Azure PowerShell 的快速入門做法。
在 Data Lake Store 中建立新資料夾,並將在該資料夾中讀取、寫入和執行檔案的權限,授予 Linux VM 系統指派的受控識別:
- 在 Azure 入口網站中,選取左側窗格的 [Data Lake Store]。
- 選取您需要使用的 Data Lake Store 執行個體。
- 選取命令列上的 [資料總管]。
- 隨即選取 Data Lake Store 執行個體的根資料夾。 在命令列上選取 [存取]。
- 選取 [新增]。 在 [選取] 方塊中,輸入 VM 的名稱,例如 DevTestVM。 從搜尋結果中選取您的 VM,然後選取 [選取]。
- 選取 選取權限。 選取 [讀取] 和 [執行],加入到 [此資料夾],新增為 [僅存取權限],然後選取 [確定]。 權限應該已成功加入。
- 關閉 [存取] 窗格。
- 建立新資料夾,選取命令列中的 [新資料夾],為新資料夾命名 (例如 TestFolder),然後選取 [確定]。
- 選取您所建立的資料夾,然後選取命令列中的 [存取]。
- 選取 [新增],然後在 [選取] 方塊中,輸入 VM 的名稱。
- 從搜尋結果中選取您的 VM,然後選取 [選取]。
- 選取 [選取權限],依序選取 [讀取]、[寫入] 和 [執行]。
- 選取以新增至此資料夾,新增為存取權限項目和預設權限項目,然後選取 [確定]。 權限應該已成功加入。
現在,適用於 Azure 資源的受控識別,可以對您所建立資料夾中的檔案執行所有作業。 如需管理 Data Lake Store 存取權的詳細資訊,請參閱 Data Lake Store 中的存取控制一文。
取得存取權杖
本節說明如何取得存取權杖及呼叫 Data Lake Store 檔案系統。 Azure Data Lake Store 原生支援 Microsoft Entra 驗證,因此可直接接受使用 Azure 資源受控識別所取得的存取權杖。
為了向 Data Lake Store 檔案系統進行驗證,您要將 Microsoft Entra ID 所簽發的存取權杖傳送至 Data Lake Store 檔案系統端點。 存取權杖位於授權標頭,格式為 Bearer \<ACCESS_TOKEN_VALUE\>
。 若要深入了解 Data Lake Store 的 Microsoft Entra 驗證支援,請參閱使用 Microsoft Entra ID 向 Data Lake Store 進行驗證 (英文)。
接下來,請使用 cURL 向 Data Lake Store 檔案系統驗證 REST API,以提出 REST 要求。
注意
適用於 Data Lake Store 檔案系統的用戶端 SDK,尚不支援適用於 Azure 資源的受控識別。
若要完成這些步驟,您需要 SSH 用戶端。 如果您使用 Windows,您可以在適用於 Linux 的 Windows 子系統中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組。
在入口網站中,瀏覽至您的 Linux VM,然後在 [概觀] 區段中選取 [連線]。
使用您所選擇的 SSH 用戶端來連線到 VM。
在終端機視窗中,使用 cURL 向 Azure 資源端點的本機受控識別提出要求,以取得 Data Lake Store 檔案系統的存取權杖。 Data Lake Store 的資源識別碼是
https://datalake.azure.net/
。 請務必包含資源識別項中的結尾斜線。curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fdatalake.azure.net%2F' -H Metadata:true
成功的回應會傳回您向 Data Lake Store 驗證時所使用的存取權杖:
{"access_token":"eyJ0eXAiOiJ...", "refresh_token":"", "expires_in":"3599", "expires_on":"1508119757", "not_before":"1508115857", "resource":"https://datalake.azure.net/", "token_type":"Bearer"}
使用 cURL 對您 Data Lake Store 檔案系統的 REST 端點提出要求,以列出根資料夾中的資料夾。 這是檢查所有項目皆正確設定的最佳方式。 複製上一個步驟中的存取權杖值。 授權標頭中的字串
Bearer
必須是大寫“B”。您可以在 Azure 入口網站 [Data Lake Store] 窗格的 [概觀] 區段中,找到您 Data Lake Store 執行個體的名稱。curl https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/?op=LISTSTATUS -H "Authorization: Bearer <ACCESS_TOKEN>"
成功的回覆看起來像這樣:
{"FileStatuses":{"FileStatus":[{"length":0,"pathSuffix":"TestFolder","type":"DIRECTORY","blockSize":0,"accessTime":1507934941392,"modificationTime":1508105430590,"replication":0,"permission":"770","owner":"bd0e76d8-ad45-4fe1-8941-04a7bf27f071","group":"bd0e76d8-ad45-4fe1-8941-04a7bf27f071"}]}}
現在,請將檔案上傳至 Data Lake Store 執行個體。 首先,建立要上傳的檔案。
echo "Test file." > Test1.txt
使用 cURL 對您的 Data Lake Store 檔案系統 REST 端點提出要求,以將檔案上傳到您先前建立的資料夾。 上傳需要重新導向,cURL 會自動遵循重新導向。
curl -i -X PUT -L -T Test1.txt -H "Authorization: Bearer <ACCESS_TOKEN>" 'https://<YOUR_ADLS_NAME>.azuredatalakestore.net/webhdfs/v1/<FOLDER_NAME>/Test1.txt?op=CREATE'
成功的回覆看起來像這樣:
HTTP/1.1 100 Continue HTTP/1.1 307 Temporary Redirect Cache-Control: no-cache, no-cache, no-store, max-age=0 Pragma: no-cache Expires: -1 Location: https://mytestadls.azuredatalakestore.net/webhdfs/v1/TestFolder/Test1.txt?op=CREATE&write=true x-ms-request-id: 756f6b24-0cca-47ef-aa12-52c3b45b954c ContentLength: 0 x-ms-webhdfs-version: 17.04.22.00 Status: 0x0 X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=15724800; includeSubDomains Date: Sun, 15 Oct 2017 22:10:30 GMT Content-Length: 0 HTTP/1.1 100 Continue HTTP/1.1 201 Created Cache-Control: no-cache, no-cache, no-store, max-age=0 Pragma: no-cache Expires: -1 Location: https://mytestadls.azuredatalakestore.net/webhdfs/v1/TestFolder/Test1.txt?op=CREATE&write=true x-ms-request-id: af5baa07-3c79-43af-a01a-71d63d53e6c4 ContentLength: 0 x-ms-webhdfs-version: 17.04.22.00 Status: 0x0 X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=15724800; includeSubDomains Date: Sun, 15 Oct 2017 22:10:30 GMT Content-Length: 0
最後,您可以使用 Data Lake Store 檔案系統的其他 API,來附加至檔案及下載檔案等。
使用 Linux VM 系統指派的受控識別來存取 Azure 儲存體
本教學課程說明如何將系統指派的受控識別用於 Linux 虛擬機器 (VM),以存取 Azure 儲存體。
您將學習如何:
- 建立儲存體帳戶
- 在儲存體帳戶中建立 Blob 容器
- 將 Linux VM 的受控識別存取權授與 Azure 儲存體容器
- 取得存取權杖,並用來呼叫 Azure 儲存體
建立儲存體帳戶
若要在此範例中執行 CLI 指令碼,您有兩個選項:
- 透過 Azure 入口網站或每個程式碼區塊右上角的 [試試看] 按鈕使用 Azure Cloud Shell。
- 如果您需要使用本機 CLI 主控台,請安裝最新版的 CLI 2.0 (2.0.23 或更新版本)。
首先,請建立儲存體帳戶。
選取 Azure 入口網站左上角的 [+ 建立資源] 按鈕。
選取 [儲存體],然後按一下 [儲存體帳戶 - Blob、檔案、資料表、佇列]。
在 [名稱] 下,輸入儲存體帳戶的名稱。
[部署模型] 和 [帳戶類型] 應該設定為資源管理員和儲存體 (一般用途 v1)。
確定 [訂用帳戶] 和 [資源群組] 符合您在上一個步驟中建立 VM 時指定的值。
選取 建立。
建立 Blob 容器,並將檔案上傳至儲存體帳戶
檔案需要 Blob 儲存體,因此您必須建立 Blob 容器,用來儲存檔案。 然後,您可以在新的儲存體帳戶中,將檔案上傳到 Blob 容器。
瀏覽到您新建立的儲存體帳戶。
選取 [Blob 服務],然後選取 [容器]。
選取頁面頂端的 [+ 容器]。
選取 [新增容器],然後為該容器輸入名稱。
確定 [公用存取層級] 為預設值。
使用您選擇的編輯器,在本機電腦上建立標題為 hello world.txt 的檔案。 開啟檔案並新增 Hello world! 文字,然後儲存之。
選取容器名稱,然後選取 [上傳]。 系統會將檔案上傳到新建立的容器。
在 [上傳 Blob] 窗格中的 [檔案] 區段中,選取資料夾圖示,然後瀏覽至本機電腦上的檔案 hello_world.txt。
選取檔案,然後選取 [上傳]。
將您的虛擬機器存取權授與 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 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組。
在 Azure 入口網站中,瀏覽至 [虛擬機器],移至您的 Linux 虛擬機器,然後在 [概觀] 頁面中,選取 [連線]。 複製字串以連線到您的 VM。
使用您所選擇的 SSH 用戶端來連線到 VM。
在終端視窗中,使用 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
請使用存取權杖來存取 Azure 儲存體。 例如讀取先前上傳至容器的範例檔案內容、將
<STORAGE ACCOUNT>
、<CONTAINER NAME>
、<FILE NAME>
取代為您先前指定的值,並將<ACCESS TOKEN>
取代為上一個步驟傳回的權杖。curl https://<STORAGE ACCOUNT>.blob.core.windows.net/<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.windows.net/<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。
服務 SAS 會授與儲存體帳戶中物件的有限存取權,而不需要公開帳戶存取金鑰。 也可以針對有限的時間和特定服務授與存取權。 在執行儲存體作業時 (例如使用儲存體 SDK),您可以如往常般使用 SAS 認證。 在此教學課程中,您將使用 Azure 儲存體 CLI 來上傳和下載 Blob。
您將學習如何:
- 建立儲存體帳戶
- 在儲存體帳戶中建立 Blob 容器
- 在資源管理員中將 VM 存取權限授與儲存體帳戶 SAS
- 使用 VM 身分識別取得存取權杖,並將其用於從資源管理員取出 SAS
建立儲存體帳戶
如果您還沒有儲存體帳戶,則必須建立儲存體帳戶。 您可以選擇略過此步驟,並將存取現有儲存體帳戶金鑰的權利,授予 VM 系統指派的受控識別。
選取 Azure 入口網站左上方的 [+/建立新服務] 按鈕。
選取 [儲存體],然後按一下 [儲存體帳戶],就會顯示 [建立儲存體帳戶] 面板。
輸入儲存體帳戶的名稱。 請牢記此名稱,稍後您將會用到此資訊。
請確定 [部署模型] 設定為 [Resource Manager],[帳戶種類] 則設為 [一般用途]。
確定 [訂閱] 和 [資源群組] 符合您建立 VM 時指定的值。
選取 [建立] 來完成建立儲存體帳戶。
在儲存體帳戶中建立 Blob 容器
稍後在本教學課程中,您將上傳檔案並將其下載到新的儲存體帳戶。 由於檔案需要 Blob 儲存體,您需要建立 Blob 容器,用來儲存檔案。
瀏覽到您新建立的儲存體帳戶。
選取左側面板 [Blob 服務] 下的 [容器] 連結。
選取頁面頂端的 [+ 容器],然後會出現 [新增容器] 面板。
指定容器的名稱,選取存取層級,然後選取 [確定]。 稍後在教學課程中將會用到您指定的名稱。
將存取儲存體帳戶 SAS 的權利,授予 VM 系統指派的受控識別
Azure 儲存體原生支援 Microsoft Entra 驗證,因此您可以使用 VM 系統指派的受控識別,從 Resource Manager 擷取儲存體 SAS, 然後使用 SAS 存取儲存體。
在本節中,您會將存取儲存體帳戶 SAS 的權利,授予 VM 系統指派的受控識別。 在包含儲存體帳戶的資源群組範圍中,將儲存體帳戶參與者角色指派給受控識別。
如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
注意
如需可用於授與儲存體權限的各種角色詳細資訊,請檢閱使用 Microsoft Entra ID 授權存取 Blob 和佇列 (部分機器翻譯)。
使用 VM 的身分識別取得存取權杖,並使用它來呼叫 Azure Resource Manager
其餘教學課程要從稍早建立的 VM 繼續進行。
您需要 SSH 用戶端才能完成這些步驟。 如果您使用 Windows,您可以在 Windows 子系統 Linux 版中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱:
啟用您的 SSH 用戶端後,請遵循下列步驟:
- 在 Azure 入口網站中,瀏覽至 [虛擬機器],然後前往您的 Linux 虛擬機器。
- 在 [概觀] 頁面中,選取畫面頂端的 [連線]。
- 複製字串以連線到您的 VM。
- 使用 SSH 用戶端連線到 VM。
- 輸入建立 Linux VM 時新增的密碼。 您應該可以順利登入。
- 使用 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 資源 ID 時,必須在 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 認證以進行儲存體呼叫
接下來,請使用上一節中擷取的存取權杖,使用 cURL 對 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>
、<STORAGE ACCOUNT NAME>
、<CONTAINER 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 認證透過 az storage
CLI 命令進行驗證,並將檔案上傳至 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 系統指派的受控識別。
選取 Azure 入口網站左上方的 [+/建立新服務] 按鈕。
選取 [儲存體],然後按一下 [儲存體帳戶],就會顯示 [建立儲存體帳戶] 面板。
輸入儲存體帳戶的名稱。 請牢記此名稱,稍後您將會用到此資訊。
請確定 [部署模型] 設定為 [Resource Manager],[帳戶種類] 則設為 [一般用途]。
確定 [訂閱] 和 [資源群組] 符合您建立 VM 時指定的值。
選取 [建立] 來完成建立儲存體帳戶。
在儲存體帳戶中建立 Blob 容器
稍後在本教學課程中,您將上傳檔案並將其下載到新的儲存體帳戶。 由於檔案需要 Blob 儲存體,您需要建立 Blob 容器,用來儲存檔案。
瀏覽到您新建立的儲存體帳戶。
選取左側面板 [Blob 服務] 下的 [容器] 連結。
選取頁面頂端的 [+ 容器],然後會出現 [新增容器] 面板。
指定容器的名稱,選取存取層級,然後選取 [確定]。 稍後在教學課程中將會用到您指定的名稱。
將存取儲存體帳戶存取金鑰的權利,授予 VM 系統指派的受控識別
Azure 儲存體原本不支援 Microsoft Entra 驗證。 不過,您可以使用 VM 系統指派的受控識別,從 Resource Manager 中擷取儲存體 SAS,然後使用該 SAS 來存取儲存體。 在此步驟中,您會將存取儲存體帳戶 SAS 的權利,授予 VM 系統指派的受控識別。 授與存取權的方法是在包含儲存體帳戶的資源群組範圍中,將儲存體帳戶參與者角色指派給受控識別。
如需詳細步驟,請參閱使用 Azure 入口網站指派 Azure 角色。
注意
如需可用於授與儲存體權限的各種角色詳細資訊,請檢閱使用 Microsoft Entra ID 授權存取 Blob 和佇列 (部分機器翻譯)。
使用 VM 的身分識別取得存取權杖,並使用它來呼叫 Azure Resource Manager
在教學課程的其餘部分,我們會從稍早建立的 VM 繼續進行。
若要完成這些步驟,您需要 SSH 用戶端。 如果您使用 Windows,您可以在適用於 Linux 的 Windows 子系統中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組。
在 Azure 入口網站中,瀏覽至 [虛擬機器],選取您的 Linux 虛擬機器,然後在 [概觀] 頁面中,選取頂端的 [連線]。 複製字串以連線到您的 VM。
使用 SSH 用戶端連線到 VM。
接下來,您必須輸入建立 Linux VM 時新增的 [密碼]。
使用 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 資源 ID 時,必須在 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 取得儲存體帳戶存取金鑰以進行儲存體呼叫
現在會利用在上一節中擷取的存取權杖,使用 CURL 來呼叫資源管理員,以擷取儲存體存取金鑰。 一旦有了儲存體存取金鑰,我們便可呼叫儲存體進行上傳/下載作業。 別忘了以您自己的值取代 <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 的長度限制,且 -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
}
使用 VM 系統指派的受控識別來存取 Azure Key Vault
本教學課程說明 Linux 虛擬機器 (VM) 可以如何使用系統指派的受控識別,以存取 Azure Key Vault。 金鑰保存庫讓您的用戶端應用程式能夠使用秘密存取未受 Microsoft Entra ID 保護的資源。 受控服務身分識別由 Azure 自動管理,並可讓您驗證支援 Microsoft Entra 驗證的服務,而不需要將驗證資訊包含在程式碼中。
您將學習如何:
- 授與 VM 存取權以取得 Key Vault 中的密碼
- 使用 VM 身分識別取得存取權杖,並使用它來擷取 Key Vault 的密碼
建立金鑰保存庫
您也需要已啟用系統指派受控識別的 Linux 虛擬機器。
- 如果您需要為本教學課程建立虛擬機器,您可以遵循標題為使用 Azure 入口網站建立 Linux 虛擬機器的文章
提示
本文中的步驟可能略有不同,具體取決於您從哪個入口網站展開作業。
本節將說明如何授與 VM 存取權以取得 Key Vault 中的祕密。 當您使用 Azure 資源受控識別時,您的程式碼可以取得存取權杖,以向支援 Microsoft Entra 驗證的資源進行驗證。
但是,並非所有 Azure 服務都支援 Microsoft Entra 驗證。 若要使用適用於 Azure 資源的受控識別搭配那些服務,請將服務認證儲存在 Azure Key Vault 中,並使用 VM 的受控識別來存取 Key Vault,以擷取認證。
首先,您需要建立 Key Vault,並將存取 Key Vault 的權利授與 VM 系統指派的受控識別。
登入 Azure 入口網站。
在左側導覽列的頂端,選取 [建立資源]。
在 [搜尋 Marketplace] 方塊中輸入 Key Vault 然後點擊 Enter 鍵。
從結果中選取 [Key Vault]。
選取 建立。
提供新金鑰保存庫的名稱。
填寫所有必要的資訊,並確定您選擇的訂用帳戶和資源群組,是您在本教學課程中用來建立虛擬機器的位置。
選取 [檢閱 + 建立],然後選取 [建立]。
建立祕密
接下來,您需要將祕密新增至 Key Vault,好讓您稍後可以使用在 VM 中執行的程式碼來擷取祕密。 在本節中,您將會使用 PowerShell, 但是相同概念適用於在此虛擬機器中執行的任何程式碼。
瀏覽到您新建立的 Key Vault。
選取 [祕密],然後選取 [新增]。
選取產生/匯入。
在 [建立祕密] 區段中,前往 [上傳選項],確定 [手動] 已經選取。
輸入密碼的名稱和值。 值可以是任何您想要的項目。
將啟動日期和到期日期保留空白,並確定 [啟用] 設定為 [是]。
選取 [建立] 來建立祕密。
授予存取權
虛擬機器所使用的受控識別需要存取權限,才能讀取 Key Vault 中儲存的祕密。
瀏覽到您新建立的 Key Vault。
從左側導覽中選取 [存取原則]。
選取新增存取原則。
在 [新增存取原則] 區段的 [從範本設定 (選用)] 下,從下拉式功能表中選擇 [祕密管理]。
選擇 [選取主體],然後在 [搜尋] 欄位中輸入您稍早建立的 VM 名稱。 在結果清單中選取 VM,然後選擇 [選取]。
選取 [新增]。
選取 [儲存]。
存取資料
若要完成這些步驟,您需要 SSH 用戶端。 如果您使用 Windows,您可以在適用於 Linux 的 Windows 子系統中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組。
重要
所有 Azure SDK 都支援 Azure.Identity 程式庫,可讓您輕鬆取得 Microsoft Entra 權杖以存取目標服務。 深入了解 Azure SDK 並存取 Azure.Identity 程式庫。
- 在入口網站中,瀏覽至您的 Linux VM,然後在 [概觀] 中選取 [連線]。
- 使用您所選擇的 SSH 用戶端來連線到 VM。
- 在終端機視窗中,使用 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.net' -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.net",
"token_type":"Bearer"}
您可以使用此存取權杖來向 Azure Key Vault 進行驗證。 下一個 CURL 要求會說明如何使用 CURL 和 Key Vault REST API 從 Key Vault 讀取密碼。 您需要 Key Vault 的 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.net/secrets/MyTestSecret/7c2204c6093c4d859bc5b9eff8f29050","attributes":{"enabled":true,"created":1505088747,"updated":1505088747,"recoveryLevel":"Purgeable"}}
當您從 Key Vault 擷取祕密後,便可以將其用於向需要名稱和密碼的服務進行驗證。
清除資源
當您準備清除資源時,請登入 Azure 入口網站,選取 [資源群組],然後找到並選取在本教學課程流程中建立的資源群組 (例如 mi-test
)。 您可以使用 [刪除資源群組] 命令,或透過 PowerShell 及 CLI (英文)。
使用 Linux VM 系統指派的受控識別來存取資源管理員中的資源群組
提示
根據您開始的入口網站,本文中的步驟可能略有不同。
本教學課程說明如何建立系統指派的身分識別,並將其指派給 Linux 虛擬機器 (VM),然後使用該身分識別存取 Azure Resource Manager (英文) API。 由 Azure 自動管理受控服務身分識別。 它們會啟用對支援 Microsoft Entra 驗證之服務的驗證,而不需要在程式碼中內嵌認證。
您將學習如何:
- 將您的 VM 存取權授與 Azure Resource Manager。
- 使用 VM 系統指派的受控識別取得存取權杖,以存取 Resource Manager。
使用系統管理員帳戶登入 Azure 入口網站。
瀏覽至 [資源群組] 索引標籤。
選取您想要授與 VM 受控識別存取權的資源群組。
從左側面板中,選取 [存取控制 (IAM)]。
選取 [新增],然後選取 [新增角色指派]。
在 [角色] 索引標籤中,選取 [讀者]。 此角色可以檢視所有資源,但無法進行任何變更。
在 [成員] 索引標籤中的 [存取權指派對象為] 選項中,選取 [受控識別],然後選取 [+ 選取成員]。
確認 [訂用帳戶] 下拉式清單中已列出適當的訂用帳戶。 針對 [資源群組],請選取 [所有資源群組]。
在 [管理身分識別] 下拉式清單中,選取 [虛擬機器]。
在 [選取] 選項中,選擇下拉式清單中的 VM,然後選取 [儲存]。
取得存取權杖
使用 VM 系統指派的受控識別,並呼叫 Resource Manager 以取得存取權杖。
若要完成這些步驟,您需要 SSH 用戶端。 如果您使用 Windows,您可以在 Windows 子系統 Linux 版中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組。
- 在 Azure 入口網站中,瀏覽至您的 Linux VM。
- 在 [概觀] 中,選取 [連線]。
- 使用您所選擇的 SSH 用戶端來連線到 VM。
- 在終端機視窗中,使用
curl
向 Azure 資源端點的本機受控識別提出要求,以取得 Azure Resource Manager 的存取權杖。 存取權杖的curl
要求如下。
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true
注意
resource
參數的值必須完全符合 Microsoft Entra ID 的預期。 使用 Resource Manager 資源識別碼時,必須在 URI 中包含後置斜線。
此回應包含您存取 Azure Resource Manager 所需的存取權杖。
回應:
{
"access_token":"eyJ0eXAiOi...",
"refresh_token":"",
"expires_in":"3599",
"expires_on":"1504130527",
"not_before":"1504126627",
"resource":"https://management.azure.com",
"token_type":"Bearer"
}
使用此存取權杖來存取 Azure Resource Manager。 例如,若要讀取您先前授與此 VM 存取權的資源群組詳細資料。 使用您稍早建立的值來取代 <SUBSCRIPTION-ID>
、<RESOURCE-GROUP>
和 <ACCESS-TOKEN>
。
注意
URL 區分大小寫,因此請確定您使用的是稍早在命名資源群組時所使用的相同大小寫,而且 resourceGroup
中的“G”為大寫。
curl https://management.azure.com/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":"westus",
"properties":
{
"provisioningState":"Succeeded"
}
}
使用 Linux VM 使用者指派的受控識別來存取 Resource Manager 中的資源群組
提示
根據您開始的入口網站,本文中的步驟可能略有不同。
本教學課程說明如何建立使用者指派的身分識別,並將其指派給 Linux 虛擬機器 (VM),然後使用該身分識別存取 Azure Resource Manager (英文) API。 由 Azure 自動管理受控服務身分識別。 它們會啟用對支援 Microsoft Entra 驗證之服務的驗證,而不需要在程式碼中內嵌認證。
您將學習如何:
- 將您的 VM 存取權授與 Azure Resource Manager。
- 使用 VM 系統指派的受控識別取得存取權杖,以存取 Resource Manager。
使用 az identity create,建立使用者指派的受控識別。 -g
參數會指定建立使用者指派受控識別的資源群組,而 -n
參數會指定其名稱。 請務必以您自己的值取代 <RESOURCE GROUP>
和 <UAMI NAME>
參數的值:
重要
建立使用者指派的受控識別時,名稱必須以字母或數字開頭,並且包含英數字元、連字號 (-) 和底線 (_) 的組合。 若要讓虛擬機器或虛擬機器擴展集的指派正常運作,名稱長度上限為 24 個字元。 如需詳細資訊,請參閱常見問題集和已知問題。
az identity create -g <RESOURCE GROUP> -n <UAMI NAME>
回應包含使用者所指派受控識別建立之後的詳細資料,與下列範例類似。 在使用者指派的受控識別中,請記下 id
值,下一步會用到:
{
"clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"clientSecretUrl": "https://control-westcentralus.identity.azure.net/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": "westcentralus",
"name": "<UAMI NAME>",
"principalId": "9012",
"resourceGroup": "<RESOURCE GROUP>",
"tags": {},
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "Microsoft.ManagedIdentity/userAssignedIdentities"
}
將身分識別指派給 Linux VM
使用者指派的受控識別可以由多個 Azure 資源上的用戶端使用。 請使用下列命令,將使用者指派的受控識別指派給單一虛擬機器。 針對 -IdentityID
參數,請使用前一個步驟中所傳回的 Id
屬性。
使用 az vm identity assign,將使用者指派的受控識別指派給 Linux VM。 請務必以您自己的值取代 <RESOURCE GROUP>
和 <VM NAME>
參數的值。 至於 --identities
參數值,請使用前一個步驟中所傳回的 id
屬性。
az vm identity assign -g <RESOURCE GROUP> -n <VM NAME> --identities "/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<UAMI NAME>"
在 Azure Resource Manager 中將存取權授與資源群組
受控識別會提供身分識別,可供程式碼用來要求存取權杖,以向支援 Microsoft Entra 驗證的資源 API 進行驗證。 在本教學課程中,您的程式碼將存取 Azure Resource Manager API。
您必須先將身分識別存取權授與 Azure Resource Manager 中的資源,您的程式碼才能存取 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 身分識別取得存取權杖,並使用它來呼叫 Resource Manager
提示
根據您開始的入口網站,本文中的步驟可能略有不同。
其餘教學課程要從稍早建立的 VM 繼續進行。
若要完成這些步驟,您需要 SSH 用戶端。 如果您使用 Windows,您可以在適用於 Linux 的 Windows 子系統中使用 SSH 用戶端。
登入 Azure 入口網站。
在入口網站中,瀏覽至 [虛擬機器],並移至您的 Linux 虛擬機器,在 [概觀] 中按一下 [連線]。 複製字串以連線到您的 VM。
使用您所選擇的 SSH 用戶端來連線到虛擬機器。 如果您使用 Windows,您可以在適用於 Linux 的 Windows 子系統中使用 SSH 用戶端。 如果您需要設定 SSH 用戶端金鑰的協助,請參閱如何在 Azure 上搭配 Windows 使用 SSH 金鑰,或如何在 Azure 中建立和使用 Linux VM 的 SSH 公開和私密金鑰組。
在終端機視窗中使用 CURL,向 Azure Instance Metadata Service (IMDS) 身分識別端點提出要求來取得 Azure Resource Manager 的存取權杖。
用來取得存取權杖的 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.azure.com/&client_id=<UAMI CLIENT ID>"
注意
resource
參數的值必須完全符合 Microsoft Entra ID 的預期。 使用 Resource Manager 資源識別碼時,必須在 URI 上包含結尾斜線。此回應包含您存取 Azure Resource Manager 所需的存取權杖。
回應範例:
{ "access_token":"eyJ0eXAiOi...", "refresh_token":"", "expires_in":"3599", "expires_on":"1504130527", "not_before":"1504126627", "resource":"https://management.azure.com", "token_type":"Bearer" }
使用存取權杖來存取 Azure Resource Manager,並讀取資源群組的屬性 (您已向使用者指派的受控識別授予該資源群組的存取權)。 請務必將
<SUBSCRIPTION ID>
、<RESOURCE GROUP>
取代為您先前指定的值,並將<ACCESS TOKEN>
取代為上一個步驟中所傳回的權杖。注意
URL 區分大小寫,因此請務必使用稍早在命名資源群組時所使用的相同大小寫,而且
resourceGroups
中的“G”為大寫。curl https://management.azure.com/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":"westus", "properties":{"provisioningState":"Succeeded"} }