AWS CLI の MFA 認証をスクリプトで簡単に実行する方法

AWS CLI の MFA 認証をスクリプトで簡単に実行する方法

Clock Icon2025.02.14

AWS のマネージメントコンソールで MFA を有効化しても、実はアクセスキーを使用したAWS CLIの実行はできてしまいます。つまり、コンソールでのMFA設定だけでは、CLI経由のアクセスを完全に保護できているとは言えません。
特に、組織のセキュリティポリシーでMFA認証が強制されている環境(参考:多要素認証(MFA)するまで使えません!なIAMユーザを作成してみた)では、AWS CLIでのMFA認証の設定が必須となります。

本記事では、プロファイルを切り替える方式でMFA認証を実装する方法を解説します。
AWS CLIでのMFA認証については、こちらの記事も参考になりますので併せて読んでみてください。

前提条件

  • AWS CLIがインストール済み
  • IAM ユーザーが作成済み
  • MFAデバイスが設定済み(Google Authenticatorなど)

1.AWS CLIのプロファイルを作成

まず、MFAのプロファイルを作成するために以下のコマンドを実行します。

~ % aws configure
AWS Access Key ID [None]: 【アクセスキーID】
AWS Secret Access Key [None]: 【シークレットアクセスキー】
Default region name [None]: ap-northeast-1  # 東京リージョン
Default output format [None]: json

設定を確認します。

~ % aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************XXXX shared-credentials-file    
secret_key     ****************XXXX shared-credentials-file    
   region           ap-northeast-1      config-file    ~/.aws/config
~ % aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "xxxxxxxxxxxx",
    "Arn": "arn:aws:iam::xxxxxxxxxxxx:user/mfauser"
}

2.MFAデバイスのシリアル番号(ARN)を確認

MFAデバイスのシリアル番号(ARN)を確認します。このARNは後ほど必要になりますので、メモをしておいてください。

~ % aws iam list-mfa-devices
{
    "MFADevices": [
        {
            "UserName": "mfauser",
            "SerialNumber": "arn:aws:iam::xxxxxxxxxxxx:mfa/mfauser",
            "EnableDate": "2025-02-05T06:10:08+00:00"
        }
    ]

3.MFA認証用のスクリプトを作成

#!/bin/bash

# MFAデバイスのARNを設定(上で確認したSerialNumberを設定)
MFA_SERIAL_NUMBER="arn:aws:iam::xxxxxxxxxxxx:mfa/mfauser"

# MFAコードの入力を求める
echo -n "Enter MFA code: "
read MFA_CODE

# AWS STSを使用して一時的な認証情報を取得
CREDENTIALS=$(aws sts get-session-token \
    --serial-number ${MFA_SERIAL_NUMBER} \
    --token-code ${MFA_CODE} \
    --duration-seconds 43200)

# 取得した認証情報を変数に格納
AWS_ACCESS_KEY_ID=$(echo ${CREDENTIALS} | jq -r '.Credentials.AccessKeyId')
AWS_SECRET_ACCESS_KEY=$(echo ${CREDENTIALS} | jq -r '.Credentials.SecretAccessKey')
AWS_SESSION_TOKEN=$(echo ${CREDENTIALS} | jq -r '.Credentials.SessionToken')

# 認証情報をAWS credentialsファイルに書き込み
aws configure set aws_access_key_id "${AWS_ACCESS_KEY_ID}" --profile mfa
aws configure set aws_secret_access_key "${AWS_SECRET_ACCESS_KEY}" --profile mfa
aws configure set aws_session_token "${AWS_SESSION_TOKEN}" --profile mfa

echo "MFA credentials have been set for profile 'mfa'"

スクリプトに実行権限を付与します。

~ % chmod +x mfa.sh

4.MFA認証の実行

~ % ./mfa.sh
Enter MFA code: 123456
MFA credentials have been set for profile 'mfa'

設定されたプロファイルを確認

~ % aws configure list --profile mfa
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     mfa           manual    --profile
access_key     ****************YYYY shared-credentials-file    
secret_key     ****************YYYY shared-credentials-file    
   region           ap-northeast-1      config-file    ~/.aws/config

5.MFAプロファイルの使用

MFA認証が必要なAWS CLIコマンドを実行する際は、--profile mfa オプションを付けます。

# S3バケットの一覧表示
~ % aws s3 ls --profile mfa

# EC2インスタンスの一覧表示
~ % aws ec2 describe-instances --profile mfa

おまけ

~/.zshrc や ~/.bashrc に以下を追加すると、より簡単にMFAプロファイルを使用できます。

alias aws-mfa='aws --profile mfa'

参考

https://dev.classmethod.jp/articles/forced_mfa/
https://dev.classmethod.jp/articles/aws-cli-supports-assume-role-credentials-provider-and-mfa/
https://qiita.com/sugimount-a/items/5c522af2f5354ab7ab9f

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.