AWSコンソールとCLI利用時にMFA認証を必須にする

2022年10月20日

AWS の IAM ユーザを利用者に渡すとき MFA(2要素認証) の設定をお願いするのですが、設定してくれるかどうかは本人任せになります。そこで、MFA の設定をしてワンタイムパスワード認証をしてからでないと AWS コンソールと AWS CLI が権限エラーで利用できないようにする設定の備忘録。これなら必ず設定してくれます。

目次

  1. ドキュメントに書かれている IAM ポリシーを設定する
  2. 利用者に MFA の設定を依頼する
  3. AWS CLI 利用時にもワンタイムパスワードによる認証が必要
  4. シェルスクリプト化

ドキュメントに書かれている IAM ポリシーを設定する

Allows MFA-authenticated IAM users to manage their own credentials on the My Security Credentials page - AWS Identity and Access Management に書かれている IAM ポリシーをそのまま利用します。これが良くできていて、利用者自身で MFA の設定やパスワード変更などはすることができるのですが、それ以外のアクションは MFA のワンタイムパスワードによる認証を通過してからでないと拒否されるポリシーです。IAM グループのポリシーとして設定し、全 IAM ユーザに適用すると良いです。

上記ドキュメントの注意書きにもかかれているように、このポリシーは初めて AWS Management Console にサインインする際のパスワードのリセットを許可していません。IAM ユーザを作成するときに「初回ログイン時にパスワードのリセットが必要」を設定しないようにしましょう。これを設定して IAM ユーザを作成してしまうと、利用者は初回ログイン後にパスワードのリセットを求められますが、パスワードのリセットは許可されておらずエラーとなり、ログインの画面から先に進めなくなります。

利用者に MFA の設定を依頼する

このポリシーを IAM ユーザやグループに設定した後、利用者に MFA の設定を依頼します。MFA の設定は Enabling MFA devices for users in AWS - AWS Identity and Access Management を参考にします。

AWS CLI 利用時にもワンタイムパスワードによる認証が必要

AWS CLI のコマンド実行時にもワンタイムパスワードによる認証が必要になります。Authenticate access using MFA through the AWS CLI に解説があるように、以下のコマンドを実行して認証を行います。

aws sts get-session-token \
  --serial-number arn:aws:iam::123456789012:mfa/your-iam-user-name \
  --token-code 123456
  • --serial-numberオプションに指定する ARN は IAM ユーザの詳細画面にある Security Credentials タブの Assigned MFA device にある ARN を指定します。
  • --token-code オプションには MFA デバイスが発行した 6 桁の数字、ワンタイムパスワードを指定します。

正しく指定すると以下のように AccessKeyId などが返ってきます。このキーはExpirationの日時まで有効です。

{
    "Credentials": {
        "SecretAccessKey": "secret-access-key",
        "SessionToken": "temporary-session-token",
        "Expiration": "expiration-date-time",
        "AccessKeyId": "access-key-id"
    }
}

これを環境変数に設定します。

export AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output
export AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output
export AWS_SESSION_TOKEN=example-session-token-as-in-previous-output

AWS CLI を実行して、結果が得られることを確認します。

aws s3 ls

シェルスクリプト化

上記の手順を毎回やるのは面倒なので、MFA 用の名前付きプロファイルに一時的なクレデンシャルを保存するようにシェルスクリプト化をします。

jq が必要なので Download jq を参考にインストールしておきます。

自信の IAM ユーザで AWS CLI 用の Access Key を取得し、my-profileという名前の名前付きプロファイルに保存しておきます。

aws configure --profile my-profile

以下のスクリプトを aws-mfa というファイルに保存します。

#!/usr/bin/env bash
set -e

echo -n "Enter your multi-factor authentication code: "
read -r TOKEN_CODE

PROFILE='my-prifile'
SERIAL_NUMBER='arn:aws:iam::123456789012:mfa/your-iam-user-name'
MFA_PROFILE="${PROFILE}-mfa"
REGION=$(aws configure get region --profile "$PROFILE" --output text

STS_CREDENTIALS=$(aws sts get-session-token \
  --serial-number "$SERIAL_NUMBER" \
  --token-code "$TOKEN_CODE" \
  --query "Credentials" \
  --profile "$PROFILE" \
  --output json)

aws configure set aws_access_key_id "$(echo "$STS_CREDENTIALS" | jq -r '.AccessKeyId')" --profile "$MFA_PROFILE"
aws configure set aws_secret_access_key "$(echo "$STS_CREDENTIALS" | jq -r '.SecretAccessKey')" --profile "$MFA_PROFILE"
aws configure set aws_session_token "$(echo "$STS_CREDENTIALS" | jq -r '.SessionToken')" --profile "$MFA_PROFILE"
aws configure set region "$REGION" --profile "$MFA_PROFILE"
aws configure set output json --profile "$MFA_PROFILE"

echo "AWS Profile, ${MFA_PROFILE}, has been saved to your config file."

実行権限を与えます。

chmod +x aws-mfa

実行すると、MFA デバイスから出力される 6 桁のワンタイムパスワードを求められるので入力します。うまくいくと以下のように my-profile-mfa という名前付きプロファイルに一時的なクレデンシャルが保存されます。

$ ./aws-mfa
Enter your multi-factor authentication code: xxxxxx
AWS Profile, my-profile-mfa, has been saved to your config file.

以下のようにプロファイルを指定して AWS CLI を実行します。有効期間をすぎるとこのクレデンシャルは使えなくなるので、スクリプトで新しいクレデンシャルを取得します。

aws s3 ls --profile my-profile-mfa
AWS_PROFILE=my-profile-mfa
aws s3 ls

-技術ブログ
-