Azure CLI 2.0 で Azure サービス プリンシパルを作成する

Azure CLI 2.0 を使ってアプリまたはサービスを管理する場合、その実行には、自分の資格情報ではなく、Azure Active Directory (AAD) のサービス プリンシパルを使用する必要があります。 このトピックでは、Azure CLI 2.0 でセキュリティ プリンシパルを作成する手順を紹介します。

注意

Azure Portal からサービス プリンシパルを作成することもできます。 詳細については、「リソースにアクセスできる Azure Active Directory アプリケーションとサービス プリンシパルをポータルで作成する」を参照してください。

"サービス プリンシパル" とは

Azure サービス プリンシパルは、ユーザーによって作成されたアプリ、サービス、およびオートメーション ツールが特定の Azure リソースにアクセスする際に使用するセキュリティ ID です。 特定のロールが割り当てられ、リソースへのアクセス許可が厳しく管理された "ユーザー ID" (ログインとパスワードまたは証明書) と考えてください。 一般的なユーザー ID とは異なり、サービス プリンシパルには求められるのは、限られた目的を遂行する能力だけです。 管理タスクを実行するために必要な最小限のアクセス許可レベルだけを与えるようにすれば、セキュリティは向上します。

現時点では、Azure CLI 2.0 でサポートされているのは、パスワードベースの認証資格情報の作成のみです。 このトピックでは、特定のパスワードを持つサービス プリンシパルの作成と、オプションとしてサービス プリンシパルへの特定のロールの割り当てについて説明します。

自分のアクセス許可レベルを確認する

まず、Azure Active Directory と Azure サブスクリプションの両方で適切なアクセス許可を持っている必要があります。 具体的には、Active Directory でアプリケーションを作成し、サービス プリンシパルにロールを割り当てることができる必要があります。

自分のアカウントに適切なアクセス許可があるかどうかを確認する最も簡単な方法は、ポータルを使用することです。 ポータルでの必要なアクセス許可のチェックに関するページをご覧ください。

アプリケーションのサービス プリンシパルを作成する

作成するサービス プリンシパルの対象アプリを識別するために、次のいずれかが必要です。

  • デプロイされているアプリの一意の名前または URI (例の "MyDemoWebApp" など)
  • アプリケーション ID (デプロイされているアプリ、サービス、またはオブジェクトに関連付けられている一意の GUID)

これらの値は、サービス プリンシパルの作成時にアプリケーションを識別します。

アプリケーションに関する情報を取得する

アプリケーションに関する ID 情報は、az ad app list で取得します。

The Azure Cloud Shell (in public preview) is a web-based shell that is preconfigured to simplify using Azure tools. With Cloud Shell, you always have the most up-to-date version of the tools available and you don’t have to install, update or separately log in. Click the Try It button at the top right of a code block to launch the Cloud Shell. Then, use the Copy button to copy and paste the sample code into the Cloud Shell.

You can also open the Cloud Shell from the Azure portal by clicking the Cloud Shell button on the top navigation.

az ad app list --display-name MyDemoWebApp
{
    "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
    "appPermissions": null,
    "availableToOtherTenants": false,
    "displayName": "MyDemoWebApp",
    "homepage": "http://MyDemoWebApp.azurewebsites.net",
    "identifierUris": [
      "http://MyDemoWebApp"
    ],
    "objectId": "bd07205b-629f-4a2e-945e-1ee5dadf610b9",
    "objectType": "Application",
    "replyUrls": []
  }

--display-name オプションを使用すると、返されたアプリの一覧がフィルター処理され、displayName が MyDemoWebApp で始まるアプリが表示します。

サービス プリンシパルを作成する

サービス プリンシパルを作成するには、az ad sp create-for-rbac を使用します。

