使用服務主體進行 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 訂用帳戶,請在開始前建立免費帳戶。
Go 已安裝:版本 1.18 或更高版本
如果您想要使用 Azure CLI 來執行本文中的步驟:
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
如果您想要使用 Azure PowerShell 執行本文中的步驟:
- 如果您選擇在本機使用 Azure PowerShell:
- 安裝最新版的 Az PowerShell 模組。
- 使用 Connect-AzAccount Cmdlet 連線至 Azure 帳戶。
- 如果您選擇使用 Azure Cloud Shell:
- 請參閱 Azure Cloud Shell 概觀 以取得詳細資訊。
- 如果您選擇在本機使用 Azure PowerShell:
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>
為適當的值。
記下輸出中的 password
、 tenant
和 appId
屬性。 您在下一節中需要這些記錄值。
建立之後,就無法擷取服務主體密碼。 如果您忘記密碼,您可以 重設服務主體認證。
選項 2:使用憑證建立 Azure 服務主體
執行下列命令來建立使用憑證的 Azure 服務主體,並在密鑰保存庫上指派「金鑰保存庫 秘密人員」角色。
az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>
將和 <keyVaultId>
取代<servicePrincipalName>
為適當的值。
記下輸出中的 fileWithCertAndPrivateKey
、 tenantId
和 appId
屬性。 您在下一節中需要這些記錄值。
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 進行驗證,並具有金鑰保存庫的適當許可權。
在主目錄中建立名為
go-on-azure
的新目錄。mkdir ~/go-on-azure
變更為
go-on-azure
目錄。cd ~/go-on-azure
執行
go mod init
以建立go.mod
檔案。go mod init go-on-azure
執行
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"
建立名為
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") }
建立名為
KEY_VAULT_NAME
的環境變數。 將環境變數的值設為先前所建立 Azure Key Vault 的名稱。export KEY_VAULT_NAME=<keyVaultName>
將取代
<keyVaultName>
為您的 Azure 金鑰保存庫 實例名稱。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>
為您服務主體的應用程式識別碼。