履歴
- 2022/6/19 初版
- 2023/1/6 誤植修正
動機
- AWSにログインするにはID・パスワードに認証だけでなく、仮想MFAデバイスなどを用いた多要素認証を行う方がセキュリティ上良いとされています
- 仮想MFAデバイスにはスマホアプリのGoogle AuthenticatorやMS Authenticatorが用いられることが多いのですが、以下のような問題があります
- AWSにログインするたびにスマホが必要になり、PC上のブラウザにOne Time Password(OTP)を手入力する必要がある。
- スマホをなくしたり、壊れたりするとAWSにログインできなくなる
やりたいこと
- スマホアプリのAuthenticatorは今まで通り使える
- 自分の所有するPCからはスマホなしでAWSにログインできるようにする
前提など
- AWSへのログインをテーマにしていますが、他のサービスにも使えます
- Linuxを前提します(他のプラットフォームで同じことができるかは未確認)
MFAデバイスの設定
- AWSにログインして、画面右上のユーザー名をクリックして、「セキュリティ認証情報」の設定を開きます
- 多要素認証の欄から「MFAデバイスの管理」を開きます
- すでにMFAデバイスを登録済みの場合は、一旦削除する必要があります。
- 下記の画面で以下のように操作します
- 「QRコードの表示」をクリックして、スマホのAuthenticatorアプリにアカウントを追加します
- 「シークレットキーの表示」をクリックして表示される文字列をコピーしておきます
- スマホのAuthenticatorからMFAコードを2回取得して、MFAコード1と2に入力します
- 「MFAの割り当て」を押下します
ここまででスマホのAuthenticatorアプリは通常通り使えるようになります
仮想MFAシェルスクリプトの仕様
スマホのAuthenticatorの代替となる、シェルスクリプトを作成します。
使い方は以下のようなものにします。IAMユーザー名はhogehogeとします
$ mymfa hogehoge
hogehoge
123456
ここで123456がMFAコードです。
これを手でコピーしても良いのですが、MFAコードをクリップボードにコピーするところまでシェルスクリプトで行うようにします。
仮想MFAシェルスクリプトの実装 mymfa
シークレットキーなどの情報は別ファイルに分けておきたいので、まずはロジックの部分を以下のように実装します。
ファイル名は仮にmymfaとします。
#!/bin/bash
. $HOME/.mymfa_keys
genotp() {
oathtool --totp --digits=6 --time-step-size=30s --base32 ${secrets[$1]}
}
if [ $# -gt 0 ]; then
key="$1"
else
key="$defaultKey"
fi
otp="$(genotp $key)"
echo $key
echo $otp
if which xclip > /dev/null 2>&1 && [ $"$DISPLAY" != x ] ;then
echo $otp | xclip
echo $otp | xclip -sel c
fi
MFAコードの生成部分はoathtoolというツールを使っています。
生成したMFAコードをクリップボードにコピーするのにxclipを使っています。
それぞれパッケージのインストールが必要です。
$ sudo dnf install oathtool xclip
xclipがない場合や、Window Systemが立ち上がってない場合は、クリップボードへのコピーは行いません。
仮想MFAシェルスクリプトの設定ファイル
シークレットキーなどのデータは $HOME/.mymfa_keys としてシェルスクリプトから読み込まれます。
以下のような形式で記述します。
declare -A secrets=(
["hogehoge"]="ABCDEFG"
["awsroot"]="ZYXWVUTS"
)
defaultKey=hogehoge
- secretsはシークレットキーをkey-value形式で記述します。keyはアカウント名などの任意の文字列、valueはAWSの画面でコピーしたシークレットキーです。
- 普段使うアカウント以外にも、AWSのrootユーザーのキーや、他のサービスのキーも追加できます
- defaultKeyはシェルスクリプトに引数を渡さなかったときに使われるデフォルトのユーザー名です。
使う
$ mymfa
とするだけで、デフォルトのアカウントのMFAコードがクリップボード(およびセレクション)にコピーされます。
各デスクトップ環境のランチャーから起動するのも便利でしょう。