これは何?
iTerm2のTriggers機能を使って、AWS CLIなどのMFA(多要素認証)トークンを自動で入力する方法の紹介です。
はじめに
AWS CLIを使ったオペレーションや、AWS SDKを使用するアプリケーションを開発する際、組織のポリシーによってはMFA(多要素認証)のトークンの入力が必須であることも少なくないかと思います。
セキュリティはもちろん重要ですが、開発中に何度も入力するのはさすがに億劫なのでMFAトークンを自動で入力する仕組みを考えてみました。
必要なもの
- macOS
- iTerm2
-
OATH Toolkit
-
brew install oath-toolkit
でインストールできます
-
設定手順
1. AWSのコンソールで仮想MFAデバイスを使用する設定を行う
既にAWSで仮想MFAデバイスの設定をしていて秘密鍵(シークレット設定キー)がわかる場合はこの手順は必要ありません。
秘密鍵がわからない場合は、以下のドキュメントを参考に仮想MFAデバイスを新たに作成し、自身のユーザに割り当てる必要があります。この際に作成した仮想MFAデバイスの秘密鍵(シークレット設定キー)を控えておいてください。
仮想 Multi-Factor Authentication (MFA) デバイスの有効化 (コンソール) - AWS Identity and Access Management
2. MFAトークンを出力するシェルスクリプトを設置する
OATH Toolkitを使用してMFAトークンを出力するシェルスクリプトを適当なパスに設置して、実行権限を付与しておきます。実行権限がないと後続の手順で動かないので忘れずに付与してください。
例
#!/bin/bash
/usr/local/bin/oathtool --totp --base32 <MFAデバイスのシークレット設定キー>
3. iTerm2でTriggerの設定をする
iTerm2のプロファイルの設定の Advanced タブに Triggers の項目があるので Edit ボタンをクリックします。
ターミナルの出力が特定の正規表現にマッチしたらCoprocessとして手順2のシェルスクリプトを起動するように設定します。
AWS CLIでMFAトークンを自動入力させる場合の例
- Regular Expression:
Enter MFA code for arn:aws:iam:.*:
- AWS CLIのバージョンによって文言が若干異なるかもしれません
- AWS SDKが表示するプロンプトも多少文言が違うと思います
- Parameters: 手順2で設置したシェルスクリプトのパス
- Instant: 改行が出力されていなくても発動するかのフラグ
- MFAトークンのプロンプトは改行が出力されないのでチェックしておきます
4. 動作確認
以上で設定は完了です。
MFAトークンの入力が求められる適当な操作をしてみて、Triggerが発動するか確認してみてください。
改善点
秘密鍵の保管方法
この記事では秘密鍵をシェルスクリプトに平文で書く例を記載していますが、秘密鍵はOSのキーチェーンに格納し security
コマンドを使用して取り出す手法の方がセキュアで良いと思います。
そもそも他のアプローチにする
この記事では、MFAトークンのプロンプトを正規表現でマッチするという邪道なアプローチをとっていますが、AWS的には多要素認証済みのセッションで発行した一時的な認証情報はそのセッションの間MFAトークンが不要なので、それを使ってAPIにアクセスするのが正攻法ではないかと思います。
軽く調べたところ aws-mfa-shotgun というツールがこれを実現しているようなので、こちらを使用するとよいかもしれません。