Аутентификация пакета Azure SDK для Go с помощью субъекта-службы
В этом руководстве описано, как использовать пакет SDK Azure для Go для проверки подлинности в Azure с помощью субъекта-службы Azure с помощью секрета или сертификата.
Субъекты-службы Azure определяют политику доступа и разрешения в клиенте Microsoft Entra, обеспечивая основные функции, такие как проверка подлинности во время входа и авторизации во время доступа к ресурсам. Они удаляют необходимость использования личная учетная запись для доступа к ресурсам Azure. Субъект-службу можно назначить точные разрешения, необходимые для приложения, и разрабатывать их для этих разрешений, а не использовать личная учетная запись, что может иметь больше привилегий в клиенте, чем требуется приложению. Вы также можете использовать субъекты-службы для приложений, размещенных в локальной среде, которые должны использовать ресурсы Azure. Модуль Azure SDK для Go Azure Identity предоставляет удобный способ проверки подлинности в Azure с помощью субъекта-службы с помощью переменных среды и секрета или сертификата.
Следуйте указаниям из этого учебника, чтобы создать и выполнить аутентификацию с помощью Azure SDK для Go, используя субъект-службу.
Необходимые компоненты
- Подписка Azure. Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.
Установленный язык 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 для выполнения действий, описанных в этой статье:
- Если вы решили использовать Azure PowerShell локально:
- Установите последнюю версию модуля Az PowerShell.
- Подключитесь к учетной записи Azure с помощью командлета Connect-AzAccount.
- Если вы решили использовать Azure Cloud Shell:
- Дополнительные сведения см. в статье Общие сведения об Azure Cloud Shell.
- Если вы решили использовать 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" в хранилище ключей:
- Вариант 1. Создание субъекта-службы Azure с секретом.
- Вариант 2. Создание субъекта-службы Azure с сертификатом.
Дополнительные сведения о субъектах-службах 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
Запишите значения и tenant
appId
свойства из выходных данных. Они потребуются в следующем разделе.
После создания пароль субъекта-службы не может быть извлечен. Если вы забыли пароль, можно сбросить учетные данные субъекта-службы.
Вариант 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
Запишите значения и tenantId
appId
свойства из выходных данных. Они потребуются в следующем разделе.
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 и имеет соответствующие разрешения для хранилища ключей.
Создайте каталог
go-on-azure
в домашнем каталоге.mkdir ~/go-on-azure
Перейдите в каталог
go-on-azure
.cd ~/go-on-azure
Чтобы создать файл
go.mod
, выполнитеgo mod init
.go mod init go-on-azure
Чтобы установить необходимые модули 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"
Создайте файл
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") }
Создайте переменную среды с именем
KEY_VAULT_NAME
. В качестве значения переменной среды задайте имя Azure Key Vault, созданного ранее.export KEY_VAULT_NAME=<keyVaultName>
Замените
<keyVaultName>
именем экземпляра Azure Key Vault.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>
идентификатором приложения субъекта-службы.