• 1 目的
  • 2 構成図
  • 3 参考
  • 4 前提
  • 5 手順
    • 5.1 Splunk側の設定
      • 5.1.1 インプットの追加
    • 5.2 AWS側の設定
      • 5.2.1 SQSの作成
      • 5.2.2 SNSの作成
      • 5.2.3 S3の設定
  • 6 Splunk側でログ確認
  • 7 感想

目的

AWSのVPCフローログを集中監視し、可視化することで、ネットワークトラフィックの状況を把握し、セキュリティリスクを検知すること。

この目的を達成するため、AWS上のログデータをSplunkに取り込み、Splunkの監視・分析機能を活用します。具体的には、Splunk側でAWS側のVPCフローログを受信できるよう設定を行います。

構成図

参考

(公式ドキュメント)Splunk Add-on for AWS
AWS S3上のデータを SQS と組み合わせて Splunkに取り込む

前提

が完了している。

手順

Splunk側の設定

EC2インスタンスにIAMロールをアタッチしているので、別途設定が不要である。実際にSplunk側で認識しているかどうかを確認するための手順を以下に示す。
SplunkのWEB UIの左ペインにある「Splunk Add-on for AWS」を選択する。

以下の画面が表示されるので、「設定」を押下する。

「Account」タブが選択されており、EC2にアタッチしたIAMロールが設定されていることを確認する。

インプットの追加

SQS(再帰的にS3含む)にデータをPullするための設定を行う。IAMロールの確認をした後の手順として記載する。

「入力」に戻り、「Create New Input」を押下する。

「Custom Data Type」→ 「SQS-Based S3」の順に押下する。

必要情報を入力する。

AWS Accountにロール名が入る。

(検証時点では、Advanced Settingまで考慮しない)

「Signature Validate All Events」は不具合が生じたら外しておく(説明は後述)

AWS側の設定

SQSの作成

1. 先にSQS-DLQを作成しておきます。

キュータイプ:標準にします。

可視性タイムアウト:5分にしておきます。

(それ以外はデフォルトでOK)

アクセスポリシー:アドバンストにして、以下内容を入れておく。

{
   "Version": "2012-10-17",
   "Id": "example-ID",
   "Statement": [
      {
        "Sid": "SQS_SQSDLQ_PUSH",
        "Effect": "Allow",
        "Principal": {
          "AWS": "*"
        },
        "Action": "SQS:*",
        "Resource": "arn:aws:sqs:ap-northeast-1:************:poc-splunk-vpcflowlog-dlq",
        "Condition": {
          "ArnLike": {
            "aws:SourceArn": "*"
          }
        }
      }
   ]
}

2. 次に通常のSQSキューを作成します。

キュータイプ:標準にします。

可視性タイムアウト:5分にしておきます。

(それ以外はデフォルトでOK)

サーバー側の暗号化:検証段階では無効にしておきます。

アクセスポリシー:アドバンストにして、SNSがSQSにSendMessageできる権限(”SNS_SQS_PUSH”)と、EC2等がSQSを確認できる権限(”Sid”: “SQS_PULL”)を入れておく。

{
  "Version": "2012-10-17",
  "Id": "example-ID",
  "Statement": [
     {
        "Sid": "SNS_SQS_PUSH",
        "Effect": "Allow",
        "Principal": {
          "AWS": "*"
        },
        "Action": "sqs:SendMessage",
        "Resource": "arn:aws:sqs:ap-northeast-1:************:poc-splunk-vpcflowlog",
        "Condition": {
          "ArnLike": {
            "aws:SourceArn": "arn:aws:sns:ap-northeast-1:************:poc-splunk-vpcflowlog-topic"
          }
        }
     },
     {
        "Sid": "SQS_PULL",
        "Effect": "Allow",
        "Principal": {
          "AWS": "*"
        },
        "Action": "sqs:*",
        "Resource": "arn:aws:sqs:ap-northeast-1:************:poc-splunk-vpcflowlog"
      }
   ]
}

デッドレターキュー:有効にして、1.で作成したDLQを指定します。

SNSの作成

  • トピックの作成

  • サブスクリプションの作成

トピック:先ほど作成したものを選択

プロトコル:SQS

エンドポイント:先ほど作成したSQSキューのARNを指定

raw メッセージ配信の有効化:チェックは必ず外したままにしておくこと

アクセスポリシー:アドバンスドにして、S3がSNSにPublishできる権限(”Sid”: “S3_to_SNS_Publish”)、SQSがこのSNSトピックをSubscribeできる権限(”Sid”: “SQS_Subscribe”)を入れておく。

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
     {
       "Sid": "S3_to_SNS_Publish",
       "Effect": "Allow",
       "Principal": {
         "AWS": "*"
       },
       "Action": "SNS:Publish",
       "Resource": "arn:aws:sns:ap-northeast-1:************:poc-splunk-vpcflowlog-topic",
       "Condition": {
         "ArnLike": {
           "aws:SourceArn": [
             "arn:aws:s3:::poc-splunk-vpcflowlog",
             "arn:aws:s3:::poc-splunk-vpcflowlog/*"
           ]
        }
     }
   },
   {
     "Sid": "SQS_Subscribe",
     "Effect": "Allow",
     "Principal": {
        "AWS": "*"
      },
      "Action": "SNS:Subscribe",
      "Resource": "arn:aws:sns:ap-northeast-1:************:poc-splunk-vpcflowlog-topic",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sqs:ap-northeast-1:************:poc-splunk-vpcflowlog"
        }
      }
    }
  ]
}

