Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
VPNの認証をCIBAでやってみた
Search
okzk
October 27, 2021
730
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
VPNの認証をCIBAでやってみた
okzk
October 27, 2021
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
GitHub's CSS Performance
jonrohan
1033
470k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
Game over? The fight for quality and originality in the time of robots
wayneb77
1
280
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
460
The Cult of Friendly URLs
andyhume
79
7k
Automating Front-end Workflow
addyosmani
1369
210k
Being A Developer After 40
akosma
91
590k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
Transcript
2021/10/27 iddance Lesson3 VPNの認証をCIBAでやってみた okzk (Hiroshi Okazaki)
自己紹介的なナニカ • okzk(Hiroshi Okazaki) – 株式会社サイバーエージェント – セキュリティの部署にて、社内向けIdPの開発/運用に従事
• はじめに • CIBAについて • RP視点でみたCIBAフロー • CD視点でみたCIBAフロー • VPNの認証をCIBAでやってみた
• まとめ • (おまけ) IdPの実装について
はじめに
本発表の概要 • 最初にCIBAの復習をカンタンに行います。 • CIBAに対応したOPが存在したときにどんなことができるのかと いうのを事例を交えて紹介します。 • 時間が余ったら、おまけでOPを実装してみた所感も紹介しま す。
CIBAについて
OpenID CIBA Flow CIBA(Client Initiated Backchannel Authentication) Decoupled flow に分類される認証/認可のフロー
◦ 消費デバイス(Consumption Device) OIDC 認証リクエストを投げる側 ◦ 認証デバイス(Authentication Device) OIDC 認証リクエストを承認するデバイス
シーケンス図(POLLモード)
シーケンス図(PINGモード)
シーケンス図(PUSHモード)
モードの違いについて(私見) • PING/PUSHモードはOPからのアクセスを受け付けるHTTPSの エンドポイントが必要になる • PING/PUSHモードの場合、RPの冗長化を考えると、CDからの リクエストとOPからのPING/PUSHアクセスが同じRPインスタ ンスに届くとは限らない →状態の外だしや更新のイベント通知が必要になる •
RPの実装を考えると、POLLモードを採用するのが楽 →本発表の内容は以降全部POLLモード
RP視点でみたCIBAフロー
RP視点でみたCIBAフロー • リダイレクトベースではないので、認証組み込みが容易 backchannel authn requestと、その後のtoken pollingを処理す るだけでOK
goのライブラリ • https://github.com/okzk/go-ciba backchannel authn requestとその後のpolling処理をラッピング するクライアントライブラリ token, err :=
client.Authenticate(ctx, ciba.LoginHint("alice")) ここの一連の処理を まとめて面倒をみる
goのライブラリ使用例 クライアント初期化コード token, err := client.Authenticate(ctx, ciba.LoginHint("alice")) token, err :=
client.Authenticate(ctx, ciba.LoginHint("alice")) client := ciba.NewClient( "https://example.com", // issuer "https://example.com/bc-authn", // backchannel_authentication_endpoint "https://example.com/token", // token_endpoint "openid", // scope "sample_client", // client_id "xxxxxxxxxxxxxxxxxxxxx", // client_secret )
goのライブラリ使用例 単純な認証の場合: token, err := client.Authenticate(ctx, ciba.LoginHint("alice")) token, err :=
client.Authenticate(ctx, ciba.LoginHint("alice"))
goのライブラリ使用例 ユーザコード付きの認証の場合: token, err := client.Authenticate(ctx, ciba.LoginHint("alice")) token, err :=
client.Authenticate(ctx, ciba.LoginHint("alice"), ciba.UserCode("code"))
(補足) ユーザコード • パスワードのようにユーザだけが知っている秘密のコード - 検証はOPで行う - 検証NGの場合ADへの通知を行わずに即時でエラー •他人のlogin_hintが推測可能な場合は、ユーザコード利用が 望ましいと思われる
- 他人のADに通知を飛ばす攻撃やいたずらを防止可能
goのライブラリ使用例 バインディングメッセージ付きの認証の場合: token, err := client.Authenticate(ctx, ciba.LoginHint("alice")) token, err :=
client.Authenticate(ctx, ciba.LoginHint("alice"), ciba.BindingMessage("message"))
(補足) バインディングメッセージ • CD/ADの画面に表示して一連のトランザクションであることを ユーザに目視で確認させるもの コードを確認して、ADで認 証許可してください code: XXXXXXX CDと同じコードかどうか確
認してください code: XXXXXXX
RPでのCIBA利用は容易 • 認可コードフローのようにリダイレクトで画面を行ったり来た りする必要がない • ライブラリを利用すれば、極わずかなコードでCIBA連携は実現 可能 • goでライブラリを実装した印象では、他言語での実装も困難で はないと思われる
CD視点でみたCIBAフロー
CD視点でみたCIBAフロー • リダイレクトベースではないので、HTTP以外のプロトコルでも 利用が容易 どんなプロトコ ルでもOK
RADIUSでやってみよう • Remote Authentication Dial In User Service • RFC2865
他で標準化 • UDPベースのシンプルな認証サービスのプロトコル • もともとはダイアルアップ向け • 現在でも、様々なアプライアンスにて認証サービスとして利用 可能 token, err := client.Authenticate(ctx, ciba.LoginHint("alice"))
RADIUSサーバ をRP として実装 •https://github.com/okzk/oidc-radius •https://hub.docker.com/r/okzk/oidc-radius token, err := client.Authenticate(ctx, ciba.LoginHint("alice"))
RADIUS プロトコル ここの実装
RADIUSサーバ をRP として実装 • RADIUSとCIBAのパラメータの変換して、認証リクエストをプロ キシするだけ token, err := client.Authenticate(ctx,
ciba.LoginHint("alice")) RADIUSサーバ (RP) User-Name User-Password login_hint user_code
起動はdocker run token, err := client.Authenticate(ctx, ciba.LoginHint("alice")) token, err :=
client.Authenticate(ctx, ciba.LoginHint("alice")) docker run -d -p 1812:1812/udp -p 1813:1813/udp \ -e RADIUS_SECRET="..." \ -e CIBA_ISSUER="https://example.com" \ -e CIBA_AUTHN_ENDBPOINT="https://example.com/backchannel/authn" \ -e CIBA_TOKEN_ENDBPOINT="https://example.com/token" \ -e CIBA_CLIENT_ID="..." \ -e CIBA_CLIENT_SECRET="..." \ okzk/oidc-radius
特徴 • POLLモードを使っていて、shared nothing - 冗長構成も横に並べるだけ • 単純のプロキシ処理なので、実装もシンプル - 100行程度の実装
token, err := client.Authenticate(ctx, ciba.LoginHint("alice"))
RADIUSを喋るRPが用意できた! • RADIUSをサポートするアプライアンスやサービスをCDとみなし て、その認証をCIBAで利用できるようになった!! • これを利用すれば。。。 token, err := client.Authenticate(ctx,
ciba.LoginHint("alice"))
VPNの認証をCIBAでやってみた
CISCO ASAシリーズ • CISCOのVPNとかを提供するアプライアンス • もともとは弊社プライベートクラウド環境で LDAP + 2FAのSaaS(RADIUS)の構成 •
CIBAのRADIUSのみの構成に移行
CIBA利用時のVPN接続シーケンス token, err := client.Authenticate(ctx, ciba.LoginHint("alice"))
VPN接続の雰囲気 token, err := client.Authenticate(ctx, ciba.LoginHint("alice")) user_code login_hint(sub)
実際にやってみて • CIBAはbackchannelでユーザインタラクションが必要になるの で、CD側のRADIUSタイムアウトは長めにする必要がある • 本番環境で、一年弱安定稼働
ユーザの反応など • 弊社のIdP実装はWebAuthnの認証に対応しているので、ADが Macの場合、VPN接続時に通知を開いてTouch IDに指を添える だけでOKとなった • 2FAのためにスマートフォンを取り出す必要がなくなり、楽に なった
その他のVPN • IPSec + CIBA, OpenVPN + CIBA - 弊社内限定公開でPoC中
- ドッグフーディングが不十分なため、社外には非公開 • コードを見た弊社社員がWireGuardでも実装 https://speakerdeck.com/kurochan/wireguardtoopenid-connectfalseli an-xi-wogoteshi-zhuang-sitemita
まとめ
まとめ • CIBAのRPの組み込みはすごくカンタン • CD/RP間のプロトコルの自由度が高いので適用範囲広い • 他の適用例のアイディアがあったらiddanceのDiscordなどで フィードバックいただけるとウレシイです!
(おまけ)IdPの実装について
IdPの実装について • ADへのpush通知以外は、既存OPの拡張でスムーズに実装可能 ここだけ ムズカシイ
ADへの通知どうするか? • ユーザごとにADを管理する必要があるが、具体的にどうするか はCIBAの仕様外 • またADへの通知方法についてもCIBAの仕様外 • ユーザサービスではスマートフォンアプリに通知を飛ばすよう な仕様が定石となる? •
ビジネス用途だとスマートフォンより、PC/Macに通知が飛ぶ方 がウレシイ?
弊社IdPでのAD通知の実装例 • PC/Macが優先だが、色々なユースケースを考慮して通知先との 密結合は避けたい • ユーザごとにwebhookのURLを設定できるようにして、IdPとし てのAD通知はwebhookをkickするだけとした IdP webhook
おまけのまとめ • OPのCIBA対応でネックになるのは、ADの管理と通知方法 • OPのAD管理/通知の方式について、他の本番環境化での実装例 があれば、iddanceのDiscordなどでフィードバックいただける とウレシイです
Any Questions?