はじめに
AWS環境への不正アクセス対策として、IAMユーザーに対して 多要素認証(MFA) を有効化しました。
本記事では、MFA導入の実際の設定手順と、設定時に発生したエラー・解消方法をまとめます。
目的
- AWSコンソールログイン時にMFAを必須化する
- 費用を抑えながら全ユーザーに展開できる仕組みを整える
- IAMポリシーの最小権限設計を明確にする
MFAの種類(AWSで選択できる3方式)
| 方式 | 説明 | 特徴 |
|---|---|---|
| ① パスキー/セキュリティキー | 指紋・顔認証、またはFIDO2キー(YubiKey等)を使用 | セキュリティ強度が最も高い(フィッシング耐性あり) |
| ② 認証アプリケーション(TOTP) | Google Authenticator / Authy / Microsoft Authenticator など | コストゼロ・導入が簡単・スマホ利用が前提 |
| ③ ハードウェア TOTP トークン | 物理デバイスでコードを生成 | コストが高いため今回は対象外 |
採用方針
費用面と運用負荷を考慮し、①パスキー/②認証アプリ の2方式に絞って検討。
最終的に、下記3つの導入パターンを整理しました。
| 方針 | 特徴 | 設定例 |
|---|---|---|
| パスキー/セキュリティキーのみ | 高セキュリティ・ややコスト高 | 管理者・高権限ユーザーのみ導入 |
| 認証アプリのみ | 導入容易・低コスト | 全ユーザー・外部協力者まで展開 |
| 併用可(推奨) | 柔軟・段階的導入可 | 対応端末はパスキー、それ以外は認証アプリで対応 |
パスキー利用時の前提条件
AWSのパスキー(FIDO2認証)を利用する場合は、端末側で生体認証を事前に登録しておく必要があります。
| 端末 | 必要な設定 |
|---|---|
| Windows | Windows Hello(指紋・顔・PIN)を有効化 |
| macOS | Touch ID 登録 |
| iPhone | Face ID/Touch ID(iOS 16以降) |
| Android | 指紋認証またはPIN設定(Android 9以降) |
生体認証未登録の端末では、パスキー作成画面に進んでも登録できません。
IAMポリシー設定(ユーザー自身でMFA登録を許可)
IAMユーザーが自分のMFAを登録できるようにするには、以下のポリシーを付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListVirtualMFADevices",
"Effect": "Allow",
"Action": "iam:ListVirtualMFADevices",
"Resource": "*"
},
{
"Sid": "AllowCreateVirtualMFADevice",
"Effect": "Allow",
"Action": "iam:CreateVirtualMFADevice",
"Resource": "arn:aws:iam::*:mfa/*"
},
{
"Sid": "AllowManageOwnMFAOnOwnUser",
"Effect": "Allow",
"Action": [
"iam:EnableMFADevice",
"iam:DeactivateMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice",
"iam:GetUser"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
}
]
}
ポイント
- ListVirtualMFADevices はリソース指定ができないため、Resource: "*" とする。
- CreateVirtualMFADevice は mfa/ が生成されるため、arn:aws:iam:::mfa/ を許可。
- 自分自身のユーザー操作(有効化・無効化等)は ${aws:username} で限定。
よくあるエラーと解決方法
❌ 権限エラー(認証アプリ登録時に発生)
User is not authorized to perform: iam:CreateVirtualMFADevice
User is not authorized to perform: iam:ListVirtualMFADevices
原因
→ CreateVirtualMFADevice / ListVirtualMFADevices の権限がポリシーに含まれていない。
対応
→ 上記ポリシーを付与することで解消。
❌ 「Authentication code for device is not valid」
Authentication code for device is not valid.
原因
→ ワンタイムコード(TOTP)が一致しない。多くの場合は「時刻ずれ」が原因。
対応策
- スマホの時計を「自動設定(ネットワーク時刻)」に変更
- 新しいQRコードを再生成してスキャンし直す
- 30秒ごとに切り替わる2つのコードを連続で正確に入力
MFA必須化(Denyポリシー)
すべてのユーザー登録が完了したら、以下のポリシーを有効化します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } }
}
]
}
⚠️ 注意
この設定を先に有効化すると、MFA未登録ユーザーはログインできなくなります。
段階的に登録を完了させてから適用しましょう。
まとめ
| 観点 | 内容 |
|---|---|
| コスト | 認証アプリ方式が最も低コスト(無料) |
| 管理者作業 | 自己登録用ポリシーの配布・登録手順案内 |
| 利用者作業 | 認証アプリ登録 or 生体認証設定 |
| よくあるエラー | 時刻ずれ・旧QR再利用・権限不足に注意 |
導入してみてのポイント
- MFA登録をユーザー自身で行えるようにすることで、管理コストを大幅に削減できる。
- パスキー(FIDO2)は生体認証環境が整っていれば非常に快適。
- 認証アプリは全デバイス対応で初期展開に最適。
参考ドキュメント
おわりに
MFAは導入自体はシンプルですが、IAMポリシーの設定や時刻ズレなどの細かい部分でつまずきやすいポイントがあります。「誰でも安全にMFAを登録できる環境」を整えることが、セキュリティ強化の第一歩だと感じました。