S3の設定

  • バケットポリシーの修正

VPCフローログの場合、設定すると勝手にS3のバケットポリシーが以下のように書き込まれてしまう。

このため、Splunk on EC2のロールがS3にアクセスできるよう、最下部に「”Sid”: “EC2PULL”」を追加しておいた。

{
  "Version": "2012-10-17",
  "Id": "AWSLogDeliveryWrite20150319",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::poc-splunk-vpcflowlog/AWSLogs/************/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control",
          "aws:SourceAccount": "************"
        },
       "ArnLike": {
         "aws:SourceArn": "arn:aws:logs:ap-northeast-1:************:*"
       }
     }
  },
  {
    "Sid": "AWSLogDeliveryAclCheck",
    "Effect": "Allow",
    "Principal": {
      "Service": "delivery.logs.amazonaws.com"
    },
    "Action": "s3:GetBucketAcl",
    "Resource": "arn:aws:s3:::poc-splunk-vpcflowlog",
    "Condition": {
      "StringEquals": {
        "aws:SourceAccount": "************"
      },
      "ArnLike": {
        "aws:SourceArn": "arn:aws:logs:ap-northeast-1:************:*"
      }
    }
  },
  {
    "Sid": "EC2PULL",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::************:role/dev-iam-role-splunk"
    },
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::poc-splunk-vpcflowlog/*"
   }
 ]
}
  • イベント通知設定(SNSへの通知)

最後にS3に新規書き込みがあった際のイベント通知設定を行います。

プレフィックス:(始まり)記載なくてもいいですが、「poc-splunk-vpcflowlog/AWSLogs/************/vpcflowlogs/ap-northeast-1/」は不変だったので記載しておきました。

サフィックス:(終わり)拡張子が.gzのファイルがアップロードされるので、拡張子だけ記載しておきました。なくてもいいです。

イベントタイプ:念のため「すべてのオブジェクト作成イベント」s3:ObjectCreated:*にチェックを入れておきます。

送信先:先ほど作成したSNSトピック「poc-splunk-vpcflowlog-topic」を指定して通知します。

Splunk側でログ確認

この状態で稼働を始めたところ、立て続けに4件以下のWarningが来ました。

Warning: This message does not have a valid SNS Signature None None doesn't match required format '^https://sns\\\\.[-a-z0-9]+\\\\.amazonaws\\\\.com(?:\\\\.cn)?/'

ここによると、Splunk Add-on for AWSバージョン5.2.1からの機能らしい。

おそらくバージョン 5.2.1 のアップデートに関連していると思われます。

https://docs.splunk.com/Documentation/AddOns/release/AWS/Releasenotes

Splunk アドオン for AWS バージョンのバージョン 5.2.1 には、次の新機能と変更された機能が含まれています。

  • SQS キューから Splunk に送信される SNS メッセージの署名の検証を追加しました。ログのソースは、SNS メッセージの署名と署名フィールドを照合することによって検証されます。

5.2.1 アップデートを取り消しました。 5.2.0は動作しているようです。

バージョン確認したところ、しっかり7.5.0でした。

ということで、後から編集でこの「Signature Validate All Events」のチェックを外します。

設定後、サーチ画面で「*」で検索。
以下のような形式のVPCフローログが来ていれば成功です。

version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
2 ************ eni-0e12ddef5e69024cb 10.110.. 10.110.. 443 33122 6 4 160 1712727859 1712727859 ACCEPT OK

補足

たまにChromeだとSplunkの動作が不安定になるので、そういうときはEdgeを使うと安定します。

(SplunkはブラウザはEdgeの方が相性いいかも)

感想

当方、まだSplunkの知識はそんなにないのですが、これはそういうのは不要で構築できました。

AWSネイティブ一択でいくのであれば、SIEMはOpenSearchでいくのがスムーズですが、Splunkを使いたいケースもあるかと思います。その場合、Splunk側ではAWS連携用としてSplunk Add-on for AWSを使い、入力方式もSQS Based S3というSNS⇨SQSからの通知によりS3から取得しに行く方式です。これが結構曲者で、S3 File DecoderやSource Typeを正しいものを選ばないと、Splunk側で正しく取り込めず、ログが表示されません。特にSQS Based S3だとどれを選べばいいのか、デフォルトのままでいいのか、情報がネットにもあまりありません。なのでSplunk Add-on for AWSを使う場合は、この辺りに注意してください。