Splunk で Cisco Secure Firewall の Syslog を可視化する

この記事はシスコの有志による Cisco Systems Japan Advent Calendar 2024 の 10 日目として投稿しています。

🎅2024 年版: https://qiita.com/advent-calendar/2024/cisco

### はじめに
本記事では、Splunk で Cisco の次世代ファイアウォール 製品 [Cisco Secure Firewall](https://www.cisco.com/site/jp/ja/products/security/firewalls/index.html) のログを可視化したり解析するためのシンプルな環境を構築する方法を紹介します。

#### 構成
可視化サーバ：Ubuntu 22.04 
・Splunk Enterprise 9.3.1
・rsyslog 
次世代ファイアウォール（センサー）：Cisco Secure Firewall Threat Defense（FTD）
・version 7.2.5, 仮想マシン版
次世代ファイアウォール（管理コンソール）：Cisco Secure Firewall Management Console (FMC）
・version 7.2.5, 仮想マシン版

#### 構成イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/7aeff9a1-50dd-c154-8bd4-6624ff06bf66.png)


### 前提事項
・Splunk と rsyslog は同じ Ubuntu 上に構築します
・大量のイベントログをさばきたかったため、ディスクスペースや I/O など考えなくてもいいよう Docker は選択肢から除外しました
・FTD/FMC の構築は完了しておりトラフィックが流れている状態とします（FTD/FMC セットアップ方法については[こちら](https://salesconnect.cisco.com/APJCPartnerCommunity/s/japan-partner-community-sec)もご覧ください）
・Secure Firewall から Splunk へログを取り込む方法としてはいくつか方法が存在しますが、最もプリミティブな方法として Syslog を一度受け取って、それを Splunk から読み込む方式を採用します 

:::note info
Splunk x Cisco Secure Firewall（FTD）などのキーワードで検索すると [eStreamer](https://www.cisco.com/c/ja_jp/support/docs/security/firepower-ngfw/215631-understand-estreamer-and-troubleshoot-en.html) が出てきますがこれは TCP を利用したサーバークライアント方式でイベントログを外部に保管する機能となります。 Syslog とは別の方法であり本記事では扱いません。
:::

### Splunk Enterprise の構築
[公式のインストールガイド](https://docs.splunk.com/Documentation/Splunk/9.3.1/Installation/InstallonLinux)を参考にしながら進めます。 [ダウンロードサイト](https://www.splunk.com/en_us/download/splunk-enterprise.html)から各種インストーラを落とすためには Splunk Account の作成が必要です（無料）。

```
# パッケージの取得 # ダウンロードサイトで表示されるコマンド
wget -O splunk-9.3.1-0b8d769cb912.x86_64.rpm "https://download.splunk.com/products/splunk/releases/9.3.1/linux/splunk-9.3.1-0b8d769cb912.x86_64.rpm"

# パッケージの実行
rpm -ivh splunk-9.3.1-0b8d769cb912.x86_64.rpm 
cd /opt/splunk/bin

# Splunk の実行
./splunk start –-accept-license 
```
メッセージに従って管理者アカウントとパスワードを設定してインストールは完了。

#### 正常起動していることの確認
・コマンドでの確認例
```
$ sudo /opt/splunk/bin/splunk status
splunkd is running (PID: 2907).
splunk helpers are running (PIDs: 2908 3270 3279 3506 3605 3703740 3713141).

$ ss -at | grep 8000
LISTEN 0      128                   0.0.0.0:8000                 0.0.0.0:* 
```

・`http://{Ubuntu の IP アドレス}:8000` へブラウザからアクセス
Splunk のサービスが起動していればインストールに設定した管理者アカウントとパスワードでログインが可能です。

:::note warn
ホストファイアウォール (ufw) が有効になっている場合、GUI にアクセスするため 8000/tcp 宛の通信を許可します。
:::

Splunk の残りの設定は Syslog が受信できるようになってからまた行います。

### rsyslog サーバの構築
rsyslog はデフォルトで入っているものを使用します。 rsyslog の設定については以下を参考としました。
https://knowledge.sakura.ad.jp/8969/
https://knowledge.sakura.ad.jp/8975/
https://qiita.com/11ohina017/items/087b1b7c4411c3b3195a

```/etc/rsyslog.conf

### Syslog を受信したいポートを指定する

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="5514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="5514")

### 今回の環境では 4つの FTD からの Syslog を別フォルダに分けて保存する。
### ファイル名は日付等を変数とし、.log ファイルを1時間おきに生成する。

#### TEMPLATES ####
$template teamA, "/opt/splunk/hardening/teamA/%hostname%_%$year%%$month%%$day%%$hour%.log"
$template teamB, "/opt/splunk/hardening/teamB/%hostname%_%$year%%$month%%$day%%$hour%.log"
$template teamC, "/opt/splunk/hardening/teamC/%hostname%_%$year%%$month%%$day%%$hour%.log"
$template teamD, "/opt/splunk/hardening/teamD/%hostname%_%$year%%$month%%$day%%$hour%.log"

### 今回の環境では 4つの FTD からの Syslog をそれぞれファシリティで区別する。

#### RULES ####
:fromhost-ip, isequal, "127.0.0.1" /var/log/messages
&stop
local4.* -?teamA
local5.* -?teamB
local6.* -?teamC
local7.* -?teamD 
&stop

```
:::note warn
.log ファイルが生成されない場合、受信フォルダのパーミッションやオーナーが適切か確認してみてください。
:::

### FMC の設定
基本的なセットアップは完了している前提で、ここでは Syslog 送信に関係する設定のみ取り上げます。設定箇所は以下の２つ。
1. Syslog 送信先オブジェクトの設定
2. ファイアウォールのルール内でのログ送信設定

#### 1. Syslog 送信先オブジェクトの設定 （Syslog Alert Configuration）
Syslog 送信先オブジェクトの設定を行います。
FMC GUI から、`Policies > Action > Alert` で追加します。（Network Object 等とは異なる場所で管理される点に注意）
- Name: 任意
- Host: rsyslog サーバ（Ubuntu) の IP アドレス
- Port: rsyslog.conf で設定したポート
- Facility: rsyslog.conf で設定したファシリティ
- Severity: ログの Severity（デフォルトまま）
- Tag: 空欄（デフォルトまま）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/4ee2e849-4c72-6798-c6af-99bb065d1344.png)


#### 2. ファイアウォールのルール内でのログ送信設定
アクセスコントロールポリシー（ACP）の Logging 設定を行います。
FMC は FTD 全体、ACP 単位、ACP 内の Rule 単位、検知するエンジン（IPS、File）単位など様々な粒度で Logging の出力先を設定することが可能。

今回は ACP 単位で設定することとします。
FMC GUI から、`Policies > Access Control > Access Control Policy` から設定したい ACP を選択し、Logging タブから Default Syslog Settings: で `Send using specific syslog alert` を有効化し、先程定義したSyslog 送信先オブジェクトを選択。
以下のチェックボックスも有効化します。
 - `Send Syslog messages for IPS events` 
 - `Send Syslog messages for File and Malware events`
 - Overrides は不要（宛先や Severity を変更したい場合に利用する）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/f58aab37-75ec-5f5d-ebd3-57787abc6823.png)

また、ACP 内の各 rule でも Logging を有効化する必要があります。
rule 編集画面から Logging タブで
 - `Log at Beginning of Connection` を有効化（End も取るとログ量が倍増するため、今回は Beginning のみ取得）
 - `Send Connection Events to:` の `Syslog Server` のチェックを有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/de47f4d0-8ae2-68aa-ac8e-b525e2401f72.png)


:::note info
本シナリオと直接関係しないですが`Firewall Management Center` のチェックボックスを有効化しないと FMC の GUI からイベントが見えないため、こちらも有効化することを推奨します。
:::

ここまで設定が完了していれば、トラフィックが流れていれば随時 rsyslog の該当フォルダに .log ファイルが作成されます。

参考までに、トラフィックが流れていない場合、ICMP 等で IPS イベントを引き起こすことも可能です。
https://community.cisco.com/t5/tkb-セキュリティ-ドキュメント/firepower-system-intrusion-policy-による-icmp-パケット検知の設定例/ta-p/3156711

### 再び Splunk の設定
最後に、Ubuntu 内に蓄積された Syslog を Splunk からモニターし取り込むための設定をします。
1. Sourcetype の追加
2. Splunk への Syslog の入力


#### 1. Sourcetype の追加
[Sourcetype](https://docs.splunk.com/Splexicon:Sourcetype) とは、Splunk が取り込むイベントを解釈するための定義ファイルです。これがない状態だと、ログはただの文字列として扱われますが、適切な Sourcetype を使えばログに含まれる文字から日付や数量といった情報を取り出しやすくなります。

Cisco がメンテナンスしている Splunk App [Cisco Security Cloud](https://splunkbase.splunk.com/app/7404) に Cisco Secure Firewall の Syslog フィールドのパース（ログのフィールドと値の解釈）ができる Sourcetype として `[cisco:ftd:syslog]` が同梱されています。

今回はこれを用いて FTD Syslog をパースします。インストール方法は簡単なので割愛。
参考: [Splunk: App・アドオンの追加方法](https://qiita.com/frozencatpisces/items/7087cd7f2051d10c2b8d)

:::note info
[Splunk Base](https://splunkbase.splunk.com/apps?keyword=cisco) には他にも Cisco や Firepower 関連の Splunk App がたくさんありますが、ソースタイプのフィールドが最も充実しているのが [Cisco Security Cloud](https://splunkbase.splunk.com/app/7404) と思われます。
:::

#### 2. Splunk への Syslog の入力
同一 Ubuntu ホスト内のフォルダに Syslog が蓄積されているため、Splunk では「ローカル入力」にてログを取り込み Index 化します。

Splunk GUI から`設定 ＞ データ入力 ＞ ローカル入力 ＞ ファイルとディレクトリ` から新規追加でソースの選択（ログのあるフォルダやファイル）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/76193985-6115-37f4-e883-a02202814846.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/3215c97a-d61f-4eeb-d677-852f335861a0.png)


ソースタイプ `cisco:ftd:syslog` を選択し、ホストフィールドやインデックスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/6c98ad40-9254-3329-8b80-98061607a38f.png)

このとき、私の環境では、`cisco:ftd:syslog`を指定して過去取得した Syslog を取り込んだ場合にタイムスタンプがイベント内容と一致しない問題が発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/40323d99-1822-743a-d783-80441def3c74.png)


そのため、`タイムスタンプ`の定義方法を`自動`として名前をつけて保存した Sourcetype を用いた。（ソースタイプ `cisco:ftd:syslog:timeauto` とした）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/76e6f54c-8f4e-68fc-f285-dac64c0b7a30.png)


ここまで完了すると、splunk ダッシュボード上で Syslog を確認でき、さらにフィールド情報もパースされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/cd5522c3-cf12-50d8-7c9a-f0f95aefd879.png)

