目次

はじめに

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 を業務に必要なポリシーに置き換えて使う

参考