共用方式為


使用受控識別向 Azure SDK for Go 進行驗證

在本教學課程中,您會設定具有受控識別的 Azure 虛擬機,以使用 Azure SDK for Go 向 Azure 進行驗證。

受控識別不需要直接將身分識別提供給 Azure 資源來管理認證。 指派給身分識別的許可權會將資源存取權授與支援受控識別的其他 Azure 資源,讓您不需要在應用程式中傳遞認證。 您可以使用受控識別來驗證和授權 Azure 裝載的應用程式與其他 Azure 資源。

請遵循本教學課程,將受控識別指派給虛擬機,並使用受控識別向 Azure 進行驗證。

必要條件

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

1.建立 Azure 資源

開始之前,您必須建立新的資源群組、虛擬機和密鑰保存庫實例。

部署虛擬機器

將虛擬機部署至 Azure。 您可以執行 Go 程式代碼,從該虛擬機在 Azure 金鑰保存庫中建立秘密。

  1. 建立 Azure 資源群組。

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

    --location 參數變更為適合您環境的值。

  2. 建立 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

  1. 取得 Azure 虛擬機的公用 IP 位址。

    az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
    
  2. 透過 SSH 連線到 Azure VM。

    ssh azureuser@<public-ip>
    

    將取代 <public-ip> 為 Azure VM 的公用 IP 位址。

  3. 安裝 Go

    sudo add-apt-repository ppa:longsleep/golang-backports;
    sudo apt update;
    sudo apt install golang-go -y
    

建立 Go 套件

  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() {
        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()
    }
    
    
  6. 建立名為 KEY_VAULT_NAME 的環境變數。 將取代 <keyVaultName> 為您的 Azure 金鑰保存庫實例名稱。

    export KEY_VAULT_NAME=<keyVaultName>
    
  7. 執行 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> 取代為金鑰保存庫的名稱。

下一步