【正解】B
【0からの解説】
このポリシーは「MFA で認証されていない場合は ec2:* をすべて拒否する」という典型的な MFA 強制ポリシーです。ポイントは aws:MultiFactorAuthPresent がいつ true になるかです。
このキーは、リクエストを行う際の一時的な認証情報(セッション)が MFA を使って取得された場合にのみ true になります。AWS マネジメントコンソールは MFA でサインインすると自動的に MFA 付きセッションになりますが、
AWS CLI で長期アクセスキー(アクセスキー ID とシークレットキー)をそのまま使うと、そのリクエストには MFA 情報が付かないため aws:MultiFactorAuthPresent は false 扱いになり、Deny に引っかかって EC2 操作ができません。
解決策は、CLI でも MFA 付きの一時セッションを取得することです。
aws sts get-session-token を MFA デバイスのシリアル番号(--serial-number)とワンタイムコード(--token-code)付きで実行すると、MFA 認証済みの一時認証情報(アクセスキー・シークレット・セッショントークン)が返されます。これらを使って CLI を実行すれば aws:MultiFactorAuthPresent が true になり、Deny を回避しつつ MFA 強制を維持できます。
【誤りの選択肢】
A:aws:MultiFactorAuthPresent はリクエスト時に AWS が自動判定する条件キーであり、ポリシーで true に「書き換える」ものではありません。値を true に固定するとそもそも MFA 強制の意味がなくなります。
C:SAML フェデレーションに切り替えるのは大掛かりな構成変更で、既存の IAM ユーザー+CLI 運用を維持したいこの状況には過剰です。問題は MFA 付きセッションの取得方法であり、フェデレーション導入は不要です。
D:sts:AssumeRole を NotAction に入れると、その操作が MFA なしでも拒否されなくなり MFA 強制が緩みます。また assume-role 方式は別ロールへの切り替えが前提で構成が複雑になり、最小限の解決策としては不適切です。
【参考】
MFA で保護された API アクセスの設定GetSessionToken(AWS STS)