CentOS8(Rocky8)でsnort

## 0.0 環境
Vietual Box 6.1.24
Rocky 8.5
snort 2.9.20

## 1.0 インストール
```terminal:snortインストール
# dnf install https://www.snort.org/downloads/snort/snort-2.9.20-1.centos.x86_64.rpm
```
>※最新のパッケージのリンクは以下から取得できます(Snort欄)
(https://www.snort.org/downloads#snort-downloads)

```terminal:よくわからないけど必要な奴
# dnf -y install libdnet

# ln -s /usr/lib64/libdnet.so.1.0.1 /usr/lib64/libdnet.1
```

```terminal:rulesファイル取得
# curl -OL https://www.snort.org/downloads/community/community-rules.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   467    0   467    0     0    871      0 --:--:-- --:--:-- --:--:--   871
100  334k  100  334k    0     0   164k      0  0:00:02  0:00:02 --:--:--  571k

# ll | grep rules
-rw-r--r--  1 root root    342342 12月 13 09:29 community-rules.tar.gz

# tar zxvf ./community-rules.tar.gz -C /etc/snort/rules
community-rules/
community-rules/community.rules
community-rules/VRT-License.txt
community-rules/LICENSE
community-rules/AUTHORS
community-rules/snort.conf
community-rules/sid-msg.map

# ll /etc/snort/rules/community-rules
合計 2348
-rw-r--r-- 1 1210 wheel    7834 11月  9  2018 AUTHORS
-rw-r--r-- 1 1210 wheel   15127  3月 20  2013 LICENSE
-rw-r--r-- 1 1210 wheel   21084  2月 25  2021 VRT-License.txt
-rw-r--r-- 1 1210 wheel 1819889 12月  9 04:11 community.rules
-rw-r--r-- 1 1210 wheel  496393 12月  9 04:11 sid-msg.map
-rw-r--r-- 1 1210 wheel   30249  4月 25  2022 snort.conf
```
>※最新のrulesファイルのリンクは以下から取得できます(Rules欄)
(https://www.snort.org/downloads#snort-downloads)


```terminal:設定ファイルとかっぽいやつ
# find / | egrep -v "mail|rc|run|selinux|usr" | grep -e "snort"
/var/log/snort
/etc/logrotate.d/snort
/etc/sysconfig/snort
/etc/snort
/etc/snort/classification.config
/etc/snort/gen-msg.map
/etc/snort/reference.config
/etc/snort/rules
/etc/snort/rules/community-rules
/etc/snort/rules/community-rules/community.rules
/etc/snort/rules/community-rules/VRT-License.txt
/etc/snort/rules/community-rules/LICENSE
/etc/snort/rules/community-rules/AUTHORS
/etc/snort/rules/community-rules/snort.conf
/etc/snort/rules/community-rules/sid-msg.map
/etc/snort/snort.conf
/etc/snort/threshold.conf
/etc/snort/unicode.map
```
>基本的には「/etc/snort/snort.conf」、「/etc/sysconfig/snort」、「/etc/snort/rules/」だけ触っていれば良さそう。

## 1.1 snort全体設定

まずは監視対象インタフェース名を変数として設定します
```terminal:変数設定
# vi /etc/sysconfig/snort

(略)
# What interface should snort listen on?  [Pick only 1 of the next 3!]
# This is -i {interface} on the command line
# This is the snort.conf config interface: {interface} directive
INTERFACE=eth0
(略)

↓ INTERFACEを監視対象のインタフェース名に変更

(略)
# What interface should snort listen on?  [Pick only 1 of the next 3!]
# This is -i {interface} on the command line
# This is the snort.conf config interface: {interface} directive
INTERFACE=enp0s3
(略)
```
>監視対象インタフェースはコマンドライン上で「# snort -i <インタフェース名>」としても指定できます。<br>
インタフェースを複数指定する場合はコマンドライン上では不可能なので、当該ファイルにて以下のように記述します。
1.すべてのインタフェースを監視対象にする場合
　INTERFACE=ALL
2.指定した複数のインタフェースを監視対象にする場合
　INTERFACE="eth1 eth2 eth3 eth4 eth5"

次にメイン設定ファイルである/etc/snort/snort.confを編集します
まずは/etc/snort/snort.conf内で記述されている不要なinclude文をコメントアウトします
```terminal:include文のコメントアウト
# vi /etc/snort/snort.conf
「include $RULE_PATH」で始まる行を全てコメントアウト(viで置換すれば楽です)
```

あと、ファイル内のパスがおかしいみたいなので直しておきます
```terminal:パス修正
# vi /etc/snort/snort.conf
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH ../so_rules
var PREPROC_RULE_PATH ../preproc_rules
var WHITE_LIST_PATH ../rules
var BLACK_LIST_PATH ../rules

↓

var RULE_PATH rules
var SO_RULE_PATH so_rules
var PREPROC_RULE_PATH preproc_rules
var WHITE_LIST_PATH rules
var BLACK_LIST_PATH rules
```

次に先ほど取得した最新のrulesファイルを読み込んでもらうために/etc/snort/snort.confにinclude設定を入れます
```terminal:最新のrulesファイル用include設定
# echo "include \$RULE_PATH/community-rules/community.rules" >> /etc/snort/snort.conf

# grep community.rules /etc/snort/snort.conf
include $RULE_PATH/community-rules/community.rules
```

## 1.2 rulesファイル設定

次に独自のrulesファイルを作成してみます。今回はssh接続をされた場合にアラートを発生するシグネチャ(ルールのこと)を設定してみます。
```terminal:独自rulesファイル作成
# echo "include \$RULE_PATH/ssh.rules" >> /etc/snort/snort.conf

# grep ssh.rules /etc/snort/snort.conf
include $RULE_PATH/ssh.rules

# vi /etc/snort/rules/ssh.rules
alert tcp <ssh接続元アドレス> any -> localhost 22 (msg:"ssh connection started"; SID:1;)
```
>シグネチャは
「アクション　プロトコル　IPアドレス　ポート番号　方向演算子　IPアドレス　ポート番号　オプション」
の形で定義されます

snortはデーモン再起動時に設定ファイルを読み込みます
```terminal:設定ファイル読み込み
# systemctl restart snortd
```

なんかエラーが出ていますね
```terminal:なんかエラーが出ている
# systemctl status snortd --no-pager -l
(略)
12月 13 11:05:10 localhost.localdomain snort[11929]: FATAL ERROR: /etc/snort/snort.conf(253) Could not stat dynamic module path "/usr/local/lib/snort_dynamicrules": No such file or directory.
(略)

# nl -b a /etc/snort/snort.conf | grep 253
   253  dynamicdetection directory /usr/local/lib/snort_dynamicrules
```

とりあえず参考ページに従ってディレクトリを作成してみます(参考:https://www.unix-power.net/networking/post-758)
```terminal:/usr/local/lib/snort_dynamicrules作成
# touch /etc/snort/rules/white_list.rules

# touch /etc/snort/rules/black_list.rules

# mkdir -p /usr/local/lib/snort_dynamicrules

# chown -R snort.snort /usr/local/lib/snort_dynamicrules

# chmod -R 700 /usr/local/lib/snort_dynamicrules

# ls -ld /usr/local/lib/snort_dynamicrules
drwx------ 2 snort snort 6 12月 13 11:17 /usr/local/lib/snort_dynamicrules
```

そしてsnortを再起動してみると、
```terminal:無事に動いたっぽい
[root@localhost ~]# systemctl status snortd --no-pager -l
● snortd.service - SYSV: snort is a lightweight network intrusion detection tool that currently detects more than 1100 host and network vulnerabilities, portscans, backdoors, and more.
   Loaded: loaded (/etc/rc.d/init.d/snortd; generated)
   Active: active (running) since Tue 2022-12-13 11:35:43 JST; 1s ago
(略)
```

ここまでで独自のrulesファイルは作成できたので、実際にアラートが発生するか確認してみます。ssh接続時に/var/log/snort/alertとかにログが出るはず。
```terminal:独自rulesファイル動作確認
※snortをインストールしたサーバに22/tcpでssh接続

# tail /var/log/snort/alert
12/13-11:40:04.962301  [**] [1:1:0] ssh connection started [**] [Priority: 0] {TCP} 172.19.67.55:49757 -> 172.19.67.193:22
```
>※ログが出たのはいいですが同じログを無限に吐き出しつづけていますね・・・この辺は後で調べます・・・。<br># ll /var/log/snort/alert
-rw-r--r-- 1 root root 7872 12月 13 11:39 /var/log/snort/alert<br># ll /var/log/snort/alert
-rw-r--r-- 1 root root 32841 12月 13 11:39 /var/log/snort/alert<br># ll /var/log/snort/alert
-rw-r--r-- 1 root root 33579 12月 13 11:39 /var/log/snort/alert
>>sshのパケット量見た感じこれで正常っぽいですね。

ちなみに、snortではバイナリ形式のログも作成されるのですがそちらは以下のようにして見ることが可能です。
```terminal:バイナリ形式のログ確認
# ll /var/log/snort/
合計 316
-rw-r--r-- 1 root  root  113341 12月 13 13:31 alert
-rw------- 1 snort snort  23756 12月 13 11:39 snort.log.1670898943
-rw------- 1 snort snort  39472 12月 13 11:42 snort.log.1670899142
-rw------- 1 snort snort   4095 12月 13 13:07 snort.log.1670904383
-rw------- 1 snort snort  10670 12月 13 13:15 snort.log.1670904706
-rw------- 1 snort snort   1068 12月 13 13:23 snort.log.1670905353
-rw------- 1 snort snort  61920 12月 13 13:26 snort.log.1670905429
-rw------- 1 snort snort  24358 12月 13 13:30 snort.log.1670905618
-rw------- 1 snort snort  10862 12月 13 13:31 snort.log.1670905825
-rw------- 1 snort snort      6 12月 13 13:30 snort_enp0s3.pid
-rw------- 1 snort snort      0 12月 13 13:30 snort_enp0s3.pid.lck

# tcpdump -r /var/log/snort/snort.log.1670905825 | tail -n 3
reading from file /var/log/snort/snort.log.1670905825, link-type EN10MB (Ethernet)
dropped privs to tcpdump
13:34:07.541155 IP 172.19.67.55.51689 > localhost.localdomain.ssh: Flags [P.], seq 3492:3528, ack 10013, win 4101, length 36
13:34:07.583390 IP 172.19.67.55.51689 > localhost.localdomain.ssh: Flags [.], ack 10065, win 4101, length 0
13:34:07.913518 IP 172.19.67.55.51689 > localhost.localdomain.ssh: Flags [P.], seq 3528:3564, ack 10065, win 4101, length 36
```
>再起動のたびにファイルが新規作成されるっぽい

## 2.1 snort自動起動設定
```terminal:自動起動設定
# systemctl enable snortd
snortd.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable snortd

# systemctl status snortd --no-pager -l
● snortd.service - SYSV: snort is a lightweight network intrusion detection tool that currently detects more than 1100 host and network vulnerabilities, portscans, backdoors, and more.
   Loaded: loaded (/etc/rc.d/init.d/snortd; generated)
   Active: active (exited) since Tue 2022-12-13 09:55:03 JST; 45s ago
   (略)
```

## 3.1 参考
【Linux】CentOS 8　Snort(不正侵入検知システム)　インストールメモ(https://acind.hatenablog.jp/entry/2020/06/16/110106)

CentOS7 Snortのインストール
(https://www.unix-power.net/networking/post-758)