Аутентификация пакета Azure SDK для Go с помощью субъекта-службы

Во время работы с этим учебником вы будете использовать пакет Azure SDK для Go, чтобы выполнить аутентификацию в Azure с помощью субъекта-службы Azure, используя либо секрет, либо сертификат.

Субъекты-службы Azure определяют политику доступа и разрешения в клиенте Microsoft Entra. Обеспечивая базовые функции, включая аутентификацию во время входа, а также авторизацию во время получения доступа к ресурсам. Избавляя от необходимости использовать личные учетные записи для доступа к ресурсам Azure. Модуль удостоверения Azure пакета Azure SDK для Go предоставляет удобный способ аутентификации в Azure с помощью субъекта-службы, используя переменные среды, секрет или сертификат.

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

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

1. Настройка среды

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

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

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

Замените <keyVaultName> на глобально уникальное имя. Кроме того, обратите внимание на Id выходные данные, используйте его для область учетной записи службы.

2. Создание субъекта-службы Azure

Чтобы создать субъект-службу Azure используйте один из следующих методов:

Дополнительные сведения о субъектах-службах Azure см. в разделе Объект субъекта-службы.

Вариант 1. Создание субъекта-службы Azure с секретом

Чтобы создать субъект-службу Azure, выполните следующие команды.

az ad sp create-for-rbac --name `<servicePrincipalName>` --role Contributor --scope <resourceGroupId>

Замените <servicePrincipalName> и <resourceGroupId> соответствующими значениями.

Обязательно скопируйте это значение пароля, так как его нельзя получить повторно. Если вы забыли пароль, сбросьте учетные данные для субъекта-службы.

Вариант 2. Создание субъекта-службы Azure с сертификатом

az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>

Замените <servicePrincipalName> и <resourceGroupId> соответствующими значениями.

3. Аутентификация в Azure с помощью субъекта-службы

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

Используйте DefaultAzureCredential для настройки учетных данных субъекта-службы, определив переменные среды.

Чтобы настроить учетные данные субъекта-службы, выберите один из следующих вариантов:

Дополнительные сведения о DefaultAzureCredential см. в статье Аутентификация Azure с помощью Azure SDK для Go.

Вариант 1. Аутентификация с помощью секрета

Определите следующие переменные среды:

Имя переменной Значение
AZURE_CLIENT_ID Идентификатор приложения субъекта-службы Azure
AZURE_TENANT_ID Идентификатор клиента Microsoft Entra приложения
AZURE_CLIENT_SECRET Пароль субъекта-службы Azure
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

Вариант 2. Аутентификация с помощью сертификата

Имя переменной Значение
AZURE_CLIENT_ID Идентификатор приложения субъекта-службы Azure
AZURE_TENANT_ID Идентификатор клиента Microsoft Entra приложения
AZURE_CLIENT_CERTIFICATE_PATH Путь к файлу сертификата, включая закрытый ключ (без защиты паролем)
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

Использование DefaultAzureCredential для аутентификации ResourceClient

Используйте функцию NewDefaultAzureCredential модуля удостоверения Azure для аутентификации ResourceClient.

cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    log.Fatalf("failed to obtain a credential: %v", err)
}

4. Пример кода

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

  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/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(name, value string) {
    	keyVaultName := os.Getenv("KEY_VAULT_NAME")
    	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(), name, value, 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("ExamplePassword", "hVFkk965BuUv")
    }
    
    
  6. Создайте переменную среды с именем KEY_VAULT_NAME. В качестве значения переменной среды задайте имя Azure Key Vault, созданного ранее.

    export KEY_VAULT_NAME=<KeyVaultName>
    

    Замените <KeyVaultName> именем экземпляра Azure Key Vault.

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

     go run main.go
    

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