第5章 Microsoft Azure での認証
Microsoft Azure でユーザーを認証する場合:
5.1. Microsoft Azure での認証の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Developer Hub には、OAuth を使用してユーザーを認証できる Microsoft Azure 認証プロバイダーが組み込まれています。
前提条件
Microsoft Azure にアプリケーションを登録する権限がある。
- カスタムの Developer Hub アプリケーション設定を追加 した。また、その設定を変更するための十分な権限を持っている。
手順
Developer Hub が Microsoft Azure で認証できるようにするために、Microsoft Azure で OAuth アプリケーションを作成 します。
Azure ポータルで App registrations に移動し、次の設定で New registration を作成します。
- 名前
- Azure 内のアプリケーション名 (例: <My Developer Hub>)
Home > App registrations > <My Developer Hub> > Manage > Authentication ページで、次の設定で プラットフォームを追加 します。
- Redirect URI
-
Developer Hub で設定されたバックエンド認証 URI (
https://<my_developer_hub_url>/api/auth/microsoft/handler/frame) を入力します。 - Front-channel logout URL
- 空白のままにします。
- Implicit grant and hybrid flows
- すべてのチェックボックスをオフのままにします。
Home > App registrations > <My Developer Hub> > Manage > API permissions ページで、権限を追加 してから、Microsoft Graph API の次の 委任された権限 を追加します。
-
email -
offline_access -
openid -
profile -
User.Read -
Microsoft Graph API のオプションのカスタムスコープ。これは、このセクションと Developer Hub 設定ファイル
app-config.yamlの両方で定義します。
-
企業によっては、これらの権限に対して管理者の同意を与えることが必要な場合があります。管理者の同意が必要ない場合でも、管理者の同意を与える場合があります。そうすることで、ユーザーが初めて Backstage にアクセスするときに、個別に同意する必要がなくなるためです。管理者の同意を付与するには、ディレクトリー管理者は admin consent ページに移動し、Grant admin consent for COMPANY NAME をクリックする必要があります。
- Home > App registrations > <My Developer Hub> > Manage > Certificates & Secrets ページの Client secrets タブで、新しいクライアントシークレット を作成します。
次のステップのために保存します。
- ディレクトリー (テナント) ID
- アプリケーション (クライアント) ID
アプリケーション (クライアント) シークレット
Microsoft Azure 認証情報を Developer Hub に追加するには、以下のキーと値のペアを Developer Hub シークレット に追加します。
AUTH_AZURE_TENANT_ID- 保存した ディレクトリー (テナント) ID を入力します。
AUTH_AZURE_CLIENT_ID- 保存した アプリケーション (クライアント) ID を入力します。
AUTH_AZURE_CLIENT_SECRET- 保存した アプリケーション (クライアント) シークレット を入力します。
app-config.yamlファイルで Microsoft Azure 認証プロバイダーを設定します。app-config.yamlファイルのフラグメントauth: environment: production1 providers: microsoft: production: clientId: ${AUTH_AZURE_CLIENT_ID}2 clientSecret: ${AUTH_AZURE_CLIENT_SECRET} tenantId: ${AUTH_AZURE_TENANT_ID} signInPage: microsoft3 - 1
- 環境を実稼働環境としてマークし、Developer Hub のログインページで Guest ログインオプションを無効にします。
- 2
- Developer Hub のシークレットに設定されている Microsoft Azure 認証情報を適用します。
- 3
- Microsoft Azure プロバイダーを Developer Hub サインインプロバイダーとして設定します。
オプション: 次のオプションフィールドを追加することを検討してください。
domainHintシングルテナントアプリケーションの場合は任意です。他のテナントのアカウントを自動的に除外することで、複数のテナントにアカウントを持つユーザーのログインの手間を軽減できます。このパラメーターをシングルテナントアプリケーションで使用する場合は、コメントを解除してテナント ID を入力します。アプリケーション登録がマルチテナントの場合は、このパラメーターを空白のままにします。詳細は、Home Realm Discovery を参照してください。
オプションの
domainHintフィールドを含むapp-config.yamlファイルのフラグメントauth: environment: production providers: microsoft: production: domainHint: ${AUTH_AZURE_TENANT_ID}additionalScopes追加のスコープの場合は任意です。アプリケーション登録のスコープを追加するには、コメントを解除して、追加するスコープのリストを入力します。デフォルトおよび必須の値のリストは
'openid', 'offline_access', 'profile', 'email', 'User.Read'です。オプションの
additionalScopesフィールドを含むapp-config.yamlファイルのフラグメントauth: environment: production providers: microsoft: production: additionalScopes: - Mail.SendsessionDurationユーザーセッションの有効期間。期間を
msライブラリー形式 ('24h'、'2 days' など)、ISO 期間形式、またはコード内で使用される "human duration" 形式で入力します。オプションの
sessionDurationフィールドを含むapp-config-rhdh.yamlフラグメントauth: providers: microsoft: production: sessionDuration: { hours: 24 }signInresolvers-
認証が成功したら、サインインするユーザーを、Developer Hub カタログ内の既存のユーザーに解決する必要があります。ユースケースに合わせて最適な形でユーザーを確実にマッチさせるために、特定のリゾルバーを設定することを検討してください。デフォルトのリゾルバー
emailLocalPartMatchingUserEntityNameをオーバーライドするには、リゾルバーのリストを入力します。
認証プロバイダーは、成功するまで各サインインリゾルバーを順番に試行します。どれも成功しない場合は失敗します。
警告実稼働モードでは、ユーザーが確実にマッチするように、リゾルバーを 1 つだけ設定してください。
resolverサインインリゾルバー名を入力します。利用可能なリゾルバーは次のとおりです。
-
userIdMatchingUserEntityAnnotation -
emailLocalPartMatchingUserEntityName -
emailMatchingUserEntityProfileEmail
-
dangerouslyAllowSignInWithoutUserInCatalog: trueDeveloper Hub ソフトウェアカタログのユーザープロビジョニング要件を回避するようにサインインリゾルバーを設定します。
警告Developer Hub の機能を調べるには
dangerouslyAllowSignInWithoutUserInCatalogを使用しますが、実稼働環境では使用しないでください。ソフトウェアカタログに存在しないユーザーのサインインを許可するオプションのフィールドを含む
app-config-rhdh.yamlフラグメントauth: environment: production providers: microsoft: production: clientId: ${AUTH_AZURE_CLIENT_ID} clientSecret: ${AUTH_AZURE_CLIENT_SECRET} tenantId: ${AUTH_AZURE_TENANT_ID} signIn: resolvers: - resolver: usernameMatchingUserEntityName dangerouslyAllowSignInWithoutUserInCatalog: true signInPage: microsoft
注記ファイアウォールルールなどの送信アクセス制限がある環境では、このステップはオプションになります。環境にこのような制限がある場合は、RHDH バックエンドが次のホストにアクセスできることを確認してください。
-
login.microsoftonline.com: 認可コードとアクセストークンを取得および交換します。 -
graph.microsoft.com: ユーザープロファイル情報を取得します (ソースコードで参照)。このホストにアクセスできない場合は、ログインしようとすると Authentication failed, failed to fetch user profile というエラーが表示されることがあります。
= Microsoft Azure からソフトウェアカタログへのユーザーのプロビジョニング
Microsoft Azure でユーザーを認証するには、Microsoft Azure での認証を有効化 した後、Microsoft Azure から Developer Hub ソフトウェアカタログにユーザーをプロビジョニングします。
手順
-
Microsoft Azure メンバー検出を有効にするには、
app-config-rhdhなどのカスタム Developer Hub ConfigMap を編集し、app-config.yamlコンテンツに次の行を追加します。
catalog:
providers:
microsoftGraphOrg:
providerId:
target: https://graph.microsoft.com/v1.0
tenantId: ${AUTH_AZURE_TENANT_ID}
clientId: ${AUTH_AZURE_CLIENT_ID}
clientSecret: ${AUTH_AZURE_CLIENT_SECRET}
target: https://graph.microsoft.com/v1.0- プロバイダーが接続する MSGraph API エンドポイントを定義します。ベータエンドポイント などの別のバージョンを使用するには、このパラメーターを変更することを推奨します。
tenandId、clientId、clientSecret- Microsoft Azure で作成し、OpenShift でシークレットとして設定した Developer Hub アプリケーション情報を使用します。
オプション: 次のオプションの microsoftGraphOrg.providerId フィールドを追加することを検討してください。
authority: https://login.microsoftonline.com使用する機関を定義します。Azure US government などの別の 機関 を使用するには、値を変更します。デフォルト値は
https://login.microsoftonline.comです。オプションの
queryModeフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: authority: https://login.microsoftonline.com/
queryMode: basic | advancedデフォルトでは、Microsoft Graph API はクエリー用に
basic機能セットのみを提供します。特定の機能にはadvancedクエリー機能が必要です。Microsoft Azure Advanced queries を参照してください。オプションの
queryModeフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: queryMode: advanced
user.expand単一のリレーションシップ (ナビゲーションプロパティー) によって参照される拡張リソースまたはコレクションを結果に含めます。1 回のリクエストで拡張できる関係は 1 つだけです。Microsoft Graph query expand parameter を参照してください。このパラメーターは ] or xref:userFilter[ と組み合わせることができます。
オプションの
user.expandフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: user: expand: manager
user.filterユーザーをフィルタリングします。Microsoft Graph API および Microsoft Graph API query filter parameters syntax を参照してください。このパラメーターと ???TITLE??? は相互に排他的であるため、いずれか 1 つだけを指定できます。
オプションの
user.filterフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: user: filter: accountEnabled eq true and userType eq 'member'
user.loadPhotos: true | falseデフォルトで写真をロードします。ユーザーの写真をロードしない場合は
falseに設定します。オプションの
user.loadPhotosフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: user: loadPhotos: true
user.select取得する Microsoft Graph リソースの種類 を定義します。
オプションの
user.selectフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: user: select: ['id', 'displayName', 'description']
userGroupMember.filterグループメンバーシップを使用してユーザーを取得します。グループをフィルタリングし、そのメンバーを取得します。このパラメーターと ???TITLE??? は、相互に排他的であるため、いずれか 1 つだけを指定できます。
オプションの
userGroupMember.filterフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: userGroupMember: filter: "displayName eq 'Backstage Users'"
userGroupMember.searchグループメンバーシップを使用してユーザーを取得します。グループを検索し、そのメンバーを取得します。このパラメーターと ???TITLE??? は、相互に排他的であるため、いずれか 1 つだけを指定できます。
オプションの
userGroupMember.searchフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: userGroupMember: search: '"description:One" AND ("displayName:Video" OR "displayName:Drive")'
group.expand単一のリレーションシップ (ナビゲーションプロパティー) によって参照される拡張リソースまたはコレクションを結果に含めるためのオプションのパラメーター。1 回のリクエストで拡張できる関係は 1 つだけです。https://docs.microsoft.com/en-us/graph/query-parameters#expand-parameter を参照してください。このパラメーターは、] instead of xref:userFilter[ と組み合わせることができます。
オプションの
group.expandフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: group: expand: member
group.filterグループをフィルタリングします。Microsoft Graph API query group syntax を参照してください。
オプションの
group.filterフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: group: filter: securityEnabled eq false and mailEnabled eq true and groupTypes/any(c:c+eq+'Unified')
group.searchグループを検索します。Microsoft Graph API query search parameter を参照してください。
オプションの
group.searchフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: group: search: '"description:One" AND ("displayName:Video" OR "displayName:Drive")'
group.select取得する Microsoft Graph リソースの種類 を定義します。
オプションの
group.selectフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: group: select: ['id', 'displayName', 'description']schedule.frequencyカスタムスケジュールの頻度を指定します。コード内で使用される cron、ISO 期間、および "人間が判読可能な期間" をサポートします。
オプションの
schedule.frequencyフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: schedule: frequency: { hours: 1 }schedule.timeoutカスタムタイムアウトを指定します。コード内で使用される ISO 期間と "人間が判読可能な期間" をサポートします。
オプションの
schedule.timeoutフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: schedule: timeout: { minutes: 50 }schedule.initialDelayカスタム初期遅延を指定します。コード内で使用される ISO 期間と "人間が判読可能な期間" をサポートします。
オプションの
schedule.initialDelayフィールドを含むapp-config.yamlフラグメントcatalog: providers: microsoftGraphOrg: providerId: schedule: initialDelay: { seconds: 15}
検証
コンソールログをチェックして、同期が完了したことを確認します。
同期が成功した例:
backend:start: {"class":"MicrosoftGraphOrgEntityProvider$1","level":"info","message":"Read 1 msgraph users and 1 msgraph groups in 2.2 seconds. Committing...","plugin":"catalog","service":"backstage","taskId":"MicrosoftGraphOrgEntityProvider:default:refresh","taskInstanceId":"88a67ce1-c466-41a4-9760-825e16b946be","timestamp":"2024-06-26 12:23:42"} backend:start: {"class":"MicrosoftGraphOrgEntityProvider$1","level":"info","message":"Committed 1 msgraph users and 1 msgraph groups in 0.0 seconds.","plugin":"catalog","service":"backstage","taskId":"MicrosoftGraphOrgEntityProvider:default:refresh","taskInstanceId":"88a67ce1-c466-41a4-9760-825e16b946be","timestamp":"2024-06-26 12:23:42"}- Microsoft Azure アカウントでログインします。