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. Microsoft Entra IDとAzure App Serviceによる
    エンタープライズWebアプリ・サービスのプラットフォーム構築
    株式会社バンダイナムコスタジオ 技術スタジオ オンラインテクノロジー部
    サーバソリューションユニット DXセクション
    八重樫 剛史 Takeshi Yaegashi
    2023/11/25 .NET 勉強会

    View full-size slide

  2. 自己紹介
    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

    View full-size slide

  3. 本日の話題
    3
    • エンタープライズ (大企業) の社内向け Web サービスに IDaaS・PaaS を導入する取り組みの紹介
    • オンプレミス・境界型セキュリティからクラウド・ゼロトラストセキュリティへの移行
    • Microsoft Entra ID (ME-ID)
    • エンタープライズの ME-ID テナントのグループ階層とユースケース
    • OpenID Connect における ID トークンの groups クレームの活用
    • Azure App Service
    • App Service 組み込みの認証・認可 (Easy Auth)
    • authsettingsV2 によるアクセス検証
    • 事例紹介
    • オープンソースの Web サービスのエンタープライズ向けカスタマイズなど

    View full-size slide

  4. 背景:エンタープライズ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)
    • インターネットのゼロトラストセキュリティを採用

    View full-size slide

  5. オンプレミス時代のエンタープライズの社内向け Web サービスホスティング
    5
    • オンプレミスのサーバ機材をやめてクラウドに移行したい…
    A会社 B会社
    A会社専用サイト
    http://192.168.1.1:8080
    A会社専用サイト
    http://192.168.1.2:8080
    B会社専用サイト
    http://192.168.1.1:8080
    社外サイト
    https://www.example.com
    VPN

    View full-size slide

  6. 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プロ
    ジェクト

    View full-size slide

  7. • 特定のグループに属するユーザーのみにアクセスを許可したい (できるだけアプリのコードをいじらずに…)
    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 アプリ登録

    View full-size slide

  8. 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 ガバナンス支援の機能が存在する

    View full-size slide

  9. 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

    View full-size slide

  10. 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 環境専用のコードを書く必要がありポータビリティが損なわれる

    View full-size slide

  11. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  14. 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 環境専用のコードを書く必要がありポータビリティが損なわれる

    View full-size slide

  15. (方法1) ME-ID アプリのユーザー・グループの割り当ての検証
    15
    • Microsoft Entra 管理センター
    • 「エンタープライズアプリケーション」で
    検証サイト ME-ID アプリを開く
    • 「プロパティ」で
    「割り当てが必要ですか」を「はい」に設定
    • 「ユーザーとグループ」で
    ユーザーまたはグループの追加
    • グループを追加するには
    Microsoft Entra ID P1 ライセンスが必要
    • 検証サイト
    • ME-ID アプリに割り当てられていない
    テナント内ユーザーでアクセスすると
    AADSTS50105 エラーとなるので
    アクセス制御が実現できている

    View full-size slide

  16. (方法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

    View full-size slide

  17. 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 環境専用のコードを書く必要がありポータビリティが損なわれる

    View full-size slide

  18. (方法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 に記述する

    View full-size slide

  19. (方法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プロ
    ジェクト

    View full-size slide

  20. (方法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

    View full-size slide

  21. (方法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

    View full-size slide

  22. 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 アプリ登録

    View full-size slide

  23. (方法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 クレームが含まれているこ
    とを確認する

    View full-size slide

  24. (方法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

    View full-size slide

  25. (方法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

    View full-size slide

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

    View full-size slide

  27. 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 環境専用のコードを書く必要がありポータビリティが損なわれる

    View full-size slide

  28. (方法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

    View full-size slide

  29. (方法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" のように複数回
    登場するクレームに注意

    View full-size slide

  30. (方法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

    View full-size slide

  31. 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

    View full-size slide

  32. 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 的なホスティングサービスを構築)

    View full-size slide

  33. 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 トークンを使うように書き換える予定

    View full-size slide

  34. まとめ
    34
    • 従来の社内向け Web サイトホスティングをクラウドに移行するための取り組みを紹介しました
    • Azure App Service + Easy Auth のエンタープライズ向け活用の調査・検証・研究
    • 関連するオープンソースソフトウェアプロジェクトの開発や貢献の紹介
    • 今後も各種プロジェクトの進捗や成果物を随時紹介していきますのでよろしくお願いします!

    View full-size slide

  35. Thank You!!
    35

    View full-size slide