パスワードマネージャにGoogle Authenticatorの情報を登録する
パスワードマネージャはQRコードを読み取って、OTPを表示できる。
パスワードマネージャは最近は高機能化されてきて、バーコードをスキャンしてワンタイムパスワードを表示できるような機能をもっているものも出てきています。
これで2要素認証といえるかどうか、という議論はあります。2 段階 認証ではありますが、OTPはパスワードマネージャが表示するものなので、マスターパスワードを入れれば表示が可能となってしまいます。この場合、目的は2要素認証なのですが、結果として利用側としては 1要素認証 になってしまいます。この点には注意が必要です。パスワードマネージャは指紋認証などの「パスワードではない」認証方法を利用すれば、これは 2要素認証 と言えるかもしれません。
ubuntuに導入できるgoogle-authenticator
他方、ログインに2段階認証を導入する場合、google-authenticatorが一番手軽に導入できるものだと思うのですが、google-authenticatorをコマンドラインから起動しても、ターミナル上に表示されたQRコードは、少なくともデスクトップ版の1passwordバーコードスキャナでは大きすぎて読めませんでした。
とはいえ、QRの上部にはURLが書かれているのですが、このotpauthは URLエンコードされている ため、そのままコピーしてパスワードマネージャに登録すると、使えないotpauthとなってしまいます。(当然、このまま登録しても、誤ったothauthのため、ログインできなくなります)
otpauth以下の部分は、そのままパスワードマネージャに登録するときにはURLデコードが必要 です。具体的には、以下の文字列を置換します。以下の3文字くらいしかないと思いますが、それ以外にもあれば、当然デコードが必要です。
(何カ所かありますから、全部デコードしてくださいね)
置換前 | 置換後 |
---|---|
%3F | ? |
%26 | & |
%3D | = |
簡単なスクリプトで置換してしまう。
ということで、非常に簡単ではありますが、スクリプトを書いてみました。なんということはなく、上記3種類を勝手に置換するだけです。
起動するときには、引数にgoogle-authenticatorから出力されているURLのうち、otpauth以降を与えるのですが、前後に[']を付けるようにしてください。
(味も素っ気もないスクリプトですが、手動置換だと忘れそうなので作ってみました)
使用方法:
encode-otpauth.py 'otpauth://hogehoge%3Fhogehoge%26hogehoge%3D'
# !/usr/bin/python3
import sys
args = sys.argv
args[1] = args[1].replace("%3F", "?")
args[1] = args[1].replace("%26", "&")
args[1] = args[1].replace("%3D", "=")
print("input password manager below otpauth for 2FA")
print(args[1])
参考となったURL
google-authenticatorそのものの導入:https://orebibou.com/2016/07/ubuntu-16-04-lts%E3%81%A7google-authenticator%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AF%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Fss/
URLデコード(といいつつ、結果としてシンプルなコードにしてしまいましたが):https://note.nkmk.me/python-urllib-parse-quote-unquote/
2要素認証と2段階認証:https://cryptomo.jp/2018/11/two-factor-authentication/