目次
はじめに
AWSのIAMユーザーにMFAを設定するよう案内しても、なかなか設定してくれないメンバーがいる、という経験はないでしょうか。
MFA未設定のユーザーはパスワードさえ漏れれば不正アクセスが成立するため、セキュリティ上のリスクになります。
この記事では、MFA未設定のIAMユーザーがAWSコンソールにログインしても、MFAを設定する操作しかできないようにするポリシーの設定方法を紹介します。
「お願い」ではなく「強制」できるため、確実にMFAを普及させたい場合に有効な手段です。
本記事では、このMFA強制の設定を実際にAWSアカウントで検証した手順と結果をまとめています。
構成の概要
テストユーザーに以下の2つのポリシーをアタッチします。
| ポリシー | 役割 |
|---|---|
Force_MFA(カスタムポリシー) |
MFA未認証時にMFA操作以外をすべてブロック |
ReadOnlyAccess(AWSマネージドポリシー) |
MFA認証後にAWSリソースの参照を許可 |
動作のイメージは以下の通りです。
- MFA未認証時:
Force_MFAポリシーが発動し、MFAデバイスの設定操作以外はすべてAccessDeniedになる - MFA認証後: ブロックが解除され、
ReadOnlyAccessの権限でAWSリソースを参照できる
実運用では ReadOnlyAccess の部分を業務に必要なポリシーに置き換えます。
Force_MFA ポリシーの解説
Force_MFA ポリシーはAWS公式ドキュメントに掲載されているポリシー例をそのまま使用します。
ポリシーは8つのステートメントで構成されています。
| ステートメントID | 内容 |
|---|---|
AllowViewAccountInfo |
アカウント概要の閲覧 |
AllowManageOwnPasswords |
自身のパスワード変更 |
AllowManageOwnAccessKeys |
自身のアクセスキー管理 |
AllowManageOwnSigningCertificates |
デジタル証明書管理 |
AllowManageOwnSSHPublicKeys |
SSH公開キー管理 |
AllowManageOwnGitCredentials |
Git認証情報管理 |
AllowManageOwnVirtualMFADevice |
仮想MFAデバイスの作成・削除 |
DenyAllExceptListedIfNoMFA |
MFA未認証時に上記以外のすべてを拒否 |
最後の DenyAllExceptListedIfNoMFA がこのポリシーの核心です。
ポイント①: Condition で MFA 未認証セッションを検出する
DenyAllExceptListedIfNoMFA には以下の条件が付いています。
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
aws:MultiFactorAuthPresent はセッションがMFA認証済みかどうかを示す条件キーです。
MFA認証なしでログインしたセッションでは false になるため、このステートメントが発動してブロックが行われます。
ポイント②: NotAction + Deny の組み合わせ
DenyAllExceptListedIfNoMFA ステートメントでは Action ではなく NotAction を使っています。
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
...
]
NotAction は「リストにないアクション」を対象にします。
Effect: Deny と組み合わせることで、「リストにないアクションをすべて拒否する」という動作になります。
Action: "*" で全拒否するのではなく NotAction を使う理由は、MFA設定に必要な操作(iam:CreateVirtualMFADevice など)だけを拒否の対象から外すためです。
「一部のアクションを除いて全部拒否」という書き方は直感に反しやすいですが、この用途では非常に有効です。
設定手順
事前準備: テスト用IAMユーザーの作成
コンソールアクセスを有効にしたIAMユーザーを作成します。MFAは設定しない状態にしておきます。
Step 1: Force_MFA ポリシーの作成
IAMコンソール > ポリシー > ポリシーを作成 を開き、JSONタブで公式ドキュメントのポリシー例を貼り付けます。
ポリシー名を Force_MFA として保存します。
MFAが有効化されていなければ操作が拒否されるようになっている

Step 2: テストユーザーへのポリシーアタッチ
IAMコンソール > ユーザー > テストユーザー > アクセス許可タブ を開き、以下の2つをアタッチします。
Force_MFA(Step 1で作成したポリシー)ReadOnlyAccess(AWSマネージドポリシー)

動作確認
MFA未設定状態: AWSリソースへのアクセスがブロックされる
テストユーザーでマネジメントコンソールにログインし、EC2コンソールを開いてみると AccessDenied エラーが表示されます。

MFA未設定状態: セキュリティ認証情報ページは開ける
ただ、MFA設定関連の権限は許可しているので、IAMコンソール > セキュリティ認証情報 のページは開くことができ、MFAデバイスの割り当てが可能です。
この画面からMFAを設定するよう誘導される動作になります。
MFA登録
セキュリティ認証情報ページでMFAデバイスを割り当て、仮想デバイス(Google Authenticator等)でQRコードをスキャンして登録を完了します。

MFA認証後: AWSリソースの参照が可能になる
一度サインアウトし、再ログイン時にMFAコードを入力するとMFA認証済みセッションが確立されます。
IAMコンソールやEC2コンソールへのアクセスができるようになりました 。


また、ReadOnlyAccess のみを付与しているため、EC2インスタンスの起動などのreadonlyでは実施できない操作は引き続き AccessDenied になります。
ハマりポイント
MFA登録直後にサインアウト→再ログインが必要
MFAデバイスを登録しても、現在のセッションにはMFA認証が反映されていません。(画像はMFA登録直後の画面 )
登録後は一度サインアウトし、MFAコードを入力して再ログインしないとブロックが解除されないため注意が必要です。
まとめ
Force_MFAポリシーをアタッチすることで、MFA未認証のIAMユーザーはMFA設定操作以外をすべてブロックできる- ポリシーはAWS公式のポリシー例をそのまま使えるため、導入コストが低い
- 実運用では
ReadOnlyAccessを業務に必要なポリシーに置き換えて使う




