Pythonで二段階認証

6,086 views
6,215 views

Published on

0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,086
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
12
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide

Pythonで二段階認証

  1. 1. Shizuoka.py#3 Pythonで二段階認証 @aoshiman 2013.11.16 13年11月17日日曜日
  2. 2. 自己紹介 • @aoshiman • 静岡の食品会社で社内SEやってます • 会社ではWindowsサーバとかVBAとか弄ってます • Pythonは完全に趣味です • Twitterbot @cookpad_recipe とかやってます • ちなみに食品会社ですが、偽装はやっていません!! 13年11月17日日曜日
  3. 3. 二段階認証を自分のブログに実装してみ た •自分のブログ Ubuntu on さくらVPS Python2.6 +   Flask0.9 •毎朝、Logwatchレポートが届く •毎日飽きもせず、phpMyAdmin攻撃を繰り返されて いる ※phpMyAdmin攻撃とはPHP製MySQL管理ツール(GUI)の脆弱性を狙った飽 くなきアタックのこと 13年11月17日日曜日
  4. 4. 俺、PHPなんて入れてねーよ(́・ω・`) 13年11月17日日曜日
  5. 5. とはいえコツコツ地道にログイン認証へのアタックを 続けられるのも精神的に嫌 最近まったくFlaskを触っていなかったということも あり、リハビリを兼ねて二段階認証を実装してみた 13年11月17日日曜日
  6. 6. 二段階認証とは ユーザー認証後、もしくはユーザー認証と同時に、ユ ーザー認証とは別要素の方法で認証する仕組み ユーザー認証後 13年11月17日日曜日 ユーザー認証と同時
  7. 7. 二段階認証は英語で Two Factor Authentication 調べていくと Two-step verificationという言い方もあ る(Google Authenticator のサブタイトルがそう) いくつか呼び方がありますが、深く調べていくときりが ないのでこれ以降は日本語で二段階認証、英語でTwo Factor Authenticationと呼びます 13年11月17日日曜日
  8. 8. なぜ二段階認証を採用するWebサービスが増えてきて いるのだろうか ※とはいっても殆どが大きなサービスだが (あくまでも私見だが) ◎ネガティブな要素 パスワードリスト攻撃の増加 パスワード使い回しの弊害が自サイトに影響をおよぼす ◎ポジティブな要素 スマフォ普及によりワンタイムパスワード発行アプリを 使用できるユーザーが増えた Twilioの(開発者への)普及 13年11月17日日曜日
  9. 9. 二段階認証の二段階目のバリエーション 現在の主流は何らかの方法で得た確認コードを画面に 入力させる ◎確認コードを入力させる •SMS (TwilioAPIなど) •電話(TwilioAPIなど) •パスワード発行アプリ (Google Authenticator、 FaceBookコードジェネレータ) •パスワード発行デバイス (RSA社 SecureID) •乱数表 13年11月17日日曜日 ◎確認ボタンを押す •スマートフォンアプリ
  10. 10. 二段階認証を採用しているサービス ◎確認コードを入力させる ◎確認ボタンを押す •Twitter(米国) •Facebook •DropBox •Evernote •Gmail •Google Apps •GitHub •WordPress •その他いろいろな銀行 •PAMもある(sshログインな •Twitter for iOS Android ど) 13年11月17日日曜日
  11. 11. OATHについて OATHとは http://www.openauthentication.org/ ワンタイムパスワード発行アルゴリズムの標準化を目 指して設立された団体 Initiative For Open Authtication 中心企業にVerisgin Symantec Sandiskなど ※紛らわしいが、セキュアなWebAPI認証のOAuth(オーオース)とは別 OATHが取りまとめてRFCになっている仕様が HOTP(RFC4226)An HMAC-Based One-Time Password Algorithm TOTP(RFC6238)Time-Based One-Time Password Algorithm 13年11月17日日曜日
  12. 12. TOTPについて 先程申し上げたとおり、OATHが取りまとめてRFC になっている仕様が HOTP(RFC4226)An HMAC-Based One-Time Password Algorithm TOTP(RFC6238)Time-Based One-Time Password Algorithm もともとはHOTPありき、それを時刻同期ベースに拡 張したのがTOTP※HOTPはカウンターベース HOTPはサーバとクライアントで回数を保持、及び同期を取る必要があるが、 TOTPはサーバとクライアントが各々正しい時刻をセットしていれば同期する必 要はない。 最近のWebサービス系二段階認証で採用されてきてい るのはTOTP 13年11月17日日曜日
  13. 13. TOTPを利用したワンタイムパスワード の発行 シークレットキーの作成 Base32文字列を使用 ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 16文字のシークレットキーを使用するものが多い※推 奨は160bit(20文字)以上(RFC4226) これ以降出てくるsecretには JBSWY3DPEHPK3PXP を使用します (Base32におけるHexspeakのようです) ※Python2.7.5で確認しています 13年11月17日日曜日
  14. 14. TOTPを利用したワンタイムパスワード の発行 タイムコードの作成 インターバルを何秒にするかを決定し、ユニックスタイムをインターバルで割る ※インターバルとは同一パスワードを何秒間発行するかということで、30秒が推 奨されている これによって30秒間、同じタイムコードが生成される インターバルを10秒にして確認すると理解しやすいかも ※Python2.7.5で確認しています 13年11月17日日曜日
  15. 15. TOTPを利用したワンタイムパスワード の発行 HMACダイジェストの算出 Base32文字列から作成したシークレットキーをKey、タイムコードをMessage として鍵付きハッシュを作成 ハッシュ関数にはSHA1、SHA256、SHA512などが使える(基本SAH1) ※Python2.7.5で確認しています 13年11月17日日曜日
  16. 16. TOTPを利用したワンタイムパスワード の発行 オフセットの算出とビット演算及びワンタイムパスワード算出 •算出されたHMACの最後のバイト[19]を0xfでマスク(&) •その値をオフセットとし、そのオフセットに基いてビット演算をする •ビット演算した値を10 のパスワード桁数分の乗数(6桁なら 10 ** 6)で割る •割った余りがワンタイムパスワードとなる(桁が足りなけれれば0埋め) ※Python2.7.5で確認しています 13年11月17日日曜日
  17. 17. TOTPを利用したワンタイムパスワード の発行 この算出をサーバ、クライアントそれぞれ実施し、 答え合わせをする仕組み インターバルに基づいたタイムコードが基準になって いるため、インターバルが30秒ならば30秒間同じパ スワードが生成される 13年11月17日日曜日
  18. 18. Google Authenticatorを利用する Google AuthenticatorはGoogle謹製の TOTP(HOTP)ベースのパスワード発行アプリ これをユーザーに使用させているWebサービスは多い Google Authenticatorへの登録を煩わしさを軽減す るために設定値が記載されたQRコードの読み取りが できる 13年11月17日日曜日
  19. 19. Google Authenticatorを利用する KeyUriのフォーマット これをQRコードに埋め込んで使用 otpauth://totp/shizuokapy@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Shizuokapy ① ② ③ ④ ①TOTPかHOTPを指定 ②user@domain(一意であればOK) ③シークレットコード ④発行者 その他パラメーター ※無ければデフォルト値を使用 Algorithm デフォルト SHA1 他 SHA256 SHA512 Digits デフォルト6 Period デフォルト30 13年11月17日日曜日
  20. 20. Google Authenticatorセッティング時 の注意 シークレットキーを盗まれない対策が必要 •公衆無線LANの環境でGoogle Authenticatorのセッティングをしない (常時SSLならよいのだが。。) •手動でセッティングする場合はショルダーハックに注意する ワンタイムパスワードからシークレットキーを導き出すのはおそらく出来ないが・・ とあるWebサービスが •インターバルが30秒 •ハッシュ作成時にSHA1を使用 •パスワードが6桁 •時刻が合っている だった場合、 シークレットキーが盗まれれば同じパスワードを発行出来る可能性は高い 13年11月17日日曜日
  21. 21. 二段階認証の実装時に気をつけたこと クライアント側との時間のズレを考慮する •15秒ずれているだけでも照合が不一致になる確率は50% •例えば、ユニックスタイムを -30させたパスワードも許可させる •クライアント側の時刻が進んでいる場合もあるのでそれも考慮するかどうか+30 但し、照合を甘くするとそれだけセキュリティ強度が弱くなる 6桁のパスワード 30秒間に 1/1,000,000 が 3/1,000,000になる formに入力したパスワードとTOTPのパスワードの型 を合わせる(int or str) おもいっきりハマりました。。 13年11月17日日曜日
  22. 22. まとめ •TOTPは算出が複雑だけど公開情報があるので頑張 ればちゃんと作れる •もし自社サービス等で二段階認証を行う場合、時間 のズレを考慮する。また、シークレットキーの扱いに は注意! •Google Authenticatorは便利ではあるがパスワード を確認する作業が煩雑。なにか代替品を考えてみた い。 13年11月17日日曜日
  23. 23. ご清聴ありがとうございました 13年11月17日日曜日
  24. 24. 参考資料 RFC4226 6238 http://tools.ietf.org/html/rfc4226 http://tools.ietf.org/html/rfc6238 Flask製TFAサンプル及びデモサイト via Twilioの中の人 https://www.twilio.com/blog/2013/04/add-two-factor-authentication-toyour-website-with-google-authenticator-and-twilio-sms.html OATHによるワンタイムパスワードの仕様 http://yamatamemo.blogspot.jp/2011/05/oath-1.html http://yamatamemo.blogspot.jp/2011/05/oath-2.html http://yamatamemo.blogspot.jp/2011/05/oath-3.html Google Authenticator http://code.google.com/p/google-authenticator/ Javascriptの実装 http://blog.tinisles.com/2011/10/google-authenticator-one-timepassword-algorithm-in-javascript/ 13年11月17日日曜日

×