Skip to content

Instantly share code, notes, and snippets.

@yfakariya
Last active October 5, 2021 15:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yfakariya/4599795cd6d1def905d1fcef1f8a1ed7 to your computer and use it in GitHub Desktop.
Save yfakariya/4599795cd6d1def905d1fcef1f8a1ed7 to your computer and use it in GitHub Desktop.
Azure ADの話

Azure ADの用語の話

メモなので、間違いなどあればコメントいただけると嬉しいです。

前提

プリンシパル(princilal)

wikipediaより。

A principal in computer security is an entity that can be authenticated by a computer system or network. It is referred to as a security principal in Java and Microsoft literature.

Principals can be individual people, computers, services, computational entities such as processes and threads, or any group of such things. They need to be identified and authenticated before they can be assigned rights and privileges over resources in the network. A principal typically has an associated identifier (such as a security identifier) that allows it to be referenced for identification or assignment of properties and permissions.

コンピューターセキュリティおけるプリンパル(principal)とは、コンピューターシステムまたはネットワークによって認証可能なエンティティのこと。JavaやMicrosoftの語彙では、セキュリティプリンシパルと言われる。

プリンシパルは、個々の人間、コンピューター、サービス、プロセスやスレッドのようなコンピューター上のエンティティ、またはそれらの任意のグループである。プリンシパルがネットワーク内のリソースに対する権利や特権が割り当てられるには、まず識別および認証される必要がある。プリンシパルは一般的に関連する識別子(セキュリティ識別子)を持ち、これによってプロパティやパーミッションの識別または割り当てのためにプリンシパルが参照できるようになる。

アプリケーションとサービスプリンシパル

アプリケーション(Application)は、Azure ADのアプリ登録(App Registration)で登録されるエンティティであり、 Application オブジェクトで表現される。アプリケーションは、ホームとなるAzure ADテナントに存在する。

サービスプリンシパル(Service Principal)は、アプリへのアクセスを管理者が承認(approve)するためのオブジェクトで、利用者たるプリンシパルが存在するテナントに作成される。ホームテナントでのみサービスプリンシパルを作成できるアプリケーションをシングルテナント、他のテナントでもサービスプリンシパルを作成できるアプリケーションをマルチテナントという。

以下のプロパティを見ればわかるように、作成者にしか定義できないものはアプリケーションにしかないし、利用側の組織のポリシーに関わるものはサービスプリンシパルにしかない。

主なプロパティ

Application ServicePrincipal 説明
appId appId アプリケーションのID。
applicationTemplateId
appOwnerOrganizationId アプリケーションのホームテナントのテナントID
id id オブジェクトID
identifierUris servicePrincipalNames aud にも使われる、アプリ識別用の URI。
servicePrincipalType Application、ManagedIdentity、Legacy(互換性用)、SocialIdp(たぶんB2C用)
createdDateTime, deletedDateTime
description, displayName appDescription, appDisplayName
logo, info, note homePage, info, notes
description ここはサービスプリンシパルの説明
verifiedPublisher ID、表示名、追加日時 を持つ
addIns addIns
appRoleAssignmentRequired
disabledByMicrosoftStatus
loginUrl, logoutUrl
keyCredentials, passwordCredentials keyCredentials, passwordCredentials keyCredentialは種別と使用法を持つバイナリ。passwordCredentialはヒントを持つ文字列。いずれもID、名前、有効期間を持つ。
groupMembershipClaims アプリケーションがトークンの group クレームに入れてほしい AAD の各種グループの種類
optionalClaims IDトークン、アクセストークン、SAML2トークンで返すクレーム audの形式をGUIDに固定する方法があることは覚えておくとよさそう
appRoles
appRoles.allowedMemberTypes ユーザー、グループ、アプリケーションのどれに割り当て可能か
appRoles.{id, name, value, description, displayName}
requiredResourceAccess
requiredResourceAccess.resourceAppId アクセス先リソース
requiredResourceAccess.resourceAccess
requiredResourceAccess.resourceAccess.id スコープオブジェクトかロールオブジェクトのID
requiredResourceAccess.resourceAccess.type idがスコープかロールか
api
api.acceptMappedClaims
api.knownClientApplications クライアントアプリを登録しておくと、クライアントアプリへの同意がこのサーバー側APIアプリの同意にもなる
api.oauth2PermissionScopes ID、種類、scp に入れたときの値、同意に関する説明や表示名
api.preAuthorizedApplications 管理者によってあらかじめ許可されたこのAPI呼び出し元
oauth2PermissionScopes アプリケーションで指定した api.oauth2PermissionScopes の値
publicClient
publicClient.redirectUris
spa
spa.redirectUris
web
web.homePageUrl, web.logoutUrl, web.redirectUris
web.implicitGrantSettings IDトークンとアクセストークンの発行が有効かどうか
replyUrls アプリケーションで指定した {publicClient
preferredSingleSignOnMode, samlSingleSignOnSettings
oauth2RequiredPostResponse
isFallbackPublicClient
isDeviceOnlyAuthSupported
signInAudience サインインで AAD と MSA のどちらを許すか。
parentalControlSettings

サービスプリンシパルに関連するエンティティ

  • appRoleAssignment -> 割り当てられれているロール
  • claimsMappingPolicy -> このSP向けに発行されるトークンのマッピング
  • memberOf -> 割り当てられているグループ
  • oauth2PermissionGrants -> 委任されたアクセス許可
  • tokenLifetimePolicy -> トークン有効期間ポリシー

az ad sp create-for-rbacとは何か

Azure CLIでコマンドを実行するためのサービスプリンシパルを作成し、サブスクリプションレベルの Contributor (共同作業者)RBACを与える。

マネージドID

特殊なサービスプリンシパル。 az identity コマンドで作成したりできる。

その資格情報は隠ぺいされており、マネージドIDが割り当てられたリソースが別リソースにアクセスする際に自動的に使用する。アプリから使う場合は、そのリソース上からのみアクセスできるリンクローカルアドレスに公開されたHTTP APIにアクセスして、OAuth2のアクセストークンとして取得し、Bearerトークンなどで送る(「など」と言っているのはRDBMSでも使えるから)

使い分け

  • システム割り当てはリソースと一緒に削除され、そのリソース専用である。したがって、リソースを認証したい場合に使う。ログとか。
  • ユーザー割り当ては個別に割り当てることができる、複数のリソースに設定したり、同一リソースに複数割り当てたりできる。そのため、アプリなどリソースとは独立したものの認証に使う。DBアクセスとか。WindowsなWeb JobからLinuxのFunctionに移したり、ACIやAKSに動かすかもしれないし。多重防御の為に、アプリ内で読み取りRBACしかないIDと、書き込み権限のあるIDを使い分けるかもしれないし。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment