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

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

受控識別不需要直接將身分識別提供給 Azure 資源來管理認證。 指派給身分識別的許可權會將資源存取權授與支援受控識別的其他 Azure 資源。 拿掉將認證傳遞至應用程式的需求。

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

必要條件

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

1.設定您的環境

開始之前,您必須設定環境。

部署虛擬機器

將虛擬機部署至 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:ubuntuserver:19.04:latest \
    --admin-username azureuser \
    --admin-password <password>
    

    <password>取代您的密碼。

若要深入瞭解支援受控識別的其他服務,請參閱 支援 Azure 資源的受控識別服務。

部署金鑰保存庫實例

執行下列命令來建立新的 Azure 金鑰儲存庫實例:

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

將取代 <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 <UserIdentityId>

將取代 <UserIdentityId> 為受控用戶識別的標識碼。

若要深入瞭解,請參閱 使用 Azure CLI 在 Azure VM 上設定 Azure 資源的受控識別。

3.將角色指派給受控識別

建立受控識別之後,您可以指派角色來授與身分識別許可權以存取其他 Azure 資源。 在本教學課程中,您會將 的內建角色 Key Vault Contributor 指派給受控識別,讓 Go 應用程式可以在金鑰保存庫實例內建立秘密。

選擇下列其中一個選項:

選項 1:將角色指派給系統指派的身分識別

執行下列命令,將角色指派 Key Vault Contributor 給系統指派的受控識別:

#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
scope=$(az keyvault show --name go-on-azure-kv --query id -o tsv)

az role assignment create --assignee '<principalId>' --role 'Key Vault Contributor' --scope '<keyVaultId>'

選項 2:將角色指派給使用者指派的身分識別

執行下列命令,將角色指派 Key Vault Contributor 給使用者指派的受控識別:

#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 go-on-azure-kv --query id -o tsv

az role assignment create --assignee '<principalId>' --role 'Key Vault Contributor' --scope '<keyVaultId>'

若要深入瞭解內建角色,請參閱 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 的新目錄。

    mkidr ~/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() {
        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)
        }
    
        resp, err := client.SetSecret(context.TODO(), secretName, secretValue, 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環境變數。 將環境變數的值設定為先前建立的 Azure 金鑰保存庫 名稱。 將取代<KeyVaultName>為您的 Azure 金鑰保存庫 實例名稱。

export KEY_VAULT_NAME=<KeyVaultName>

接下來,執行 go run 命令以建立金鑰保存庫秘密。

go run main.go

確認已使用 Azure PowerShell、Azure CLI 或 Azure 入口網站 建立密鑰保存庫密碼。

下一步