AWS CLI でMFA認証してスイッチロールしたい

AWS CLI でMFA認証してスイッチロールしたい
目次

はじめに


AWS CLIをローカル環境で使用するためには、どうしてもクレデンシャルの発行が必要になります。
Cloud9やEC2を立てたり、Cloudshellを使えば良いのだが、コストがかかったり、コンソールログインが必要だったりと何かと面倒です。

かといって、クレデンシャル流出のリスク対策をしないわけにはいかないので、やってみました。
完全無料でってところがこの記事のポイントですね。

 

前提

スイッチロール前の権限はなにもできない設定にしています。
※これでクレデンシャルが流出してもなにもできません。

 

TL;DR


本記事でわかることは以下の通りです。

☆ AWS CLI 使用時に、MFA認証後にスイッチロールする方法

 

環境


$ aws --version
aws-cli/2.7.12 Python/3.9.11 Linux/5.10.104-linuxkit exe/x86_64.rhel.9 prompt/off

 

1. IAMロールの作成


IAMロールを作成し、ポリシーに「AdministratorAccess」を選択する。
※適宜、必要なポリシーに変更してください。 信頼関係のタブを選択し、以下のように設定します。

このロールを使用するユーザの許可設定とMFA認証後でないと使用できないよう設定しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNTID:user/username"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}

 

2. aws cliの初期設定


aws cliのインストールは 公式ドキュメント を参考に実施してください。

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

ユーザのホームディレクトリ直下に、.aws/config と .aws/credentials が作成されます。

 

3. シェルスクリプトの作成


スイッチロールして、aws cliを使用するためのシェルスクリプト書いたので、全文公開! ※ACCOUNTID、username、RoleNameは適宜置き換えてください。

#!/bin/bash

DATE=`date +%s`
SERIAL_NUMBER='arn:aws:iam::ACCOUNTID:mfa/username'
ROLE_ARN='arn:aws:iam::ACCOUNTID:role/RoleName'

# スイッチロールのセッション時間を指定(ex: 3600 (s))
echo -n "Set duration_second: "
read DURATION_SECOND

# MFA認証コードを入力
echo -n "Input MFA Code: "
read TOKEN_CODE

# ここからスイッチロール
OUTPUT=`aws sts assume-role \
  --role-arn          ${ROLE_ARN} \
  --serial-number     ${SERIAL_NUMBER} \
  --role-session-name ${DATE}-session \
  --duration-second   ${DURATION_SECOND} \
  --token-code        ${TOKEN_CODE}
`

# コマンドの実行結果から3つのキーを抜き出し、環境変数に設定する

export AWS_ACCESS_KEY_ID=`echo $OUTPUT | jq -r .Credentials.AccessKeyId`
echo "export AWS_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY=`echo $OUTPUT | jq -r .Credentials.SecretAccessKey`
echo "export AWS_SECRET_ACCESS_KEY"
export AWS_SESSION_TOKEN=`echo $OUTPUT | jq -r .Credentials.SessionToken`
echo "export AWS_SESSION_TOKEN"

echo "start session....Session expires after ${DURATION_SECOND} seconds...."

 

まとめ


クレデンシャルが流出した場合の対策として、MFA必須化とスイッチロールさせる設定をやってみました。
これで完全無料でそこそこセキュアな環境を築けたのではないでしょうか。
よければご活用ください。