SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
Shizuoka.py#3
Pythonで二段階認証
@aoshiman

2013.11.16
13年11月17日日曜日
自己紹介
• @aoshiman
• 静岡の食品会社で社内SEやってます
• 会社ではWindowsサーバとかVBAとか弄ってます
• Pythonは完全に趣味です
• Twitterbot @cookpad_recipe とかやってます
• ちなみに食品会社ですが、偽装はやっていません!!
13年11月17日日曜日
二段階認証を自分のブログに実装してみ
た
•自分のブログ Ubuntu on さくらVPS Python2.6 +  
Flask0.9
•毎朝、Logwatchレポートが届く
•毎日飽きもせず、phpMyAdmin攻撃を繰り返されて
いる
※phpMyAdmin攻撃とはPHP製MySQL管理ツール(GUI)の脆弱性を狙った飽
くなきアタックのこと

13年11月17日日曜日
俺、PHPなんて入れてねーよ(́・ω・`)

13年11月17日日曜日
とはいえコツコツ地道にログイン認証へのアタックを
続けられるのも精神的に嫌
最近まったくFlaskを触っていなかったということも
あり、リハビリを兼ねて二段階認証を実装してみた

13年11月17日日曜日
二段階認証とは
ユーザー認証後、もしくはユーザー認証と同時に、ユ
ーザー認証とは別要素の方法で認証する仕組み
ユーザー認証後

13年11月17日日曜日

ユーザー認証と同時
二段階認証は英語で Two Factor Authentication
調べていくと Two-step verificationという言い方もあ
る(Google Authenticator のサブタイトルがそう)
いくつか呼び方がありますが、深く調べていくときりが
ないのでこれ以降は日本語で二段階認証、英語でTwo
Factor Authenticationと呼びます

13年11月17日日曜日
なぜ二段階認証を採用するWebサービスが増えてきて
いるのだろうか ※とはいっても殆どが大きなサービスだが
(あくまでも私見だが)
◎ネガティブな要素
パスワードリスト攻撃の増加
パスワード使い回しの弊害が自サイトに影響をおよぼす
◎ポジティブな要素
スマフォ普及によりワンタイムパスワード発行アプリを
使用できるユーザーが増えた
Twilioの(開発者への)普及
13年11月17日日曜日
二段階認証の二段階目のバリエーション
現在の主流は何らかの方法で得た確認コードを画面に
入力させる
◎確認コードを入力させる

•SMS (TwilioAPIなど)
•電話(TwilioAPIなど)
•パスワード発行アプリ
(Google Authenticator、
FaceBookコードジェネレータ)

•パスワード発行デバイス
(RSA社 SecureID)
•乱数表

13年11月17日日曜日

◎確認ボタンを押す

•スマートフォンアプリ
二段階認証を採用しているサービス
◎確認コードを入力させる

◎確認ボタンを押す

•Twitter(米国)
•Facebook
•DropBox
•Evernote
•Gmail
•Google Apps
•GitHub
•WordPress
•その他いろいろな銀行
•PAMもある(sshログインな

•Twitter for iOS Android

ど)
13年11月17日日曜日
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日日曜日
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日日曜日
TOTPを利用したワンタイムパスワード
の発行
シークレットキーの作成
Base32文字列を使用

ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

16文字のシークレットキーを使用するものが多い※推
奨は160bit(20文字)以上(RFC4226)
これ以降出てくるsecretには JBSWY3DPEHPK3PXP を使用します
(Base32におけるHexspeakのようです)
※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
タイムコードの作成
インターバルを何秒にするかを決定し、ユニックスタイムをインターバルで割る
※インターバルとは同一パスワードを何秒間発行するかということで、30秒が推
奨されている

これによって30秒間、同じタイムコードが生成される
インターバルを10秒にして確認すると理解しやすいかも
※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
HMACダイジェストの算出
Base32文字列から作成したシークレットキーをKey、タイムコードをMessage
として鍵付きハッシュを作成
ハッシュ関数にはSHA1、SHA256、SHA512などが使える(基本SAH1)

※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
オフセットの算出とビット演算及びワンタイムパスワード算出
•算出されたHMACの最後のバイト[19]を0xfでマスク(&)
•その値をオフセットとし、そのオフセットに基いてビット演算をする
•ビット演算した値を10 のパスワード桁数分の乗数(6桁なら 10 ** 6)で割る
•割った余りがワンタイムパスワードとなる(桁が足りなけれれば0埋め)

※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
この算出をサーバ、クライアントそれぞれ実施し、
答え合わせをする仕組み
インターバルに基づいたタイムコードが基準になって
いるため、インターバルが30秒ならば30秒間同じパ
スワードが生成される

13年11月17日日曜日
Google Authenticatorを利用する
Google AuthenticatorはGoogle謹製の
TOTP(HOTP)ベースのパスワード発行アプリ
これをユーザーに使用させているWebサービスは多い
Google Authenticatorへの登録を煩わしさを軽減す
るために設定値が記載されたQRコードの読み取りが
できる

13年11月17日日曜日
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日日曜日
Google Authenticatorセッティング時
の注意
シークレットキーを盗まれない対策が必要
•公衆無線LANの環境でGoogle Authenticatorのセッティングをしない
(常時SSLならよいのだが。。)
•手動でセッティングする場合はショルダーハックに注意する
ワンタイムパスワードからシークレットキーを導き出すのはおそらく出来ないが・・
とあるWebサービスが
•インターバルが30秒
•ハッシュ作成時にSHA1を使用
•パスワードが6桁
•時刻が合っている
だった場合、
シークレットキーが盗まれれば同じパスワードを発行出来る可能性は高い

13年11月17日日曜日
二段階認証の実装時に気をつけたこと
クライアント側との時間のズレを考慮する
•15秒ずれているだけでも照合が不一致になる確率は50%
•例えば、ユニックスタイムを -30させたパスワードも許可させる
•クライアント側の時刻が進んでいる場合もあるのでそれも考慮するかどうか+30
但し、照合を甘くするとそれだけセキュリティ強度が弱くなる
6桁のパスワード 30秒間に 1/1,000,000 が 3/1,000,000になる

formに入力したパスワードとTOTPのパスワードの型
を合わせる(int or str)
おもいっきりハマりました。。

13年11月17日日曜日
まとめ
•TOTPは算出が複雑だけど公開情報があるので頑張
ればちゃんと作れる
•もし自社サービス等で二段階認証を行う場合、時間
のズレを考慮する。また、シークレットキーの扱いに
は注意!
•Google Authenticatorは便利ではあるがパスワード
を確認する作業が煩雑。なにか代替品を考えてみた
い。

13年11月17日日曜日
ご清聴ありがとうございました

13年11月17日日曜日
参考資料
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日日曜日

Contenu connexe

Tendances

コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活Drecom Co., Ltd.
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベントAzure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベントShingo Kawahara
 
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側Takeshi HASEGAWA
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全てOsamu Shimoda
 
小さなサービスも契約する時代
小さなサービスも契約する時代小さなサービスも契約する時代
小さなサービスも契約する時代Ryo Mitoma
 
GNU AGPLv3について(On GNU AGPLv3)
GNU AGPLv3について(On GNU AGPLv3)GNU AGPLv3について(On GNU AGPLv3)
GNU AGPLv3について(On GNU AGPLv3)真行 八田
 
Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要Yui Ashikaga
 
Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介onozaty
 
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)Masaya Tahara
 
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法についてAzure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法についてShinya Yamaguchi
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方Shohei Koyama
 
ZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介しますZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介しますHiromasa Oka
 
React(TypeScript) + Go + Auth0 で実現する管理画面
React(TypeScript) + Go + Auth0 で実現する管理画面React(TypeScript) + Go + Auth0 で実現する管理画面
React(TypeScript) + Go + Auth0 で実現する管理画面KentaEndoh
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析Amazon Web Services Japan
 
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
20190619 AWS Black Belt Online Seminar Dive Deep into AWS ChaliceAmazon Web Services Japan
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門Hiroyuki Wada
 

Tendances (20)

コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活コンテナで始める柔軟な AWS Lambda 生活
コンテナで始める柔軟な AWS Lambda 生活
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベントAzure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
Azure Blob Storageへの様々なアクセス方法を比べてみた JAZUG12周年イベント
 
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
「スプラトゥーン」リアルタイム画像解析ツール 「IkaLog」の裏側
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
私がSeleniumを使ってスクリーンショットを撮るまでに出会った闇の全て
 
小さなサービスも契約する時代
小さなサービスも契約する時代小さなサービスも契約する時代
小さなサービスも契約する時代
 
GNU AGPLv3について(On GNU AGPLv3)
GNU AGPLv3について(On GNU AGPLv3)GNU AGPLv3について(On GNU AGPLv3)
GNU AGPLv3について(On GNU AGPLv3)
 
Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要Virtual Machine Scale Sets 概要
Virtual Machine Scale Sets 概要
 
Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介
 
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
 
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法についてAzure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
ZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介しますZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介します
 
React(TypeScript) + Go + Auth0 で実現する管理画面
React(TypeScript) + Go + Auth0 で実現する管理画面React(TypeScript) + Go + Auth0 で実現する管理画面
React(TypeScript) + Go + Auth0 で実現する管理画面
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
 
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 

En vedette

AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュNorito Agetsuma
 
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219Keizo Tatsumi
 
IntelliJ IDEAで快適なPython生活
IntelliJ IDEAで快適なPython生活IntelliJ IDEAで快適なPython生活
IntelliJ IDEAで快適なPython生活敦志 金谷
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかHiroshi Tokumaru
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編なべ
 
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話Takashi Uemura
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!TATSUYA HAYAMIZU
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Matt Raible
 

En vedette (8)

AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
 
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
 
IntelliJ IDEAで快適なPython生活
IntelliJ IDEAで快適なPython生活IntelliJ IDEAで快適なPython生活
IntelliJ IDEAで快適なPython生活
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいか
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
 

Pythonで二段階認証