使用服務主體向 Azure 進行驗證
本文說明如何使用服務主體向 Azure 驗證 Terraform。
在本文中,您將學會如何:
- 建立服務主體
- 在環境變數中指定服務主體認證
- 在 Terraform 提供者區塊中指定服務主體認證
建立服務主體
如果您沒有服務主體的存取權,請繼續進行本節來建立新的服務主體。 如果您有可以使用的服務主體,請跳至指定服務主體認證一節。
部署或使用 Azure 服務的自動化工具 (例如 Terraform),應一律具有受限制的權限。 有別於以完整權限使用者身分登入應用程式的作法,Azure 提供服務主體。
最常見的模式是以互動方式登入 Azure、建立服務主體、測試服務主體,然後使用該服務主體進行未來的驗證 (以互動方式或從您的指令碼)。
若要建立服務主體,請登入 Azure。 透過 Microsoft 帳戶向 Azure 進行驗證之後,請返回這裡。
如果您要從 Git Bash 建立服務主體,請設定
MSYS_NO_PATHCONV
環境變數。 (如果您使用 Cloud Shell,則不需要此步驟)。export MSYS_NO_PATHCONV=1
重點︰
- 您可以全域方式設定
MSYS_NO_PATHCONV
環境變數 (針對所有終端工作階段) 或本機 (僅適用於目前的工作階段)。 由於建立服務主體並非您經常執行的動作,此範例會設定目前工作階段的值。 若要全域設定此環境變數,請將設定新增至~/.bashrc
檔案。
- 您可以全域方式設定
若要建立服務主體,請執行 az ad sp create-for-rbac。
az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
重點︰
- 您可以將
<service-principal-name>
取代為環境的自訂名稱,或完全省略 參數。 如果您省略參數,則會根據目前的日期和時間產生服務主體名稱。 - 成功完成時,
az ad sp create-for-rbac
會顯示數個值。 下一個步驟會使用appId
、password
和tenant
值。 - 如果遺失,就無法擷取密碼。 因此,您應該將密碼儲存在安全的地方。 如果您忘記密碼,您可以重設服務主體認證。
- 本文中正在使用具有參與者角色的服務主體。 如需角色型存取控制 (RBAC) 角色的詳細資訊,請參閱 RBAC:內建角色。
- 建立服務主體的輸出包含敏感性認證。 請務必不要在程式碼中包含這些認證,或是將認證簽入原始檔控制中。
- 如需使用 Azure CLI 建立服務主體時選項的詳細資訊,請參閱使用 Azure CLI 建立 Azure 服務主體一文。
- 您可以將
指定服務主體認證
有幾種方式可以指定您的服務主體認證。 不過,基於安全性考慮,我們建議不要將認證儲存在提供者區塊中。 這項技術只會針對完整性和測試目的顯示。
在環境變數中指定服務主體認證
建立服務主體之後,您可以透過環境變數將其認證指定給 Terraform。
新增下列環境變數,以編輯
~/.bashrc
檔案。export ARM_SUBSCRIPTION_ID="<azure_subscription_id>" export ARM_TENANT_ID="<azure_subscription_tenant_id>" export ARM_CLIENT_ID="<service_principal_appid>" export ARM_CLIENT_SECRET="<service_principal_password>"
若要執行
~/.bashrc
腳本,請執行source ~/.bashrc
(或其縮寫的對等用法. ~/.bashrc
)。 您也可以結束並重新開啟 Cloud Shell,讓指令碼自動執行。. ~/.bashrc
設定環境變數之後,您可以確認其值,如下所示:
printenv | grep ^ARM*
重點︰
- 如需在 Terraform HCL 中使用環境變數的詳細資訊,請參閱 在 Terraform 執行中讀取和使用環境變數。
- 建立及套用 Terraform 執行計畫,會在服務主體相關聯的 Azure 訂用帳戶上進行變更。 如果您已登入一個 Azure 訂用帳戶,而環境變數指向第二個 Azure 訂用帳戶,實際上有時可能會造成混淆。 讓我們看下列範例以利說明。 假設您有兩個 Azure 訂用帳戶:SubA 和 SubB。 如果目前的 Azure 訂用帳戶是 SubA (透過
az account show
決定),而環境變數指向 SubB,則 Terraform 所做的任何變更都在 SubB 上。 因此,您必須登入您的 SubB 訂用帳戶,以執行 Azure CLI 命令或 Azure PowerShell 命令來檢視您的變更。
跳到區段, 後續步驟
在 Terraform 提供者區塊中指定服務主體認證
警告
在 Terraform 設定檔中指定 Azure 訂用帳戶認證的能力可能很方便,尤其是在測試時。 不過,不建議將認證儲存在可由非信任人員檢視的純文字檔中。
Azure 提供者區塊會定義可讓您指定 Azure 訂用帳戶驗證資訊的語法。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {}
subscription_id = "<azure_subscription_id>"
tenant_id = "<azure_subscription_tenant_id>"
client_id = "<service_principal_appid>"
client_secret = "<service_principal_password>"
}
# Your code goes here