Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Microsoft Entra IDとAzure App Serviceによる エンタープライズWebアプリ・サービスのプラットフォーム構築

Microsoft Entra IDとAzure App Serviceによる エンタープライズWebアプリ・サービスのプラットフォーム構築

.NETラボ 勉強会 2023年11月
https://dotnetlab.connpass.com/event/299544/

YAEGASHI Takeshi

November 25, 2023
Tweet

More Decks by YAEGASHI Takeshi

Other Decks in Technology

Transcript

  1. 自己紹介 2 • 八重樫 剛史 Takeshi Yaegashi • 株式会社バンダイナムコスタジオ (BNS)

    技術スタジオ オンラインテクノロジー部 サーバソリューションユニット DXセクション テクニカルディレクター • 社内開発者向けのクラウドサービス導入推進 プラットフォームエンジニアリングのプロジェクトに従事 • Microsoft MVP for Microsoft Azure (2023) https://mvp.microsoft.com/ja-jp/PublicProfile/5005134 • Web (blog) https://l0w.dev X (Twitter) https://twitter.com/hogegashi GitHub https://github.com/yaegashi
  2. 本日の話題 3 • エンタープライズ (大企業) の社内向け Web サービスに IDaaS・PaaS を導入する取り組みの紹介

    • オンプレミス・境界型セキュリティからクラウド・ゼロトラストセキュリティへの移行 • Microsoft Entra ID (ME-ID) • エンタープライズの ME-ID テナントのグループ階層とユースケース • OpenID Connect における ID トークンの groups クレームの活用 • Azure App Service • App Service 組み込みの認証・認可 (Easy Auth) • authsettingsV2 によるアクセス検証 • 事例紹介 • オープンソースの Web サービスのエンタープライズ向けカスタマイズなど
  3. 背景:エンタープライズWebサービスホスティングのオンプレミス→クラウド移行 4 • エンタープライズ Web サービスホスティングとは? • 社内向けの Web サービスをセルフホストで運用すること

    • Web サービスの例: Jenkins CI, Redmine, GitLab, Confluence, Jira, etc. • オンプレミス時代 (これまで) • オンプレミス設置の物理サーバー、仮想マシンでイントラネット向けにサービスを提供 • Active Directory Domain Services (AD DS) によるユーザー認証 (Kerberos, LDAP, etc.) • HTTP・IPアドレス直打ちのサイトが横行 (http://192.168.1.2:8080) • イントラネットの境界型セキュリティを採用・VPNによる延命 • クラウド時代 (理想) • クラウドで稼働するIaaSやPaaSでインターネット向けにサービスを提供 • Azure VM, Azure App Service, Azure Functions, Azure Container Apps, etc. • Microsoft Entra ID (ME-ID) によるユーザー認証 (OpenID Connect, SAML, etc.) • HTTPS・カスタムDNSドメインの利用を強制 (https://service.example.com) • インターネットのゼロトラストセキュリティを採用
  4. Microsoft 365 導入後のエンタープライズ Microsoft Entra ID (ME-ID) テナントの構造 6 •

    大規模なテナントは多数の会社・部署・プロジェクトに属するユーザー・グループで構成される A会社 A事業部 A部 A課 B課 B部 C課 B事業部 C部 D課 B会社 C事業部 D部 E課 D事業部 E部 F課 Aプロ ジェクト Bプロ ジェクト Cプロ ジェクト
  5. • 特定のグループに属するユーザーのみにアクセスを許可したい (できるだけアプリのコードをいじらずに…) A会社 A事業部 A部 A課 B課 B部 C課

    B事業部 C部 D課 B会社 C事業部 D部 E課 D事業部 E部 F課 Aプロ ジェクト Bプロ ジェクト Cプロ ジェクト Microsoft 365 導入後のエンタープライズ ME-ID テナントのユースケース 7 A会社専用サイト Azure App Service ME-ID アプリ登録
  6. ME-ID 各種リソース 一般ユーザーによるセルフサービス管理とガバナンス 8 • Microsoft Entra 管理センター https://entra.microsoft.com •

    ME-ID のグループやアプリをセルフサービス管理できるポータル • ME-ID グループ • デフォルトでは一般ユーザーでもセキュリティグループや Microsoft グ ループの作成が自由にできる • グループの所有者はメンバー管理をセルフサービスでできる • ME-ID アプリ登録 • ME-ID アプリ登録 = ME-ID の認証・認可を利用するクライアント登録 • Web サービスそのものを実装する App Service などで動かすサーバーアプリとは異なる • デフォルトでは一般ユーザーでもアプリ登録が自由にできる • アプリへのアクセス許可の付与はテナント管理者の同意が必要な場合が ある • ME-ID ガバナンス • 一般ユーザーにどこまでの操作を許すかはテナントの方針による • ME-ID 活用推進の観点では自由度はなるべく高いほうがよい • グループの名前付けポリシー、アプリアクセス許可の管理者同意ワーク フローなど、様々な ME-ID ガバナンス支援の機能が存在する
  7. Azure App Service 組み込み認証・認可 (Easy Auth) 9 • Azure App

    Service 系のサービスで利用可能な Web 認証・認可機能 • App Service, Functions, Static Web Apps, Container Apps, etc. が対応、細かい仕様はサービスにより異なる • アプリの前段に配置されるミドルウェアとして動作 し、HTTPヘッダなどでアプリ本体にユーザー認証情 報を伝える • IdP として Microsoft (ME-ID), Google, Apple, GitHub, Facebook などに対応するがここでは Microsoft (ME- ID) に限定する • シンプルな認証・認可機能に限ればアプリの コードに手を加えることなく実現可能 • 頻出のユースケース「特定グループに属するユー ザーのみアクセスを許可」は Easy Auth だけでも実現 可能 Source: https://learn.microsoft.com/ja-jp/azure/app-service/overview-authentication-authorization
  8. Azure App Service + Easy Auth における認可の実現方法 10 • (方法1)

    ME-ID アプリのユーザー・グループの割り当て強制 • Microsoft Entra 管理センターや Azure Portal で最も簡単に設定できる • 重要な機能がなくテナント管理者権限が必要という欠点がある • (方法2) Easy Auth での ID トークンの検証 • IDトークンにgroupsクレームを追加し sites/config "authsettingsV2" リソースを設定する • 一般ユーザー権限でも設定可能で大きな欠点はないがエラー表示が不親切 • (方法3) Web アプリコードによる ID トークンの検証 • 複雑な認可や挙動を実現したい場合は結局これしかない • Easy Auth 環境専用のコードを書く必要がありポータビリティが損なわれる
  9. Azure App Service + Easy Auth の検証サイトを作る (1) 11 •

    Azure Portal で App Service を作成 • 公開: Docker コンテナー • オペレーティングシステム: Linux • 価格プラン: Free F1 • Docker: • オプション: 単一コンテナー • イメージソース: Docker Hub • アクセスの種類: パブリック • イメージとタグ: traefik/whoami [1] • デプロイ完了後 App Serviceの 「認証」から Easy Auth を有効化 • IDプロバイダー: Microsoft • テナントの種類: 従業員 • アプリ登録の種類: アプリの登録を新規作成する • アクセスを制限する: 認証が必要 • トークンストア: 有効 [1] https://github.com/traefik/whoami
  10. Azure App Service + Easy Auth の検証サイトを作る (2) 12 •

    検証サイトを開く • https://検証サイト名.azurewebsites.net • 「要求されているアクセス許可」 を承認 • HTTPリクエストヘッダの表示 • 重要: 認証クッキーやアクセストーク ンなどが含まれているので、HTTPリ クエストヘッダの内容全体を他人と 共有しないこと • トークンストアの確認 • https://検証サイト名.azurewebsites.net/.auth/me
  11. Azure App Service + Easy Auth の検証サイトを作る (3) 13 •

    検証サイトの X-Ms-Token-Aad-Id-Token ヘッダの Base64 文字列をコピー • https://jwt.ms を開いてフォームにペースト • Decoded Token に ID トークンの内容を表示 • デフォルトでは groups クレームは含まれていない
  12. Azure App Service + Easy Auth における認可の実現方法 14 • (方法1)

    ME-ID アプリのユーザー・グループの割り当て強制 • Microsoft Entra 管理センターや Azure Portal で最も簡単に設定できる • 重要な機能がなくテナント管理者権限が必要という欠点がある • (方法2) Easy Auth での ID トークンの検証 • IDトークンにgroupsクレームを追加し sites/config "authsettingsV2" リソースを設定する • 一般ユーザー権限でも設定可能で大きな欠点はないがエラー表示が不親切 • (方法3) Web アプリコードによる ID トークンの検証 • 複雑な認可や挙動を実現したい場合は結局これしかない • Easy Auth 環境専用のコードを書く必要がありポータビリティが損なわれる
  13. (方法1) ME-ID アプリのユーザー・グループの割り当ての検証 15 • Microsoft Entra 管理センター • 「エンタープライズアプリケーション」で

    検証サイト ME-ID アプリを開く • 「プロパティ」で 「割り当てが必要ですか」を「はい」に設定 • 「ユーザーとグループ」で ユーザーまたはグループの追加 • グループを追加するには Microsoft Entra ID P1 ライセンスが必要 • 検証サイト • ME-ID アプリに割り当てられていない テナント内ユーザーでアクセスすると AADSTS50105 エラーとなるので アクセス制御が実現できている
  14. (方法1) ME-ID アプリのユーザー・グループの割り当ての問題点 16 • テナント管理者権限が必要 • 一般ユーザーは ME-ID アプリによるアクセス許可要求への同意ができなくな

    り、新規の一般ユーザーは割り当てられていても Web サイトが開けない [1] • 割り当てを強制する前に同意済みの既存の一般ユーザーには影響ない • テナント管理者の権限によりテナントユーザー全体で同意済みにする • 一般ユーザーはテナント管理者に作業依頼する必要があるため使いにくい • ネストしたグループ階層をサポートしていない • ME-ID アプリに割り当てたグループ内のネストしたグループは無視される[2] • エンタープライズの組織構成を反映した多重にネストするグループ階層が活 用できない [1] https://learn.microsoft.com/ja-jp/entra/identity/enterprise-apps/what-is-access-management#requiring-user-assignment-for-an-app [2] https://learn.microsoft.com/ja-jp/entra/identity/users/directory-service-limits-restrictions
  15. Azure App Service + Easy Auth における認可の実現方法 17 • (方法1)

    ME-ID アプリのユーザー・グループの割り当て強制 • Microsoft Entra 管理センターや Azure Portal で最も簡単に設定できる • 重要な機能がなくテナント管理者権限が必要という欠点がある • (方法2) Easy Auth での ID トークンの検証 • IDトークンにgroupsクレームを追加し sites/config "authsettingsV2" リソースを設定する • 一般ユーザー権限でも設定可能で大きな欠点はないがエラー表示が不親切 • (方法3) Web アプリコードによる ID トークンの検証 • 複雑な認可や挙動を実現したい場合は結局これしかない • Easy Auth 環境専用のコードを書く必要がありポータビリティが損なわれる
  16. (方法2) Easy Auth での ID トークンの検証 18 • ME-ID OpenID

    Connect における ID トークンの groups クレーム • OpenID Connect でユーザー認証完了時に得られる ID トークンに groups クレームを追加できる • groups クレームにはそのユーザーが所属するすべてのグループの Object ID のリスト • 多重にネストしたグループ階層にも対応している • Easy Auth の ID トークン検証 • Easy Auth 設定で特定の Object ID が groups クレームに含まれることを認可の条件にできる • Easy Auth 設定は App Service のサブリソース AuthSettingsV2 に記述する
  17. (方法2) Easy Auth での ID トークンの検証 ME-ID OpenID Connect における

    ID トークンの groups クレーム 19 • 大規模な ME-ID テナントは多数のユーザーとグループ (会社・部署・プロジェクト) で構成される A会社 A事業部 A部 A課 B課 B部 C課 B事業部 C部 D課 B会社 C事業部 D部 E課 D事業部 E部 F課 Aプロ ジェクト Bプロ ジェクト Cプロ ジェクト
  18. (方法2) Easy Auth での ID トークンの検証 ME-ID OpenID Connect における

    ID トークンの groups クレーム 20 • 各グループやユーザー (プリンシパル) にはユニークな Object ID (GUID) が割り当てられる A会社 b06675e0-8a1b- 43b8-92c7- c31a2c0071b3 A事業部 0ecc9315-2640- 4821-ad26- b35e1ff6a001 A部 93b408f5-f7cd- 4cf6-a418- f86633851edd A課 e3717321-e8ae- 442a-9de9- 13ec7e9e2bfb B課 7d222a95-374a- 45f0-9234- 08647fbdd1bc B部 aa63b7e1-a387- 42ee-a967- 427b3b978d94 C課 c9127af3-8167- 4c3f-aad3- 2f59fdfab502 B事業部 11eb4681-2d91- 4bf9-bf5d- ee03fd1a53f8 C部 79796392-ed4d- 4475-8933- 52461a63e990 D課 6112d319-aadd- 46e1-8cf9- f144dcc2c873 B会社 f3c2ef9f-ae1d- 4a4c-a6fe- bfdc7c02a4e8 C事業部 5537e6af-fb46- 4ac0-9e5b- 09ccba3f2668 D部 cb1a8869-8a9b- 49d8-833a- bfa988029de5 E課 2eb60dc6-0c29- 4801-8d36- 65a64dac3d6d D事業部 c604091e-56b8- 4118-990c- 1fa8ff4838f9 E部 a8527c49-7ae2- 4cdd-9d25- a112bd213c7b F課 53abfb13-8d09- 41c5-830e- 4b0358e62059 Aプロジェクト 8541c800-c80e- 4fe1-a965- 7f217eb54c5c Bプロジェクト f25aaa09-0ec7- 4155-9ee3- 1e8a643aa0b1 Cプロジェクト dd7187f7-c32c- 41f8-806e- ab0ecc5f1a85
  19. (方法2) Easy Auth での ID トークンの検証 ME-ID OpenID Connect における

    ID トークンの groups クレーム 21 • 各ユーザーのIDトークンのgroupsクレームには自分が所属する全グループのObject IDが含まれる { "oid": "54667aa5-1d49-4bea-9e0b-7a54d4d97e7e", "groups": [ "b06675e0-8a1b-43b8-92c7-c31a2c0071b3", "0ecc9315-2640-4821-ad26-b35e1ff6a001", "93b408f5-f7cd-4cf6-a418-f86633851edd", "e3717321-e8ae-442a-9de9-13ec7e9e2bfb" ] { "oid": "6d66d72e-2fbb-409c-81bf-1162fa19d28d", "groups": [ "f3c2ef9f-ae1d-4a4c-a6fe-bfdc7c02a4e8", "5537e6af-fb46-4ac0-9e5b-09ccba3f2668", "cb1a8869-8a9b-49d8-833a-bfa988029de5", "2eb60dc6-0c29-4801-8d36-65a64dac3d6d" ] A会社 b06675e0-8a1b- 43b8-92c7- c31a2c0071b3 A事業部 0ecc9315-2640- 4821-ad26- b35e1ff6a001 A部 93b408f5-f7cd- 4cf6-a418- f86633851edd A課 e3717321-e8ae- 442a-9de9- 13ec7e9e2bfb B課 7d222a95-374a- 45f0-9234- 08647fbdd1bc B部 aa63b7e1-a387- 42ee-a967- 427b3b978d94 C課 c9127af3-8167- 4c3f-aad3- 2f59fdfab502 B事業部 11eb4681-2d91- 4bf9-bf5d- ee03fd1a53f8 C部 79796392-ed4d- 4475-8933- 52461a63e990 D課 6112d319-aadd- 46e1-8cf9- f144dcc2c873 B会社 f3c2ef9f-ae1d- 4a4c-a6fe- bfdc7c02a4e8 C事業部 5537e6af-fb46- 4ac0-9e5b- 09ccba3f2668 D部 cb1a8869-8a9b- 49d8-833a- bfa988029de5 E課 2eb60dc6-0c29- 4801-8d36- 65a64dac3d6d D事業部 c604091e-56b8- 4118-990c- 1fa8ff4838f9 E部 a8527c49-7ae2- 4cdd-9d25- a112bd213c7b F課 53abfb13-8d09- 41c5-830e- 4b0358e62059 Aプロジェクト 8541c800-c80e- 4fe1-a965- 7f217eb54c5c Bプロジェクト f25aaa09-0ec7- 4155-9ee3- 1e8a643aa0b1 Cプロジェクト dd7187f7-c32c- 41f8-806e- ab0ecc5f1a85
  20. A会社 b06675e0-8a1b- 43b8-92c7- c31a2c0071b3 A事業部 0ecc9315-2640- 4821-ad26- b35e1ff6a001 A部 93b408f5-f7cd-

    4cf6-a418- f86633851edd A課 e3717321-e8ae- 442a-9de9- 13ec7e9e2bfb B課 7d222a95-374a- 45f0-9234- 08647fbdd1bc B部 aa63b7e1-a387- 42ee-a967- 427b3b978d94 C課 c9127af3-8167- 4c3f-aad3- 2f59fdfab502 B事業部 11eb4681-2d91- 4bf9-bf5d- ee03fd1a53f8 C部 79796392-ed4d- 4475-8933- 52461a63e990 D課 6112d319-aadd- 46e1-8cf9- f144dcc2c873 B会社 f3c2ef9f-ae1d- 4a4c-a6fe- bfdc7c02a4e8 C事業部 5537e6af-fb46- 4ac0-9e5b- 09ccba3f2668 D部 cb1a8869-8a9b- 49d8-833a- bfa988029de5 E課 2eb60dc6-0c29- 4801-8d36- 65a64dac3d6d D事業部 c604091e-56b8- 4118-990c- 1fa8ff4838f9 E部 a8527c49-7ae2- 4cdd-9d25- a112bd213c7b F課 53abfb13-8d09- 41c5-830e- 4b0358e62059 Aプロジェクト 8541c800-c80e- 4fe1-a965- 7f217eb54c5c Bプロジェクト f25aaa09-0ec7- 4155-9ee3- 1e8a643aa0b1 Cプロジェクト dd7187f7-c32c- 41f8-806e- ab0ecc5f1a85 (方法2) Easy Auth での ID トークンの検証 ME-ID OpenID Connect における ID トークンの groups クレーム 22 • IDトークンのgroupsクレームに特定グループのObject IDが含まれる否かでアクセス許可を判断 { "oid": "54667aa5-1d49-4bea-9e0b-7a54d4d97e7e", "groups": [ "b06675e0-8a1b-43b8-92c7-c31a2c0071b3", "0ecc9315-2640-4821-ad26-b35e1ff6a001", "93b408f5-f7cd-4cf6-a418-f86633851edd", "e3717321-e8ae-442a-9de9-13ec7e9e2bfb" ] { "oid": "6d66d72e-2fbb-409c-81bf-1162fa19d28d", "groups": [ "f3c2ef9f-ae1d-4a4c-a6fe-bfdc7c02a4e8", "5537e6af-fb46-4ac0-9e5b-09ccba3f2668", "cb1a8869-8a9b-49d8-833a-bfa988029de5", "2eb60dc6-0c29-4801-8d36-65a64dac3d6d" ] A会社専用サイト Azure App Service ME-ID アプリ登録
  21. (方法2) Easy Auth での ID トークンの検証 ME-ID OpenID Connect における

    ID トークンの groups クレーム 設定・確認方法 23 • Microsoft Entra 管理センター • 「アプリの登録」で ME-ID アプリを開く • 「トークン構成」で「グループ要求の追加」を選択 • 「セキュリティグループ」をチェックして「追加」 • 検証サイト • サインインをやり直してヘッダを表示する • https://検証サイト名.azurewebsites.net/.auth/logout を開いて ログアウトした後に再度アクセスする • X-Ms-Token-Aad-Id-Token ヘッダの Base64 文字列を コピーして https://jwt.ms にペースト • Decoded Token に groups クレームが含まれているこ とを確認する
  22. (方法2) Easy Auth での ID トークンの検証 ME-ID OpenID Connect における

    ID トークンの groups クレーム注意事項 24 • ID トークンの groups クレームには 200 個までし か Object ID を保持できない [1] • 200以上のグループに所属するユーザーの場合 groups は分散クレーム形式となる • 別の REST API リクエストにより groups クレームを取得す る必要がある • よく見ると Azure AD Graph API のエンドポイントになっている • アクセストークンの情報がないため取得できない • グループフィルタによる対処 [2] • 表示名などのフィルタ設定により group クレームに含ま れる Object ID の数を 200 以下に減らすことができる • 「エンタープライズアプリケーション」で ME-ID アプリ を開き、「シングルサインオン」→「属性とクレーム」 編集→「groups」選択、グループフィルターを設定 • 「アプリ登録」で ME-ID アプリを開き、「マニフェス ト」のJSON で "acceptMappedClaims" を true に設定 • これを設定しないと AADSTS50146 エラーが発生する [1] https://learn.microsoft.com/ja-jp/security/zero-trust/develop/configure-tokens-group-claims-app-roles#group-overages [2] https://learn.microsoft.com/ja-jp/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#group-filtering
  23. (方法2) Easy Auth での ID トークンの検証 sites/config – "authsettingsV2" の設定

    25 • Azure App Service 設定のサブリソース [1] • Easy Auth に関する設定すべてを含む • "validation" で承認ポリシーを設定できる • authsettingsV2 の設定 • Azure Portal で完全な設定はできない • Azure Resource Explorer https://resources.azure.com または Azure CLI や ARM Templates (Bicep) で更新する • App Service アプリ内のファイルで設定する方法もある [2] • properties → identityProviders → azureActiveDirectory → validation → defaultAuthorizationPolicy → allowedPrincipals → groups でアクセ スを許可するグループの Object ID の配列を設定する [1] https://learn.microsoft.com/ja-jp/azure/templates/microsoft.web/sites/config-authsettingsv2 [2] https://learn.microsoft.com/ja-jp/azure/app-service/configure-authentication-file-based
  24. (方法2) Easy Auth での ID トークンの検証 アクセス拒否の確認 26 • 検証サイト

    • validation の条件を満たさないテナント内 ユーザーでサインインすると、コールバッ ク URI の時点で JSON を表示して終了する ので、アクセス制御は実現できている • Easy Auth レベルで発生するエラー表示に カスタマイズの余地がないので問題になる かもしれない
  25. Azure App Service + Easy Auth における認可の実現方法 27 • (方法1)

    ME-ID アプリのユーザー・グループの割り当て強制 • Microsoft Entra 管理センターや Azure Portal で最も簡単に設定できる • 重要な機能がなくテナント管理者権限が必要という欠点がある • (方法2) Easy Auth での ID トークンの検証 • IDトークンにgroupsクレームを追加し sites/config "authsettingsV2" リソースを設定する • 一般ユーザー権限でも設定可能で大きな欠点はないがエラー表示が不親切 • (方法3) Web アプリコードによる ID トークンの検証 • 複雑な認可や挙動を実現したい場合は結局これしかない • Easy Auth 環境専用のコードを書く必要がありポータビリティが損なわれる
  26. (方法3) Web アプリコードによる ID トークンの検証 28 • Easy Auth により

    HTTP リクエストヘッダにユーザー認証情報が設定される [1][2] • Safe? が Y のヘッダの情報は信用してよい (クライアントで設定されても Easy Auth がブロックする) • 重要: Safe? が Y ではないヘッダの情報は検証なしに使用しないこと これらのヘッダがクライアントで設定されても Easy Auth はブロックせず通してしまう 特に X-Ms-Token-Aad-Id-Token には groups クレームが含まれるが、これを信用してアクセス許可を判断しないこと Header Example (Microsoft provider) Safe? Description X-Ms-Client-Principal eyJhdXRoX3R5... Y 認証済みユーザーの情報 Base64 エンコードされた JSON object X-Ms-Client-Principal-Id 5b5450db-eb26-4c1a-981c-ba1d25f0483d Y 認証済みユーザーのObject ID X-Ms-Client-Principal-Name [email protected] Y 認証済みユーザーのメールアドレス X-Ms-Client-Principal-Idp aad Y 認証済みユーザーのIdPの種類 X-Ms-Token-Aad-Id-Token eyJ0eXAiOiJK... N ME-ID IDトークン (JWT) X-Ms-Token-Aad-Access-Token eyJ0eXAiOiJK... N ME-ID アクセストークン (JWT) X-Ms-Token-Aad-Expires-On 2023-11-24T19:48:40.9719862Z N ME-ID アクセストークンの有効期限 [1] https://learn.microsoft.com/ja-jp/azure/app-service/configure-authentication-user-identities [2] https://learn.microsoft.com/ja-jp/azure/app-service/configure-authentication-oauth-tokens
  27. (方法3) Web アプリコードによる ID トークンの検証 アプリコードによる Easy Auth X-Ms-Client-Principal ヘッダのデコード

    29 • X-Ms-Client-Principal に含まれる JSON object 構造の例 [1] { "auth_typ": "aad", "name_typ": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", "role_typ": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "claims": [ { "typ": "http://schemas.microsoft.com/identity/claims/objectidentifier", "val": "5b5450db-eb26-4c1a-981c-ba1d25f0483d" }, { "typ": "preferred_username", "val": "[email protected]" }, { "typ": "groups", "val": "f08bbbea-b793-4a36-a5fc-136c18d8aa8f" }, { "typ": "groups", "val": "14a87ffa-0801-49bf-a515-3d259a2a9f8f" }, // .... ] } [1] https://learn.microsoft.com/ja-jp/azure/app-service/configure-authentication-user-identities "typ":"groups" のように複数回 登場するクレームに注意
  28. (方法3) Web アプリコードによる ID トークンの検証 アプリコードによる Easy Auth X-Ms-Client-Principal ヘッダのデコード

    30 • C# のコード例 [1] • ヘッダのデコードのサンプルプログラム • Microsoft.Identity.Web 1.2.0 release [2] • Easy Auth がある環境でもない環境でもシームレスに動く ASP.NET Core 用の認証ライブラリ • Ruby on Rails のコード例 [3] • Easy Auth がある環境で動作する Redmine のユーザー認証プラグイン • Go のコード例 [4] • groups のような同名 typ/val が複数個存在することを考慮していない間違いコード、修正予定 [1] https://learn.microsoft.com/ja-jp/azure/app-service/configure-authentication-user-identities#decoding-the-client-principal-header [2] https://github.com/AzureAD/microsoft-identity-web/wiki/1.2.0 [3] https://github.com/yaegashi/redmine_easyauth/blob/master/app/controllers/easyauth_controller.rb [4] https://github.com/yaegashi/pswa/blob/master/auth/easy_auth_handler.go#L44-L61
  29. Azure App Service + Easy Auth 関連プロジェクトの紹介 (1) 31 •

    Redmine/RedMica の App Service ホスティング DevOps プロジェクト https://github.com/yaegashi/dx2devops-redmine https://github.com/yaegashi/redmine_easyauth (Redmine Easy Auth plugin) • Redmine/RedMica: Ruby on Rails によるプロジェクト進捗管理 Web サービス • 老朽オンプレミス機材で運用中の Redmine サイトを App Service に移すためにプロジェクト • Web App for Containers (Linux) を使用・GHCR でコンテナイメージを公開中 • 単一の App Service Plan・Database で複数のサイトが運用可能 → 高集積・低コスト • Azure Developer CLI に対応 • 2023/11/04 Redmine Tokyo 勉強会で紹介 Microsoft Entra/Azure による Redmine の企業内利用向けカスタマイズと運用 https://www.docswell.com/s/yaegashi/KENJ7G-microsoft-entra-azure-redmine
  30. Azure App Service + Easy Auth 関連プロジェクトの紹介 (2) 32 •

    Protected Static Web Apps https://github.com/yaegashi/pswa • Azure App Service + Easy Auth に対応した SPA 向け軽量 Web サーバ • ただし、今回紹介した ID トークン group クレームではなく、Microsoft Graph API でグループ情報を取得している • Azure Static Web Apps に似せた設定ファイルで簡単にアクセス制御が可能 • Go 言語による実装、GHCR でコンテナイメージを公開中 • 社内向けブログなどを運用中 (社内向け GitHub Pages 的なホスティングサービスを構築)
  31. Azure App Service + Easy Auth 関連プロジェクトの紹介 (3) 33 •

    Azure Chat Solution Accelerator powered by Azure Open AI Service https://github.com/microsoft/azurechat https://github.com/yaegashi/azurechat (forked repository) • App Service と Next.JS + NextAuth による AOAI チャット Web アプリ • Microsoft 公式っぽい AOAI サンプルプロジェクト、類似のプロジェクトは多数存在 • PR #192: AZURE_AD_ALLOWED_PRINCIPAL https://github.com/microsoft/azurechat/pull/192 • ME-ID グループによる Web アプリへのアクセス制限する機能を追加するプルリクエスト • NextAuth 利用モジュールを改造して Microsoft Graph API で必要な機能を実現 (Easy Auth は関係ない) • 今回紹介した ID トークン group クレーム ID 200 個までの制約を克服するためのグループフィルターの活用について教 えてくれたディスカッションがあります • これも ID トークンを使うように書き換える予定
  32. まとめ 34 • 従来の社内向け Web サイトホスティングをクラウドに移行するための取り組みを紹介しました • Azure App Service

    + Easy Auth のエンタープライズ向け活用の調査・検証・研究 • 関連するオープンソースソフトウェアプロジェクトの開発や貢献の紹介 • 今後も各種プロジェクトの進捗や成果物を随時紹介していきますのでよろしくお願いします!