Sysdig SecureのAgent Local Forwarding機能

Sysdig Agent v.12.18.0以上で実装されたAgent Local Forwarding機能を使うと、SysdigのSaaSバックエンドを経由せずにSysdig Agentから直接SIEM等にイベントを転送できます。本記事ではSplunkに対する転送の設定手順をご紹介します。

Agent Local Fowardingは、通常のイベント転送に対して以下の点が異なるのでご注意ください。

::: note
- ローカルフォワーダは X.509 認証をサポートしていません。
- イベントは永続化されないため、エージェントの再起動時に転送されないと失われます。
- 一部のラベルは、スキップされた後処理フェーズで入力される可能性があるため、利用できない場合があります。
- `description` と `agentId` フィールドは利用できません。
- UIによる設定ではなく、Agent設定ファイルに対する手動設定が必要です。
:::

# 関連ドキュメント
https://docs.sysdig.com/en/docs/sysdig-secure/secure-events/event-forwarding/#agent-local-forwarding

https://docs.sysdig.com/en/docs/sysdig-secure/secure-events/event-forwarding/forwarding-to-splunk/#configure-agent-local-forwarding

# テスト環境
- AWS
- Kubernetes 1.28.2
- Sysdig Agent 12.20.0
- Splunk Enterprise 9.1.2

# Splunk側でのEvent Collector Tokenの作成
下記記事をご参照ください。

https://qiita.com/yotake/items/f55390207d4078ef0c03#event-collector%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90

# AWS Security Groupの設定
K8sノードからSplunk Enterprise Serverに対する8088ポートのInbound接続を許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/9f721633-3dea-d8b7-7861-3e9912f17e8b.png)

K8sノードからSplunk Enterprise Serverに対するイベント転送接続が問題なくできるかを、確認します。
K8sノードにSSH接続し、以下のコマンドを実行します。
```
curl --insecure https://<SPLUNK_PUBLIC_IP>:8088/services/collector/event -H 'Authorization: Splunk <SPLUNK_TOKEN>' -d '{"sourcetype": "demo", "event":"Hello, world!"}'
```
`success`と返れば問題なく通信できています。

# Agent Local Forwardingの設定
本記事では、新規にSysdig AgentをインストールするためのHelmファイル（values.yaml)で、Agent Local Forwardingの有効化を設定する例をご紹介します。ハイライトしている箇所がAgent Local Forwardingに固有の設定になります（行頭の+は不要です）。

```diff_yaml:values.yaml
global:
  clusterConfig:
    name: "yo-sysdig-aws"
  sysdig:
    region: "<SYSDIG_SAAS_REGION>"
    accessKey: "<SYSDIG_ACCESS_KEY>"
  kspm:
    deploy: false

agent:
  enabled: true
+ localForwarder:
+   enabled: true
+   transmitMessageTypes:
+    - POLICY_EVENTS
+    - SECURE_AUDIT
+   integrations:
+   - type: SPLUNK
+     channels:
+     - SECURE_EVENTS_POLICIES
+     - ACTIVITY_AUDIT
+     configuration:
+       Index: <indexname>
+       ServiceToken: "<SPLUNK_TOKEN>"
+       ServiceURL: "https://<SPLUNK_IP>:8088"
+       insecure: true

nodeAnalyzer:
  enabled: false

admissionController:
  enabled: false

rapidResponse:
  enabled: false
```
上記Helmファイルを使ってSysdig Agentをインストールします。
```
helm repo add sysdig https://charts.sysdig.com
helm repo update
helm install sysdig-agent --namespace sysdig-agent --create-namespace \
    --values ./values.yaml \
    sysdig/sysdig-deploy
```
ConfigMapにAgent Local Forwardingの設定が入っていることを確認します。ハイライトしている箇所がAgent Local Forwardingに固有の設定になります（行頭の+は不要です）。
```diff_yaml
$ kubectl -n sysdig-agent describe cm sysdig-agent
Name:         sysdig-agent
Namespace:    sysdig-agent
Labels:       app=sysdig-agent
              app.kubernetes.io/instance=sysdig-agent
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=agent
              app.kubernetes.io/version=12.20.0
              helm.sh/chart=agent-1.19.4
Annotations:  meta.helm.sh/release-name: sysdig-agent
              meta.helm.sh/release-namespace: sysdig-agent

Data
====
dragent.yaml:

new_k8s: true
k8s_cluster_name: yo-sysdig-aws
collector: ingest.us4.sysdig.com
security:
  enabled: true
  k8s_audit_server_enabled: true
  k8s_audit_server_port: 7765
  k8s_audit_server_url: 0.0.0.0

+local_forwarder:
+  enabled: true
+  transmit_message_types:
+    - POLICY_EVENTS
+    - SECURE_AUDIT

BinaryData
====

Events:  <none>
```
Sysdig Agentコンテナの中に`local_forwarder_config.yaml`ファイルが作成されていることを確認します。
```
$ kubectl exec -it -n sysdig-agent sysdig-agent-xxxxx -- cat /opt/draios/etc/local_forwarder_config.yaml
Defaulted container "sysdig" out of: sysdig, sysdig-agent-kmodule (init)
integrations:
  - channels:
    - SECURE_EVENTS_POLICIES
    - ACTIVITY_AUDIT
    configuration:
      ServiceToken: <Redacted>
      ServiceURL: https://<Redacted>:8088
      insecure: true
    type: SPLUNK
```
# イベント転送テスト
テスト用のNginx Podを起動します。
```
kubectl run nginx --image nginx
```
Nginx Podに入ります。
```
kubectl exec -it nginx -- bash
```
セキュリティイベントを発生させます
```
# touch /dev/testfile
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/ac3a9c45-8670-44ec-bee4-133d40e9b4fb.png)

Splunk UIにログインし、__Search & Reporting__ に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/54d22f49-7973-4f42-1630-25c467c5cda4.png)

サーチ欄に`source="http:sysdig"`と入力して検索し、発生させたイベントがSplunkに転送されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802821/80824416-e0e3-0bd2-8d44-52e92dce26d7.png)

:::note warn
Sysdig UIから設定する通常のSplunk転送とAgent Local Forwardingの両方を有効にした場合は、同一のイベントが重複して転送されるのでご注意ください。
:::

# まとめ
Agent Local Forwardingを使って、SysdigのSaaSバックエンドを経由せずにSysdig Agentから直接Splunkに簡単にイベント転送できることが確認できました。