QRadarでAmazon VPC Flow Logsを取得し監視する

# はじめに
みなさまこんにちは。IBM QRadarを活用されていらっしゃいますか？
これまでAWS環境にIBM QRadar SIEMを構築、導入する手順を投稿してきましたが、今回はAmazon VPC Flow Logsの取得にチャレンジしたいと思います。

# 背景
IBM QRadarは元々フローログの分析を主体とする製品から誕生しており、NetFlow/IPFIX/sFlowなどのトラフィックモニタリングが得意なSIEM製品です。AWS環境ではVPC内の通信監視機能としてVPCフローログを生成することが出来るのですが、フローログの分析を行うためにはAmazon CloudWatch LogsやAmazon Elasticsearch Serviceなどの分析基盤を活用する必要があります。
IBM QRadarにAWS VPCフローログを取り込むことで、従来IBM QRadarで培ってきたフロー情報の異常検知、監視がQRadar側のSIEMルールで判定できるようになるため、取り込みを行なってみました。

# Amazon VPCフローログとは？
公式ドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs.html)。VPCフローログは、VPC のネットワークインターフェイスとの間で行き来する IPトラフィックに関する情報をキャプチャできるようにする機能で、フローログデータを Amazon CloudWatch Logs または Amazon S3 に発行できます。
AWSを触っている方は、Amazon CloudWatch Logsに出力されている方も多いのではと思います。
以下のようなフォーマットで出力されます。

```
<version> <account-id> <interface-id> <srcaddr> <dstaddr> <srcport> <dstport> <protocol> <packets> <bytes> <start> <end> <action> <log-status>
```
IPFIX規格と異なる点として、AWSアカウントIDやVPC内取得元のインターフェース情報などが付加されています。

```
2 634148078504 eni-0d88826XXXX11111 10.0.4.114 10.0.1.190 443 52737 6 31 9135 1593139499 1593139510 ACCEPT OK
2 634148078504 eni-0d88826XXXX11111 10.0.4.114 10.0.1.190 443 52729 6 33 9215 1593139499 1593139510 ACCEPT OK
```

