0
0

PyOTPでAWS IAMのMFAを突破する

Posted at

はじめに

MFAについて調べている過程でPythonのPyOTPというライブラリを見つけました。PythonからOTP(ワンタイムパスワード)の6桁の数字を生成するものです。

これを使うとMicrosoft AuthenticatorやWinAuthなどを使うのと同じことがPythonでできることが分かりました。他のMFAにも利用できると思います。

OTP は RFC6238 という規格で標準化されている模様。

準備

Pythonを実行できる環境が必要です。今回はEC2にPythonを入れて利用します。

PyOPTを利用するために必要なライブラリを用意します。

pyotpのインストール
sudo pip3 install pyotp

名前が似ていますがpyotpとpyoptは全くの別物です。

手順

  • マネコンからIAMのMFA設定のページへ行きます。
    image.png

  • MFAデバイスは「認証アプリケーション」を選択して次へ。
    image.png

  • デバイスの設定でQRコードではなく「シークレットキーを表示」を押すと出てくる64文字の英数字をメモします。
    image.png

シークレットキーはOTPの生成に必要な秘密情報であり、非常に重要なセキュリティ要素です。公開されるべきではなく、機密情報として扱う必要があります。

  • 上記でメモしたシークレットキーをSECRET_KEYと仮定して下記のようにPythonで実行することで、6桁のMFAコードを出力します。
PyOTPで実行するプログラム。
# PyOTPライブラリのインポート
import pyotp

# SECRET_KEYを引数としてインスタンス生成
totp = pyotp.TOTP('SECRET_KEY')      

# SECRET_KEYに対応するワンタイムパスワードを生成
totp.now()
  • 30秒後に再度Pythonコードを実行して2つのMFAコードをそれぞれマネコンで入力してMFAを追加します。
    image.png

  • 下記のようにメッセージが表示されれば登録OKです。
    image.png

このプログラムでは、OTPの値は30秒ごとに更新されます。TOTP(Time-Based One-Time Password)アルゴリズムのデフォルト設定では、30秒のタイムステップを使用してOTPが生成されます。したがって、30秒ごとに新しいOTPが生成され、前のOTPは無効になります。

ログインしてみる

設定したIAMユーザーでログインしてIDとパスワードを入力するとMFAコードが要求されるので、同じプログラムを実行して6桁のMFAコードを入力します。

おわりに

物理的なOTP機器がインターネット通信もしないでMFAができることに「もやっ」としていたこれまでに比べて、OTPの仕組みが多少クリアになりました。

あまり実用的な用途が思い浮かびませんが、次のような条件が揃ったら選択肢に挙げてもよいかもです。

  • スマホが持ち込めないような場所でMFAが必要
  • 物理OTPデバイスも利用できない
  • WinAuthも利用できない
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0