Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
「認証認可」という 体験をデザインする ~Nekko Cloud 認証認可基盤計画 logica 𝕏: @logica0419 GitHub: @logica0419
Slide 2
Slide 2 text
自己紹介 ● logica (ろじか) ● 千葉工業大学 情報科学部 情報ネットワーク学科 3年 ● ネットワークコンテンツ研究会 (サークル) 所属 ○ Nekko Cloudチームのソフトウェア担当 ● セキュキャンだったり、ICTSCだったり、 Goだったり、Kubernetesだったり… 色んな界隈にいます
Slide 3
Slide 3 text
Nekko Cloudチーム
Slide 4
Slide 4 text
「メンバーの自宅サーバーVPNで 繋いで、プライベートクラウド 作ろう!」っていうチーム 自称「マルチリージョンプライベートクラウド」
Slide 5
Slide 5 text
ネッコ研が誇る逸般の誤家庭たち
Slide 6
Slide 6 text
ネッコ研が誇る逸般の誤家庭たち 浦和
Slide 7
Slide 7 text
ネッコ研が誇る逸般の誤家庭たち 津田沼
Slide 8
Slide 8 text
ネッコ研が誇る逸般の誤家庭たち 幕張
Slide 9
Slide 9 text
これらの”リージョン”を… 浦和 津田沼 幕張
Slide 10
Slide 10 text
VPNで繋げてしまえ! 浦和 津田沼 幕張
Slide 11
Slide 11 text
論理構成イメージ
Slide 12
Slide 12 text
これまでとこれから ● これまでできたこと ○ VPNで各拠点を繋ぐ ○ Proxmoxでクラスタリングし、IaaSを構築する ● これからやりたいこと ○ 共通認証認可基盤を作る ○ K8sクラスタを建てて、アプリをデプロイできる プラットフォームを整える などなど…
Slide 13
Slide 13 text
これまでとこれから ● これまでできたこと ○ VPNで各拠点を繋ぐ ○ Proxmoxでクラスタリングし、IaaSを構築する ● これからやりたいこと ○ 共通認証認可基盤を作る ←今日はこれの話です ○ K8sクラスタを建てて、アプリをデプロイできる プラットフォームを整える などなど…
Slide 14
Slide 14 text
一般的な認証認可
Slide 15
Slide 15 text
認証と認可 ● 認証 - Authentication ○ アクセスしているユーザが誰なのかを判別 ○ 情報漏洩すると非常にマズい ● 認可 - Authorization ○ 誰にどの操作を許可するのかを判別 ○ 変更されなければ、実際の影響はない ● この二つはセットにすると扱いやすいので、まとめて 「認証認可」と呼ばれる
Slide 16
Slide 16 text
認証情報、 自前で持つか? 外部で持つか? 認証の形について、少し整理しておく
Slide 17
Slide 17 text
自前で持つ型 ● パスワード / Passkey / 電話番号認証 など ● 認証情報の取扱いにかなり気を付けなければいけない ● アカウントが増えてめんどくさい、という印象が多い
Slide 18
Slide 18 text
外部で持つ型 ● OIDC (OAuth2) / IDaaS など ● 「自前で持つ型」を認証基盤が行い、受け渡す ● 知識が必要だったり、コードを書く量が増えたりで辛い
Slide 19
Slide 19 text
認証手法の良し悪し ● 自前型 ○ 良: 独自の手法が使える / 実装が比較的楽 ○ 悪: 脆弱な実装が生まれやすい ● 外部型 ○ 良: 比較的安全 / ユーザーの機密情報が増えない ○ 悪: 難しい / 実装がめんどくさい ● 昨今Web界隈では「外部型に寄せよう!」という動きが 高まっている ような気がする
Slide 20
Slide 20 text
主な認可手法 ● ユーザー紐づけ ○ それぞれのユーザーに権限を紐づける ○ 簡単だが、ユーザー・権限が増えると管理が大変 ● RBAC (Role Based Access Control) ○ 最近の認可手法のデファクトスタンダード ○ ユーザー - ロール - 権限 という風に紐づける ○ ロールで権限を束ねることで、わかりやすくなる
Slide 21
Slide 21 text
RBACの例: AWS IAM Image by: AWS Document ユーザー ロール with 権限 実際に触るリソース
Slide 22
Slide 22 text
認証・認可情報を伝播させる技術 ● OAuth2 ○ 認可情報を伝える手段 ○ 一定のAPIを叩く権限のあるアクセストークンを発行 ● OIDC ○ OAuth2を拡張した、認証情報を伝える手段 ○ 認証情報に加え、拡張フィールドでロールなども 伝播できる
Slide 23
Slide 23 text
様々な技術をいい感じに組み 合わせて、認証認可の技術は 成り立っています! 以上が前提知識で、ここからが本題
Slide 24
Slide 24 text
Nekko Cloudで求められる要件
Slide 25
Slide 25 text
これまでとこれから ● これまでできたこと ○ VPNで各拠点を繋ぐ ○ Proxmoxでクラスタリングし、IaaSを構築する ● これからやりたいこと ○ 共通認証認可基盤を作る ○ K8sクラスタを建てて、アプリをデプロイできる プラットフォームを整える などなど…
Slide 26
Slide 26 text
認証の要件 ● Nekko Cloud内のアプリケーションエコシステムに、 共通認証基盤が欲しい ○ IaaS / Kubernetes基盤 / 部内Wiki / VPN などなど… ○ これらを1つのアカウントで済ませたい ○ 逆に、それ以外のところに使う予定はない ● 自分たちで認証情報を管理したくない ○ 「外部で持つ型」の認証はほぼ確定
Slide 27
Slide 27 text
認可の要件 ● どのメンバーがどのアプリケーションを使えるかを コントロールしたい ○ アプリケーションの中での権限については、 「admin」か「user」かくらいしか存在しない ● アプリケーション側に複雑なロジックを実装したくない ○ アプリケーション側で権限管理をしたくない ○ 外付けの認可基盤で管理できればBest
Slide 28
Slide 28 text
肥大化・分散する認可情報 ● 認可情報は、肥大化する傾向にある ○ IAMとか、全部分かってる人いない ● 認可情報は、分散していく傾向にある ○ 認証情報はOIDC等でそのまま伝播できるが、 認可情報はそれぞれのアプリケーションが持つ ○ OIDCでも伝播できるのはせいぜいロール程度で、 ロールを元に権限を割り振るのはそれぞれのアプリ ● これが汎用的な基盤の限界
Slide 29
Slide 29 text
プラットフォームとしての要件 ● できるだけアプリケーションにロジックを入れたくない ○ 今後みんながアプリケーションを作りやすくする ために、複雑性の隠蔽をしたい ○ 既存OSSの場合はOIDCの設定 / 自作アプリなら プロキシで認証できると良い (後述) ● Kubernetesをアプリケーションデプロイ基盤として 用いるので、それに即した形にしたい
Slide 30
Slide 30 text
2つのソリューションを発案した 1. Kikkoff: ネッコ研 共通認証認可基盤 2. Sidauth: K8s上のhttpプロキシ型認証システム
Slide 31
Slide 31 text
Kikkoff: ネッコ研 共通認証認可基盤
Slide 32
Slide 32 text
サークルの環境と認証手法 ● 部内の全ての人が、Discordサーバーにいる ○ Discordサーバーに所属していれば、サークル員 ● DiscordのOAuthで直接認証するという案が出たが、 以下の問題があった ○ 認可処理が面倒 (Discordのロールを使うのは厳しい) ○ OAuthしかないので、OIDCにするためには何かしら のソフトウェアを挟む必要がある
Slide 33
Slide 33 text
Discordで認証するポータルに OIDC Providerの機能を持たせ 認証を「プロキシ」する! 小規模クラウドだからこそ絞れる要件を、最大限絞った結果
Slide 34
Slide 34 text
Kikkoff ● メンバーポータル 兼 OIDC Provider ● メンバーポータルとして ○ Discordのみで認証する ○ ロール付け等、独立したメンバー管理機構 ● OIDC Providerとして ○ 部内アプリケーションの認証手法を統一する ○ Clientにロールを紐づけ、Provider主体でアプリへ のアクセス認可をする
Slide 35
Slide 35 text
認証の「プロキシ」イメージ ● これによって、 ○ Discordの認証でありながら ○ OIDCを使った認証情報の伝播ができる!
Slide 36
Slide 36 text
Provider主体の、単純化された認可
Slide 37
Slide 37 text
Provider主体の、単純化された認可 Providerがアクセスを切る (認証情報を渡さない)
Slide 38
Slide 38 text
メンバーのライフサイクル管理 ● Kikkoffのメンバー状態 (在籍・ロールなど) を正と して、DiscordやGitHubのメンバーに逆に同期すると いうアイデア ○ Discord / GitHubのロール自動管理 ○ 長期間アクセスの無い部員を自動でキック ○ Kikkoffに登録すると、自動で各種サービスに招待 ■ サークルのキックオフを補助する (名前の由来)
Slide 39
Slide 39 text
Sidauth: K8s上のhttpプロキシ型認証システム
Slide 40
Slide 40 text
直接認証とプロキシ型認証 ● 直接認証 ○ アプリケーションが直接認証する ○ 認証情報はアプリケーションが持つ ● プロキシ型認証 ○ リバースプロキシが認証し、アプリに伝達 ○ アプリは認証情報を持たず、ヘッダ等で受け取る ● 複雑性をアプリから切り離したい = プロキシ型が適する
Slide 41
Slide 41 text
Kubernetesにおけるプロキシ型認証
Slide 42
Slide 42 text
Kubernetesにおけるプロキシ型認証
Slide 43
Slide 43 text
Ingress Controllerによる認証の問題点 ● Ingress Controllerに実装が依存する ○ 認証を実装していないIngress Controllerが存在 ○ 新しい規格であるGateway APIでも状況は同じ ● アプリケーションと認証システムのライフサイクルが 一致しない ○ 認証システムが落ちたらアプリにアクセスできない ○ Ingress Controller内包だったらまだいいが、外付け だと顕著に弱さが出る
Slide 44
Slide 44 text
アプリケーションPodの Sidecar Containerとして 認証システムをInjectする 「自分のことは自分でやれ」型の認証システム
Slide 45
Slide 45 text
Ingress Controller主体
Slide 46
Slide 46 text
Sidecar主体
Slide 47
Slide 47 text
Sidecar型認証の利点 ● Ingress Controllerに実装が依存しない ○ アプリケーションPod単体で認証ができる! ○ 認証が無いIngress ControllerでもOK ● アプリケーションと認証システムのライフサイクルが 完全に一致する ○ アプリケーションと一心同体! ○ 最近K8sでSidecarが改善されたので、いい感じに 実装できそう
Slide 48
Slide 48 text
Sidauth: Sidecar型認証Operator ● CRD: AuthService ○ Serviceの代わりに使用 ○ Serviceの設定と、認証設定を包含する ● Sidauth Operator ○ AuthServiceを受け取って、以下を生成する ■ 対象のPod群へのSidecar Injection ■ Injectしたコンテナへ向けたService
Slide 49
Slide 49 text
アイデア自体は転がっていたが CRDとOperatorまで 作っている人はいなかった 結構面白いプロダクトにできるのでは…?と思っている
Slide 50
Slide 50 text
まとめ / 今後の展望
Slide 51
Slide 51 text
認証認可の選択肢は 1つではないと思うが、 我々はこれでやってみたい ユースケースに合わせて適切に設計していきたいですね
Slide 52
Slide 52 text
実際の開発と未踏事業への挑戦 ● まだ開発は開始していない ○ Nekko Cloudのみんなで頑張って開発していく ● 今回紹介した認証認可基盤と、Kubernetesベースの IaaSを設計し、「Kubernetesをベースとした、軽量な 小規模クラウド基盤」として未踏に挑戦してみたい ○ 事前開発や開発ペースなど、未踏人材の皆さんに アドバイスいただけたら嬉しいです!
Slide 53
Slide 53 text
ありがとうございました 良き認証認可ライフを!