前回はAWS Vaultの基本的な使い方を紹介しましたが、今回は実践編として、MFA認証と複数アカウント間のロール切り替えについて解説します。
実際の運用では、一つのベースアカウントで認証して、開発・本番など複数のアカウントのロールにスイッチするケースが多いと思います。
■ 構成イメージ
今回想定する構成:
ベースアカウント(認証用アカウント)
├─ IAMユーザー(MFA有効)
↓ AssumeRole
開発アカウント
└─ 開発者ロール
本番アカウント
└─ 本番運用ロール
ベースアカウントのIAMユーザーで認証し、MFAトークンを使って他のアカウントのロールにスイッチします。
■ 前提条件
※MacOS上で動かしていきます
【AWSアカウント側の準備】
・ベースアカウントにIAMユーザーが作成されている
・IAMユーザーにMFAデバイスが設定されている
・各アカウント(開発・本番)にスイッチ先のIAMロールが作成されている
・ロールの信頼関係でベースアカウントからのAssumeRoleが許可されている
【必要な情報】
・ベースアカウントのAccess Key ID / Secret Access Key
・MFAデバイスのARN(例:arn:aws:iam::123456789012:mfa/username)
・スイッチ先ロールのARN(例:arn:aws:iam::987654321098:role/DeveloperRole)
■ AWS Vaultの設定
【1. ベースアカウントの認証情報を追加】
aws-vault add base
Access Key IDとSecret Access Keyを入力します。
この情報は暗号化されてキーチェーンに保存されます。
【2. ~/.aws/configファイルの設定】
今回紹介するのは、credential_processを使った安全な構成です。
この方法では、認証情報が完全にAWS Vault経由でのみ取得されるため、より安全に管理できます。
~/.aws/config ファイルを編集:
[profile base]
region = ap-northeast-1
mfa_serial = arn:aws:iam::123456789012:mfa/username
role_session_name = your-session-name
[profile dev-src]
include_profile = base
role_arn = arn:aws:iam::987654321098:role/DeveloperRole
[profile dev]
credential_process = aws-vault export –format=json –prompt=osascript dev-src
region = ap-northeast-1
[profile prod-src]
include_profile = base
role_arn = arn:aws:iam::111222333444:role/ProductionRole
[profile prod]
credential_process = aws-vault export –format=json –prompt=osascript prod-src
region = ap-northeast-1
【設定の説明】
・profile base: ベースアカウントの基本設定
– mfa_serial: MFAデバイスのARN
– role_session_name: AssumeRole時のセッション名(CloudTrailのログに記録される)
・profile dev-src: 開発アカウントへのスイッチ設定(中間プロファイル)
– include_profile: ベースプロファイルの設定を継承
– role_arn: スイッチ先のロールARN
– ※ mfa_serialは不要(baseから継承される)
・profile dev: 実際に使用する開発環境プロファイル
– credential_process: AWS Vaultから認証情報を取得
– –prompt=osascript: macOSのネイティブダイアログでパスワード入力
– region: 使用するリージョン
・profile prod-src / prod: 本番環境も同様の構成
【この構成の利点】
・認証情報が完全にAWS Vault経由でのみ取得される
・~/.aws/credentialsファイルは一切使用しない
・credential_processにより、AWS CLIが自動的にAWS Vaultから認証情報を取得
・セキュリティが大幅に向上
・baseからdevにsource_profileでAssumeRoleする設定だと一時認証トークンが平文でキャッシュファイルで保存されるため、保存防止のためこの構成にしている
■ 基本的な使い方
この構成では、aws-vault execコマンドは不要です。
通常のAWS CLIコマンドに –profile オプションを付けるだけで使えます。
【開発環境でコマンドを実行】
aws –profile dev s3 ls
初回実行時、macOSのダイアログでキーチェーンのパスワード入力とMFAトークンの入力を求められます。
認証後は、セッションがキャッシュされるため、一定時間内は再入力不要です。
【本番環境でコマンドを実行】
aws –profile prod s3 ls
同様に、本番環境のロールにスイッチしてコマンドを実行します。
■ MFAの自動化(応用編)
MFAトークンの入力を自動化したい場合、1Password CLIなどのツールと組み合わせることができます。
【1Password CLIのインストール】
brew install 1password-cli
【~/.aws/configにmfa_processを追加】
[profile base]
region = ap-northeast-1
mfa_serial = arn:aws:iam::123456789012:mfa/username
mfa_process = op read op://vault/item/totp –otp
role_session_name = your-session-name
※ op://vault/item/totp の部分は、1Passwordに保存しているMFAトークンのパスに置き換えてください
この設定により、MFAトークンの入力が完全に自動化され、よりシームレスに複数アカウントを切り替えられます。
■ まとめ
・credential_processを使うことで、認証情報が完全にAWS Vault経由でのみ取得される安全な構成を実現
・include_profileで設定を継承し、構成ファイルをシンプルに保てる
・通常のAWS CLIコマンドに –profile を付けるだけで使える
・1Password CLIと組み合わせることで、MFAトークンの入力も自動化可能
・開発環境と本番環境を明確に分離して管理できる
この構成により、セキュリティを保ちながら、複数のAWSアカウントを効率的に管理できます。
~/.aws/credentialsファイルに平文で認証情報を保存する必要がなくなり、よりセキュアな運用が可能になります。
今回はここまで。