Создание субъекта-службы Azure с помощью Azure CLI

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

Что такое субъект-служба Azure?

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

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

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

Создайте субъект-службу Azure с помощью команды az ad sp create-for-rbac.

Ключи appId и tenant отображаются в выходных данных команды az ad sp create-for-rbac и используются при аутентификации субъекта-службы. Запишите их значения, но при необходимости вы можете получить их в любой момент с помощью команды az ad sp list.

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

Предупреждение

При создании субъекта-службы Azure с помощью команды az ad sp create-for-rbac в выходные данные включаются учетные данные, которые необходимо защитить. Убедитесь, что эти учетные данные не включены в код, или проверьте учетные данные в системе управления версиями. В качестве альтернативы можно использовать управляемые удостоверения (если они доступны), чтобы не работать с учетными данными.

Чтобы снизить риск компрометации субъекта-службы, назначьте более конкретную роль и ограничьте область ресурсом или группой ресурсов. Дополнительные сведения см. в статье Шаги по добавлению назначения ролей.

Аутентификация на основе пароля

Если используется аутентификация на основе пароля, для вас будет создан случайный пароль. Если значение параметра --name не будет указано, для вас будет создано имя с меткой времени. Обязательно укажите --scopes, так как это значение не имеет значения по умолчанию. При желании вы можете задать назначение ролей позже с помощью команды az role assignment create.

# Create a service principal with required parameter
az ad sp create-for-rbac --scopes /subscriptions/mySubscriptionID

# Create a service principal for a resource group using a preferred name and role
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role reader \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

Вы также можете создать субъект-службу с помощью переменных.

let "randomIdentifier=$RANDOM*$RANDOM"  
servicePrincipalName="msdocs-sp-$randomIdentifier"
roleName="azureRoleName"
subscriptionID=$(az account show --query id -o tsv)
# Verify the ID of the active subscription
echo "Using subscription ID $subscriptionID"
resourceGroup="myResourceGroupName"

echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup"
az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup

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

Аутентификация на основе сертификата

Для аутентификации на основе сертификата используйте параметр --cert. Он требует наличия существующего сертификата. Убедитесь, что все средства, которые используют этот субъект-службу, имеют доступ к закрытому ключу сертификата. Сертификаты должны иметь формат ASCII, например PEM, CER или DER. Передайте сертификат в виде строки или воспользуйтесь форматом @path, чтобы загрузить сертификат из файла.

Примечание

В используемый PEM-файл нужно добавить CERTIFICATE к PRIVATE KEY.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert @/path/to/cert.pem

Можно добавить параметр --keyvault, чтобы использовать сертификат в Azure Key Vault. В таком случае значение --cert будет именем сертификата.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert certificateName \
                         --keyvault vaultName

Чтобы создать для аутентификации самозаверяющий сертификат, укажите параметр --create-cert:

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert

Выходные данные консоли:

Creating a role assignment under the scopes of "/subscriptions/myId"
Please copy C:\myPath\myNewFile.pem to a safe place.
When you run 'az login', provide the file path in the --password parameter
{
  "appId": "myAppId",
  "displayName": "myDisplayName",
  "fileWithCertAndPrivateKey": "C:\\myPath\\myNewFile.pem",
  "name": "http://myName",
  "password": null,
  "tenant": "myTenantId"
}

Содержимое нового PEM-файла:

-----BEGIN PRIVATE KEY-----
myPrivateKeyValue
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
myCertificateValue
-----END CERTIFICATE-----

Примечание

Команда az ad sp create-for-rbac --create-cert создает субъект-службу и PEM-файл. PEM-файл содержит правильно отформатированные PRIVATE KEY и CERTIFICATE.

Можно добавить параметр --keyvault для хранения сертификата в Azure Key Vault. При использовании --keyvault параметр --cert является обязательным.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert \
                         --cert certificateName \
                         --keyvault vaultName

Выходные данные включают ключ fileWithCertAndPrivateKey (если только сертификат не хранится в Key Vault). Значение этого ключа позволяет определить, где хранится сгенерированный сертификат. Обязательно скопируйте сертификат в безопасное расположение. В противном случае вы не сможете войти с помощью этого субъекта-службы.

В случае утраты доступа к закрытому ключу сертификата сбросьте учетные данные субъекта-службы.

Получение сертификата из Key Vault

Для получения сертификата и его закрытого ключа, которые хранятся в Key Vault, используйте команду az keyvault secret show. Преобразуйте сертификат в PEM-файл. В Key Vault имя секрета сертификата совпадает с именем самого сертификата.

az keyvault secret download --file /path/to/cert.pfx --vault-name VaultName --name CertName --encoding base64
openssl pkcs12 -in cert.pfx -passin pass: -out cert.pem -nodes

2. Получение существующего субъекта-службы

Список субъектов-служб в клиенте можно получить с помощью команды az ad sp list. По умолчанию эта команда возвращает первые 100 субъектов-служб для вашего клиента. Чтобы получить все субъекты-службы арендатора, используйте параметр --all. На получение такого списка может потребоваться длительное время, поэтому мы рекомендуем отфильтровать список с помощью следующих параметров:

  • --display-name — запрашивает субъекты-службы с префиксом, который совпадает с указанным именем. Отображаемое имя субъекта-службы представляет собой значение, заданное при создании с помощью параметра --name. Если вы не указали параметр --name при создании субъекта-службы, используется префикс имени azure-cli-.
  • --spn — отфильтровывает точные совпадения имен субъектов-служб. Имя субъекта-службы всегда начинается с https://. Если значение, которое вы использовали для аргумента --name, не было универсальным кодом ресурса (URI), им будет значение https:// с последующим отображаемым именем.
  • --show-mine — запрашивает только те субъекты-службы, которые были созданы пользователем, вошедшим в систему.
  • --filter — выполняет фильтрацию на стороне сервера с использованием фильтра OData. Мы рекомендуем использовать этот метод, а не фильтрацию на стороне клиента с указанием параметра CLI --query. Дополнительные сведения о фильтрах OData см. в статье Синтаксис выражений OData для предложений фильтрации и упорядочивания в службе "Поиск Azure".

