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

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

Управляемые удостоверения устраняют для вас необходимость в управлении учетными данными, предоставляя удостоверение непосредственно ресурсу Azure. Разрешения, назначенные удостоверению, предоставляют ресурсу доступ к другим ресурсам Azure, поддерживающим управляемые удостоверения, удаляя необходимость передачи учетных данных в приложении. Управляемые удостоверения можно использовать для проверки подлинности и авторизации размещенных в Azure приложений с другими ресурсами Azure.

Следуйте указаниям из этого учебника, чтобы назначить управляемое удостоверение виртуальной машине и пройти аутентификацию в Azure с помощью управляемого удостоверения.

Необходимые компоненты

  • Если вы хотите использовать Azure CLI для выполнения действий, описанных в этой статье:

    • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

    • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

      • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

      • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

      • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Если вы хотите использовать Azure PowerShell для выполнения действий, описанных в этой статье:

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.

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

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

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

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> имя хранилища ключей. В последней команде замените <principalId> и <keyVaultId> на выходные данные из первых двух команд.

Вариант 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> имя хранилища ключей. В последней команде замените <principalId> и <keyVaultId> на выходные данные из первых двух команд.

Дополнительные сведения о встроенных ролях в хранилище ключей Azure см. в статье Предоставление доступа к ключам Key Vault, сертификатам и секретам с помощью управления доступом на основе ролей Azure. Дополнительные сведения о встроенных ролях в Azure см. в статье о встроенных ролях 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 в корневом каталоге.

    mkdir ~/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/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 назначена роль, которая позволяет ему читать секреты в хранилище ключей, например "Сотрудник по секретам Key Vault" или "Пользователь секретов Key Vault".

5. Очистка ресурсов

Если вы больше не хотите использовать ресурсы Azure, созданные в этой статье, рекомендуется удалить их. Удаление неиспользуемых ресурсов помогает избежать текущих расходов и не загромождает подписку. Самый простой способ удалить ресурсы, используемые в этом руководстве, — удалить группу ресурсов.

az group delete --name go-on-azure --force-deletion-types Microsoft.Compute/virtualMachines --yes

Аргумент force-deletion-type сообщает команде принудительное удаление виртуальных машин в группе ресурсов. Аргумент --yes указывает команде не запрашивать подтверждение.

Предыдущая команда выполняет обратимое удаление в хранилище ключей в группе ресурсов. Чтобы окончательно удалить ее из подписки, введите следующую команду:

az keyvault purge --name <keyVaultName> --no-wait

Замените <keyVaultName> именем своего хранилища ключей.

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