はじめに
本書の目的
本ドキュメントは、AWS CLIでの多要素認証(MFA)を導入・運用する方法をわかりやすく解説します。IAMユーザーへのデバイス登録から、CLIのプロファイル設定、セッショントークン取得、さらに自動化スクリプトやAWSumeを使った簡易運用までカバーします。
なぜMFAが必要か
CLIでの操作は強力な権限を伴います。認証情報が漏れると広範な被害につながります。MFAを使うと、パスワードだけでなく手元のデバイスで生成したワンタイムコードを追加で求めるため、リスクを大きく下げられます。
対象読者
・AWSの基本操作が分かる方
・CLIでの認証を強化したい管理者や開発者
本書を読むとできること
- IAMユーザーにMFAを設定する方法が分かります
- AWS CLIでMFA対応のプロファイルを作成できます
- セッショントークンを取得して安全にコマンドを実行できます
以降の章で手順を順を追って説明します。
AWS CLIでのMFA認証の重要性と概要
なぜMFAが必要か
MFA(多要素認証)は、パスワードやアクセスキーだけでは防げない不正利用を防ぎます。例えばアクセスキーが漏れた場合でも、MFAを要求する設定にしておけば、ワンタイムコードがないと操作できません。特に組織でセキュリティルールがある場合は必須です。
コンソールとCLIの違い(簡単な例)
AWS管理コンソールでMFAを有効にしても、アクセスキーを使うCLIはそのまま動きます。つまりコンソールでMFAを設定しただけでは、CLI経由の操作は守られません。CLIで保護したい場合は、MFA付きの一時的な認証情報を使う追加設定が必要です。
MFAはどう働くか(概略)
一般的には、MFAデバイスで生成した6桁コードを使い、STSのGetSessionTokenなどで一時的なアクセスキー(有効期限あり)を取得します。取得した一時的認証情報をCLIのプロファイルに設定して操作します。
組織への影響
MFAをCLIでも運用すると、スクリプトや自動化の見直しが必要になります。自動化はセッション取得を組み込むか、専用ロールで運用するなど設計変更が発生します。次章で具体的な準備手順を説明します。
前提条件と準備
準備の概要
AWS CLIでMFAを使う前に、環境を整えておく必要があります。本章では最低限の前提条件と準備手順を分かりやすく説明します。
必要なソフトとアカウント
- AWSアカウントとIAMユーザー(管理者権限または必要な権限を持つ)
- AWS CLI(最新版を推奨)
- スマートフォンにインストールしたTOTP対応アプリ(例:Google Authenticator、Authy)
IAMユーザーの準備
- AWS Management ConsoleでIAMにログインします。
- 対象ユーザーを作成または選択し、プログラムによるアクセス(アクセスキー)や適切な権限を付与します。
- MFAを設定する前に、ユーザーにSTSのGetSessionTokenを実行できる権限があるか確認してください(ポリシーにsts:GetSessionTokenを含める)。
AWS CLIの準備
- ローカルでaws configureを実行し、アクセスキーIDとシークレットを設定します。
- 複数プロファイルを使う場合は、–profileオプションでプロファイル名を指定して設定します。
MFAデバイスの準備(例:Google Authenticator)
- IAMコンソールで「MFAデバイスの割り当て」からQRコードを表示します。
- スマホの認証アプリでQRコードを読み取り、生成される6桁コードを控えます。
その他の確認事項
- ローカル端末の時刻が正確であること(時刻ずれがあるとワンタイムパスが無効になります)。
- 必要なネットワークアクセス(AWSへの接続)があること。
チェックリスト
- [ ] AWS CLIがインストール済み
- [ ] IAMユーザーと必要権限がある
- [ ] 認証アプリがスマホにある
- [ ] ローカル時刻が正しい
以上で準備が整います。次章では実際にIAMユーザーへMFAデバイスを登録する手順を説明します。
IAMユーザーへのMFAデバイス登録
概要
IAMユーザーに仮想MFAを登録すると、ログイン時やAPI利用時の二段階認証が有効になります。ここではAWS CLIでの手順を具体例つきで説明します。
手順
- 仮想MFAデバイスを作成し、QRコードを取得します。例:
aws iam create-virtual-mfa-device –virtual-mfa-device-name my-mfa-device –outfile qrcode.png
このコマンドは仮想デバイスのARNとQRコード(PNG)を作成します。outfileを使えない環境では、出力のQRCodePNGを保存してください。
-
スマホの認証アプリ(Google AuthenticatorやAuthenticator)でQRコードを読み取ります。
-
MFAをIAMユーザーに関連付けます。アプリに表示される連続した2つのワンタイムパスワードを使います。例:
aws iam enable-mfa-device –user-name alice –serial-number arn:aws:iam::123456789012:mfa/my-mfa-device –authentication-code1 123456 –authentication-code2 234567
serial-numberはcreateコマンドの出力にあるARNを指定します。
注意点
- コードは連続した2つを入力してください。タイミングがずれると失敗します。\n- IAMに必要な権限(CreateVirtualMFADevice、EnableMFADeviceなど)があるか確認してください。\n- 端末を紛失した場合に備えてルートや管理者でのリカバリ手順を準備してください。
以上でIAMユーザーへの仮想MFAデバイス登録が完了します。
AWS CLIのプロファイル設定
概要
aws configureコマンドで、アクセスキーID、シークレットアクセスキー、デフォルトリージョン、出力フォーマットを設定します。複数の資格情報は「プロファイル」として管理できます。
基本的な使い方
- デフォルトプロファイルを設定:
aws configure
対話形式でアクセスキー、シークレットキー、リージョン、出力形式を入力します。
- 名前付きプロファイルを作る例:
aws configure --profile myprofile
設定の確認
- 現在の設定を一覧表示:
aws configure list --profile myprofile
- 認証が正しいか確認:
aws sts get-caller-identity --profile myprofile
ファイルと切替え
設定は~/.aws/credentialsと~/.aws/configに保存されます。コマンド実行時は–profileオプションで明示的に指定するか、環境変数AWS_PROFILEを使って切り替えます。
注意点
アクセスキーは安全に保管してください。MFAで追加の保護を行う場合、プロファイル分けが後の手順で役立ちます。
AWS CLI設定ファイルへのMFA情報追加
概要
~/.aws/configファイルにmfa_serialを追加して、プロファイルにMFAデバイスを関連付けます。これにより、セッショントークン取得時やロールの引き受け時に使うMFA情報を明示できます。
MFAデバイスARNの確認方法
- IAMコンソールで該当ユーザーを開き、「セキュリティ認証情報」→「仮想MFAデバイス」を確認します。ARNは「arn:aws:iam::123456789012:mfa/ユーザー名」の形式です。
- CLIでは次を実行します:
aws iam list-mfa-devices –user-name ユーザー名
設定例(IAMユーザープロファイル)
~/.aws/configに以下を追加します。
[profile myuser]
region = ap-northeast-1
output = json
mfa_serial = arn:aws:iam::123456789012:mfa/myuser
これでmyuserプロファイルにMFAが紐づきます。
設定例(ロールを使う場合)
ロール用プロファイルにmfa_serialを置くと、assume-role時にMFAを指定できます。
[profile myrole]
role_arn = arn:aws:iam::123456789012:role/RoleName
source_profile = myuser
mfa_serial = arn:aws:iam::123456789012:mfa/myuser
注意点
- ARNに誤りがあると認証が失敗します。コピー&ペーストで入力してください。
- ~/.aws/credentialsとは別にconfigに設定します。必要に応じてcredentialsにアクセスキーを入れてください。
確認方法
aws configure list-profile myuser ではなく、ファイルを直接確認します:
cat ~/.aws/config
正しくmfa_serialが書かれていれば完了です。
セッショントークンの取得
説明
aws sts get-session-tokenコマンドで、一時的なセッショントークンを取得します。MFAデバイスのARNとワンタイムコードを指定すると、MFA認証が適用されたセッションが発行されます。
コマンド例
aws sts get-session-token \
–serial-number arn:aws:iam::123456789012:mfa/your-user \
–token-code 123456 \
–duration-seconds 3600
上記は例です。serial-numberは実際のMFAデバイスARN、token-codeは認証アプリの6桁コードに置き換えてください。
出力の主な項目
- AccessKeyId:一時的なアクセスキー
- SecretAccessKey:一時的なシークレット
- SessionToken:セッションを証明するトークン
- Expiration:有効期限
環境変数への設定例
出力を変数に入れて環境変数に設定します(bashの例)。
export AWS_ACCESS_KEY_ID=取得したAccessKeyId
export AWS_SECRET_ACCESS_KEY=取得したSecretAccessKey
export AWS_SESSION_TOKEN=取得したSessionToken
こうすると、そのシェル内ではMFA認証済みのセッションでAWSコマンドを実行できます。
注意点
- durationは最大と組織の設定により変わります。 期限切れに注意してください。
- トークンは短期間のため、長時間の作業には自動更新やスクリプトでの再取得を検討してください。
MFA認証の自動化スクリプト
概要
bash関数 aws-mfa を定義すると、6桁のMFAトークンを渡すだけで aws sts get-session-token を実行し、取得した一時認証情報を環境変数に設定できます。セッションは12時間(43200秒)有効です。
スクリプト例
aws-mfa(){
token="$1"
if [[ ! $token =~ ^[0-9]{6}$ ]]; then
echo "6桁のMFAトークンを指定してください"
return 1
fi
serial="arn:aws:iam::123456789012:mfa/your-user" # 必要に応じて変更
duration=43200
# jqがある場合
creds=$(aws sts get-session-token --serial-number "$serial" --token-code "$token" --duration-seconds $duration --output json) || return 1
export AWS_ACCESS_KEY_ID=$(echo "$creds" | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo "$creds" | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo "$creds" | jq -r '.Credentials.SessionToken')
echo "MFAセッションを設定しました(有効期間: ${duration}s)"
}
jqがない場合の代替
read -r AK SK TOK <<< $(aws sts get-session-token --serial-number "$serial" --token-code "$token" --duration-seconds $duration --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text)
export AWS_ACCESS_KEY_ID="$AK"; export AWS_SECRET_ACCESS_KEY="$SK"; export AWS_SESSION_TOKEN="$TOK"
使い方と注意点
- 関数を~/.bashrcや~/.zshrcに追加し、シェルを再読み込みして使います。
- 環境変数はそのシェルでのみ有効です。不要になったら unset するかシェルを閉じてください。
- MFAシリアルは実際のARNに置き換えてください。
- 認証情報を誤って共有しないよう注意してください。
MFA対応のプロファイルを使用したコマンド実行
概要
MFA対応プロファイルを使うと、MFAで取得した一時認証情報を利用してAWS CLIコマンドを実行できます。基本はコマンドに–profile mfa(例)を付けるだけです。
実行手順
- 事前にセッショントークンをプロファイルに保存してください(第7章・第8章参照)。
- CLIコマンド実行時に–profileオプションを付けます。
例:
aws s3 ls --profile mfa
aws ec2 describe-instances --profile mfa --region ap-northeast-1
注意点と対処
- エラー例: ExpiredTokenやInvalidClientTokenIdが出たら、セッショントークンが期限切れです。トークン再取得スクリプトを再実行してください。
- プロファイル名は任意です。環境変数で指定する場合はAWS_PROFILE=mfaを使えます。
- 権限不足が出る場合はIAMのポリシーやMFA設定を確認してください。
短いポイント: 実行はシンプルですが、事前のトークン取得と有効期限管理が重要です。
AWSumeを使用した簡単なMFA認証
概要
AWSumeは、プロファイル名を指定しMFAコードを入力するだけで一時的な認証情報を取得し、シェルに自動で読み込めるツールです。複雑な設定を省けるため、日常のCLI作業が楽になります。
インストール
- Pythonが入っている環境で次のようにインストールします。
- pip install awsume
使い方(基本例)
- POSIX系シェル(bash/zsh):
- eval “$(awsume myprofile)”
- これでMFAコードを求められたら入力します。入力後、環境変数に一時的なキーが設定されます。
- PowerShell:
- awsume myprofile | Invoke-Expression
セッションの運用
- 期限が切れたら同じコマンドを再実行してMFAを入力します。
- 長時間作業する場合は、作業を始める前に有効期限を確認し、再取得してください。
注意点と便利な使い方
- プロファイル名は~/.aws/credentialsや~/.aws/configに登録したものを指定します。
- スクリプト内で使う場合は、サブシェルでawsumeを呼び出すより、手動でトークンを取得して環境に反映すると安全です。
この章では、手早くMFA対応の一時認証を取得する方法を示しました。実際の操作は環境に合わせてコマンドを調整してください。












