MFAなしでのログインにおける監視設定

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、CloudTrail を利用して MFA (多要素認証) なしでのログインを監視するメトリクスフィルター が設定されていない状態について、リスクと対策を解説します。

リスク
AWSにおけるMFAは、アカウントのセキュリティを大幅に強化するための最も重要な手段の一つです。MFAなしでのログインは、セキュリティ上の大きな脆弱性となり、以下のような深刻なリスクを招く可能性があります。
- 認証情報の漏洩時のリスク増大: MFAが有効になっていないアカウントは、ユーザー名とパスワードが漏洩した場合に、攻撃者によって簡単に乗っ取られてしまいます。これは、ブルートフォース攻撃やフィッシング詐欺の主要なターゲットとなります。
- 不正アクセスとデータ侵害: 攻撃者がMFAなしでログインできるアカウントを乗っ取ると、そのアカウントが持つすべてのAWSリソースにアクセスできるようになり、機密データの流出、システムの改ざん、サービス停止などの重大なセキュリティインシデントに発展する可能性があります。
- 監査証跡の不明瞭化: 誰がMFAなしでログインしたかを即座に特定できない場合、セキュリティインシデント発生時の原因究明や対応が遅れ、監査証跡の信頼性も損なわれる可能性があります。
- 内部脅威への脆弱性: 内部の悪意のあるユーザーや、誤って認証情報を共有してしまったユーザーがMFAなしでアクセスした場合、それが検知されないと、組織への損害が大きくなる可能性があります。
対策
MFAなしでのログインを即座に検知し、対応できる監視体制を構築することは、AWS環境のセキュリティを維持するために不可欠です。
- CloudTrailの有効化: AWSアカウントのCloudTrailが有効になっており、管理イベントを記録していることを確認します。CloudTrailは、ログイン試行を含むアカウント内のすべてのアクティビティを記録する中心的なサービスです。
- CloudWatch Logsへの連携: CloudTrailのログを CloudWatch Logs に送信するように設定します。これにより、ログデータを一元的に管理し、メトリクスフィルターやアラームを設定できるようになります。
- メトリクスフィルターの設定: CloudWatch Logsグループ内で、MFAを使用せずに成功したログイン(
ConsoleLogin
イベントでresponseElements.MfaUsed
がfalse
)を検出するメトリクスフィルターを作成します。 - CloudWatchアラームの設定: 作成したメトリクスフィルターに基づいて CloudWatchアラーム を設定します。これにより、MFAなしでのログインが検出された際に、Amazon SNSなどを通じて関係者に即座に通知が送信されるようになります。
- 通知の自動化: SNSトピックを介して、セキュリティチームや運用チームにメール、PagerDuty、Slackなど、適切なチャネルでアラートが届くように設定します。
- MFAの強制: IAMポリシーを使用して、すべてのIAMユーザーにMFAの使用を強制することを強く推奨します。例えば、
aws:MultiFactorAuthPresent
条件キーを使用することで、MFAなしでの特定のAPI操作やコンソールログインを拒否できます。 - 定期的なアクセスレビューと対応計画: MFAなしでのログインアラートが発報された際の対応手順(ユーザーへの確認、MFAの強制、不正アクセスの有無確認など)を明確に定義し、定期的にレビューします
修復方法
AWSコンソールでの修復手順
AWSコンソールを使用して、MFAなしでのログインを監視するCloudWatchメトリクスフィルターとアラームを設定します。
前提: CloudTrailが有効で、ログがCloudWatch Logsに送信されていることを確認してください。
- CloudWatchサービスへ移動: AWSコンソールにログインし、CloudWatchサービスを開きます。
- ロググループの選択: 左側のナビゲーションペインで「ロググループ」を選択します。 CloudTrailのログが保存されているロググループ(通常は
CloudTrail/DefaultLogGroup
のような名前)を選択します。 - メトリクスフィルターの作成: ロググループの詳細ページで「メトリクスフィルター」タブを選択し、「メトリクスフィルターの作成」をクリックします。
- フィルターパターンの定義: 「フィルターパターン」に、MFAを使用せずに成功したコンソールログインイベントを検出する以下のパターンを入力します。
「次へ」をクリックします。
`{ ($.eventName = "ConsoleLogin") && ($.errorMessage = "null") && ($.responseElements.MfaUsed = "false") }`
- メトリクス詳細の指定:
- フィルター名: 例:
NoMfaLoginFilter
- メトリクス名前空間: 例:
CloudTrailMetrics
- メトリクス名: 例:
NoMfaLoginCount
- メトリクス値:
1
「次へ」をクリックします。
- フィルター名: 例:

