こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
LPIC303 Securityの受験に際し、セキュリティの勉強をしています。
その中でIDS(IPS)システムのSnortと呼ばれるものが試験範囲に含まれています。
今回は雑ですが、Snort環境を作っていってlogに出ているなぁ的なことを確認していって感覚を掴んでいこうと思います。
Snortとは?
公式から引用します。
※公式サイトの文章を日本語に翻訳しています。
Snort は、世界最先端のオープン ソース侵入防止システム (IPS) です。Snort IPS は、悪意のあるネットワーク アクティビティを定義するのに役立つ一連のルールを使用し、それらのルールを使用して一致するパケットを検出し、ユーザーに警告を生成します。
Snort は、これらのパケットを停止するためにインラインで展開することもできます。Snort には、tcpdump のようなパケット スニファーとして、ネットワーク トラフィックのデバッグに役立つパケット ロガーとして、または本格的なネットワーク侵入防止システムとして使用できるという 3 つの主な用途があります。Snort は、個人用にもビジネス用にもダウンロードして構成できます。
環境イメージ
簡単な環境ですが、以下となります。2台ともubuntu22.04です。
以前構築した認証局サーバにSnortをインストールします。その後local.rulesにssh接続を検知するような設定を行います。
別のubuntuサーバ(GUI環境のもの)からSnortに対してssh接続を実行。ログが出力されるかを確認してきたいと思います。
※本当であればもう少しそれっぽい環境を作るべきなのでしょうが、LPIC303でそこまで深い設定内容を求められることもないだろうという事で・・・本当ならDMZとかを作って…的なことをした方が良いんでしょうがそこまでやるよりは他のLPIC303関連のものを広く浅く触りたいので・・・
必要に応じて拡張を考えます。
構築
環境構築
apt updateとapt upgradeを実行した後にapt install -y snortを実行するだけでインストールすることが出来ます。簡単ですね。
root@ca-server:~# apt update && apt upgrade -y
root@ca-server:~# apt install -y snort
但し、installを実行しようとすると以下のような設定を求められます。監視したいネットワークを指定すればいいと思います。デフォルトでは192.168.0.0/16と記載がありました。
今回はSnortを作るネットワークである192.168.2.0/24と変更しています。
私の環境だけだとは思いますが、以下のような出力がされました。
カーネルのバージョンが若干古いようです。対応しなくても大丈夫そうですが、対応しておきます。
現在のカーネルバージョンを確認してrebootを実施する
root@ca-server:~# uname -r
5.15.0-105-generic
root@ca-server:~# reboot
再起動後カーネルバージョンが上がっていることを確認します。
root@ca-server:~# uname -r
5.15.0-107-generic
このあとsnortコマンドが有効になっていることを確認します。
ブタが出てくれば問題ありません。併せてsystemctl status snortでsnortが稼働していることを確認します。
root@ca-server:~# snort --version
,,_ -*> Snort! <*-
o" )~ Version 2.9.15.1 GRE (Build 15125)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
Copyright (C) 1998-2013 Sourcefire, Inc., et al.
Using libpcap version 1.10.1 (with TPACKET_V3)
Using PCRE version: 8.39 2016-06-14
Using ZLIB version: 1.2.11
root@ca-server:/etc/snort/rules# systemctl status snort
● snort.service - LSB: Lightweight network intrusion detection system
Loaded: loaded (/etc/init.d/snort; generated)
Active: active (running) since Sun 2024-05-26 00:23:59 UTC; 9min ago
Docs: man:systemd-sysv-generator(8)
Process: 676 ExecStart=/etc/init.d/snort start (code=exited, status=0/SUCCESS)
Tasks: 2 (limit: 4557)
Memory: 84.8M
CPU: 680ms
CGroup: /system.slice/snort.service
mq775 /usr/sbin/snort -m 027 -D -d -l /var/log/snort -u snort -g snort --pid-path /run/snort/ -c /etc/snort/snort.conf -S "\"HOME_NET=[192.168.>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_FTPTELNET Version 1.2 <Build 13>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: appid Version 1.1 <Build 5>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_REPUTATION Version 1.1 <Build 1>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_SSLPP Version 1.1 <Build 4>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_IMAP Version 1.0 <Build 1>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_POP Version 1.0 <Build 1>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_DCERPC2 Version 1.0 <Build 3>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_GTP Version 1.1 <Build 1>
May 26 00:23:59 ca-server snort[775]: Preprocessor Object: SF_SSH Version 1.1 <Build 3>
May 26 00:23:59 ca-server snort[775]: Commencing packet processing (pid=775)
lines 1-21/21 (END)
環境確認とrulesの追記
設定ファイルは/etc/snort/配下にある様子。
確認してみます。rulesディレクトリの中に細かいruleが設定されているように見えます。
root@ca-server:~# cd /etc/snort
root@ca-server:/etc/snort# ls -R
.:
attribute_table.dtd community-sid-msg.map gen-msg.map rules snort.debian.conf unicode.map
classification.config file_magic.conf reference.config snort.conf threshold.conf
./rules:
attack-responses.rules community-mail-client.rules community-web-iis.rules imap.rules pop3.rules web-cgi.rules
backdoor.rules community-misc.rules community-web-misc.rules info.rules porn.rules web-client.rules
bad-traffic.rules community-nntp.rules community-web-php.rules local.rules rpc.rules web-coldfusion.rules
chat.rules community-oracle.rules ddos.rules misc.rules rservices.rules web-frontpage.rules
community-bot.rules community-policy.rules deleted.rules multimedia.rules scan.rules web-iis.rules
community-deleted.rules community-sip.rules dns.rules mysql.rules shellcode.rules web-misc.rules
community-dos.rules community-smtp.rules dos.rules netbios.rules smtp.rules web-php.rules
community-exploit.rules community-sql-injection.rules experimental.rules nntp.rules snmp.rules x11.rules
community-ftp.rules community-virus.rules exploit.rules oracle.rules sql.rules
community-game.rules community-web-attacks.rules finger.rules other-ids.rules telnet.rules
community-icmp.rules community-web-cgi.rules ftp.rules p2p.rules tftp.rules
community-imap.rules community-web-client.rules icmp-info.rules policy.rules virus.rules
community-inappropriate.rules community-web-dos.rules icmp.rules pop2.rules web-attacks.rules
snort関連のログは/var/log/snort/配下にある様子。catコマンドで中身を確認しようとしても文字化けを発生させてしまうので、別のコマンドを使って中身を確認していきたいと思います。これは後程。
root@ca-server:~# cd /var/log/snort/
root@ca-server:/var/log/snort# ls
snort.alert snort.alert.fast snort.log
ubuntuのdesktopから認証局サーバにsshしようとしたときにalertを出力させてみます。
rules配下にあるlocal.rulesに設定を追加していきます。
ruleを追加した後、Snortに読み込ませるためrestartをかけます。
root@ca-server:~# cd /etc/snort/rules/
root@ca-server:/etc/snort/rules# vi local.rules
root@ca-server:/etc/snort/rules# cat local.rules
# $Id: local.rules,v 1.11 2004/07/23 20:15:44 bmc Exp $
# ----------------
# LOCAL RULES
# ----------------
# This file intentionally does not come with signatures. Put your local
# additions here.
alert tcp 192.168.2.104 any -> 192.168.2.0/24 22 (msg:"SSH connection from ubuntu desktop"; sid:1000002; rev:1;)
root@ca-server:/etc/snort/rules# systemctl restart snort
ruleの書き方ですが以下の様です。
alert tcp 192.168.2.104 any -> 192.168.2.0/24 22 (msg:"SSH connection from ubuntu desktop"; sid:1000002; rev:1;)
- alert tcp:tcpを監視し条件に合致した場合はalertを発生させます
- 192.168.2.104:送信元のIPアドレスを示します。今回はこのIPアドレスです
- any:送信元ポートを示します。今回は全部のポートを監視します
- 192.168.2.0/24 22:送信先のIPアドレス(ネットワーク)と送信先のポートを示します。今回はSnortが設置されているネットワーク帯でポート番号は22、つまりSSHを監視します。
- msg:"SSH connection from ubuntu desktop":アラートメッセージとして "SSH connection from ubuntu desktop" を表示します。
- sid:1000002:このルールの一意の識別子(SID)です。SnortルールでSIDは一意である必要があるようです。
- rev:1:このルールのリビジョン番号です。ルールが更新されるたびにリビジョン番号を増やすことで、変更履歴を管理できるようです。
テスト
テストを行います。ubuntu desktop環境でterminalを開いて以下のコマンドを実行。
CAサーバにssh接続を行います。ssh出来ていることを確認しましょう。
Snortサーバでsnort.alertを確認します。
sig idがlocal.rulesで定義したものと同じであることや、IPアドレス的に想定通りかなと思います。
前述の通り、catコマンドだと文字化けで中身を見れませんのでu2spewfooというコマンドで読み込みます。Snortをインストールした際に一緒にインストールしています。
root@ca-server:~# cd /var/log/snort/
root@ca-server:/var/log/snort# u2spewfoo snort.alert
中略
(Event)
sensor id: 0 event id: 42 event second: 1716688977 event microsecond: 788900
sig id: 1000002 gen id: 1 revision: 1 classification: 0
priority: 0 ip source: 192.168.2.104 ip destination: 192.168.2.190
src port: 52020 dest port: 22 protocol: 6 impact_flag: 0 blocked: 0
ちなみに
local.rulesというファイルを読み込ませるためには/etc/snort/snort.confファイルにて以下の記載がないといけないようです。
root@ca-server:/etc/snort# cat -n snort.conf | grep -i local
590 include $RULE_PATH/local.rules