Slide 1

Slide 1 text

Azure AD対応の 認証プロキシサーバを Goで作っている話 2021/11/13 Go Conference 2021 Autumn 八重樫 剛史 Takeshi Yaegashi

Slide 2

Slide 2 text

自己紹介 八重樫 剛史 Takeshi Yaegashi 株式会社バンダイナムコスタジオ所属 Linux・Unix・OSS・Go 言語が好きなエンジニア 組み込みシステム開発、ゲームサーバ開発、 CI/CD インフラ開発、 開発環境のクラウドシフトなどの業務に従事 活動場所 ホームページ・ブログ https://l0w.dev GitHub https://github.com/yaegashi Twitter https://twitter.com/hogegashi

Slide 3

Slide 3 text

クラウドの静的ウェブアプリ (SWA) ● 静的ウェブアプリの流行 ○ Hugo のような Static Site Generator で作る静的ウェブサイト ○ TypeScript や React で作るシングルページアプリ ● 静的ウェブアプリに適したクラウドサービス ○ GitHub Pages ○ GitLab Pages ○ Netlify ○ Azure Static Web Apps / App Service ○ AWS Amplify ○ Google Firebase Hosting

Slide 4

Slide 4 text

クラウドの社内向け静的ウェブアプリ ● 全てのユーザーについて認証・認可が必要 ○ IPアドレス・イントラネット・ VPNに頼るアクセス制御は甘え (ゼロトラストセキュリティ ) ○ 特定の会社や部署だけに見せる、といった細かいレベルで制御したいことがよくある ○ Web サイトの一部分だけに認証をかけたいということも ● 細かい認可のニーズに対応できるサービスがない ○ 例えばAzure App Serviceにおいてはユーザー認証なら自動的にやってくれるが (Easy-Auth)、 認可についてはWebアプリが自分自身で判断する必要がある ○ アプリごとになんらかの認可のためのコードを書く必要があり敷居が高い ○ 認証だけでなく認可までコードを書かずに設定できる Webサーバがほしい

Slide 5

Slide 5 text

pswa - Protected Static Web Apps ● Go による認証・認可つきの Web コンテンツ・プロキシサーバ ● Simple web content/proxy server that embodies enterprise zero trust security ● https://github.com/yaegashi/pswa ● Docker image: ghcr.io/yaegashi/pswa

Slide 6

Slide 6 text

pswa 特徴 ● Azure Active Directory の OpenID Connect によるユーザーの認証・認可 (Azure AD 以外の IdP にも対応を検討中) ● 認証ユーザーの ID トークンに含まれる groups クレームからロールを定義 ロールを使ってルートごとのアクセス認可設定 ● ルートごとにリライト・リダイレクト・プロキシが設定可能 ● /index.html などへのフォールバックが設定可能 シングルページアプリのホストにも利用できる

Slide 7

Slide 7 text

pswa.config.json - 設定ファイルの例 ● routes: ルートパスとアクセスを許可 するロール、リライトやリダイレクトな どの処理を定義 ● roles: ロールの名前とそれに属する AzureAD グループのオブジェクトIDを 定義 ● Azure Static Web Apps で使用する staticwebapps.config.json に似せた { "routes": [ { "route": "/admin/*", "allowedRoles": ["admin"] }, { "route": "/internal/*", "allowedRoles": ["authenticated"] }, { "route": "/api/*", "proxy": "http://backend:8080/api" } ], "roles": [ { "role": "admin", "members": [ "34a36796-6043-4dea-85e1-c6ad121a54d4", "06fe36df-51ab-49d9-aa3e-2b0034c2cbd1", "5bafeeac-804c-4ea4-95c6-11696535c8cb" ] } ] }

Slide 8

Slide 8 text

pswa - デモ ● https://pswademo1.azurewebsites.net/ ● Azure App Service の Linux B1 に ghcr.io/yaegashi/pswa コンテナをデプロイ ● Hugo で作った静的サイトを Visual Studio Code 拡張でアップロード

Slide 9

Slide 9 text

pswa のコンポーネント ● github.com/coreos/go-oidc - OpenID Connect RP ○ IdP の .well-known/openid-configuration を取得してエンドポイントを自動設定 ○ JWKS による ID トークンの署名検証 ● github.com/gobwas/glob - Route path pattern matching ○ "*.{jpg,gif,png}" のようなパターンマッチは標準ライブラリではできない ● go.uber.org/zap - Logger ● github.com/felixge/httpsnoop - HTTP access logging ● github.com/gorilla/sessions - Session cookie store

Slide 10

Slide 10 text

pswa 開発進捗 ● 典型的な登壇ドリブン開発(CFPを出してから考える) ● 構想は一年以上、開発期間はまだ一週間 ● 各所に明確なニーズがあるので2021年中に完成させたい

Slide 11

Slide 11 text

おわり ● 認証・認可機能が充実した Web コンテンツ・プロキシサーバを作ってます ● コメントやプルリクいただけるとうれしいです ● ご清聴ありがとうございました