はじめに
MFAについて調べている過程でPythonのPyOTPというライブラリを見つけました。PythonからOTP(ワンタイムパスワード)の6桁の数字を生成するものです。
これを使うとMicrosoft AuthenticatorやWinAuthなどを使うのと同じことがPythonでできることが分かりました。他のMFAにも利用できると思います。
OTP は RFC6238 という規格で標準化されている模様。
準備
Pythonを実行できる環境が必要です。今回はEC2にPythonを入れて利用します。
PyOPTを利用するために必要なライブラリを用意します。
sudo pip3 install pyotp
名前が似ていますがpyotpとpyoptは全くの別物です。
手順
シークレットキーはOTPの生成に必要な秘密情報であり、非常に重要なセキュリティ要素です。公開されるべきではなく、機密情報として扱う必要があります。
- 上記でメモしたシークレットキーを
SECRET_KEY
と仮定して下記のようにPythonで実行することで、6桁のMFAコードを出力します。
# PyOTPライブラリのインポート
import pyotp
# SECRET_KEYを引数としてインスタンス生成
totp = pyotp.TOTP('SECRET_KEY')
# SECRET_KEYに対応するワンタイムパスワードを生成
totp.now()
このプログラムでは、OTPの値は30秒ごとに更新されます。TOTP(Time-Based One-Time Password)アルゴリズムのデフォルト設定では、30秒のタイムステップを使用してOTPが生成されます。したがって、30秒ごとに新しいOTPが生成され、前のOTPは無効になります。
ログインしてみる
設定したIAMユーザーでログインしてIDとパスワードを入力するとMFAコードが要求されるので、同じプログラムを実行して6桁のMFAコードを入力します。
おわりに
物理的なOTP機器がインターネット通信もしないでMFAができることに「もやっ」としていたこれまでに比べて、OTPの仕組みが多少クリアになりました。
あまり実用的な用途が思い浮かびませんが、次のような条件が揃ったら選択肢に挙げてもよいかもです。
- スマホが持ち込めないような場所でMFAが必要
- 物理OTPデバイスも利用できない
- WinAuthも利用できない