Аутентификация с помощью пакета Azure SDK для Go с использованием управляемого удостоверения

В этом руководстве вы настроите виртуальную машину Azure с управляемым удостоверением для проверки подлинности в Azure с помощью пакета SDK Azure для Go.

Управляемые удостоверения устраняют для вас необходимость в управлении учетными данными, предоставляя удостоверение непосредственно ресурсу 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.

Развертывание экземпляра хранилища ключей

Создайте экземпляр хранилища ключей, выполнив следующую команду:

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 на виртуальной машине Azure с помощью Azure CLI.

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

Затем подключитесь к виртуальной машине Azure по протоколу SSH, установите Go и выполните сборку пакета Go.

Установка Go на виртуальную машину Azure

  1. Получите общедоступный IP-адрес виртуальной машины Azure.

    az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
    
  2. Установите SSH-подключение к виртуальной машине Azure.

    ssh azureuser@<public-ip>
    

    Замените <public-ip> общедоступным IP-адресом, который присвоен виртуальной машине Azure.

  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, выполните go mod init.

    go mod init go-on-azure
    
  4. Чтобы установить необходимые модули Go, выполните go get.

    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 Key Vault, созданного ранее. Замените <KeyVaultName> именем экземпляра Azure Key Vault.

export KEY_VAULT_NAME=<KeyVaultName>

Затем выполните go run команду, чтобы создать секрет хранилища ключей.

go run main.go

Убедитесь, что секрет хранилища ключей создан с помощью Azure PowerShell, Azure CLI или портала Azure.

Следующие шаги