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

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

Azure 服務主體會在 Microsoft Entra 租使用者中定義存取原則和許可權,以在資源存取期間啟用驗證等核心功能。 他們不需要使用個人帳戶來存取 Azure 資源。 您可以將應用程式所需的確切許可權指派給服務主體,並針對這些許可權進行開發,而不是使用個人帳戶,這在您的租使用者中可能會比應用程式所需的許可權更多。 您也可以將服務主體用於裝載於內部部署且需要使用 Azure 資源的應用程式。 Azure SDK for Go Azure 身分識別 模組提供方便的方式,使用環境變數和秘密或憑證向 Azure 驗證服務主體。

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

必要條件

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

1.建立 Azure 資源

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

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

az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization

將取代 <keyVaultName> 為全域唯一名稱。

記下 id 命令輸出中的 az keyvault create 屬性。 您將在下一節中使用它來定義服務主體的授權範圍。 值 id 的格式如下: /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>

2.建立 Azure 服務主體

使用下列其中一種技術來建立 Azure 服務主體,並在密鑰保存庫上指派「金鑰保存庫 秘密人員」角色:

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

將「金鑰保存庫 秘密人員」角色指派給服務主體,授權它建立、讀取、更新及刪除密鑰保存庫中的秘密。 若要深入瞭解 Azure 金鑰保存庫的內建角色,請參閱使用 Azure 角色型訪問控制來提供 金鑰保存庫 金鑰、憑證和秘密的存取權。 若要深入瞭解 Azure 中的內建角色,請參閱 Azure 內建角色

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

執行下列命令來建立 Azure 服務主體,並將金鑰保存庫上的「金鑰保存庫 秘密人員」角色指派給它。

az ad sp create-for-rbac --name <servicePrincipalName> --role "Key Vault Secrets Officer" --scope <keyVaultId>

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

記下輸出中的 passwordtenantappId 屬性。 您在下一節中需要這些記錄值。

建立之後,就無法擷取服務主體密碼。 如果您忘記密碼,您可以 重設服務主體認證

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

執行下列命令來建立使用憑證的 Azure 服務主體,並在密鑰保存庫上指派「金鑰保存庫 秘密人員」角色。

az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>

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

記下輸出中的 fileWithCertAndPrivateKeytenantIdappId 屬性。 您在下一節中需要這些記錄值。

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 PEM 或 PKCS12 憑證檔案的路徑,包括私鑰。 如果您已遵循 Azure CLI 的步驟,檔案不會受到密碼保護。 如果您遵循 Azure PowerShell 的步驟,檔案會受到密碼保護,而且您也需要設定 AZURE_CLIENT_CERTIFICATE_PASSWORD 環境變數。
AZURE_CLIENT_CERTIFICATE_PASSWORD 您在建立服務主體時輸入的密碼。 只有在您遵循 Azure PowerShell 的步驟時才需要。
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 來驗證資源用戶端

設定環境變數之後,您可以在 DefaultAzureCredential Azure 身分識別模組中使用 來驗證資源用戶端。 下列程式代碼示範如何取得的 DefaultAzureCredential實例。

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

4.使用 Go 建立金鑰保存庫秘密

使用下列程式代碼範例來驗證您的服務主體是否向 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/security/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/security/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)
    	}
    
        params := azsecrets.SetSecretParameters{Value: &value}
        resp, err := client.SetSecret(context.TODO(), name, params, 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 Key Vault 的名稱。

    export KEY_VAULT_NAME=<keyVaultName>
    

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

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

     go run main.go
    

    成功時,輸出如下所示:

    Name: https://<keyVaultName>.vault.azure.net/secrets/ExamplePassword/1e697f71d0014761a65641226f2f057b, Value: hVFkk965BuUv
    

5.清除資源

如果您不想再使用在本文中建立的 Azure 資源,最好將其刪除。 刪除未使用的資源可協助您避免產生持續費用,並讓您的訂用帳戶保持不整整。 刪除您在本教學課程中使用的資源最簡單的方式,就是刪除資源群組。

az group delete --name go-on-azure --yes

--yes 變數會告知命令不要要求確認。

上述命令會在 資源群組中的金鑰保存庫上執行虛刪除 。 若要從您的訂用帳戶永久移除它,請輸入下列命令:

az keyvault purge --name <keyVaultName> --no-wait

<keyVaultName> 取代為金鑰保存庫的名稱。

最後,您應該移除應用程式註冊和服務主體。

az ad app delete --id <servicePrincipalAppId>

將取代 <servicePrincipalAppId> 為您服務主體的應用程式識別碼。

下一步