説明
利用者が MFA なしで AWS ロールを引き受けられると、盗まれた認証情報だけでロールを利用されるリスクが高まります。実際の引き受けには、呼び出し元の権限やロールの信頼ポリシーなども満たす必要があります。
要求に MFA の値を渡すことと、MFA のない要求をポリシーで拒否することは別です。非対話型のワークロードでは、利用者の MFA コードを保存せず、実行環境のロールやフェデレーションによる一時認証情報を使用してください。
想定される影響
- 盗まれた利用者の認証情報で、利用可能なロールの権限が悪用されるおそれがあります。
- MFA の入力だけを追加しても、別の要求経路では MFA なしで引き受けられる場合があります。
対処方法
- MFA が必要な AssumeRole 要求には、正しい mfa_serial_number と現在有効な mfa_token を渡してください。トークンや返された認証情報をログに出さないでください。
- 利用者のアクセス経路に対応する信頼ポリシーで aws:MultiFactorAuthPresent 条件を適切に強制し、実際の許可・拒否を確認してください。ワークロードの認証方法は別途設計してください。
例
既存のモジュール名を使った抜粋です。インストール済みのコレクションが対応する名前を確認してください。現在のモジュールは amazon.aws.sts_assume_role です。実際のロール ARN と MFA デバイス一覧を用意し、実行時に有効な current_mfa_token を渡してください。
変更前
yaml
- name: 既存のロールを引き受ける
community.aws.sts_assume_role:
mfa_serial_number: "{{ mfa_devices.mfa_devices[0].serial_number }}"
role_arn: "arn:aws:iam::123456789012:role/someRole"
role_session_name: "someRoleSession"
register: assumed_role
- name: ロールを引き受ける
sts_assume_role:
role_arn: "arn:aws:iam::123456789012:role/someRole"
role_session_name: "someRoleSession"
register: assumed_role
変更後
yaml
- name: 既存のロールを引き受ける
community.aws.sts_assume_role:
mfa_serial_number: "{{ mfa_devices.mfa_devices[0].serial_number }}"
mfa_token: "{{ current_mfa_token }}"
role_arn: "arn:aws:iam::123456789012:role/someRole"
role_session_name: "someRoleSession"
register: assumed_role
no_log: true
補足:
- 変更前: 最初のタスクはデバイス識別子だけを指定し、次のタスクには MFA の値がありません。実際の許可は IAM ポリシーによって決まります。
- 変更後: デバイス識別子と現在のトークンを渡し、ログ出力を抑制します。ポリシーによる MFA の強制は別途確認する必要があります。