View
559
Download
0
Category
Preview:
Citation preview
わかった気になる!ID連携の最新事情
for developers
SAML、OAuth、あるいはOpenID Connectについて
神原淳史
@atsukanrock2015/02/27(第八回) ネクストスケープ×Sansan .NET勉強会
自己紹介
•神原淳史 @atsukanrock
https://github.com/atsukanrock
• Sansan株式会社 (2014年11月から)
アバナード株式会社 (2011年7月~2014年10月)
• Software Developer: Domain-Driven Design / .NET / C# / Microsoft Azure
• Strong: トラブルシューティングが速い、アーキとか組める
• Weak: 酒にだらしない
ID連携 (identity federation)
複数のアイデンティティ管理システムに分散して格納された個人のユーザー情報を仮想的に再結合したもの (Wikipedia – 連合アイデンティティ)
SAML
OAuth
OpenID Connect
AD FS
Azure AD
JWT
OpenID
WS-Trust
WS-Federation
Open AM
Azure ACS
MFA
なるほどまったくわからん
Developerから見たID連携
•用語多すぎ
•歴史長すぎ
•展開速すぎ (ググってたらすぐ古い非推奨な情報が出てくる)
•興味なさ杉
今日のゴール
•自分のサービスにID連携を実装したいDeveloper向け
• ID連携の歴史、最新事情、今後をざっくり把握
•意思決定 (技術選定) ができるようになる
Windows / Active Directoryに偏ってますがご容赦ください
Agenda
•なんでID連携なの?
• ID連携ってなに?
• ID連携の歴史
• SAML
• OAuth
• OpenID Connect (OAuth 2.0 for Login)
•まとめ
なんでID連携なの?Why on earth do we need identity federation?
世はセキュリティの時代
時代の要請
•個人情報保護
たった1回の個人情報流出が企業の存続に関わる
•情報セキュリティ
ビジネスデータをきっちり守らなければならない
IT管理者が思うこと
•社員が管理するアカウント数を減らしてあげたい
(さもないとあいつら絶対パスワード使い回す)
• Active Directoryで全部管理したい
(全部俺様の管理下におかないとあいつら何するか分からない)
•退職者対応が面倒
ID連携ならできます
•企業のActive DirectoryにID管理を一元化
•ユーザは普段Windowsにサインインする時のID / Passwordで各種サービスにログイン可能
• Active Directoryでアカウントを無効化したら各種サービスへのログインが即刻不可能に
サービス提供者の視点
強固な認証の実装は非常に難しい
•ロックアウト
•パスワード再発行
• N段階認証
•普段と違うIPアドレスからのアクセス
Developerが思うこと
•実装したくない
•どっかに丸投げしたい
ID連携ならできます
•認証の仕組みは全て連携先に移譲
•移譲先が複雑な実装を担保してくれる
•アプリは認証OKだった「結果」のみを受け取る
結果=トークン
ID連携ってなに?So, what the hell is the identity federation?
ID連携フロー (抽象化)
ID連携の歴史The history of identity federation
それはプロトコルの歴史
2000年 2005年 2010年
イントラ Web デバイス
KerberosSAML
WS-FederationOAuth
Open ID Connect
高速なら
何でも
HTTP
テキスト軽量
ID連携のプロトコル
テクノロジーへの要求
時代の要請
年代
SAML (あるいはWS-Federation)
It’s LEGACY… but still de facto standard of identity federation
プロトコルの歴史
2000年 2005年 2010年
イントラ Web デバイス
KerberosSAML
WS-FederationOAuth
Open ID Connect
高速なら
何でも
HTTP
テキスト軽量
ID連携のプロトコル
テクノロジーへの要求
時代の要請
年代
フロー (HTTP POST binding)
HTTP Redirect: SAML Request を query string に乗せる
HTTP POST: SAML Response を form に乗せる
ID連携のデファクトスタンダード
• ID連携 (実質AD連携) 方式がSAMLなSaaS:
• Salesforce
• Google Apps
• Cybozu
• Workday
• ServiceNow
etc.
Identity Provider (IdP) としてでなく、Service Provider (SP) としての話
「枯れた」プロトコル (良い意味で)
•最新バージョン: SAML 2.0
• SAML 2.0標準化: 2005年3月
• XMLベース
•エンタープライズID連携の世界で支配的シェア
But…
Heavyweight (SAML Responseのサンプル)
一方その頃
一方その頃MS (Windows系ID管理の支配者)は
こう思っていた
• SAML嫌ぁぁあああ!!
• WS-Federation推奨!!
WS-Federationの特徴:
• SAMLと似たようなもん
• XMLベース
• サポーター: MS
結論
• Windows Identity Foundation (WIF) ではWS-Federationだけサポートします
WIF: .NETでID連携を実装するための (当時唯一の) MS謹製ライブラリ
• AD FSではSAMLもサポートしますけど
結果
• 2010年頃までSAML vs WS-Federation抗争が継続
現在はMSのAD FSでのSAMLサポートにより概ね終息:
• オープンなサービスではSAML
• MS製品で固められるシステムではWS-Federation
• .NETでSAMLを実装するには自前実装が必要
もしくはサードパーティ製コンポーネント
OK, OK, I implement
SAML by myself
自前実装 is NOT that hard
リクエストを出す
• XMLのテンプレを埋める程度
string.Format で可能なレベル
レスポンス (トークン) を受け取る
• XMLの決まった位置から値を取り出す
•改ざんチェックは.NETがクラスを提供
• SignedXmlクラス
• 事前に公開鍵の入手が必要
署名チェック自前実装のイメージ
事前に入手した公開鍵 (.cerファイル) からX509Certificate2クラスをインスタンス化したもの
https://github.com/onelogin/dotnet-saml/blob/master/App_Code/Saml.cs (onelogin/dotnet-saml@GitHub)
But…
ネイティブアプリ (iOS / Android / Win8)
前提
•クライアントはWeb APIを呼び出す
• Web API呼び出しはステートレス
前提から導き出される要件
•「認証OK」を示す何かを毎回送る必要あり
ネイティブアプリの設計例
• SAMLトークンは重いので毎回送るわけにいかない
•別の軽い何か (access token) を発行する機能をサーバー側に自前実装
ネイティブアプリの設計例
埋め込みブラウザー (Web View)
HTTP Redirect: SAML Request を query string に乗せる
HTTP POST: SAML Response をform に乗せる
OAuthWe’re familiar with OAuth because Twitter and Facebook use it…
プロトコルの歴史
2000年 2005年 2010年
イントラ Web デバイス
KerberosSAML
WS-FederationOAuth
Open ID Connect
高速なら
何でも
HTTP
テキスト軽量
ID連携のプロトコル
テクノロジーへの要求
時代の要請
年代
フロー (Authorization Code Grant)
http://www.atmarkit.co.jp/ait/articles/1209/10/news105.html (デジタル・アイデンティティ技術最新動向 - @IT)
HTTP Redirectを命じる
Query stringにAuthorization Code
Redirect命令を捕まえてAuthorization Codeを取り出す
HTTP POSTでAuthorization Codeを送る
ResponseにAccess Token
著名コンシューマー向けサービスが採用
etc.
Lightweight
SAMLトークンよりずっと軽い
毎回のWeb API呼び出しに乗せられる
But…
OAuth is NOT for AuthN but for AuthZ
OAuthは認証でなく承認
• 認証 (AuthN: Authentication)ユーザが「誰であるか」
• 承認 (AuthZ: Authorization)ユーザが「何をできるか」
例: Facebook’s OAuth
• ユーザが「誰であるか」を確認するのはFacebook
• アプリはFacebookから「そのユーザができること」を記したトークンを受け取る
• アプリが「ユーザが誰であるか」を知るには、それを知るためのAPIを叩く
セキュリティ上の弱点
•トークンの形式が標準化されていない
•アプリ側でトークンのvalidationができないアプリは発行されたトークンをそのまま受け渡すしかできない
•偽装トークンに対して脆弱
OpenID Connect (OIDC)The next standard for identity federation
プロトコルの歴史
2000年 2005年 2010年
イントラ Web デバイス
KerberosSAML
WS-FederationOAuth
Open ID Connect
高速なら
何でも
HTTP
テキスト軽量
ID連携のプロトコル
テクノロジーへの要求
時代の要請
年代
OAuth 2.0ベース (OAuth 2.0とほぼ同じフロー)
http://www.atmarkit.co.jp/ait/articles/1209/27/news138_2.html (デジタル・アイデンティティ技術最新動向 - @IT)
ID Tokenからユーザの基本情報が取り出せる
OAuthのセキュリティ上の弱点をカバー
• トークンの形式を標準化
• JWT: JSON Web Token
• JWTはトークンのvalidationが可能
• 改ざんされていないこと (トークン署名)
• 発行元がたしかにxxxであること
• 発行先がたしかに我々 (アプリ) であること
• 意図したユーザに対するトークンであること
http://blogs.msdn.com/b/tsmatsuz/archive/2015/02/18/azure-ad-service-web-api-programming-with-access-token-validation-check.aspx (松崎剛 Blog)
Lightweight (JWTのサンプル)
http://blogs.msdn.com/b/tsmatsuz/archive/2015/02/18/azure-ad-service-web-api-programming-with-access-token-validation-check.aspx (松崎剛 Blog)
そのままWeb APIのaccess tokenとして使える
MS謹製ライブラリが豊富
http://www.cloudidentity.com/blog/2015/02/20/IDENTITY-LIBRARIES-STATUS-AS-OF-02202015/ (Cloud Identity)
iOS / Android / JavaScript用まである…だと…
乗るしかないこのビッグウェーブに
個人の意見です
MS is now working on OpenID Connect
• Azure ADは対応
OpenID Connect and OAuth 2.0 support in Azure Active Directory has GA’d!http://blogs.technet.com/b/ad/archive/2014/09/09/openid-connect-and-oauth-2-0-support-in-azure-active-directory-has-ga-d.aspx (Active Directory Team Blog)
• AD FSは未対応
次バージョンで対応との噂も
まとめWrapping up
SAML vs OpenID Connect
SAML
Pros:• エンタープライズで支配的
• AD FSが対応
Cons:• Heavyweight
• 複雑
• .NETでの実装が大変
• コンシューマー向けサービスはIdP非対応が多い
OpenID Connect
Pros:• Lightweight
• シンプル
• .NETでの実装が容易
• コンシューマー向けサービスもIdP対応が多い
Cons:• AD FSが未対応
何を選ぶかはあなた次第です
質疑応答Q&A
Recommended