- メトリクスの作成: 設定を確認し、「メトリクスフィルターの作成」をクリックします。
- アラームの作成: 作成したメトリクスフィルターを選択し、「アラームの作成」をクリックします。
- アラームの設定:
- メトリクス: 自動的に設定されます。
- 統計: 「合計」を選択します。
- 期間: 例: 「5分」を選択します。
- しきい値: 「次とより大きい」を選択し、
0
を入力します。(1回でもイベントが発生したらアラーム) - 「次へ」をクリックします。
- 通知の設定:
- 「通知の送信先」で、既存のSNSトピックを選択するか、「新しいトピックの作成」を選択して、メールアドレスなどを指定します。
- 「次へ」をクリックします。
- アラーム名の追加:
- アラーム名: 例:
NoMfaLoginAlarm
- アラーム説明: 例:
Alerts when a console login occurs without MFA.
「次へ」をクリックします。
- アラーム名: 例:
- アラームの作成: 設定を確認し、「アラームの作成」をクリックします。
Terraformでの修復手順
TerraformでMFAなしでのログインを監視するCloudWatchメトリクスフィルターとアラームを設定します。
# 既存のCloudTrailロググループを参照
data "aws_cloudwatch_log_group" "cloudtrail_log_group" {
name = "CloudTrail/DefaultLogGroup" # あなたのCloudTrailロググループ名に置き換えてください
}
# MFAなしでのログインを検出するCloudWatchメトリクスフィルター
resource "aws_cloudwatch_log_metric_filter" "no_mfa_login_filter" {
name = "NoMfaLoginFilter"
log_group_name = data.aws_cloudwatch_log_group.cloudtrail_log_group.name
# MFAを使用せずに成功したコンソールログインイベントのパターン
# errorMessage = "null" は成功したログインを示します
pattern = <<-EOT
{ ($.eventName = "ConsoleLogin") && ($.errorMessage = "null") && ($.responseElements.MfaUsed = "false") }
EOT
metric_transformation {
name = "NoMfaLoginCount"
namespace = "CloudTrailMetrics"
value = "1"
default_value = 0
}
}
# アラート通知用のSNSトピック
resource "aws_sns_topic" "no_mfa_login_sns_topic" {
name = "no-mfa-login-alerts"
tags = {
Environment = "Production"
}
}
# SNSトピックの購読者 (メールアドレスなど)
resource "aws_sns_topic_subscription" "no_mfa_login_email_subscription" {
topic_arn = aws_sns_topic.no_mfa_login_sns_topic.arn
protocol = "email"
endpoint = "your-security-email@example.com" # 通知を受け取るメールアドレスに置き換えてください
}
# MFAなしでのログインを検知するCloudWatchアラーム
resource "aws_cloudwatch_metric_alarm" "no_mfa_login_alarm" {
alarm_name = "NoMfaLoginAlarm"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = aws_cloudwatch_log_metric_filter.no_mfa_login_filter.metric_transformation[0].name
namespace = aws_cloudwatch_log_metric_filter.no_mfa_login_filter.metric_transformation[0].namespace
period = 300 # 5分
statistic = "Sum"
threshold = 0 # 1回でもイベントが発生したらアラーム
alarm_description = "Alerts when a console login occurs without MFA enabled for the user."
alarm_actions = [aws_sns_topic.no_mfa_login_sns_topic.arn]
ok_actions = [aws_sns_topic.no_mfa_login_sns_topic.arn]
dimensions = {
LogGroupName = data.aws_cloudwatch_log_group.cloudtrail_log_group.name
}
}
上記のTerraformコードでは、以下のリソースを定義しています。
data "aws_cloudwatch_log_group" "cloudtrail_log_group"
: 既存のCloudTrailロググループを参照します。aws_cloudwatch_log_metric_filter.no_mfa_login_filter
: MFAなしでの成功したコンソールログインイベントを検出するメトリクスフィルターを定義します。aws_sns_topic.no_mfa_login_sns_topic
: アラート通知のためのSNSトピックを定義します。aws_sns_topic_subscription.no_mfa_login_email_subscription
: SNSトピックの購読者(ここではメールアドレス)を設定します。(この購読は手動で承認が必要です。)aws_cloudwatch_metric_alarm.no_mfa_login_alarm
: メトリクスフィルターで検出されたイベント数が閾値を超えた場合にアラートを発報するCloudWatchアラームを定義します。
your-security-email@example.com
や CloudTrail/DefaultLogGroup
などのプレースホルダーは、実際の環境に合わせて修正してください。
最後に
この記事では、CloudTrailとCloudWatch Logsを活用してMFAなしでのログインを監視するためのメトリクスフィルターとアラームを設定する方法について解説しました。MFAなしでのログインは、アカウント乗っ取りのリスクを大幅に高めるため、これを早期に検知し、対応できる体制を構築することは非常に重要です。
貴社のAWS環境では、MFAなしでのログインに対してどのような監視体制を構築していますか?ぜひ、この機会に強化を検討してみてください。
こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。