Entra ID
Microsoft Entra ID(Azure AD)によるシングルサインオン。ロールはユーザーの Entra ID グループから決まります
仕組み
Entra ID プロバイダーが有効な場合、ログインページの サインイン の下に Entra ID のボタンが表示されます。ログインは次のように進みます。
- ボタンを押すとブラウザーは
/api/v2/auth/entraidに送られ、そこから Microsoft にリダイレクトされます。 - ユーザーが Microsoft でサインインすると、認可コードとともに リダイレクト URL に戻されます。サーバーは そのコードを Microsoft と交換して、ID トークンと Microsoft Graph 用のアクセストークンを受け取ります。
- サーバーは Microsoft Graph(
/v1.0/me/transitiveMemberOf)からユーザーのグループを読み込むので、入れ子のグループも含まれます。 - グループは表示名に対して グループフィルター で絞り込まれ、残った各グループは
azuread/<object id>とazuread/<display name>の 2 通りで保存されます。
ユーザー名はトークンの upn クレームで、たとえば jdoe@example.com です。トークンに upn がない場合は preferred_username クレームが 使われます。職場のアカウントではどちらも同じ値です。
アプリケーションの登録
AnsibleForms には、Entra 管理センターの App registrations > New registration で作成するアプリの登録が必要です。
- 名前を付け、サポートされるアカウントの種類として Accounts in this organizational directory only を選び、種類 Web の リダイレクト URI
https://af.example.com/api/v2/auth/entraid/callbackを追加します。 - Certificates & secrets でクライアントシークレットを作成し、その値をコピーします。値は一度しか表示されません。
- API permissions で、Microsoft Graph の 委任された アクセス許可
User.ReadとGroupMember.Read.Allを追加し、 管理者の同意を与えます。 - Overview ページで、 Application (client) ID と Directory (tenant) ID を控えます。
リダイレクト URI は、ユーザーが AnsibleForms にアクセスするアドレスの後に /api/v2/auth/entraid/callback を付けたものです。 BASE_URL が /forms の場合は https://af.example.com/forms/api/v2/auth/entraid/callback になります。プロバイダーの認証情報の リダイレクト URI と 完全に一致する必要があります。
7.2.0 までのパスは /api/v2/auth/azureadoauth2/callback でした。7.3.0 からもこのパスは使えるので、既存の登録を変更する必要は ありません。 リダイレクト URI が空の認証情報は新しいパスを使うので、その場合は新しいパスを登録に追加してください。
AnsibleForms はグループを Graph から読み込み、トークンのグループクレームは使わないので、登録でグループクレームを 設定する必要はありません。
プロバイダーの追加
アクセス > SSO でプロバイダーを追加します。ウィザードが 4 つのステップでフィールドを尋ね、 種類 のステップでは Microsoft Entra ID を選びます。
| ステップ | フィールド | 意味 |
|---|---|---|
| 詳細 | 名前、説明 | プロバイダーの一意の名前と、任意の説明 |
| 種類 | プロバイダー | Microsoft Entra ID 。作成時に設定し、変更できません |
| 認証情報 | 認証情報 | 接続 > 認証情報 の Microsoft Entra ID 認証情報。下記を参照 |
| グループ | グループフィルター | 正規表現。表示名が一致するグループだけが残ります。空の場合はすべてのグループが残ります |
認証情報はアプリの登録を保持するので、追加、変更できるのは管理者だけです。
| フィールド | 意味 |
|---|---|
| テナント ID | 必須。Directory (tenant) ID(GUID)、またはテナントのドメインの一つ。そのテナントのユーザーだけがサインインできます |
| クライアント ID | Application (client) ID |
| クライアントシークレット | クライアントシークレットの値。暗号化して保存するか、 シークレットストア から読み込みます |
| リダイレクト URI | 登録したとおりの値。例: https://af.example.com/api/v2/auth/entraid/callback 。空の場合はアプリの URL とコールバックのパス |
テナント ID が空の認証情報は、保存時に拒否されます。マルチテナントのエンドポイント common 、 organizations 、 consumers は、その認証情報を指定したプロバイダーの保存時に拒否されます。任意の Microsoft テナントのユーザーがサインインできてしまうためです。サインイン時には、 トークンが設定されたテナントから来ていることもサーバーが確認します。以前にテナント ID なしで保存されたプロバイダーでは 誰もサインインできません。テナント ID を入力するまで、サーバーは Could not enable Microsoft Entra ID: set the tenant id to your tenant ('' would let any Microsoft tenant log in) をログに記録します。
7.2.0 までは、テナント、クライアント ID、シークレット、リダイレクト URL はプロバイダーのフィールドでした。7.3.0 へのアップグレードでこれらは <provider>-sso という名前の認証情報に移されます。 認証情報内のアドレス を参照してください。 新しいプロバイダーには必ず認証情報を選んでください。サーバーは 7.3.0 より前の、独自のクライアント ID とシークレットを持つプロバイダーも 引き続き受け付け、認証情報が選ばれるまではそれらでサインインします。
同時に有効にできる Entra ID プロバイダーは一つだけで、Entra ID のボタンはそのプロバイダーでサインインします。別のプロバイダーの行メニューの 有効にする 、 またはその 有効 スイッチを使うと、同じ種類のほかのプロバイダーはオフになります。リストの 有効 列で、どれが使われているかがわかります。プロバイダーは ログインページをスキップすることもできます。 シングルサインオンの切り替え を参照してください。保存するとすぐに、再起動なしで反映されます。
ロールへの対応付け
config.yaml では、Entra ID のグループは entraid/<object id> または entraid/<display name> 、ユーザーは entraid/<upn> と書きます。 オブジェクト ID はテナント内で一意なので、より安全な選択です。表示名のほうが読みやすくはあります。
roles:
- name: admin
groups:
- local/admins
- entraid/0b6c8e1a-2f4d-4c7e-9a3b-5d1e7f2a4c6b
- name: operator
groups:
- entraid/AF-Operators
users:
- entraid/jdoe@example.com
7.2.0 までのプレフィックスは azuread/ でした。7.3.0 からもロールでは同じメンバーに一致しますが、8.0 で削除されます。 ロールエディターは entraid/ と書き込みます。 entraid/ を受け付けるのはロールだけです。ユーザーのグループは azuread/<object id> と azuread/<display name> として保存され、プロフィールページと extravar ansibleforms_user にもそのように表示されます。 ^AF- のような グループフィルター を使うと、ロールで使うグループだけが残ります。 ロール を参照してください。7.1.0 からは サインイントークンにグループが含まれなくなったため、グループが増えてもトークンのサイズは大きくなりません。それでも、多くのグループに 所属するユーザーにはフィルターが重要です。サインインのたびにロールと照合されるグループが少なくなり、ユーザーの ディレクトリレコード には意味のあるグループだけが表示されます。7.1.0 より前は、 100 以上のグループに所属するユーザーがフォームを表示するにはフィルターが必要です。 シングルサインオン後にフォームとジョブが空になる を参照してください。
Microsoft Graph のエンドポイント
サーバーは既定で https://login.microsoftonline.com でユーザーをサインインさせ、 https://graph.microsoft.com の Microsoft Graph を呼び出します。
| 変数 | 変わるもの |
|---|---|
ENTRA_AUTHORITY_URI | サインインの機関。 https://login.microsoftonline.us のような国内クラウド向け |
ENTRA_GRAPH_URI | グループを読み込む Graph のエンドポイント。例: https://graph.microsoft.us |
どちらも末尾にスラッシュのないベース URI を指定し、7.3.0 で追加されました。これらが設定されていない場合は AZURE_AUTHORITY_URI と AZURE_GRAPH_URI が ログに警告を出しつつ引き続き読み込まれますが、8.0 で削除されます。サーバーは Graph に到達できる必要があります。グループを読み込めないとログインは失敗します。
制限事項
Entra ID のユーザーは Microsoft でサインインするため、ローカルアカウントや LDAP アカウントとはいくつかの点で動作が異なります。
- AnsibleForms にはパスワードがないので、そこでパスワードを変更することはできません。 API トークン はセッションから作成されます。
- Entra ID では表示名は一意ではありません。同じ名前の二つのグループは同じロールに対応付けられます。そのグループだけに一致させるには、 ロールでオブジェクト ID を使って
entraid/<object id>と指定してください。