34
安全な"○○でログインの作り方 @ritou NDS in Niigata #1 2014/7/13 1

安全な"○○でログイン"の作り方 @ NDS in Niigata #1

  • Upload
    ryo-ito

  • View
    711

  • Download
    2

Embed Size (px)

DESCRIPTION

NDS in Niigata #1での発表資料です。 https://github.com/NagaokaDevelopersStudy/Studies/blob/master/NDSMeetUp%231.md

Citation preview

Page 1: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

安全な"○○でログイン“の作り方

@ritou

NDS in Niigata #1 2014/7/13

1

Page 2: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

自己紹介

@ritou “秋田の猫”

新潟市在住、渋谷区の会社にリモート勤務

Evangelist at OpenID Foundation Japan

#idcon運営

CPAN Author

OAuth::Lite2,OIDC::Lite

NDS in Niigata #1 2014/7/13

2

Page 3: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

今日の内容

“○○でログイン”とは

実装するときに考えること

気をつけてほしいこと

NDS in Niigata #1 2014/7/13

3

Page 4: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

“○○でログイン”とは

ソーシャルログイン

ID連携, Identity Federation

Twitter, Facebookなどの外部サービスのアカウントを自サービスのアカウントに連携する

ログイン、新規登録のハードルを下げる

OpenIDとかOAuthとか

NDS in Niigata #1 2014/7/13

4

Page 5: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

5

Page 6: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

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

Page 7: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

7

引用 :

http://www.atmarkit.co.jp/fsecurity/rensai/digid01/02.html

Page 8: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

8 Webサービスの場合

Client Secretを安全に管理できる

Page 9: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

9

引用: http://www.slideshare.net/matake/ayaka

Page 10: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

10 モバイルアプリ、JSで動作するアプリケーションの場合

Client Secretを安全に管理できない

Page 11: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

11

引用: http://www.slideshare.net/matake/ayaka

Page 12: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

12

引用: http://www.slideshare.net/matake/ayaka

Page 13: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

実装方法

各SNSのSDK

ライブラリ

フレームワークのプラグイン

OAuth 2.0用

もっと汎用的なやつ

mBaaSを利用

Parse.com

NDS in Niigata #1 2014/7/13

13

Page 14: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

実装するときに考えること

ユーザーの識別子は普遍のものを利用する

user_id, idとかで提供されるもので良い

メールアドレスは変わるので注意

新規登録時は属性情報を活用する

プロフィール情報 APIを利用

デフォルト値に利用 or フォーム補完

メールアドレスを有効活用する

登録時の確認機能スキップ

定期的に変更をチェックしても良いかも

NDS in Niigata #1 2014/7/13

14

Page 15: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

気をつけてほしいこと

CSRFへの対策

Webサービス

Token置換攻撃への対策

モバイルアプリ + バックエンドサービス

NDS in Niigata #1 2014/7/13

15

Page 16: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

OAuth 2.0とCSRF

参考

OAuthのセキュリティ強化を目的とする拡張仕様を導入しました

http://alpha.mixi.co.jp/2013/12020/

NDS in Niigata #1 2014/7/13

16

Page 17: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

認可フロー

NDS in Niigata #1 2014/7/13

17

引用: http://alpha.mixi.co.jp/2013/12020/

Page 18: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

OAuth 2.0の認可要求

response_type(REQUIRED)

client_id(REQUIRED)

redirect_uri(OPTIONAL)

scope(OPTIONAL)

state(RECOMMENDED)

NDS in Niigata #1 2014/7/13

18

Page 19: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

CSRFが可能なケース

NDS in Niigata #1 2014/7/13

19

引用: http://alpha.mixi.co.jp/2013/12020/

Page 20: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

stateパラメータを利用しよう

response_type(REQUIRED)

client_id(REQUIRED)

redirect_uri(OPTIONAL)

scope(OPTIONAL)

state(RECOMMENDED)

NDS in Niigata #1 2014/7/13

20

Page 21: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

CSRF対策トークンとして検証

NDS in Niigata #1 2014/7/13

21

引用: http://alpha.mixi.co.jp/2013/12020/

Page 22: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

22 CSRF対策トークンとして検証

引用: http://alpha.mixi.co.jp/2013/12020/

Page 23: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

Token置換攻撃

参考

"なんちゃら iOS SDK" でありそうな被害例

http://oauth.jp/blog/2012/02/08/ios-sdk/

NDS in Niigata #1 2014/7/13

23

Page 24: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

24

引用: http://www.slideshare.net/matake/ayaka

Page 25: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

攻撃方法

攻撃者

他のOAuth Client向けに発行されたAccess

Tokenを所持している

○○占いとか

攻撃手法

バックエンドサーバーへのリクエストを把握

Access Tokenを自らが所持している第3者のAccess Tokenに置き換える

得られるもの

第3者のログインセッションなど

NDS in Niigata #1 2014/7/13

25

Page 26: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

26

参照 : http://www.slideshare.net/kura_lab/devsumi201413c5

Page 27: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

27

参照 : http://www.slideshare.net/kura_lab/devsumi201413c5

Page 28: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

対策

バックエンドサーバーは受け取ったAccess

Tokenを検証

正しいClient向けに発行されたものであることを確認

検証用のAPIはサービスごとに異なる…

Access Tokenを送信しないしくみを利用

Android + Googleではいろいろなしくみが用意されている

NDS in Niigata #1 2014/7/13

28

Page 29: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

NDS in Niigata #1 2014/7/13

29

このあたりで検証!

引用: http://www.slideshare.net/matake/ayaka

Page 30: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

おまけ : 連携キャンセル時の挙動

エラー画面にすべき?

正常系とみなす?

パラメータを判断しよう

error, error_description, error_reasonなど

ユーザーにそのまま見せるのは良くない感

NDS in Niigata #1 2014/7/13

30

Page 31: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

キャンセル時の挙動例:timeticket.jp

NDS in Niigata #1 2014/7/13

31

Page 32: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

パラメータをいじると…

NDS in Niigata #1 2014/7/13

32

Page 33: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

まとめ

“○○でログイン”で最近流行っているのはOAuth 2.0ベースのもの

Webサービス、モバイルアプリのそれぞれで気をつける点がある

NDS in Niigata #1 2014/7/13

33

Page 34: 安全な"○○でログイン"の作り方 @ NDS in Niigata #1

ありがとうございました

NDS in Niigata #1 2014/7/13

34

宣伝: http://yapcasia.org/2014/talk/show/cc57f3ca-01b8-11e4-

b7e8-e4a96aeab6a4