使用服務主體進行 Azure SDK for Go 驗證

在本教學課程中,您將使用 Azure SDK for Go,透過使用秘密或憑證向 Azure 服務主體進行驗證。

Azure 服務主體會定義 Microsoft Entra 租使用者中的存取原則和許可權。 啟用核心功能,例如在登入期間進行驗證,以及在資源存取期間進行授權。 拿掉使用個人帳戶存取 Azure 資源的需求。 Azure SDK for Go 的 Azure 身分識別 模組提供使用環境變數、秘密或憑證的服務主體向 Azure 進行驗證的便利方式

請遵循本教學課程,使用服務主體來建立 Azure SDK for Go 並進行驗證。

必要條件

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

1.設定您的環境

開始之前,請先建立新的資源群組和密鑰保存庫實例。

az group create --name go-on-azure --location eastus

az keyvault create --location eastus --name `<keyVaultName>` --resource-group go-on-azure

將取代 <keyVaultName> 為全域唯一名稱。 也請記 Id 下輸出中的 ,您將將其用於服務帳戶的範圍。

2.建立 Azure 服務主體

使用下列其中一種技術來建立 Azure 服務主體:

若要深入瞭解 Azure 服務主體,請參閱 服務主體物件

選項 1:使用秘密建立 Azure 服務主體

執行下列命令來建立 Azure 服務主體。

az ad sp create-for-rbac --name `<servicePrincipalName>` --role Contributor --scope <resourceGroupId>

將和 <resourceGroupId> 取代<servicePrincipalName>為適當的值。

請確定您複製 密碼 值 - 無法擷取。 如果您忘記密碼,請 重設服務主體認證

選項 2:使用憑證建立 Azure 服務主體

az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>

將和 <resourceGroupId> 取代<servicePrincipalName>為適當的值。

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

藉由使用 DefaultAzureCredential,您可以避免撰寫環境特定的程式代碼向 Azure 進行驗證。

DefaultAzureCredential使用 來定義環境變數來設定您的服務主體認證。

選擇下列其中一個選項來設定您的服務主體認證:

若要深入瞭解 DefaultAzureCredential,請參閱 使用 Azure SDK for Go 進行 Azure 驗證

選項 1:使用秘密進行驗證

定義下列環境變數:

變數名稱
AZURE_CLIENT_ID Azure 服務主體的應用程式標識碼
AZURE_TENANT_ID 應用程式的 Microsoft Entra 租使用者識別碼
AZURE_CLIENT_SECRET Azure 服務主體的密碼
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

選項 2:使用憑證進行驗證

變數名稱
AZURE_CLIENT_ID Azure 服務主體的應用程式標識碼
AZURE_TENANT_ID 應用程式的 Microsoft Entra 租使用者識別碼
AZURE_CLIENT_CERTIFICATE_PATH 憑證檔案的路徑,包括私鑰(不含密碼保護)
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

使用 DefaultAzureCredential 來驗證 ResourceClient

NewDefaultAzureCredential使用 Azure 身分識別模組的 函式來驗證 ResourceClient。

cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    log.Fatalf("failed to obtain a credential: %v", err)
}

4.範例程序代碼

使用下列程式代碼範例來驗證您的服務主體是否向 Azure 進行驗證,並具有資源群組的適當許可權。

  1. 在主目錄中建立名為 go-on-azure 的新目錄。

    mkdir ~/go-on-azure
    
  2. 變更為 go-on-azure 目錄。

    cd ~/go-on-azure
    
  3. 執行 go mod init 以建立 go.mod 檔案。

    go mod init go-on-azure
    
  4. 執行 go get 以安裝必要的 Go 模組。

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
    
  5. 建立名為 main.go 的檔案,並新增下列程序代碼。

    package main
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    	"github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
    )
    
    func createSecret(name, value string) {
    	keyVaultName := os.Getenv("KEY_VAULT_NAME")
    	keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.net/", keyVaultName)
    
    	cred, err := azidentity.NewDefaultAzureCredential(nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a credential: %v", err)
    	}
    
    	client, err := azsecrets.NewClient(keyVaultUrl, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create a client: %v", err)
    	}
    
    	resp, err := client.SetSecret(context.TODO(), name, value, nil)
    	if err != nil {
    		log.Fatalf("failed to create a secret: %v", err)
    	}
    
    	fmt.Printf("Name: %s, Value: %s\n", *resp.ID, *resp.Value)
    }
    
    func main() {
    	createSecret("ExamplePassword", "hVFkk965BuUv")
    }
    
    
  6. 建立名為的 KEY_VAULT_NAME環境變數。 將環境變數的值設定為先前建立的 Azure 金鑰保存庫 名稱。

    export KEY_VAULT_NAME=<KeyVaultName>
    

    將取代<KeyVaultName>為您的 Azure 金鑰保存庫 實例名稱。

  7. go run執行 命令以建立新的金鑰保存庫秘密。

     go run main.go
    

下一步