az ad sp create-for-rbac --name {appId} --password "{strong password}" 
{
  "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "displayName": "MyDemoWebApp",
  "name": "http://MyDemoWebApp",
  "password": {strong password},
  "tenant": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
警告

安全でないパスワードを作成しないでください。 Azure AD のパスワードの規則と制限に関するガイダンスに従ってください。

サービス プリンシパルに関する情報を取得する

az ad sp show --id a487e0c1-82af-47d9-9a0b-af184eb87646d
{
  "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "displayName": "MyDemoWebApp",
  "objectId": "0ceae62e-1a1a-446f-aa56-2300d176659bde",
  "objectType": "ServicePrincipal",
  "servicePrincipalNames": [
    "http://MyDemoWebApp",
    "a487e0c1-82af-47d9-9a0b-af184eb87646d"
  ]
}

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

az ad sp showappIdpassword を使用して、アプリの新しいサービス プリンシパルとしてログインできるようになりました。 tenant 値に az ad sp create-for-rbac の結果を指定します。

az login --service-principal -u a487e0c1-82af-47d9-9a0b-af184eb87646d --password {password} --tenant {tenant}

サインインに成功すると、次の出力が表示されます。

[
  {
    "cloudName": "AzureCloud",
    "id": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
    "isDefault": true,
    "state": "Enabled",
    "tenantId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "user": {
      "name": "https://MyDemoWebApp",
      "type": "servicePrincipal"
    }
  }
]

アプリを実行するための資格情報として、idpasswordtenant の値を使用します。

ロールを管理する

注意

Azure のロールベースのアクセス制御 (RBAC) は、ユーザー プリンシパルとサービス プリンシパルのロールを定義して管理するためのモデルです。 ロールに関連付けられる一連のアクセス許可によって、プリンシパルが各種の操作 (読み取り、アクセス、書き込み、または管理) を実行できるリソースが決まります。 RBAC とロールの詳細については、RBAC の組み込みロールに関するページを参照してください。

Azure CLI 2.0 には、ロールの割り当てを管理するために、次のコマンドが用意されています。

サービス プリンシパルの既定のロールは、Contributor です。 このロールは、広範なアクセス許可が与えられているため、アプリと Azure サービスとの対話用には最適でない場合があります。 Reader ロールは、より制限が厳しく、読み取り専用のアクセスに適しています。 Azure Portal では、ロールごとのアクセス許可に関する詳しい情報を確認したり、カスタム ロールを作成したりすることができます。

次の例では、先ほどの例に Reader ロールを追加し、Contributor ロールを削除しています。

az role assignment create --assignee a487e0c1-82af-47d9-9a0b-af184eb87646d --role Reader
az role assignment delete --assignee a487e0c1-82af-47d9-9a0b-af184eb87646d --role Contributor

変更を確認するには、現在割り当てられているロールを一覧表示します。

az role assignment list --assignee a487e0c1-82af-47d9-9a0b-af184eb87646d
{
    "id": "/subscriptions/34345f33-0398-4a99-a42b-f6613d1664ac/providers/Microsoft.Authorization/roleAssignments/c27f78a7-9d3b-404b-ab59-47818f9af9ac",
    "name": "c27f78a7-9d3b-404b-ab59-47818f9af9ac",
    "properties": {
      "principalId": "790525226-46f9-4051-b439-7079e41dfa31",
      "principalName": "http://MyDemoWebApp",
      "roleDefinitionId": "/subscriptions/34345f33-0398-4a99-a42b-f6613d1664ac/providers/Microsoft.Authorization/roleDefinitions/acdd72a7-3385-48ef-bd42-f606fba81ae7",
      "roleDefinitionName": "Reader",
      "scope": "/subscriptions/34345f33-0398-4a99-a42b-f6613d1664ac"
    },
    "type": "Microsoft.Authorization/roleAssignments"
}
注意

ロールを割り当てることのできるアクセス許可がアカウントに設定されていない場合は、エラー メッセージが表示されます。 このメッセージは、アカウントで、スコープ "/subscriptions/{guid} に対するアクション Microsoft.Authorization/roleAssignments/write の実行が承認されていない" ことを示しています。

セキュリティ プリンシパルの資格情報を変更する

セキュリティ上、アクセス許可の確認とパスワードの更新を定期的に行うことが大切です。 アプリの変更に合わせて、セキュリティ資格情報を管理したり変更したりする場合もあります。

サービス プリンシパルのパスワードをリセットする

サービス プリンシパルの現在のパスワードをリセットするには、az ad sp reset-credentials を使用します。

az ad sp reset-credentials --name 20bce7de-3cd7-49f4-ab64-bb5b443838c3 --password {new-password}
{
  "appId": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "name": "a487e0c1-82af-47d9-9a0b-af184eb87646d",
  "password": {new-password},
  "tenant": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

--password オプションを指定しなかった場合は、CLI によって安全なパスワードが生成されます。