ついに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認証も自動化できそう。