AWS Lambda Python でMFA認証コードを作成してみる

はじめに

今回はAWS Lambda PythonでMFA認証コードを作成してみたいと思います。
あまり必要になることもないかと思いますが、試したら出来たので共有します!

準備

ライブラリ

今回は以下のライブラリを使わせてもらいます。
GitHub - pyauth/pyotp: Python One-Time Password Library
こちらのライブラリをpipでインストールする必要があるのですが、今回はLambdaで実装していくのでレイヤー化します。

ライブラリダウンロード

適当にdockerやらEC2やら立ててレイヤー化の作業を行います。
今回はAmazon Linux2のEC2を使いました。
インストール手順は以下となります。

sudo easy_install pip
mkdir python
pip install -t ./python pyotp
zip -r pyotp.zip python
aws -s mv pyotp.zip s3://バケット名/pyotp.zip

やっていることはライブラリをダウンロードしてS3バケットに配置しているだけです。

レイヤー化

マネジメントコンソールから[Lambda]→[レイヤー]→[レイヤーの作成]
名前は任意ですが、ここではpyotpとしておきます。
S3のリンクは先ほどライブラリを配置したパスを指定します。

f:id:rioner2525:20200326184646j:plain
こんな感じ

実装

AWS Lambda で準備したレイヤーを利用してMFA認証コードを作成します。
Lambda関数に先ほど作成したレイヤーを追加しておきます。

f:id:rioner2525:20200326195213j:plain
こんな感じ
Python のコード例は以下になります。

実行したら以下のような情報が出ます。

012345  #MFA認証コード
14  #コードが切り替わるまでの時間、30になったら切り替わる

おわりに

軽く解説します。
TOTPメソッド内の数字ですが、これはMFAのシークレットキーになります。
普通はQRコードでMFA登録を行うことが多いと思いますが、実はQRコードと同時にシークレットキーも払い出されています。

f:id:rioner2525:20200326192214j:plain
IAMでのMFAだとココ

これでサーバレスにMFA認証が可能となります。
主な利用ケースとしてはMFA認証を利用したCLIの操作でしょうか。
他にもスマホを持っていないガラケーユーザーがAmazon connectと連携したLambdaを電話コールで叩いてMFAコードを取得、MFA認証でログインするとか変則的な使い方もできそうです(`・ω・´)