共用方式為


使用服務主體向 Azure 進行驗證

本文說明如何使用服務主體向 Azure 驗證 Terraform。

在本文中,您將學會如何:

  • 建立服務主體
  • 在環境變數中指定服務主體認證
  • 在 Terraform 提供者區塊中指定服務主體認證

建立服務主體

如果您沒有服務主體的存取權,請繼續進行本節來建立新的服務主體。 如果您有可以使用的服務主體,請跳至指定服務主體認證一節

部署或使用 Azure 服務的自動化工具 (例如 Terraform),應一律具有受限制的權限。 有別於以完整權限使用者身分登入應用程式的作法,Azure 提供服務主體。

最常見的模式是以互動方式登入 Azure、建立服務主體、測試服務主體,然後使用該服務主體進行未來的驗證 (以互動方式或從您的指令碼)。

  1. 若要建立服務主體,請登入 Azure。 透過 Microsoft 帳戶向 Azure 進行驗證之後,請返回這裡。

  2. 如果您要從 Git Bash 建立服務主體,請設定 MSYS_NO_PATHCONV 環境變數。 (如果您使用 Cloud Shell,則不需要此步驟)。

    export MSYS_NO_PATHCONV=1    
    

    重點︰

    • 您可以全域方式設定 MSYS_NO_PATHCONV 環境變數 (針對所有終端工作階段) 或本機 (僅適用於目前的工作階段)。 由於建立服務主體並非您經常執行的動作,此範例會設定目前工作階段的值。 若要全域設定此環境變數,請將設定新增至 ~/.bashrc 檔案。
  3. 若要建立服務主體,請執行 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 會顯示數個值。 下一個步驟會使用 appIdpasswordtenant 值。
    • 如果遺失,就無法擷取密碼。 因此,您應該將密碼儲存在安全的地方。 如果您忘記密碼,您可以重設服務主體認證
    • 本文中正在使用具有參與者角色的服務主體。 如需角色型存取控制 (RBAC) 角色的詳細資訊,請參閱 RBAC:內建角色
    • 建立服務主體的輸出包含敏感性認證。 請務必不要在程式碼中包含這些認證,或是將認證簽入原始檔控制中。
    • 如需使用 Azure CLI 建立服務主體時選項的詳細資訊,請參閱使用 Azure CLI 建立 Azure 服務主體一文。

指定服務主體認證

有幾種方式可以指定您的服務主體認證。 不過,基於安全性考慮,我們建議不要將認證儲存在提供者區塊中。 這項技術只會針對完整性和測試目的顯示。

在環境變數中指定服務主體認證

建立服務主體之後,您可以透過環境變數將其認證指定給 Terraform。

  1. 新增下列環境變數,以編輯 ~/.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>"
    
  2. 若要執行 ~/.bashrc 腳本,請執行 source ~/.bashrc (或其縮寫的對等用法 . ~/.bashrc)。 您也可以結束並重新開啟 Cloud Shell,讓指令碼自動執行。

    . ~/.bashrc
    
  3. 設定環境變數之後,您可以確認其值,如下所示:

    printenv | grep ^ARM*
    

    重點︰

    • 如同任何環境變數,若要從 Terraform 指令碼中存取 Azure 訂用帳戶值,請使用下列語法:${env.<environment_variable>}。 例如,若要存取 ARM_SUBSCRIPTION_ID 值,請指定 ${env.ARM_SUBSCRIPTION_ID}
    • 建立及套用 Terraform 執行計畫,會在服務主體相關聯的 Azure 訂用帳戶上進行變更。 如果您已登入一個 Azure 訂用帳戶,而環境變數指向第二個 Azure 訂用帳戶,實際上有時可能會造成混淆。 讓我們看下列範例以利說明。 假設您有兩個 Azure 訂用帳戶:SubA 和 SubB。 如果目前的 Azure 訂用帳戶是 SubA (透過 az account show 決定),而環境變數指向 SubB,則 Terraform 所做的任何變更都在 SubB 上。 因此,您必須登入您的 SubB 訂用帳戶,以執行 Azure CLI 命令或 Azure PowerShell 命令來檢視您的變更。
  4. 跳到區段, 後續步驟

在 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

下一步