Slide 1

Slide 1 text

わかった気になる! ID連携の最新事情 for developers SAML、OAuth、あるいはOpenID Connectについて 神原 淳史 @atsukanrock 2015/02/27 (第八回) ネクストスケープ×Sansan .NET勉強会

Slide 2

Slide 2 text

自己紹介 • 神原 淳史 @atsukanrock https://github.com/atsukanrock • Sansan株式会社 (2014年11月から) アバナード株式会社 (2011年7月~2014年10月) • Software Developer: Domain-Driven Design / .NET / C# / Microsoft Azure • Strong: トラブルシューティングが速い、アーキとか組める • Weak: 酒にだらしない

Slide 3

Slide 3 text

ID連携(identity federation) 複数のアイデンティティ管理システムに分散して 格納された個人のユーザー情報を仮想的に 再結合したもの (Wikipedia – 連合アイデンティティ)

Slide 4

Slide 4 text

SAML OAuth OpenID Connect AD FS Azure AD JWT OpenID WS-Trust WS-Federation Open AM Azure ACS MFA

Slide 5

Slide 5 text

なるほど まったくわからん

Slide 6

Slide 6 text

Developerから見たID連携 • 用語多すぎ • 歴史長すぎ • 展開速すぎ (ググってたらすぐ古い非推奨な情報が出てくる) •興味なさ杉

Slide 7

Slide 7 text

今日のゴール • 自分のサービスにID連携を実装したいDeveloper向け • ID連携の歴史、最新事情、今後をざっくり把握 • 意思決定 (技術選定) ができるようになる Windows / Active Directoryに 偏ってますがご容赦ください

Slide 8

Slide 8 text

Agenda • なんでID連携なの? • ID連携ってなに? • ID連携の歴史 • SAML • OAuth • OpenID Connect (OAuth 2.0 for Login) • まとめ

Slide 9

Slide 9 text

なんでID連携なの? Why on earth do we need identity federation?

Slide 10

Slide 10 text

世はセキュリティの時代 時代の要請 • 個人情報保護 たった1回の個人情報流出が企業 の存続に関わる • 情報セキュリティ ビジネスデータをきっちり 守らなければならない IT管理者が思うこと • 社員が管理するアカウント数 を減らしてあげたい (さもないとあいつら絶対パスワード使い回す) • Active Directoryで全部管理 したい (全部俺様の管理下におかないとあいつら何するか分からない) • 退職者対応が面倒

Slide 11

Slide 11 text

ID連携ならできます • 企業のActive DirectoryにID管理を一元化 • ユーザは普段Windowsにサインインする時の ID / Passwordで各種サービスにログイン可能 • Active Directoryでアカウントを無効化したら 各種サービスへのログインが即刻不可能に

Slide 12

Slide 12 text

サービス提供者の視点 強固な認証の実装は非常に難しい • ロックアウト • パスワード再発行 • N段階認証 • 普段と違うIPアドレスからの アクセス Developerが思うこと • 実装したくない • どっかに丸投げしたい

Slide 13

Slide 13 text

ID連携ならできます • 認証の仕組みは全て連携先に移譲 • 移譲先が複雑な実装を担保してくれる • アプリは認証OKだった「結果」のみを受け取る 結果=トークン

Slide 14

Slide 14 text

ID連携ってなに? So, what the hell is the identity federation?

Slide 15

Slide 15 text

ID連携フロー (抽象化)

Slide 16

Slide 16 text

ID連携の歴史 The history of identity federation

Slide 17

Slide 17 text

それはプロトコルの歴史 2000年 2005年 2010年 イントラ Web デバイス Kerberos SAML WS-Federation OAuth Open ID Connect 高速なら 何でも HTTP テキスト 軽量 ID連携の プロトコル テクノロジー への要求 時代の要請 年代

Slide 18

Slide 18 text

SAML(あるいはWS-Federation) It’s LEGACY… but still de facto standard of identity federation

Slide 19

Slide 19 text

プロトコルの歴史 2000年 2005年 2010年 イントラ Web デバイス Kerberos SAML WS-Federation OAuth Open ID Connect 高速なら 何でも HTTP テキスト 軽量 ID連携の プロトコル テクノロジー への要求 時代の要請 年代

Slide 20

Slide 20 text

フロー (HTTP POST binding) HTTP Redirect: SAML Request を query string に乗せる HTTP POST: SAML Response を form に乗せる

Slide 21

Slide 21 text

ID連携のデファクトスタンダード • ID連携 (実質AD連携) 方式がSAMLなSaaS: • Salesforce • Google Apps • Cybozu • Workday • ServiceNow etc. Identity Provider (IdP) としてでなく、 Service Provider (SP) としての話

Slide 22

Slide 22 text

「枯れた」プロトコル (良い意味で) • 最新バージョン: SAML 2.0 • SAML 2.0標準化: 2005年3月 • XMLベース • エンタープライズID連携の世界で支配的シェア

Slide 23

Slide 23 text

But…

Slide 24

Slide 24 text

Heavyweight (SAML Responseのサンプル)

Slide 25

Slide 25 text

一方その頃

Slide 26

Slide 26 text

一方その頃MS (Windows系ID管理の支配者) は こう思っていた • SAML嫌ぁぁあああ!! • WS-Federation推奨!! WS-Federationの特徴: • SAMLと似たようなもん • XMLベース • サポーター: MS 結論 • Windows Identity Foundation (WIF) ではWS-Federationだけ サポートします WIF: .NETでID連携を実装する ための (当時唯一の) MS謹製 ライブラリ • AD FSではSAMLもサポート しますけど

