Microsoft Sentinel に Amazon CloudWatch Logs のログを取り込んでみた

2023.11.17

Azure で利用できる Microsoft Sentinel には Amazon CloudWatch Logs のデータを取り込むデータコネクタがあるため、試してみました。S3 に CloudWatch Logs のデータをエクスポートしてから Sentinel に取り込む必要があります。

Microsoft Sentinel をアマゾン ウェブ サービスに接続し、AWS サービス ログ データを取り込む | Microsoft Learn

アーキテクチャ概要

Amazon CloudWatch Logs を Microsoft Sentinel に取り込むアーキテクチャは Sentinel のドキュメントに記載があるため抜粋します。今回の場合は下図における AWS Service 部分が CloudWatch Logs であり、S3 バケットへのエクスポートはマネジメントコンソールから手動で実施することにしました。

(引用元)アーキテクチャの概要


Sentinel に取り込んだ後は下図のように検索できるようになりました。下図の例では EC2 インスタンス(Amazon Linux 2)の/var/log/secureを転送しています。

以降では実際に連携する設定を試してみます。

Sentinel に CloudWatch Logs を取り込み

Microsoft Sentinel に Amazon CloudWatch Logs のデータを取り込む前提条件や方法は次のドキュメントで公開されています。今回はドキュメントにおける手動セットアップにて試してみます。

Microsoft Sentinel をアマゾン ウェブ サービスに接続し、AWS サービス ログ データを取り込む | Microsoft Learn


なお、今回は Microsoft Seninel が有効化済みの前提となります。


Azure において Log Analytics ワークスペース ID の取得

AWS 側の設定には、Microsoft Sentinel で利用している Log Analytics のワークスペース ID が必要なためメモ事前にしておきます。

Log Analytics ワークスペースの「概要」から確認できます。


AWS において Sentinel 連携設定

Microsoft Sentinel と連携できるように次のリソースを作成します。

  • IAM ロール
  • SQS のキュー
  • S3 バケット


IAM ロールの作成

Microsoft Sentinel が利用する IAM ロールを作成します。

信頼されたエンティティは次の通りです。AWS 想定ロールを作成し、AWS Sentinel アカウントへのアクセスを許可する で指定されている AWS アカウント 197857026523 を信頼し、外部 ID として Log Analytics ワークスペース ID を指定します。

上記の設定により信頼ポリシーは次のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::197857026523:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "83ca9364-68a9-4095-8325-b4df82example"
                }
            }
        }
    ]
}


許可ポリシーは IAM アクセス許可ポリシーを適用する を参考に次のポリシーをアタッチします。

  • AmazonSQSReadOnlyAccess
  • AmazonS3ReadOnlyAccess
  • AWSLambdaSQSQueueExecutionRole

今回は ms-sentinel-role という名前のロールで作成しました。

Microsoft Sentinel 側の設定で利用するため、作成した IAM ロールの ARN を控えておきます。


SQS のキュー作成

次に SQS のキューを作成します。今回は下記以外の設定はデフォルトのままにしています。アクセスポリシーも後から変更するため一旦デフォルトのままです。

キューができた後は Azure-Sentinel/DataConnectors/AWS-S3/AwsRequiredPolicies.md を参考にして、アクセスポリシーを次のように編集しました。S3 バケットは後の手順で作成しますが、先にバケット名を記載しています。

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:ap-northeast-1:111122223333:ms-sentinel-queue-cloudwatch",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::ms-sentinel-cloudwatch-20231115"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/ms-sentinel-role"
      },
      "Action": [
        "SQS:ChangeMessageVisibility",
        "SQS:DeleteMessage",
        "SQS:ReceiveMessage",
        "SQS:GetQueueUrl"
      ],
      "Resource": "arn:aws:sqs:ap-northeast-1:111122223333:ms-sentinel-queue-cloudwatch"
    }
  ]
}


Microsoft Sentinel 側の設定で利用するため、作成したキューの URL を控えておきます。


S3 バケットの作成

S3 バケット作成します。今回は他の設定はデフォルトのまま進めます。

作成するバケットに CloudWatch Logs をエクスポートし、Sentinel から読み取ります。

バケット作成後にバケットポリシーを編集します。CloudWatch Logs からエクスポートできるように許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "logs.ap-northeast-1.amazonaws.com"
                ]
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::ms-sentinel-cloudwatch-20231115"
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::ms-sentinel-cloudwatch-20231115/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}


次に、SQS と連携するために PutObject を契機にイベントを通知するようにします。

「プロパティ」タブの「イベント通知」からイベント通知を作成します。

作成後のプロパティ画面です。

また、必要に応じてバケット内に保管されたデータを一定期間で削除するためのライフサイクルルールも作成しておきます。今回はバージョニングを有効化していないので、次の設定で 30 日後に削除します。

以上で、Microsoft Sentinel と連携するようにリソースの作成は終わりです。


Azure において Sentinel のデータコネクタ設定

Microsoft Sentinel において、AWS のデータコネクタを利用するためにコンテンツハブから「Amazon Web Services」をインストールします。今回の環境ではインストール済みであるため「管理」となっていますが、インストールしていない場合は「インストール」表記となっているはずです。


次に、データコネクタから「アマゾン ウェブ サービス S3 (プレビュー) 」を選択して「コネクタ ページを開く」をクリックします。

次の設定を入力して「接続の追加」をクリックすれば設定完了です。

設定 入力値
ロール ARN AWS 側で作成した IAM ロールの ARN
SQS URL AWS 側で作成した SQS キューの URL
宛先テーブル AWSCloudWatch

設定後は、上図の下部に設定内容が追加されます。

この状態で S3 バケットにデータが追加されれば、Sentinel に取り込めるようになっているはずです。


AWS において CloudWatch Logs を S3 にエクスポート

CloudWatch Logs を S3 バケットにエクスポートして Sentinel に転送してみます。

設定内容は割愛しますが、EC2 インスタンス(Amazon Linux 2)の/var/log/secureを CloudWatch Logs に転送するように CloudWatch エージェントを設定しています。そのログを S3 にエクスポートします。

エクスポート先のバケットは先ほど作成したバケットを指定しています。

S3 バケットへのエクスポートを確認できました。

また、キューにおいても利用可能なメッセージが増えていることを確認できました。


Azure において Microsoft Sentinel でログを確認

数分待つと Microsoft Sentinel にログが転送されていることを確認できました。

気になる点としては、単純に CloudWatch Logs を S3 にエクスポートの場合は、ロググループ名やログストリーム名が含まれないため、複数のインスタンスや複数の種類のログを転送してしまうと見分けがつかない状況になりそうなことです。そのあたりは、CloudWatch Logs のデータを Lambda 等で加工してから S3 に保管する必要があるかもしれません。

また、今回は一度きりの手動のエクスポートにしましたが、自動で転送したい場合は EventBridge スケジューラを利用して定期的にエクスポートするなどの工夫も必要です。

AWS CloudTrail を Sentinel に取り込む際は、単純にイベントログが保管された S3 バケットを指定するだけでしたが、CloudWatch Logs の場合はもう少し検討が必要となりそうです。

さいごに

Amazon CloudWatch Logs を Microsoft Sentinel と連携する設定を試してみました。今回は、一度だけ CloudWatch Logs から S3 にエクスポートしたデータを取り込んだだけとなりますが、Sentinel 側でログを閲覧できることを確認しました。

以上、このブログがどなたかのご参考になれば幸いです。