### 簡単なダッシュボードの作成

最後に、簡単なダッシュボードを作ってみます。
FTD Syslog はイベントの種類で 5 種類存在し、それぞれ Message ID が異なります。今後ガッツリ分析されたい場合は、イベントの種類でログの構造や含まれるフィールドも異なる点に注意が必要です。

```
• 430001: Intrusion event
This ID was introduced in release 6.3.
• 430002: Connection event logged at beginning of connection
This ID was introduced in release 6.3.
• 430003: Connection event logged at end of connection
This ID was introduced in release 6.3.
• 430004: File events
Syslog support for these events was introduced in release 6.4.
• 430005: File malware events
Syslog support for these events was introduced in release 6.4
```
https://www.cisco.com/c/en/us/td/docs/security/firepower/Syslogs/b_fptd_syslog_guide.pdf

ソースタイプ `cisco:ftd:syslog` では Message ID は`rec_type` というフィールド名になっています。これらをカウントして「単一値」のダッシュボードとして表示してみます。

ドロップダウンで index 名や送信元 IP、宛先 IP などでフィルタできます。ドロップダウンメニューの作り込みは[こちら](https://qiita.com/frozencatpisces/items/5e6f42b7e8653ba0fd18)が参考になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/4f24b494-ff33-e4e6-df43-f2cf9660cdb3.png)


その他にもバイト数を合計したり、特定の情報だけでテーブルを作ったりすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/6d702a08-9ade-d717-85ef-505301253442.png)
Splunk のダッシュボードは JSON ファイルをインポートするだけでまったく同じダッシュボードを一瞬で構築できるのでご興味ありましたらどうぞ（index 名などは環境にあわせて変更が必要）
https://github.com/urikura/splunk_dashboard/blob/main/ftd_syslog_splunk_dashboard

### さいごに
本記事では、Ubuntu 一台で Cisco Secure Firewall のログ可視化環境を構築する手順を紹介しました。
Cisco 製品を Splunk と連携させるためのドキュメントがもっと拡充されてほしいという思いが高まったので、まずは自分が書いてみました。

率直に言うと、FMC の [Unified Event Viewer 機能](https://www.cisco.com/c/ja_jp/support/docs/security/secure-firewall-management-center/221068-monitor-events-using-unified-event-viewe.html)は非常に使い勝手がよいため、本製品単体のログを Splunk へ入れて可視化・分析する必要性は薄いです。一方で、昨今の巧妙化するサイバー攻撃に対して早期に検知・対応するためには複数のソースからのイベント情報を関連付けて分析することが重要となります。そのような環境を構築する際に本記事が一助となれば嬉しいです。