Slide 27

Slide 27 text

結果 • 2010年頃までSAML vs WS-Federation抗争が継続 現在はMSのAD FSでのSAMLサポートにより概ね終息: • オープンなサービスではSAML • MS製品で固められるシステムではWS-Federation • .NETでSAMLを実装するには自前実装が必要 もしくはサードパーティ製コンポーネント

Slide 28

Slide 28 text

OK, OK, I implement SAML by myself

Slide 29

Slide 29 text

自前実装 is NOT that hard リクエストを出す • XMLのテンプレを埋める程度 string.Format で可能なレベル レスポンス (トークン) を受け取る • XMLの決まった位置から値を 取り出す • 改ざんチェックは.NETが クラスを提供 • SignedXmlクラス • 事前に公開鍵の入手が必要

Slide 30

Slide 30 text

署名チェック自前実装のイメージ 事前に入手した公開鍵 (.cerファイル) から X509Certificate2クラスをインスタンス化したもの https://github.com/onelogin/dotnet-saml/blob/master/App_Code/Saml.cs (onelogin/dotnet-saml@GitHub)

Slide 31

Slide 31 text

But…

Slide 32

Slide 32 text

ネイティブアプリ (iOS / Android / Win8) 前提 • クライアントはWeb APIを 呼び出す • Web API呼び出しはステート レス 前提から導き出される要件 • 「認証OK」を示す何かを 毎回送る必要あり

Slide 33

Slide 33 text

ネイティブアプリの設計例 • SAMLトークンは重いので毎回送るわけにいかない • 別の軽い何か (access token) を発行する機能を サーバー側に自前実装

Slide 34

Slide 34 text

ネイティブアプリの設計例 埋め込みブラウザー (Web View) HTTP Redirect: SAML Request を query string に乗せる HTTP POST: SAML Response を form に乗せる

Slide 35

Slide 35 text

OAuth We’re familiar with OAuth because Twitter and Facebook use it…

Slide 36

Slide 36 text

プロトコルの歴史 2000年 2005年 2010年 イントラ Web デバイス Kerberos SAML WS-Federation OAuth Open ID Connect 高速なら 何でも HTTP テキスト 軽量 ID連携の プロトコル テクノロジー への要求 時代の要請 年代

Slide 37

Slide 37 text

フロー (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

Slide 38

Slide 38 text

著名コンシューマー向けサービスが採用 • Facebook • Twitter • Instagram etc.

Slide 39

Slide 39 text

Lightweight SAMLトークンよりずっと軽い 毎回のWeb API呼び出しに乗せられる

Slide 40

Slide 40 text

But…

Slide 41

Slide 41 text

OAuth is NOT for AuthN but for AuthZ OAuthは認証でなく承認 • 認証 (AuthN: Authentication) ユーザが「誰であるか」 • 承認 (AuthZ: Authorization) ユーザが「何をできるか」 例: Facebook’s OAuth • ユーザが「誰であるか」を確認 するのはFacebook • アプリはFacebookから「その ユーザができること」を 記したトークンを受け取る • アプリが「ユーザが誰であるか」 を知るには、それを知るための APIを叩く

Slide 42

Slide 42 text

セキュリティ上の弱点 • トークンの形式が標準化されていない • アプリ側でトークンのvalidationができない アプリは発行されたトークンをそのまま受け渡すしかできない • 偽装トークンに対して脆弱

Slide 43

Slide 43 text

OpenID Connect (OIDC) The next standard for identity federation

Slide 44

Slide 44 text

プロトコルの歴史 2000年 2005年 2010年 イントラ Web デバイス Kerberos SAML WS-Federation OAuth Open ID Connect 高速なら 何でも HTTP テキスト 軽量 ID連携の プロトコル テクノロジー への要求 時代の要請 年代

Slide 45

Slide 45 text

OAuth 2.0ベース (OAuth 2.0とほぼ同じフロー) http://www.atmarkit.co.jp/ait/articles/1209/27/news138_2.html (デジタル・アイデンティティ技術最新動向 - @IT) ID Tokenからユーザの 基本情報が取り出せる

Slide 46

Slide 46 text

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)

Slide 47

Slide 47 text

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として使える

Slide 48

Slide 48 text

MS謹製ライブラリが豊富 http://www.cloudidentity.com/blog/2015/02/20/IDENTITY-LIBRARIES-STATUS-AS-OF-02202015/ (Cloud Identity) iOS / Android / JavaScript用 まである…だと…

Slide 49

Slide 49 text

乗るしかない このビッグウェーブに 個人の意見です

Slide 50

Slide 50 text

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は未対応 次バージョンで対応との噂も

Slide 51

Slide 51 text

まとめ Wrapping up

Slide 52

Slide 52 text

SAML vs OpenID Connect SAML Pros: • エンタープライズで支配的 • AD FSが対応 Cons: • Heavyweight • 複雑 • .NETでの実装が大変 • コンシューマー向けサービスは IdP非対応が多い OpenID Connect Pros: • Lightweight • シンプル • .NETでの実装が容易 • コンシューマー向けサービスも IdP対応が多い Cons: • AD FSが未対応

Slide 53

Slide 53 text

何を選ぶかは あなた次第です

Slide 54

Slide 54 text

質疑応答 Q&A