証明書ベースの認証を使用して Azure サービス プリンシパルを使用する

サービス プリンシパルを作成する際に、サービス プリンシパルが使用するサインイン認証の種類を選択します。 Azure サービス プリンシパルで使用できる認証には、パスワードベースの認証証明書ベースの認証の 2 種類があります。

パスワードベースの認証にはセキュリティ制限があるため、証明書ベースの認証を使用することをお勧めします。 証明書ベースの認証を使用すると、条件付きアクセス ポリシーを使用してフィッシング耐性のある認証を採用でき、Azure リソースをより厳重に保護できます。 証明書ベースの認証がより安全である理由の詳細については、Microsoft Entra 証明書ベースの認証に関するページを参照してください。

チュートリアルのこの手順では、サービス プリンシパルの証明書を使用して Azure リソースにアクセスする方法について説明します。

新しい証明書を含むサービス プリンシパルを作成する

認証用の "自己署名" 証明書を作成するには、--create-cert パラメーターを使用します

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

コンソール出力:

{
  "appId": "myServicePrincipalID",
  "displayName": "myServicePrincipalName",
  "fileWithCertAndPrivateKey": "certFilePath\certFileName.pem",
  "password": null,
  "tenant": "myOrganizationTenantID"
}

証明書を Key Vault に格納しない場合は、出力に fileWithCertAndPrivateKey キーが含まれています。 このキーの値を見ると、生成された証明書の格納場所がわかります。 証明書を安全な場所にコピーしました。 証明書の秘密キーにアクセスできない場合は、サービス プリンシパルの資格情報をリセットします。

PEM ファイルの内容はテキスト エディターで表示できます。 PEM ファイルの例を次に示します。

Screenshot of PEM file

既存の証明書を使用したサービス プリンシパルを作成する

--certパラメーターを使用して、既存の証明書で、サービス プリンシパルを作成します。 このサービス プリンシパルを使用する任意のツールは、証明書の秘密キーにアクセスできる必要があります。 証明書は、PEM、CER、または DER などの ASCII 形式でなければなりません。 certi897ficate を文字列として渡すか、@path 形式を使用してファイルから証明書を読み込みます。

PEM ファイルを使用する場合は、ファイル内で PRIVATE KEYCERTIFICATE を追加する必要があります。

# create a service principal with the certificate as a string
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
# create a service principal with the certificate file location
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert @/path/to/cert.pem

Azure Key Vault を使用する

--keyvault パラメーターを追加して、Azure Key Vault で証明書を作成または取得できます。 --keyvault パラメーターを使用する場合は、--cert パラメーターも必要です。 この例では、--cert 値は証明書の名前です。

# Create a service principal storing the certificate in Azure Key Vault
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert \
                         --cert myCertificateName \
                         --keyvault myVaultName
# Create a service principal using an existing certificate in Azure Key Vault
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert myCertificateName \
                         --keyvault myVaultName

Azure Key Vault から証明書を取得する

証明書が Azure Key Vault に格納されている場合、az keyvault secret show を使用して証明書と秘密キーを取得し、それを PEM ファイルに変換します。 Azure 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

既存の PKCS12 ファイルを変換する

PKCS#12 ファイルが既にある場合は、OpenSSL を使用して PEM 形式に変換できます。 パスワードがある場合は、passin 引数を変更します。

openssl pkcs12 -in fileName.p12 -clcerts -nodes -out fileName.pem -passin pass:

サービス プリンシパルに証明書を追加する

既存のサービス プリンシパルに証明書を追加するには、az ad sp credential reset--append パラメーターを使用します。 既定では、このコマンドはすべてのパスワードとキーをクリアするため、慎重に使用してください。

az ad sp credential reset --id myServicePrincipalID \
                          --append \
                          --cert @/path/to/cert.pem

コンソール出力:

Certificate expires yyyy-mm-dd hh:mm:ss+00:00. Adjusting key credential end date to match.
The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
{
  "appId": "myServicePrincipalID",
  "password": null,
  "tenant": "myOrganizationTenantID"
}

証明書を使用してサービス プリンシパルでサインインする

証明書を使用してサインインする場合、その証明書は、ASCII 形式の PEM または DER ファイルとしてローカルで使用できる必要があります。 PKCS#12 ファイル (.p12/.pfx) が機能しません。 PEM ファイルを使用する場合は、ファイル内に秘密キー証明書を共に追加する必要があります。 他の az コマンドと同様に、パスの前に @ を付ける必要はありません。

az login --service-principal \
         --username myServicePrincipalID \
         --tenant myOwnerOrganizationId \
         --password /path/to/cert

次のステップ

証明書を使用してサービス プリンシパルを操作する方法を学習したので、次のステップに進んで、既存のサービス プリンシパルを取得する方法を習得します。