Azure CLI で Azure サービス プリンシパルを作成するCreate an Azure service principal with Azure CLI

Azure サービスを使用する自動化ツールのアクセス許可は、常に制限されている必要があります。Automated tools that use Azure services should always have restricted permissions. 完全な特権を持つユーザーとしてアプリケーションをサインインさせる代わりに、Azure にはサービス プリンシパルが用意されています。Instead of having applications sign in as a fully privileged user, Azure offers service principals.

Azure サービス プリンシパルは、Azure リソースにアクセスするアプリケーション、ホステッド サービス、および自動化ツールで使用するために作成される ID です。An Azure service principal is an identity created for use with applications, hosted services, and automated tools to access Azure resources. このアクセスはサービス プリンシパルに割り当てられているロールによって制限されるため、どのリソースに、どのレベルでアクセスできるかを制御することができます。This access is restricted by the roles assigned to the service principal, giving you control over which resources can be accessed and at which level. セキュリティ上の理由から、自動化ツールにはユーザー ID でのログインを許可するのではなく、常にサービス プリンシパルを使用することを推奨します。For security reasons, it's always recommended to use service principals with automated tools rather than allowing them to log in with a user identity.

この記事では、Azure CLI を使用して、サービス プリンシパルの作成、情報取得、およびリセットを行うための手順について説明します。This article shows you the steps for creating, getting information about, and resetting a service principal with the Azure CLI.

サービス プリンシパルの作成Create a service principal

サービス プリンシパルは、az ad sp create-for-rbac コマンドを使用して作成します。Create a service principal with the az ad sp create-for-rbac command. サービス プリンシパルを作成する際に、サービス プリンシパルが使用するサインイン認証の種類を選択します。When creating a service principal, you choose the type of sign-in authentication it uses.

注意

ご利用のアカウントにサービス プリンシパルを作成するためのアクセス許可がない場合は、az ad sp create-for-rbac から "この操作を完了するのに十分な特権がありません" というエラー メッセージが返されます。If your account doesn't have permission to create a service principal, az ad sp create-for-rbac will return an error message containing "Insufficient privileges to complete the operation." サービス プリンシパルを作成するには、Azure Active Directory 管理者にお問い合わせください。Contact your Azure Active Directory admin to create a service principal.

サービス プリンシパルで使用できる認証には、パスワードベースの認証と証明書ベースの認証の 2 種類があります。There are two types of authentication available for service principals: Password-based authentication, and certificate-based authentication.

パスワードベースの認証Password-based authentication

パスワード ベースの認証では、認証パラメーターは使用せず、自動的に作成されるランダム パスワードと共に使用されます。Without any authentication parameters, password-based authentication is used with a random password created for you.

az ad sp create-for-rbac --name ServicePrincipalName

重要

Azure CLI 2.0.68 の時点で、ユーザーが定義したパスワードを使ってサービス プリンシパルを作成する --password パラメーターは、脆弱なパスワードの予期しない使用を避けるために__サポートされなくなりました__。As of Azure CLI 2.0.68, the --password parameter to create a service principal with a user-defined password is no longer supported to prevent the accidental use of weak passwords.

パスワード認証によるサービス プリンシパルの出力には、password キーが含まれます。The output for a service principal with password authentication includes the password key. この値は__必ず__コピーしてください。取得することはできません。Make sure you copy this value - it can't be retrieved. パスワードを忘れた場合は、サービス プリンシパルの資格情報をリセットします。If you forget the password, reset the service principal credentials.

appId キーと tenant キーは az ad sp create-for-rbac の出力に表示され、サービス プリンシパルの認証で使用されます。The appId and tenant keys appear in the output of az ad sp create-for-rbac and are used in service principal authentication. これらの値を記録してください。ただし、az ad sp list を使用していつでも取得できます。Record their values, but they can be retrieved at any point with az ad sp list.

証明書ベースの認証Certificate-based authentication

証明書ベースの認証の場合は、--cert 引数を使用します。For certificate-based authentication, use the --cert argument. この引数を使用するには、既存の証明書を保持しておく必要があります。This argument requires that you hold an existing certificate. このサービス プリンシパルを使用する任意のツールから、証明書の秘密キーにアクセスできることを確認します。Make sure any tool that uses this service principal has access to the certificate's private key. 証明書は、PEM、CER、または DER などの ASCII 形式でなければなりません。Certificates should be in an ASCII format such as PEM, CER, or DER. 文字列として証明書を渡すか、@path 形式を使用してファイルから証明書を読み込みます。Pass the certificate as a string, or use the @path format to load the certificate from a file.

