Поделиться через


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

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

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

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

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

  • Установленный язык Go версии 1.18 или более поздней

  • Если вы хотите использовать 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

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

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

az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization

Замените <keyVaultName> на глобально уникальное имя.

id Запишите свойство из выходных az keyvault create данных команды. Вы будете использовать его в следующем разделе, чтобы определить область авторизации для субъекта-службы. Значение id имеет следующую форму: /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>

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

Используйте один из следующих методов, чтобы создать субъект-службу Azure и назначить ему роль "Сотрудник по секретам Key Vault" в хранилище ключей:

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

Назначение роли "Специалист по секретам Key Vault" субъекту-службе позволяет ему создавать, читать, обновлять и удалять секреты в хранилище ключей. Дополнительные сведения о встроенных ролях для хранилища ключей Azure см. в статье Предоставление доступа к ключам Key Vault, сертификатам и секретам с помощью управления доступом на основе ролей Azure. Дополнительные сведения о встроенных ролях в Azure см. в статье о встроенных ролях Azure.

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

Выполните следующие команды, чтобы создать субъект-службу Azure и назначить ему роль "Специалист по секретам Key Vault" в хранилище ключей.

az ad sp create-for-rbac --name <servicePrincipalName> --role "Key Vault Secrets Officer" --scope <keyVaultId>

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

passwordЗапишите значения и tenantappId свойства из выходных данных. Они потребуются в следующем разделе.

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

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

Выполните следующие команды, чтобы создать субъект-службу Azure, использующий сертификат, и назначить ей роль "Офицер секретов Key Vault" в хранилище ключей.

az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>

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

fileWithCertAndPrivateKeyЗапишите значения и tenantIdappId свойства из выходных данных. Они потребуются в следующем разделе.

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 Путь к файлу сертификата PEM или PKCS12, включая закрытый ключ. Если вы выполнили действия для Azure CLI, файл не защищен паролем. Если вы выполнили действия по Azure PowerShell, файл защищен паролем, и вам также потребуется задать AZURE_CLIENT_CERTIFICATE_PASSWORD переменную среды.
AZURE_CLIENT_CERTIFICATE_PASSWORD Пароль, введенный при создании субъекта-службы. Требуется только в том случае, если вы выполнили действия по Azure PowerShell.
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 для проверки подлинности клиента ресурсов

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

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

4. Создание секрета хранилища ключей с помощью Go

Используйте следующий пример кода, чтобы убедиться, что субъект-служба проходит проверку подлинности в 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/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(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)
    	}
    
        params := azsecrets.SetSecretParameters{Value: &value}
        resp, err := client.SetSecret(context.TODO(), name, 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("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
    

    При успешном выполнении выходные данные похожи на следующие:

    Name: https://<keyVaultName>.vault.azure.net/secrets/ExamplePassword/1e697f71d0014761a65641226f2f057b, Value: hVFkk965BuUv
    

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

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

az group delete --name go-on-azure --yes

Аргумент --yes указывает команде не запрашивать подтверждение.

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

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

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

Наконец, необходимо удалить регистрацию приложения и субъект-службу.

az ad app delete --id <servicePrincipalAppId>

Замените <servicePrincipalAppId> идентификатором приложения субъекта-службы.

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