こんにちは、辻です。
AWSのIAMユーザのセキュリティ上、IAMユーザにMFA(他要素認証)を導入するケースがあります。MFAを有効にしているIAMユーザでGUI経由でログインする場合は、ログイン時に認証情報が求められて、MFAデバイスが出力するトークンを入力することでログインできます。一方AWS CLIを用いてリソースにアクセス場合はコマンド発行時に認証情報は求められません。代わりに以下のような記事にかかれているような、一時的な認証情報を発行することがよく行われます。
get-session-token
コマンドを発行することで一時的な認証情報を発行する、ということです。
aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token --profile my-login-profile |
コマンドが成功すると、以下のようなJSONがレスポンスとして返ってきます。
{ |
返ってきたレスポンス SecretAccessKey
, SessionToken
を ~/.aws/credentials
に記述したり、あるいは環境変数を更新する必要があります。
上記のJSONの値を ~/.aws/credentials
に記述することでリソースにアクセスできるようになったものの、get-session-token
コマンドを発行した認証情報は最大で129600秒(=36時間)です。一時的な認証情報という意味では妥当ですが、AWS CLIは頻繁に利用するため、ほぼ毎日 get-session-token
コマンドで出力したJSONの値を ~/.aws/credentials
に貼り付ける作業が発生するようになりました。これはちょっと面倒です。
そこで future-architect/awsmfa というAWS CLIでMFAを扱うときにちょっとだけ便利にMFAを扱うコマンドラインツールを作りました。
future-architect/awsmfa
<img src=”https://github.com/future-architect/awsmfa" alt="future-architect/awsmfa - GitHub“ loading=”lazy”>
何ができるのか
- AWSの
config
ファイルやcredential
ファイルにMFA用の名前付きプロファイルを生成 - MFAに使用する値を、コマンド実行時に自動で更新
使い方
sts get-session-token
と同じ要領で awsmfa
コマンドを実行するだけです。
awsmfa --serial-number arn:aws:iam::123456789012:mfa/my-login-role --profile my-login-profile code-from-token |
MFAの認証情報を扱うプロファイル名はデフォルトで mfa
としています。(別のプロファイル名で保存したい場合はオプションに --mfa-profile-name
を指定します。)上記の awsfma ...
コマンドを実行すると以下のように mfa
のプロファイル名が追加されます。2回目以降は ~/.aws/credentials
の mfa
プロファイル名の値を更新するようになっています。
~/.aws/config
[default] |
~/.aws/credentials
[default] |
インストール
Linuxの場合はシェルスクリプト一発でローカル環境にインストールできます。このコマンドラインツールはGoで書かれており、マルチプラットフォーム向けにシングルバイナリを簡単に提供できます。インストールが簡単に行えるのはとても良いですね。
curl -sfL https://raw.githubusercontent.com/future-architect/awsmfa/master/install.sh | sudo sh -s -- -b /usr/local/bin |
Windowsの場合は Releases から最新のバイナリを取得して、パスが通っているディレクトリにバイナリを配備してください。
まとめ
AWS CLIで用いるMFAの運用をちょっとだけ楽にするツールを作りました。
やろうと思えばシェル芸でもできそうですし、99designs/aws-vault
や broamski/aws-mfa
などのよりリッチなOSSもあります。今回は自分たちのユースケースのために作ったツールを公開しました。
さっそくプルリクエストもいただきました。社外の方からも使っていただき嬉しく思います。