Для объектов субъектов-служб возвращаются подробные сведения. Чтобы получить только те сведения, которые нужны для входа, используйте строку запроса [].{id:appId, tenant:appOwnerTenantId}. Например, чтобы получить сведения для входа ото всех субъектов-служб, созданных пользователем, вошедшим в систему, выполните команду:

az ad sp list --show-mine --query "[].{id:appId, tenant:appOwnerTenantId}"

Важно!

Команды az ad sp list или az ad sp show позволяют получить данные о пользователе или клиенте, но не о секретах аутентификации или способе аутентификации. Секреты для сертификатов в Key Vault можно извлечь с помощью команды az keyvault secret show, но по умолчанию другие секреты не сохраняются. Если вы забыли способ аутентификации или секрет, сбросьте учетные данные субъекта-службы.

3. Управление ролями субъекта-службы

В Azure CLI доступны следующие команды для управления назначением ролей:

Роль участник имеет все разрешения на чтение из учетной записи Azure и запись в нее. Роль читателя имеет больше ограничений, предоставляя права доступа только на чтение. Дополнительные сведения об управлении доступом на основе ролей см. в статье Встроенные роли для управления доступом на основе ролей в Azure.

В этом примере мы добавим роль читателя и удалим роль участника:

az role assignment create --assignee appID \
                          --role Reader \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

az role assignment delete --assignee appID \
                          --role Contributor \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

Добавление роли не ограничивает назначенные ранее разрешения. При ограничении разрешений субъекта-службы обязательно удалите роль участника (если она была назначена ранее).

Чтобы проверить изменения, выведите назначенные роли:

az role assignment list --assignee appID

4. Вход с помощью субъекта-службы

Войдите, чтобы протестировать разрешения и учетные данные нового субъекта-службы. Для входа с использованием субъекта-службы вам потребуются appId, tenant и учетные данные.

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

az login --service-principal --username appID --password PASSWORD --tenant tenantID

Чтобы войти с использованием сертификата, этот сертификат должен быть доступным локально как PEM- или DER-файл в формате ASCII. В используемый PEM-файл нужно добавить CERTIFICATE к PRIVATE KEY.

az login --service-principal --username appID --tenant tenantID --password /path/to/cert

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

5. Создание ресурса с помощью субъекта-службы

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

Чтобы войти с помощью субъекта-службы, вам потребуются appID, tenantID и password, возвращаемые в виде ответа при создании субъекта-службы.

  1. Выполните вход как субъект-служба.

    az login --service-principal --username appID --password PASSWORD --tenant tenantID
    
  2. Создайте группу ресурсов для хранения всех ресурсов, используемых для работы с одним кратким руководством, учебником или проектом разработки.

    az group create --location westus --name myResourceGroupName
    
  3. Создайте учетную запись хранения.

    Для службы хранилища Azure допустимы следующие значения параметра <KIND>:

    • BlobStorage
    • BlockBlobStorage
    • FileStorage
    • Память
    • Хранилище версии 2
    az storage account create --name myStorageAccountName --resource-group myResourceGroupName --kind <KIND> --sku F0 --location westus --yes
    
  4. Получите ключи ресурсов, которые вы будете использовать в коде для аутентификации в учетной записи хранения Azure.

    az storage account keys list --name myStorageAccountName --resource-group myResourceGroupName
    

6. Сброс учетных данных

Если вы потеряли учетные данные для субъекта-службы, воспользуйтесь командой az ad sp credential reset. Команда сброса принимает те же параметры, что и az ad sp create-for-rbac.

az ad sp credential reset --name myServicePrincipal_appID_or_name

7. Устранение неполадок

Недостаточно прав

Если у вашей учетной записи нет разрешения на создание субъекта-службы, командлет az ad sp create-for-rbac вернет сообщение об ошибке, информирующее о том, что у вас недостаточно привилегий для выполнения этой операции. Чтобы создать субъект-службу, обратитесь к своему администратору Azure Active Directory.

Недопустимый арендатор

Если вы указали недопустимый идентификатор подписки, вы увидите сообщение об ошибке "В запросе нет подписки или действительного поставщика ресурсов на уровне арендатора". Если вы используете переменные, выполните команду echo Bash, чтобы увидеть значение, передаваемое в ссылочную команду. Используйте команду az account set, чтобы изменить подписку, или узнайте, как управлять подписками Azure с помощью Azure CLI.

Группа ресурсов не найдена

Если вы указали недопустимое имя группы ресурсов, вы увидите сообщение об ошибке "Не удалось найти группу ресурсов «имя»". Если вы используете переменные, выполните команду echo Bash, чтобы увидеть значение, передаваемое как подписке, так и ссылочным командам. Используйте команду az group list, чтобы просмотреть группы ресурсов для текущей подписки, или узнайте как управлять группами ресурсов Azure с помощью Azure CLI.

Авторизация для выполнения действия

Если ваша учетная запись не позволяет назначать роли, вы увидите сообщение об ошибке о том, что ваша учетная запись не авторизована для выполнения действия Microsoft.Authorization/roleAssignments/write. Чтобы получить возможность управлять ролями, обратитесь к администратору Azure Active Directory.

См. также