0.0 環境
Vietual Box 6.1.24
Rocky 8.5
snort 2.9.20
1.0 インストール
# 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)
# dnf -y install libdnet
# ln -s /usr/lib64/libdnet.so.1.0.1 /usr/lib64/libdnet.1
# 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)
# 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全体設定
まずは監視対象インタフェース名を変数として設定します
# 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 <インタフェース名>」としても指定できます。
インタフェースを複数指定する場合はコマンドライン上では不可能なので、当該ファイルにて以下のように記述します。
1.すべてのインタフェースを監視対象にする場合
INTERFACE=ALL
2.指定した複数のインタフェースを監視対象にする場合
INTERFACE="eth1 eth2 eth3 eth4 eth5"
次にメイン設定ファイルである/etc/snort/snort.confを編集します
まずは/etc/snort/snort.conf内で記述されている不要なinclude文をコメントアウトします
# vi /etc/snort/snort.conf
「include $RULE_PATH」で始まる行を全てコメントアウト(viで置換すれば楽です)
あと、ファイル内のパスがおかしいみたいなので直しておきます
# 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設定を入れます
# 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接続をされた場合にアラートを発生するシグネチャ(ルールのこと)を設定してみます。
# 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はデーモン再起動時に設定ファイルを読み込みます
# systemctl restart snortd
なんかエラーが出ていますね
# 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)
# 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を再起動してみると、
[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とかにログが出るはず。
※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
※ログが出たのはいいですが同じログを無限に吐き出しつづけていますね・・・この辺は後で調べます・・・。
# ll /var/log/snort/alert
-rw-r--r-- 1 root root 7872 12月 13 11:39 /var/log/snort/alert
# ll /var/log/snort/alert
-rw-r--r-- 1 root root 32841 12月 13 11:39 /var/log/snort/alert
# ll /var/log/snort/alert
-rw-r--r-- 1 root root 33579 12月 13 11:39 /var/log/snort/alertsshのパケット量見た感じこれで正常っぽいですね。
ちなみに、snortではバイナリ形式のログも作成されるのですがそちらは以下のようにして見ることが可能です。
# 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自動起動設定
# 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)