前回、[技術検証]SplunkでAWSのVPCフローログを収集する では、Splunk側でAWS側のVPCフローログを受信できるよう設定しました。
今回は、Splunkがある方をログ収集AWSアカウントとし、別AWSアカウントからのVPCフローログを収集できるように構成します。

構成図

目的

〔クロスアカウント側〕monitor側

作業概要

  1. VPC-monitorのVPC Flow LogsをS3バケットに出力させるようにする
  2. iam-role-splunk ロールからのAssumeRoleを許可するポリシーを作成
    このポリシーにはVPC Flow LogsのS3バケットへアクセス権をセット
    Manage accounts for the Splunk Add-on for AWS – Splunk Documentation
  3. SNSトピックを作成
    サブスクリプションとして設定するキューは、ログ収集側にあるキュー:splunk-vpcflowlog-queue
  4. S3イベント先としてSNSを設定

〔ログ収集アカウント側〕collect側

作業概要

  1. iam-role-splunk ロールに、Action:Assumeできるポリシーの追加
  2. SQSキューのアクセスポリシーに、クロスアカウント側のSNSからのアクセスを受け入れるように設定
  3. Splunk WebでSQSベースのS3の設定をする

参考

前提

手順

クロスアカウント側

1.VPC-monitorのVPC Flow LogsをS3バケット(splunk-vpcflowlog)に出力させるようにする。

2.iam-role-splunk ロールからのAssumeRoleを許可する信頼ポリシーを作成
 このポリシーにはsplunk-vpcflowlogバケットへアクセス権をセット
Create and configure roles to delegate permissions to IAM users

ロール作成後、AWS マネジメントコンソールを使用して信頼関係を変更し、IAM ユーザーが新しく作成されたロールを引き受けられるようにします。次の例は、johndoe という名前の IAM ユーザーがロールを引き受けることを許可する信頼関係を示しています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/johndoe"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

次に、IAM ユーザーにロールを引き受ける権限を付与します。次の例は、IAM ユーザーが s3admin ロールを引き受けることを許可する AWS IAM ポリシーを示しています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/s3admin"
    }
  ]
}

この辺りのSplunkの記載がよくわからないが、おそらく次のことだと推定

https://d1.awsstatic.com/events/jp/2018/summit/tokyo/aws/40.pdfより)

まずはこの通りにS3Adminロールを作成

  • 許可ポリシー

S3フルアクセスとKMSフルアクセス、infra-sqs-policyには両アカウントのSQSキューのフルアクセスを許可

{
  "Statement": [
      {
          "Action": "sqs:*",
          "Effect": "Allow",
          "Resource": [
              "arn:aws:sqs:ap-northeast-1:クロスアカウントID:*",
              "arn:aws:sqs:ap-northeast-1:ログ収集アカウントID:*"
          ],
          "Sid": ""
      }
  ],
  "Version": "2012-10-17"
}
  • 信頼ポリシー
    iam-role-splunkロールにAssumeRoleを許可
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
              "AWS": "arn:aws:iam::ログ収集アカウントID:role/iam-role-splunk"
          },
          "Action": "sts:AssumeRole"
      }
  ]
}

3.SNSトピックの作成

アクセスポリシー:アドバンスドにして、S3がSNSにPublishできる権限(”Sid”: “S3_to_SNS_Publish”)、ログ収集側にあるキュー:splunk-vpcflowlog-queueがこの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:クロスアカウントID:splunk-vpcflowlog-topic",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": [
            "arn:aws:s3:::splunk-vpcflowlog",
            "arn:aws:s3:::splunk-vpcflowlog/*"
          ]
        }
      }
    },
    {
      "Sid": "SQS_Subscribe",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "SNS:Subscribe",
      "Resource": "arn:aws:sns:ap-northeast-1:クロスアカウントID:splunk-vpcflowlog-topic",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sqs:ap-northeast-1:ログ収集アカウントID:splunk-vpcflowlog-queue"
        }
      }
    }
  ]
}
  • サブスクリプションの作成
    トピック:先ほど作成したsplunk-vpcflowlog-topicを選択
    プロトコル:SQS
    エンドポイント:ログ収集側にあるキュー:splunk-vpcflowlog-queueのARNを指定
    raw メッセージ配信の有効化:チェックは必ず外したままにしておくこと

サブスクリプションが「保留中の確認」になり、SQSに確認用メッセージを送信しています。

