3.8K Views
December 16, 23
スライド概要
.NETラボ 勉強会 2023年12月
https://dotnetlab.connpass.com/event/303142/
Microsoft MVP for Microsoft Azure
Azure Container Apps と Easy Auth による レガシー Web アプリ・サービスのモダナイズ 株式会社バンダイナムコスタジオ 技術スタジオ オンラインテクノロジー部 サーバソリューションユニット DXセクション 八重樫 剛史 Takeshi Yaegashi 2023/12/16 .NET 勉強会
自己紹介 • 八重樫 剛史 Takeshi Yaegashi • 株式会社バンダイナムコスタジオ (BNS) 技術スタジオ オンラインテクノロジー部 サーバソリューションユニット DXセクション テクニカルディレクター • 社内開発者向けのクラウドサービス導入推進 プラットフォームエンジニアリングのプロジェクトに従事 • Microsoft MVP for Microsoft Azure (2023) https://mvp.microsoft.com/ja-jp/PublicProfile/5005134 • Web (blog) X (Twitter) GitHub https://l0w.dev https://twitter.com/hogegashi https://github.com/yaegashi 2
本日の話題 • エンタープライズ (大企業) の社内向け Web サービスに IDaaS・PaaS を導入する取り組みの紹介 • 2023年11月 .NETラボ勉強会の登壇の続き 「Microsoft Entra ID と Azure App Service によるエンタープライズ Web アプリ・サービスのプラットフォーム構築」 • 「エンタープライズ」の例: Microsoft 365 E3を導入した従業員10,000名の企業グループ • レガシーな認証プロトコルしか使えないアプリ・サービスのモダナイズ • レガシーな認証プロトコル = HTTP Basic 認証 • Microsoft Entra ID を活用してモダンな認証プロトコルでゼロトラストなセキュリティを実現したい • 事例紹介 • プライベート NuGet フィードの Azure Container Apps によるホスティング 3
エンタープライズのMicrosoft Entra ID (ME-ID)テナントの特徴 • 単一のME-IDテナントの中に多数の会社・部署などの組織階層を反映したセキュリティグループがある • 組織階層とは関係なく一般ユーザーが自由に作成するMicrosoftグループ(MS Teams)も多数存在する • 多数の社外ゲストユーザーも混じっている (B2Bコラボレーション) A会社 A事業部 A部 A課 B課 B会社 B事業部 C事業部 D事業部 B部 C部 D部 E部 C課 D課 E課 F課 Aプロ ジェクト Bプロ ジェクト Cプロ ジェクト 4
エンタープライズの社内向けWebアプリ・サービスでのME-IDの活用 • 特定の組織階層グループに属するユーザーのみにWebアプリ・サービスへのアクセスを許可したい (前回の登壇を参照) • OpenID Connect などのモダンな認証プロトコルでゼロトラストなセキュリティを実現したい • レガシーな認証プロトコルのWebアプリ・サービスをモダナイズしたいがソースコードにはなるべく手を加えたくない A会社 A事業部 B会社 B事業部 C事業部 D事業部 A会社専用サイト Azure App Service ME-ID アプリ登録 A部 A課 B課 B部 C部 D部 E部 C課 D課 E課 F課 Aプロ ジェクト Bプロ ジェクト Cプロ ジェクト 5
レガシーな認証プロトコル・HTTP Basic 認証について • HTTPに組み込まれたユーザー認証 • HTTPリクエストのAuthorizationヘッダで "ユーザー:パスワード" 文字列をBase64エンコードして渡す • HTTP Basic認証はセキュリティが弱いことから廃止・置き換えが進んでいる • 例: Microsoft Exchange Online & Outlook など • 他要素認証 (MFA) に対応できない、いわゆるログアウトができない、etc. • 置き換え先: OpenID Connect からのHTTPクッキー認証のようなモダンな認証プロトコル • HTTP Basic認証がやめられないアプリ・サービスも多数ある • 例: NuGet、Subversion など • 昔から使われている専用クライアントアプリによる開発者向けツールなどに多い • オンプレミスで稼働するWebアプリ・サービスのクラウド移行の障害のひとつとなっている 6
easy-basic-auth-proxy • https://github.com/yaegashi/easy-basic-auth-proxy • Easy Auth認証およびHTTP Basic認証のフロントエンドとなるリバースプロキシサーバー • Easy Auth 認証でサインインするとHTTPクッキー認証とHTTP Basic認証ができるアカウントを自動登録する • プロキシ後段に配置するアプリサーバーのコードを書き換えることなく、モダンな認証プロトコルの対応が可能 • Go 言語による実装、GHCRでコンテナイメージを公開中 • Go を使うとコンテナサイズが小さく、立ち上がりが速くできる → サーバーレス構成で有用 7
Easy Auth について • Azure App Service などのWebアプリPaaSで利 用可能な組み込みの Web 認証・認可機能 • App Service, Functions[1], Static Web Apps[2], Container Apps[3], etc. が対応、細かい仕様はサービスにより異 なる • アプリの前段に配置されるミドルウェアとして動作 し、HTTPリクエストのヘッダなどでアプリ本体に ユーザー認証情報を伝える • Identity Provider (IdP) として Microsoft (ME-ID), Google, Apple, GitHub, Facebook などに対応するがここでは Microsoft (ME-ID) に限定する 認証済みユーザーのIDをHTTPリクエストヘッダに挿入 X-Ms-Client-Principal-Id: 7b90a0b5-324c-4154-8599-82fe1e338796 X-Ms-Client-Principal-Name: [email protected] [1] https://learn.microsoft.com/ja-jp/azure/app-service/overview-authentication-authorization [2] https://learn.microsoft.com/ja-jp/azure/static-web-apps/authentication-authorization [3] https://learn.microsoft.com/ja-jp/azure/container-apps/authentication 8
dx2devops-nuget-server • https://github.com/yaegashi/dx2devops-nuget-server • Azure Container Apps で稼働するプライベート NuGet サーバー • 社内専用の https://www.nuget.org/ を実現 • NuGet サーバーアプリ BaGetter[1] のレガシー認証を easy-basic-auth-proxy でモダナイズ • BaGetter 自体は認証機能を持たないので外付けする必要がある • Web ブラウザでは OpenID Connect + HTTPクッキー認証を使用する • 同時に一般的な NuGet V3 APIクライアントが備える HTTP Basic 認証にも対応する • Azure Developer CLI によるワンストップデプロイ • azd コマンドで NuGet サーバーを作ったり壊したりが簡単にできる [1] https://github.com/bagetter/BaGetter 9
デモンストレーション • Azure Developer CLI によりデプロイ (https://github.com/yaegashi/dx2devops-nuget-server の README を参照) $ $ $ $ $ mkdir my-nuget-server cd my-nuget-server azd init -t https://github.com/yaegashi/dx2devops-nuget-server azd auth login azd provision 10
デモンストレーション • デプロイされたサーバーに Web ブラウザで初回のアクセス • HTTP Basic 認証で阻まれる • OK ボタンで Easy Basic Auth Proxy configuration に移動 (/auth) 11
デモンストレーション • Microsoft Entra ID サインイン → Easy Basic Auth Proxy configuration • HTTP クッキー認証が設定され Web ブラウザでのアクセスが可能になる • HTTP Basic 認証の Username/Password が生成される → NuGet V3 API クライアントで使用 12
デモンストレーション • WebブラウザでHTTP クッキー認証により BaGetter サイトを表示 13
デモンストレーション • dotnet nuget コマンドで HTTP Basic 認証つきの NuGet フィードを登録、アクセス $ dotnet nuget add source ¥ -n MyFeed ¥ -u 7b90a0b5-324c-4154-8599-82fe1e338796 ¥ -p sxT3F65Po34shzTZ8Ufrs6TTHX7PLBxJ ¥ --store-password-in-clear-text ¥ https://ca-blpumsfgpuyse.lemongrass-c26891ca.japaneast.azurecontainerapps.io/v3/index.json $ dotnet nuget push –s MyFeed –k 7L02FpgCyN4iZq8 unitysetup.5.6.161-develop.nupkg HTTP Basic認証の Username/Password NuGet V3 API Endpoint Key Vault に格納された API Key 14
dx2devops-nuget-server アーキテクチャ • マネージドサービスを活用してモダンな認証を備える NuGet サーバーを実現 15
dx2devops-nuget-server パス・ルーティング • /.auth および /auth が認証・認可機能として BaGetter に到達前にインターセプトされる 16
easy-basic-auth-proxy・dx2devops-nuget-server をなぜ作ったか • プライベートNuGetサーバがほしい場合の第一の選択肢 → マネージドサービスの利用 • 例: Azure Artifacts、GitHub Packages など • 大規模エンタープライズの社内向けのパッケージ配布にマネージドサービス導入はできない • 例: 1000人以上の従業員にME-ID社内管理ツールのPowerShellモジュールを配りたい • マネージドサービスでは毎月・毎ユーザーの課金により利用実績に見合わない料金が発生する • GitHub Packages: $21/user/month (Enterprise) • Azure Artifacts: $6/user/month (Basic) • セルフホスト可能なNuGetサーバーの選択肢がない [1] • クラウドサービスに設置するにはモダンな認証プロトコルが必要 • モダンな認証プロトコルを実装したOSSのNuGetサーバー・クライアントがない • レガシーなHTTP Basic認証とモダンなEasy Auth認証の両方に対応する汎用リバースプロキシを自作することで対応 • NuGetだけでなくSubversionなど他の開発者向けソフトウェアにも対応可能と思われる [1] https://learn.microsoft.com/ja-jp/nuget/hosting-packages/overview 17
まとめ • レガシーなHTTP Basic認証のWebアプリ・サービスを モダンなEasy Auth認証に対応させる手法を NuGet サーバーの事例と共に紹介しました • easy-basic-auth-proxy • dx2devops-nuget-server • 今後も各種プロジェクトの進捗や成果物を随時紹介していきますのでよろしくお願いします! 18
Thank You!! 19