やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

pyotpでGitHubアカウントの2FAを有効化しログインできた

ついに2FA自動化のメドが立った。

前回まで

http://ytyaru.hatenablog.com/entry/2017/07/30/000000
http://ytyaru.hatenablog.com/entry/2017/07/31/000000

2FA(二要素認証)を有効化したアカウントがあったが、ログインできなくなった。WindowsをやめてWinAuthを使えなくなったから。OTP生成ライブラリで生成されたOTPではログインできなかった。

原因は以下が考えられる。

  • 間違ったsecretキーを保存した可能性もある
  • TOTPで算出する基本時刻のせいかもしれない

もはや2FA有効アカウントのBasic認証API実行を自動化するどころではない。ふつうにログインもできない。そこで、メールにて2FAを無効化してもらった。

http://ytyaru.hatenablog.com/entry/2017/08/01/000000

QRコード取得ツールがあるらしい。2FA自動化の手順を半自動化できるかもしれない。

今回

  • 画面キャプチャとQRコードリーダを使ってGitHubの2FAを有効化してみる。
  • pyotpに2FAの秘密鍵を渡してOTPを生成する
  • ログインできれば成功

インストール

QRコードリーダと画面キャプチャのツールをインストールする。

sudo apt-get install zbar-tools
sudo apt-get install scrot

もしくはSynapticパッケージマネージャでインストールする。

f:id:ytyaru:20170410184137p:plain
f:id:ytyaru:20170410184143p:plain

画面キャプチャし、QRコードを読み取る

#!/bin/bash
IMG_PATH=qrcode.png
WAIT_TIME=3
scrot -b -u -d ${WAIT_TIME} ${IMG_PATH}
WAIT_TIME=`expr ${WAIT_TIM} + 2`
sleep ${WAIT_TIM}s
zbarimg ${IMG_PATH}

結果は以下のように標準出力される。

QR-Code:otpauth://totp/GitHub:{GitHubユーザ名}?secret={16桁の秘密鍵}&issuer=GitHub
scanned 1 barcode symbols from 1 images in 1.3 seconds

secretの値{16桁の秘密鍵}はOTP生成に使う。

secretからOTPを生成する

前回のコードを使う。

ユーザ名とパスワードは無意味な文字列でOK。-sは2FAの秘密鍵

$ python3 Main.py -u user1 -p pass -s {16桁の秘密鍵}

{6桁のOTP}が目的のOTP。こいつをGitHubの2FAログイン画面にペーストしてログインできればOK。

{'auth': ('user1', 'pass'), 'headers': {'Time-Zone': 'Asia/Tokyo', 'X-GitHub-OTP': '{6桁のOTP}'}}

GitHubサイトで対象アカウントの2FAを有効化する

  1. GitHubサイトでログインする
  2. アカウント設定→セキュリティページへ移動する
  3. Two-factor authenticationoffになっている
  4. set up Two-factor authenticationボタンを押下する
    f:id:ytyaru:20170410184415g:plain
  5. Set up using an appボタンを押下する
    f:id:ytyaru:20170410184714g:plain
  6. QRコードが表示される
    f:id:ytyaru:20170410184819g:plain
  7. この画面でキャプチャとQRコード読取コマンドを実行する
scrot -b -u -d 5 "qrcode.png"
zbarimg "qrcode.png"
QR-Code:otpauth://totp/GitHub:{GitHubユーザ名}?secret={16桁の秘密鍵}&issuer=GitHub
scanned 1 barcode symbols from 1 images in 1.3 seconds
  1. {16桁の秘密鍵}をコピーする
  2. 前回のコードを実行する
$ python3 Main.py -u user1 -p pass -s {16桁の秘密鍵}
{'auth': ('user1', 'pass'), 'headers': {'Time-Zone': 'Asia/Tokyo', 'X-GitHub-OTP': '{6桁のOTP}'}}
  1. {6桁のOTP}をコピーする
  2. ブラウザに戻り、QRコードの下にあるテキストボックス123456とある部分に{6桁のOTP}をペーストする(30秒以内)
  3. 失敗すると以下のようにエラーが出る
    f:id:ytyaru:20170410190836g:plain
  4. 成功するとリカバリコードが表示される画面になる
    f:id:ytyaru:20170410185408g:plain
  5. Downloadボタンを押下してどこかに保存しておく
  6. リカバリコードを取得できるラストチャンス?
    f:id:ytyaru:20170410185857g:plain
  7. Back to Settingsリンクをクリックして設定画面に戻る
  8. Two-factor authenticationonになっている f:id:ytyaru:20170410190149g:plain

めでたく2FAが有効化された。

2FAのOTPでログインする

  1. ユーザ名とパスワードを入力する
    f:id:ytyaru:20170410210303p:plain
  2. 先述のとおりにOTPを生成させて入力する(30秒以内)
    f:id:ytyaru:20170410210312p:plain

ログインできた。

ポイント

  • 2FAのsecret値を保存しておく
  • secret値を忘れた時のためにリカバリコードを保存しておく
    • 発行から1年間だけ有効らしい
    • リカバリコードは1発行16個で1個1回限り

所感

あっさりできた。以前できなかったのは、たぶんSecretを間違っていたのだろう。

これで2FAでのBasic認証も自動化できそう。