az ad sp create-for-rbac --name ServicePrincipalName --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
az ad sp create-for-rbac --name ServicePrincipalName --cert @/path/to/cert.pem

--keyvault 引数を追加すると、Azure Key Vault 内の証明書を使用できます。The --keyvault argument can be added to use a certificate in Azure Key Vault. ここでは、--cert 値は証明書の名前を表します。In this case, the --cert value is the name of the certificate.

az ad sp create-for-rbac --name ServicePrincipalName --cert CertName --keyvault VaultName

認証用の "自己署名" 証明書を作成するには、--create-cert 引数を使用します。To create a self-signed certificate for authentication, use the --create-cert argument:

az ad sp create-for-rbac --name ServicePrincipalName --create-cert

--keyvault 引数を追加すると、証明書を Azure Key Vault に格納できます。The --keyvault argument can be added to store the certificate in Azure Key Vault. --keyvault を使用する場合は、--cert 引数が__必要__です。When using --keyvault, the --cert argument is required.

az ad sp create-for-rbac --name ServicePrincipalName --create-cert --cert CertName --keyvault VaultName

証明書を Key Vault に格納しない場合は、出力に fileWithCertAndPrivateKey キーが含まれています。Unless you store the certificate in Key Vault, the output includes the fileWithCertAndPrivateKey key. このキーの値を見ると、生成された証明書の格納場所がわかります。This key's value tells you where the generated certificate is stored. 証明書は__必ず__安全な場所にコピーしてください。そうしないと、このサービス プリンシパルでサインインすることができません。Make sure that you copy the certificate to a secure location, or you can't sign in with this service principal.

Key Vault に格納されている証明書の場合、az keyvault secret show を使用して証明書の秘密キーを取得します。For certificates stored in Key Vault, retrieve the certificate's private key with az keyvault secret show. Key Vault では、証明書のシークレットの名前は、証明書の名前と同じです。In Key Vault, the name of the certificate's secret is the same as the certificate name. 証明書の秘密キーにアクセスできない場合は、サービス プリンシパルの資格情報をリセットします。If you lose access to a certificate's private key, reset the service principal credentials.

appId キーと tenant キーは az ad sp create-for-rbac の出力に表示され、サービス プリンシパルの認証で使用されます。The appId and tenant keys appear in the output of az ad sp create-for-rbac and are used in service principal authentication. これらの値を記録してください。ただし、az ad sp list を使用していつでも取得できます。Record their values, but they can be retrieved at any point with az ad sp list.

既存のサービス プリンシパルの取得Get an existing service principal

az ad sp list を使用して、テナント内のサービス プリンシパルの一覧を取得できます。A list of the service principals in a tenant can be retrieved with az ad sp list. 既定では、このコマンドによって、テナントの最初の 100 個のサービス プリンシパルが返されます。By default this command returns the first 100 service principals for your tenant. テナントのサービス プリンシパルをすべて取得するには、--all 引数を使用します。To get all of a tenant's service principals, use the --all argument. この一覧の取得には時間がかかる場合があるため、次の引数のいずれかを使用して一覧をフィルター処理することをお勧めします。Getting this list can take a long time, so it's recommended that you filter the list with one of the following arguments:

  • --display-name は、指定した名前に一致する "プレフィックス" を持つサービス プリンシパルを要求します。--display-name requests service principals that have a prefix that match the provided name. サービス プリンシパルの表示名は、作成時に --name パラメーターで設定した値です。The display name of a service principal is the value set with the --name parameter during creation. サービス プリンシパルの作成時に --name を設定していない場合、名前のプレフィックスは azure-cli- になります。If you didn't set --name during service principal creation, the name prefix is azure-cli-.
  • --spn は、正確に一致するサービス プリンシパル名でフィルター処理します。--spn filters on exact service principal name matching. サービス プリンシパル名は常に https:// で始まります。The service principal name always starts with https://. --name に使用した値が URI ではない場合、この値は https:// とこれに続く表示名となります。if the value you used for --name wasn't a URI, this value is https:// followed by the display name.
  • --show-mine は、サインインしているユーザーによって作成されたサービス プリンシパルのみを要求します。--show-mine requests only service principals created by the signed-in user.
  • --filter は OData フィルターを使用して、"サーバー側" のフィルター処理を実行します。--filter takes an OData filter, and performs server-side filtering. この方法は、CLI の --query 引数を使用したクライアント側のフィルター処理よりも推奨されます。This method is recommended over filtering client-side with the CLI's --query argument. OData フィルターの詳細については、フィルターのための OData 式の構文に関するページをご覧ください。To learn about OData filters, see OData expression syntax for filters.