4.S3イベントとしてSNSを設定

  • バケットポリシーの修正
    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:::splunk-vpcflowlog/AWSLogs/クロスアカウントID/*",
          "Condition": {
              "StringEquals": {
                  "s3:x-amz-acl": "bucket-owner-full-control",
                  "aws:SourceAccount": "クロスアカウントID"
              },
              "ArnLike": {
                  "aws:SourceArn": "arn:aws:logs:ap-northeast-1:クロスアカウントID:*"
              }
          }
      },
      {
          "Sid": "AWSLogDeliveryAclCheck",
          "Effect": "Allow",
          "Principal": {
              "Service": "delivery.logs.amazonaws.com"
          },
          "Action": "s3:GetBucketAcl",
          "Resource": "arn:aws:s3:::splunk-vpcflowlog",
          "Condition": {
              "StringEquals": {
                  "aws:SourceAccount": "クロスアカウントID"
              },
              "ArnLike": {
                  "aws:SourceArn": "arn:aws:logs:ap-northeast-1:クロスアカウントID:*"
              }
          }
      },
      {
          "Sid": "EC2PULL",
          "Effect": "Allow",
          "Principal": {
              "AWS": "arn:aws:iam::ログ収集アカウントID:role/iam-role-splunk"
          },
          "Action": "s3:*",
          "Resource": "arn:aws:s3:::splunk-vpcflowlog/*"
      }
}
  • イベント通知設定(SNSへの通知)

最後にS3に新規書き込みがあった際のイベント通知設定を行います。
プレフィックス:(始まり)記載なくてもいいですが、「splunk-vpcflowlog/AWSLogs/クロスアカウントID/vpcflowlogs/ap-northeast-1/」の部分は不変なので指定しておきました。
サフィックス:(終わり)拡張子が.gzのファイルがアップロードされるので、拡張子だけ記載しておきました。なくてもいいです。
イベントタイプ:念のため「すべてのオブジェクト作成イベント」s3:ObjectCreated:* にチェックを入れておきます。

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

ログ収集アカウント側

iam-role-splunk ロールに、infra-s3admin-roleをAssumeできるポリシーの追加

  • iam-policy-splunk ポリシー
{
  "Statement": [
      {
          "Action": [
              "sqs:ListQueues",
              "s3:ListAllMyBuckets"
          ],
          "Effect": "Allow",
          "Resource": "*",
          "Sid": "VisualEditor0"
      },
      {
          "Action": [
              "sqs:*"
          ],
          "Effect": "Allow",
          "Resource": [
              "arn:aws:sqs:ap-northeast-1:ログ収集アカウントID:splunk-vpcflowlog*"
          ],
          "Sid": "VisualEditor1"
      },
      {
          "Action": [
              "sts:AssumeRole"
          ],
          "Effect": "Allow",
          "Resource": [
              "arn:aws:iam::クロスアカウントID:role/infra-s3admin-role"
          ],
          "Sid": "VisualEditor2"
      }
  ],
  "Version": "2012-10-17
}

2.SQSキューのアクセスポリシーで、クロスアカウント側SNSのアクセスを受け入れるように変更

{
  "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:ログ収集アカウントID:splunk-vpcflowlog-queue",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:sns:ap-northeast-1:クロスアカウントID:splunk-vpcflowlog-topic"
        }
      }
    },
    {
      "Sid": "S3_SQS_PULL",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "sqs:*",
      "Resource": "arn:aws:sqs:ap-northeast-1:ログ収集アカウントID:splunk-vpcflowlog-queue"
    }
  ]
}

SQSでメッセージをポーリングして、以下のようなメッセージを受信します。

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "6e2af903-****",
  "Token" : "2336********d3",
  "TopicArn" : "arn:aws:sns:ap-northeast-1:クロスアカウントID:splunk-vpcflowlog-topic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:ap-northeast-1:クロスアカウントID:splunk-vpcflowlog-topic.\n
    To confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:ap-northeast-1:クロスアカウントID:splunk-vpcflowlog-topic&Token=2336******d3",
  "Timestamp" : "2024-04-15T05:16:19.348Z",
  "SignatureVersion" : "1",
  "Signature" : "BipTu*********",
  "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-60ea****.pem"
}

この長いSubscribeURLをコピーしておきます。
クロスアカウントのSNS側で、[サブスクリプションの確認]をします。

コピーしたURLを貼り付けて[サブスクリプションの確認]

これで「確認済み」になることを確認

3.Splunk Webでインプットの設定
Configure an SQS-based S3 input using Splunk Web
ところが、Splunk WebからAssume Roleを設定すると、以下のようにAssume Role側arn:aws:iam::クロスアカウントID:role/infra-s3admin-roleのキューリストが表示されてしまい、AWSアカウント側arn:aws:sqs:ap-northeast-1:ログ収集アカウントID:splunk-vpcflowlog-queueのキューリストが表示されず、選択できない。このリスト表示は、ListQueuesアクションで表示させていると思うのですが、アカウントまたぎのキューを表示されない。最初はポリシーが原因か?と思ってたのですが、仕様な気がします。

Splunk Community によると、SQSキューを同一アカウント内にまとめるか、アカウントごとにSQSキューとSplunk Inputを作成するとのことです。
そのため、Splunk Webからではなくて、構成ファイルを直接いじって設定することにします。
Configure an SQS-based S3 input using configuration files

# more /opt/splunk/etc/apps/Splunk_TA_aws/local/inputs.conf

[aws_sqs_based_s3://cross-account-input-vpcflowlogs]
aws_account = iam-role-splunk
aws_iam_role = s3admin
interval = 300
parse_csv_with_delimiter = ,
parse_csv_with_header = 0
parse_firehose_error_data = 0
private_endpoint_enabled = 0
s3_file_decoder = VPCFlowLogs
sns_max_age = 96
sourcetype = aws:cloudwatchlogs:vpcflow
sqs_batch_size = 10
sqs_queue_region = ap-northeast-1
sqs_queue_url = https://sqs.ap-northeast-1.amazonaws.com/ログ収集アカウントID/splunk-vpcflowlog-queue
sqs_sns_validation = 0
using_dlq = 1
index = main

SQSキュー名に直接URLを指定するのがポイント
Webで見ると以下のようにURLが(New Value)として直接設定されている(ところがWebからだとこれを直接入力することはできない)

Splunk側でログ確認

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

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

 

まとめ

Splunkでクロスアカウントでログを収集したいという需要は結構あると思います。
ただし、SQSキューを同一アカウント内にまとめるか、アカウントごとに SQS キューとSplunk Inputを作成しなければならないという制約があるため、直接設定ファイルをいじって今回の構成を実現させています。
また、Splunkが直接クロスアカウントのS3から収集できてしまってはいけないため、Splunk側ロールのポリシーに
“arn:aws:s3:::splunk-vpcflowlog” の許可を書かないように注意してください。