安全な"○○でログイン"の作り方 @ nds in niigata #1
DESCRIPTION
NDS in Niigata #1での発表資料です。 https://github.com/NagaokaDevelopersStudy/Studies/blob/master/NDSMeetUp%231.mdTRANSCRIPT
安全な"○○でログイン“の作り方
@ritou
NDS in Niigata #1 2014/7/13
1
自己紹介
@ritou “秋田の猫”
新潟市在住、渋谷区の会社にリモート勤務
Evangelist at OpenID Foundation Japan
#idcon運営
CPAN Author
OAuth::Lite2,OIDC::Lite
NDS in Niigata #1 2014/7/13
2
今日の内容
“○○でログイン”とは
実装するときに考えること
気をつけてほしいこと
NDS in Niigata #1 2014/7/13
3
“○○でログイン”とは
ソーシャルログイン
ID連携, Identity Federation
Twitter, Facebookなどの外部サービスのアカウントを自サービスのアカウントに連携する
ログイン、新規登録のハードルを下げる
OpenIDとかOAuthとか
NDS in Niigata #1 2014/7/13
4
NDS in Niigata #1 2014/7/13
5
ID連携を支える技術
独自仕様
OpenID 2.0
OAuth 1.0 : Twitter
OAuth 2.0 : Facebook, Github, …
署名なし、モバイルアプリからの利用も想定
OpenID Connect : Google, Salesforce
OAuth 2.0のIdentity層を拡張
各サービスは、これらの標準仕様に独自拡張を入れたりしてなかりカオスな状態
NDS in Niigata #1 2014/7/13
6
NDS in Niigata #1 2014/7/13
7
引用 :
http://www.atmarkit.co.jp/fsecurity/rensai/digid01/02.html
NDS in Niigata #1 2014/7/13
8 Webサービスの場合
Client Secretを安全に管理できる
NDS in Niigata #1 2014/7/13
9
引用: http://www.slideshare.net/matake/ayaka
NDS in Niigata #1 2014/7/13
10 モバイルアプリ、JSで動作するアプリケーションの場合
Client Secretを安全に管理できない
NDS in Niigata #1 2014/7/13
11
引用: http://www.slideshare.net/matake/ayaka
NDS in Niigata #1 2014/7/13
12
引用: http://www.slideshare.net/matake/ayaka
実装方法
各SNSのSDK
ライブラリ
フレームワークのプラグイン
OAuth 2.0用
もっと汎用的なやつ
mBaaSを利用
Parse.com
NDS in Niigata #1 2014/7/13
13
実装するときに考えること
ユーザーの識別子は普遍のものを利用する
user_id, idとかで提供されるもので良い
メールアドレスは変わるので注意
新規登録時は属性情報を活用する
プロフィール情報 APIを利用
デフォルト値に利用 or フォーム補完
メールアドレスを有効活用する
登録時の確認機能スキップ
定期的に変更をチェックしても良いかも
NDS in Niigata #1 2014/7/13
14
気をつけてほしいこと
CSRFへの対策
Webサービス
Token置換攻撃への対策
モバイルアプリ + バックエンドサービス
NDS in Niigata #1 2014/7/13
15
OAuth 2.0とCSRF
参考
OAuthのセキュリティ強化を目的とする拡張仕様を導入しました
http://alpha.mixi.co.jp/2013/12020/
NDS in Niigata #1 2014/7/13
16
認可フロー
NDS in Niigata #1 2014/7/13
17
引用: http://alpha.mixi.co.jp/2013/12020/
OAuth 2.0の認可要求
response_type(REQUIRED)
client_id(REQUIRED)
redirect_uri(OPTIONAL)
scope(OPTIONAL)
state(RECOMMENDED)
NDS in Niigata #1 2014/7/13
18
CSRFが可能なケース
NDS in Niigata #1 2014/7/13
19
引用: http://alpha.mixi.co.jp/2013/12020/
stateパラメータを利用しよう
response_type(REQUIRED)
client_id(REQUIRED)
redirect_uri(OPTIONAL)
scope(OPTIONAL)
state(RECOMMENDED)
NDS in Niigata #1 2014/7/13
20
CSRF対策トークンとして検証
NDS in Niigata #1 2014/7/13
21
引用: http://alpha.mixi.co.jp/2013/12020/
NDS in Niigata #1 2014/7/13
22 CSRF対策トークンとして検証
引用: http://alpha.mixi.co.jp/2013/12020/
Token置換攻撃
参考
"なんちゃら iOS SDK" でありそうな被害例
http://oauth.jp/blog/2012/02/08/ios-sdk/
NDS in Niigata #1 2014/7/13
23
NDS in Niigata #1 2014/7/13
24
引用: http://www.slideshare.net/matake/ayaka
攻撃方法
攻撃者
他のOAuth Client向けに発行されたAccess
Tokenを所持している
○○占いとか
攻撃手法
バックエンドサーバーへのリクエストを把握
Access Tokenを自らが所持している第3者のAccess Tokenに置き換える
得られるもの
第3者のログインセッションなど
NDS in Niigata #1 2014/7/13
25
NDS in Niigata #1 2014/7/13
26
参照 : http://www.slideshare.net/kura_lab/devsumi201413c5
NDS in Niigata #1 2014/7/13
27
参照 : http://www.slideshare.net/kura_lab/devsumi201413c5
対策
バックエンドサーバーは受け取ったAccess
Tokenを検証
正しいClient向けに発行されたものであることを確認
検証用のAPIはサービスごとに異なる…
Access Tokenを送信しないしくみを利用
Android + Googleではいろいろなしくみが用意されている
NDS in Niigata #1 2014/7/13
28
NDS in Niigata #1 2014/7/13
29
このあたりで検証!
引用: http://www.slideshare.net/matake/ayaka
おまけ : 連携キャンセル時の挙動
エラー画面にすべき?
正常系とみなす?
パラメータを判断しよう
error, error_description, error_reasonなど
ユーザーにそのまま見せるのは良くない感
NDS in Niigata #1 2014/7/13
30
キャンセル時の挙動例:timeticket.jp
NDS in Niigata #1 2014/7/13
31
パラメータをいじると…
NDS in Niigata #1 2014/7/13
32
まとめ
“○○でログイン”で最近流行っているのはOAuth 2.0ベースのもの
Webサービス、モバイルアプリのそれぞれで気をつける点がある
NDS in Niigata #1 2014/7/13
33
ありがとうございました
NDS in Niigata #1 2014/7/13
34
宣伝: http://yapcasia.org/2014/talk/show/cc57f3ca-01b8-11e4-
b7e8-e4a96aeab6a4