使用受控識別向 Azure SDK for Go 進行驗證
在本教學課程中,您會設定具有受控識別的 Azure 虛擬機,以使用 Azure SDK for Go 向 Azure 進行驗證。
受控識別不需要直接將身分識別提供給 Azure 資源來管理認證。 指派給身分識別的許可權會將資源存取權授與支援受控識別的其他 Azure 資源,讓您不需要在應用程式中傳遞認證。 您可以使用受控識別來驗證和授權 Azure 裝載的應用程式與其他 Azure 資源。
請遵循本教學課程,將受控識別指派給虛擬機,並使用受控識別向 Azure 進行驗證。
必要條件
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
如果您想要使用 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 資源
開始之前,您必須建立新的資源群組、虛擬機和密鑰保存庫實例。
部署虛擬機器
將虛擬機部署至 Azure。 您可以執行 Go 程式代碼,從該虛擬機在 Azure 金鑰保存庫中建立秘密。
建立 Azure 資源群組。
az group create --name go-on-azure --location eastus
將
--location
參數變更為適合您環境的值。建立 Azure 虛擬機。
az vm create \ --resource-group go-on-azure \ --name go-on-azure-vm \ --image canonical:0001-com-ubuntu-server-jammy:22_04-lts:latest \ --admin-username azureuser \ --admin-password <password>
<password>
取代您的密碼。
若要深入瞭解支援受控識別的其他服務,請參閱 支援 Azure 資源的受控識別服務。
部署金鑰保存庫實例
執行下列命令來建立新的 Azure 金鑰儲存庫實例:
az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization
將取代 <keyVaultName>
為全域唯一名稱。
2.建立受控識別
Azure 支援兩種類型的受控識別;系統指派和使用者指派。
系統指派的身分識別會直接連結至 Azure 資源,且僅限於該資源。 使用者指派的身分識別是可指派給一或多個 Azure 資源的獨立資源。
若要深入了解系統指派與使用者指派之間的差異,請參閱 受控識別類型。
選擇下列其中一個選項:
選項 1:建立系統指派的身分識別
執行下列命令來建立系統指派的受控識別:
az vm identity assign -g go-on-azure -n go-on-azure-vm
選項 2:建立使用者指派的身分識別
執行下列命令來建立使用者指派的受控識別:
az identity create -g go-on-azure -n GoUserIdentity
az vm identity assign -g go-on-azure -n go-on-azure-vm --identities GoUserIdentity
若要深入瞭解,請參閱 使用 Azure CLI 在 Azure VM 上設定 Azure 資源的受控識別。
3.將角色指派給受控識別
建立受控識別之後,您可以指派角色來授與身分識別許可權以存取其他 Azure 資源。 在本教學課程中,您會將 的內建角色 Key Vault Secrets Officer
指派給受控識別,讓 Go 應用程式可以在金鑰保存庫實例內建立秘密。
選擇下列其中一個選項:
選項 1:將角色指派給系統指派的身分識別
執行下列命令,將角色指派 Key Vault Secrets Officer
給系統指派的受控識別:
#output system identity principal ID
az vm identity show --name go-on-azure-vm --resource-group go-on-azure --query principalId -o tsv
#output key vault ID
az keyvault show --name <keyVaultName> --query id -o tsv
az role assignment create --assignee <principalId> --role "Key Vault Secrets Officer" --scope <keyVaultId>
在第二個命令中,將 取代 <keyVaultName>
為您的金鑰保存庫名稱。 在最後一個命令中,將和 <keyVaultId>
取代<principalId>
為前兩個命令的輸出。
選項 2:將角色指派給使用者指派的身分識別
執行下列命令,將角色指派 Key Vault Secrets Officer
給使用者指派的受控識別:
#output user identity principal ID
az identity show --resource-group go-on-azure --name GoUserIdentity --query principalId -o tsv
#output key vault ID
az keyvault show --name <keyVaultName> --query id -o tsv
az role assignment create --assignee <principalId> --role "Key Vault Secrets Officer" --scope <keyVaultId>
在第二個命令中,將 取代 <keyVaultName>
為您的金鑰保存庫名稱。 在最後一個命令中,將和 <keyVaultId>
取代<principalId>
為前兩個命令的輸出。
若要深入瞭解 Azure 金鑰保存庫中的內建角色,請參閱使用 Azure 角色型訪問控制提供 金鑰保存庫 金鑰、憑證和秘密的存取權。 若要深入瞭解 Azure 中的內建角色,請參閱 Azure 內建角色。
4.使用 Go 建立金鑰保存庫秘密
接下來透過 SSH 連線到 Azure 虛擬機,安裝 Go 並建置 Go 套件。
在 Azure VM 上安裝 Go
取得 Azure 虛擬機的公用 IP 位址。
az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
透過 SSH 連線到 Azure VM。
ssh azureuser@<public-ip>
將取代
<public-ip>
為 Azure VM 的公用 IP 位址。安裝 Go
sudo add-apt-repository ppa:longsleep/golang-backports; sudo apt update; sudo apt install golang-go -y
建立 Go 套件
在主目錄中建立名稱
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() { keyVaultName := os.Getenv("KEY_VAULT_NAME") secretName := "quickstart-secret" secretValue := "createdWithGO" 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: &secretValue} resp, err := client.SetSecret(context.TODO(), secretName, 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() }
建立名為
KEY_VAULT_NAME
的環境變數。 將取代<keyVaultName>
為您的 Azure 金鑰保存庫實例名稱。export KEY_VAULT_NAME=<keyVaultName>
執行
go run
命令以建立金鑰保存庫秘密。go run main.go
成功時,輸出如下所示:
Name: https://<keyVaultName>.vault.azure.net/secrets/quickstart-secret/0e0b941824c4493bb3b83045a31b2bf7, Value: createdWithGO
您可以使用 Azure PowerShell、Azure CLI 或 Azure 入口網站 來確認金鑰保存庫密碼已建立。
注意
如果您使用 Azure CLI 或 Azure PowerShell,您必須確定 Azure 使用者帳戶已獲指派角色,以允許其讀取密鑰保存庫中的秘密,例如「金鑰保存庫 秘密人員」或「金鑰保存庫 秘密使用者」。
5.清除資源
如果您不想再使用在本文中建立的 Azure 資源,最好將其刪除。 刪除未使用的資源可協助您避免產生持續費用,並讓您的訂用帳戶保持不整整。 刪除您在本教學課程中使用的資源最簡單的方式,就是刪除資源群組。
az group delete --name go-on-azure --force-deletion-types Microsoft.Compute/virtualMachines --yes
自 force-deletion-type
變數會告知命令強制刪除資源群組中的 VM。 自 --yes
變數會告知命令不要要求確認。
上述命令會在 資源群組中的金鑰保存庫上執行虛刪除 。 若要從您的訂用帳戶永久移除它,請輸入下列命令:
az keyvault purge --name <keyVaultName> --no-wait
將 <keyVaultName>
取代為金鑰保存庫的名稱。