Azure資源託管標識淺析和實踐


生成雲應用程序時須要應對的常見挑戰是,如何管理代碼中用於雲服務身份驗證的憑據。 保護這些憑據是一項重要任務。 理想狀況下,這些憑據永遠不會出如今開發者工做站上,也不會被簽入源代碼管理系統中。雖然 Azure Key Vault 可用於安全存儲憑據、機密以及其餘密鑰,但代碼須要經過 Key Vault 的身份驗證才能檢索它們。shell

Azure Active Directory (Azure AD) 中的 Azure 資源託管標識功能能夠解決此問題。 此功能爲 Azure 服務提供了 Azure AD 中的自動託管標識。 可使用此標識向支持 Azure AD 身份驗證的任何服務(包括 Key Vault)證實身份,無需在代碼中放入任何憑據。json

Azure 資源託管標識的工做原理:api

託管標識分爲兩種類型:安全

  • 系統分配託管標識 直接在 Azure 服務實例上啓用。 啓用標識後,Azure 將在實例的訂閱信任的 Azure AD 租戶中建立實例的標識。建立標識後,系統會將憑據預配到實例。 系統分配標識的生命週期直接綁定到啓用它的 Azure 服務實例。 若是實例遭刪除,Azure 會自動清理 Azure AD 中的憑據和標識。app

  • 用戶分配託管標識 是做爲獨立的 Azure 資源建立的。 在建立過程當中,Azure 會在由所用訂閱信任的 Azure AD 租戶中建立一個標識。 在建立標識後,能夠將標識分配到一個或多個 Azure 服務實例。 用戶分配標識的生命週期與它所分配到的 Azure 服務實例的生命週期是分開管理的。ide

下圖演示了託管服務標識如何與 Azure 虛擬機 (VM) 協同工做:對象

clip_image002

系統分配託管標識如何與 Azure VM 協同工做:blog

1. Azure 資源管理器收到請求,要求在 VM 上啓用系統分配託管標識。token

2. Azure 資源管理器在 Azure AD 中建立與 VM 標識相對應的服務主體。 服務主體在此訂閱信任的 Azure AD 租戶中建立。生命週期

3. Azure 資源管理器在 VM 上配置標識:使用服務主體客戶端 ID 和證書更新 Azure 實例元數據服務標識終結點。

4. VM 有了標識之後,請根據服務主體信息向 VM 授予對 Azure 資源的訪問權限。 若要調用 Azure 資源管理器,請在 Azure AD 中使用基於角色的訪問控制 (RBAC) 向 VM 服務主體分配相應的角色。 若要調用 Key Vault,請授予代碼對 Key Vault 中特定機密或密鑰的訪問權限。

5. 在 VM 上運行的代碼能夠從只能從 VM 中訪問的一個終結點請求令牌(另外一個已經棄用):

  • Azure 實例元數據服務標識終結點(推薦):http://169.254.169.254/metadata/identity/oauth2/token

  •        resource 參數指定了要向其發送令牌的服務。 若要向 Azure 資源管理器進行身份驗證,請使用 resource=https://management.azure.com/。

  •        API 版本參數指定 IMDS 版本,請使用 api-version=2018-02-01 或更高版本。

6. 調用了 Azure AD,以便使用在步驟 3 中配置的客戶端 ID 和證書請求訪問令牌(在步驟 5 中指定)。 Azure AD 返回 JSON Web 令牌 (JWT) 訪問令牌。

7. 代碼在調用支持 Azure AD 身份驗證的服務時發送訪問令牌。

用戶分配託管標識如何與 Azure VM 協同工做:

1. Azure 資源管理器收到請求,要求建立用戶分配託管標識。

2. Azure 資源管理器在 Azure AD 中建立與用戶分配託管標識相對應的服務主體。服務主體在此訂閱信任的 Azure AD 租戶中建立。

3. Azure 資源管理器收到請求,要求在 VM 上配置用戶分配託管標識:使用用戶分配託管標識服務主體客戶端 ID 和證書更新 Azure 實例元數據服務標識終結點。

4. 建立用戶分配託管標識之後,請根據服務主體信息向標識授予對 Azure 資源的訪問權限。 若要調用 Azure 資源管理器,請在 Azure AD 中使用 RBAC 向用戶分配標識的服務主體分配相應的角色。若要調用 Key Vault,請授予代碼對 Key Vault 中特定機密或密鑰的訪問權限。

5. 在 VM 上運行的代碼能夠從只能從 VM 中訪問的一個終結點請求令牌(另外一個已經棄用):

  • Azure 實例元數據服務標識終結點(推薦):http://169.254.169.254/metadata/identity/oauth2/token

  • resource 參數指定了要向其發送令牌的服務。 若要向 Azure 資源管理器進行身份驗證,請使用 resource=https://management.azure.com/。

  • API 版本參數指定 IMDS 版本,請使用 api-version=2018-02-01 或更高版本。

6. 調用了 Azure AD,以便使用在步驟 3 中配置的客戶端 ID 和證書請求訪問令牌(在步驟 5 中指定)。 Azure AD 返回 JSON Web 令牌 (JWT) 訪問令牌。

7. 代碼在調用支持 Azure AD 身份驗證的服務時發送訪問令牌。

=============================================================================================

下面簡單介紹下如何使用啓用了系統分配的託管標識的 Windows 虛擬機來訪問 Azure 資源管理器 API

在資源組下面點擊訪問控制,而後添加角色分配

clip_image004

選擇角色並將訪問權限分配到虛擬機

clip_image005

而後登陸該虛擬機,打開powershell,執行以下命令。使用 Invoke-WebRequest cmdlet,向 Azure 資源終結點的本地託管標識發出請求以獲取 Azure 資源管理器的訪問令牌。

$response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}

clip_image007

接下來,提取完整響應,響應以 JavaScript 對象表示法 (JSON) 格式字符串的形式存儲在 $response 對象中。

1. $content = $response.Content | ConvertFrom-Json

 

clip_image009

而後從響應中提取訪問令牌。

1. $ArmToken = $content.access_token

 

clip_image011

最後,使用訪問令牌調用 Azure 資源管理器。 在此示例中,咱們還使用 Invoke-WebRequest cmdlet 調用 Azure 資源管理器,並將訪問令牌包含在受權標頭中。

(Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{ Authorization ="Bearer $ArmToken"}).content

執行命令後將顯示資源組的相關信息。

clip_image013

爲了驗證權限,咱們去請求別的資源組的信息,結果會提示你沒有權限去讀取。

clip_image015

相關文章
相關標籤/搜索