サービス プリンシパル オブジェクトについて返される情報は、詳細情報です。The information returned for service principal objects is verbose. サインインに必要な情報のみを取得するには、クエリ文字列 [].{"id":"appId", "tenant":"appOwnerTenantId"} を使用します。To get only the information necessary for sign-in, use the query string [].{"id":"appId", "tenant":"appOwnerTenantId"}. たとえば、現在ログインしているユーザーによって作成されたすべてのサービス プリンシパルのサインイン情報を取得するには、次のコマンドを使用します。For example, to get the sign-in information for all service principals created by the currently logged in user:

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

重要

az ad sp list または az ad sp show を使用するとユーザーとテナントは取得されますが、認証シークレット "" 認証方法も取得されません。az ad sp list or az ad sp show get the user and tenant, but not any authentication secrets or the authentication method. Key Vault 内の証明書のシークレットは az keyvault secret show を使用して取得できますが、既定では、それ以外のシークレットは保存されません。Secrets for certificates in Key Vault can be retrieved with az keyvault secret show, but no other secrets are stored by default. 認証方法やシークレットを忘れた場合は、サービス プリンシパルの資格情報をリセットします。If you forget an authentication method or secret, reset the service principal credentials.

サービス プリンシパル ロールを管理するManage service principal roles

Azure CLI には、ロールの割り当てを管理するために、次のコマンドが用意されています。The Azure CLI has the following commands to manage role assignments:

サービス プリンシパルの既定のロールは共同作成者です。The default role for a service principal is Contributor. このロールには、Azure アカウントの読み取りと書き込みを行うための完全なアクセス許可が付与されます。This role has full permissions to read and write to an Azure account. 閲覧者ロールは制限がより厳しく、読み取り専用アクセスが提供されます。The Reader role is more restrictive, with read-only access. ロールベースのアクセス制御 (RBAC) とロールの詳細については、RBAC の組み込みのロールに関するページをご覧ください。For more information on Role-Based Access Control (RBAC) and roles, see RBAC: Built-in roles.

この例では、閲覧者ロールを追加し、共同作成者ロールを削除します。This example adds the Reader role and removes the Contributor one:

az role assignment create --assignee APP_ID --role Reader
az role assignment delete --assignee APP_ID --role Contributor

注意

ロールを割り当てるためのアクセス許可がアカウントにない場合は、アカウントに "'Microsoft.Authorization/roleAssignments/write' のアクションを実行するためのアクセス権限がありません" というエラー メッセージが表示されます。ロールを管理するには、Azure Active Directory 管理者にお問い合わせください。If your account doesn't have permission to assign a role, you see an error message that your account "does not have authorization to perform action 'Microsoft.Authorization/roleAssignments/write'." Contact your Azure Active Directory admin to manage roles.

ロールを追加しても、以前に割り当てられたアクセス許可は制限され "ません"。Adding a role doesn't restrict previously assigned permissions. サービス プリンシパルのアクセス許可を制限するときは、__共同作成者__ロールを削除する必要があります。When restricting a service principal's permissions, the Contributor role should be removed.

変更を確認するには、割り当てられているロールの一覧を表示します。The changes can be verified by listing the assigned roles:

az role assignment list --assignee APP_ID

サービス プリンシパルを使用したサインインSign in using a service principal

サインインして、新しいサービス プリンシパルの資格情報とアクセス許可をテストします。Test the new service principal's credentials and permissions by signing in. サービス プリンシパルでサインインするには、appIdtenant、および資格情報が必要です。To sign in with a service prinicpal, you need the appId, tenant, and credentials.

パスワードを使用してサービス プリンシパルでサインインするには、次のコマンドを使用します。To sign in with a service principal using a password:

az login --service-principal --username APP_ID --password PASSWORD --tenant TENANT_ID

証明書を使用してサインインする場合、その証明書は、ASCII 形式の PEM または DER ファイルとしてローカルで使用できる必要があります。To sign in with a certificate, it must be available locally as a PEM or DER file, in ASCII format:

az login --service-principal --username APP_ID --tenant TENANT_ID --password /path/to/cert

サービス プリンシパルを使用したサインインの詳細については、「Azure CLI を使用してサインインする」を参照してください。To learn more about signing in with a service principal, see Sign in with the Azure CLI.

資格情報をリセットするReset credentials

サービス プリンシパルの資格情報を忘れた場合は、az ad sp credential reset を使用します。If you forget the credentials for a service principal, use az ad sp credential reset. リセット コマンドでは、az ad sp create-for-rbac と同じ引数を使用します。The reset command takes the same arguments as az ad sp create-for-rbac.

az ad sp credential reset --name APP_ID