# IBM QRadar DSMによる設定方法　〜 Amazon S3/SQS経由の取得　〜
それでは設定してみましょう。
IBM QRadarの[DSMドキュメント](https://www.ibm.com/support/knowledgecenter/SS42VS_DSM/com.ibm.dsm.doc/c_dsm_guide_amazon_VPC_Flow_Log_overview.html)を見ると、VPCフローログの収集はAmazon SQS経由による接続であることが分かります。
DSMガイドの記載が文字しか無いため、分かり難いので図に起こしてみました。
![vpcflow_diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/833d062c-fb49-5770-b8f9-fe1b94aa8e76.png)
手順をまとめると、以下のようになります。


1. **AWS側設定**
    2. AWS環境側でVPC Flow Logsを有効にする(VPC)
    2. VPC Flow Logs用のSQSキューを作成する(SQS)
    3. VPC Flow Logsが保管されているS3 BucketからSQSに発行する
4. **IBM QRadar側設定**
    5. DSMモジュール (Protocol Common / Amazon RESTAPIなど）の更新（※本記事では省略）
    6. Flow設定の有効化（Default_NetFlowが動いていればOK）
    7. DSM設定（DSM接続ガイドの通りに記載し、SQSキューを指定する）

# AWS側設定
## 1. Amazon SQSキューの作成
Amazon SQSの画面に入り、VPC Flow Logsを一次受けするキューを作成します。
![SQS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/86618806-8f55-b038-90c5-c662aeb1ebaf.png)
ここで、SQSキューに対して許可ポリシーを適用するのですが、公式のドキュメントがPrincipalを全許可してCondition条件で対象元を絞るポリシーになっており、表現上適切ではない様に思えましたので、筆者は以下のように設定しました。SQSのリソースベースのポリシー側で、IBM QRadarのEC2から受ける許可ポリシーと、S3 BucketからSendを受ける許可ポリシーを二つ記載しています。

```json-doc

{
  "Version": "2012-10-17",
  "Id": "arn:aws:sqs:ap-northeast-1:[AWSアカウントID]:For_QRadar_VPCFlow_SQS/SQSDefaultPolicy",
  "Statement": [
    {
      "Sid": "AllowQRadarEC2",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::[AWSアカウントID]:root"
      },
      "Action": "SQS:*",
      "Resource": "arn:aws:sqs:ap-northeast-1:[AWSアカウントID]:For_QRadar_VPCFlow_SQS"
    },
    {
      "Sid": "AllowS3",
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:ap-northeast-1:[AWSアカウントID]:For_QRadar_VPCFlow_SQS",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:::[VPCフローログ保管Bucket]"
        }
      }
    }
  ]
}
```
## 2. S3Bucket設定
Amazon VPC Flow Logsが保管されるS3 Bucket側でSQSキューに転送する設定を行います。
![S3_Config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/0abd74e8-f390-5bdc-90bd-acbb9ab1851b.png)
設定後、Amazon SQS側でキューが溜まることを確認できればOKです。

# IBM QRadar DSM設定
IBM QRadarのDSMガイドの通り、設定を行います。
注意点としては、Universal DSMを用いる特殊なDSM設定になるのでご注意ください。
ここでは、認証方式としてVPC内にIBM QRadar (Community Edition)を構築しているため、IAMロールによるセキュアな接続方式を用いています。

<img width="765" alt="DSM_vpcflowlogs.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/bccc2f84-b629-f9f4-ce3d-8c81b74e9224.png">
「SQS Queue URL」の部分が、https://から始まるSQSキューのURLを指定することになります。

# 動作確認
設定が反映されて、QRadarがDSMを用いてSQSにポーリングし、Flow情報として展開できているかどうか、QRadarのログ（/var/log/qradar.log）から確認ができます。

```
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [0] records from S3 File [/store/tmp/59/AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0215Z_a96f8084.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [tomcat.tomcat] [configservices@10.0.2.4 (1314) /console/JSON-RPC/System.addAliases System.addAliases] com.q1labs.configservices.capabilities.CapabilitiesHandler: [INFO] [NOT:0000006000][127.0.0.1/- -] [-/- -]adding autodetected flowsource alias: 127.0.0.1:localhost_localdomain
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processing S3 File: [AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0225Z_3729e216.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.file.VPCFlowLogHandler: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [161] VPC Flow records from [AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0225Z_3729e216.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [0] records from S3 File [/store/tmp/59/AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0225Z_3729e216.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processing S3 File: [AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0220Z_c3db12b5.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.file.VPCFlowLogHandler: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [1167] VPC Flow records from [AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0220Z_c3db12b5.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [0] records from S3 File [/store/tmp/59/AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0220Z_c3db12b5.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processing S3 File: [AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0210Z_5168a8cc.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.file.VPCFlowLogHandler: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [902] VPC Flow records from [AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0210Z_5168a8cc.log.gz]
Jun 26 11:29:14 ::ffff:127.0.0.1 [ecs-ec-ingress.ecs-ec-ingress] [Amazon AWS S3 REST API Protocol Provider Thread: class com.q1labs.semsources.sources.amazonawsrest.AmazonAWSRESTProvider59] com.q1labs.semsources.sources.amazonawsrest.utils.web.SQSEventProcessor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Processed [0] records from S3 File [/store/tmp/59/AWSLogs-XXXXXXXXXXXX-vpcflowlogs-ap-northeast-1-2020-06-26-XXXXXXXXXXXX_vpcflowlogs_ap-northeast-1_fl-081519e90b2edcb30_20200626T0210Z_5168a8cc.log.gz]
Jun 26 11:29:29 ::ffff:127.0.0.1 [tomcat.tomcat] [admin@27.0.3.146 (1394) /console/JSON-RPC/QRadar.getUndeployedChanges QRadar.getUndeployedChanges] com.q1labs.configservices.deployment.DeploymentHandler: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]DETECTED: 1 flowsource aliases need deploying
Jun 26 11:29:53 ::ffff:10.0.2.4 [masterdaemon.masterdaemon] [SourceMonitorTimerTask] com.q1labs.sem.monitors.SourceMonitor: [INFO] [NOT:0000006000][10.0.2.4/- -] [-/- -]Incoming flow rate [5s: (0.00):(0.00) fps], [10s: (0.00):(0.00) fps], [15s: (0.00):(0.00) fps], [30s: (0.00):(0.00) fps], [60s: (0.00):(0.00) fps], [300s: (0.00):(0.00) fps], [900s: (0.00):(0.00) fps]. Peak in the last 60s: (0.00):(0.00) fps. Max Seen (0.00):(0.00) fps.License Threshold: 0.00
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138540] IPFIX Flow Source Stats for default_Netflow:  received and processed 188 packets.
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138540] Sent 0 flows on transport connection to 10.0.2.4:32010
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138540] Flows held over for the next reporting interval: 0
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Current interval starting input flow count: 0
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Number offlows that should be reported in the interval: 1655
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Total number of aggregatable flows received from all flow sources: 3528
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Total number of non-aggregatable flows received from all flow sources: 0
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Byte count: 18364323
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Packet count: 50524
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Overflow count: 0 (Compressed: 0)
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] Superflow count: 0 (Compressed: 0)
Jun 26 11:29:59 localhost [QRADAR] [21607] qflow: [INFO] [1593138600] New input interval started
Jun 26 11:30:00 localhost [QRADAR] [21607] qflow: [INFO] Successfully connected to 10.0.2.4:32010
```
設定が無事できているようであれば、IBM QRadar側からトラフィック情報が確認できるはずです。
<img width="1440" alt="QRadar_f.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/7fb05d84-021f-f4fb-9c7a-b5869601c547.png">
ダブルクリックして、フロー情報の詳細を見てみましょう。
AWS固有の情報である Interface名、Action、ENI IDなども取り込まれていることが分かります。これで分析やQRadarの相関ルールも判定できそうですね。
<img width="596" alt="flow3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/a1b0e723-8c07-cb50-8d9e-11ad52c3d1b3.png">

# まとめ
本記事では、AWS VPC FlowLogsをIBM QRadarに取り込んで、分析を行うための接続方法について記載しました。次回からは、取り込んだ分析の異常検知に取り組んでみたいと思います。