ついに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コードリーダと画面キャプチャのツールをインストールする。
sudo apt-get install zbar-tools
sudo apt-get install scrot
もしくはSynapticパッケージマネージャでインストールする。


画面キャプチャし、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を有効化する
- GitHubサイトでログインする
- アカウント設定→セキュリティページへ移動する
- Two-factor authenticationが- offになっている
- set up Two-factor authenticationボタンを押下する
  
- Set up using an appボタンを押下する
  
- QRコードが表示される
  
- この画面でキャプチャと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
- {16桁の秘密鍵}をコピーする
- 前回のコードを実行する
$ python3 Main.py -u user1 -p pass -s {16桁の秘密鍵}
{'auth': ('user1', 'pass'), 'headers': {'Time-Zone': 'Asia/Tokyo', 'X-GitHub-OTP': '{6桁のOTP}'}}
- {6桁のOTP}をコピーする
- ブラウザに戻り、QRコードの下にあるテキストボックス123456とある部分に{6桁のOTP}をペーストする(30秒以内)
- 失敗すると以下のようにエラーが出る
  
- 成功するとリカバリコードが表示される画面になる
  
- Downloadボタンを押下してどこかに保存しておく
- リカバリコードを取得できるラストチャンス?
  
- Back to Settingsリンクをクリックして設定画面に戻る
- Two-factor authenticationが- onになっている 
めでたく2FAが有効化された。
2FAのOTPでログインする
- ユーザ名とパスワードを入力する
  
- 先述のとおりにOTPを生成させて入力する(30秒以内)
  
ログインできた。
ポイント
所感
あっさりできた。以前できなかったのは、たぶんSecretを間違っていたのだろう。
これで2FAでのBasic認証も自動化できそう。