Contents
SNORT3 インストール
Snortは、IPネットワーク上でリアルタイムのトラフィック分析とパケットロギングを実行できるオープンソースのネットワーク侵入検知システムです。
「プロトコル分析」「コンテンツ検索」「マッチング」を実行でき、「バッファオーバーフロー」「ステルスポートスキャン」「CGI攻撃」「SMBプローブ」「OSフィンガープリント試行」「セマンティックURL攻撃」「サーバメッセージブロック探査」など、さまざまな攻撃検出に使用できます。
1.事前準備
①CodeReady Red Hat リポジトリを追加し、必要なソフトウェアをインストールする
1 2 3 4 |
# dnf config-manager --set-enabled ol8_codeready_builder # dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm # dnf config-manager --set-enabled epel # dnf upgrade |
必要なビルドツールとライブラリをインストール
1 2 3 4 5 |
# dnf -y install bison flex libtool nghttp2 libnghttp2-devel \ libpcap-devel pcre-devel openssl-devel libdnet-devel \ libtirpc-devel git gcc-c++ libunwind-devel cmake hwloc-devel \ luajit-devel xz-devel libnfnetlink-devel libmnl-devel \ libnetfilter_queue-devel uuid-devel libsafec-devel |
②DAQ のインストール
作業ディレクトリーを作成し、そのディレクトリーに移動し進める
1 2 3 4 5 6 7 |
# mkdir snort-source && cd snort-source # git clone https://github.com/snort3/libdaq.git # cd libdaq # ./bootstrap # ./configure # make # make install |
③Tcmallocインストール
1 2 3 4 5 6 7 |
# cd ../ # wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz # tar xzf gperftools-2.16.tar.gz # cd gperftools-2.16/ # ./configure # make # make install |
2. Snort をダウンロード、コンパイル、インストール
バージョンについては最新のものに変更してください
1 2 3 4 5 6 7 8 9 10 11 12 |
# cd ../ # wget https://github.com/snort3/snort3/archive/refs/tags/3.1.28.0.tar.gz # wget https://github.com/snort3/snort3/archive/refs/tags/3.3.7.0.tar.gz # tar xzf 3.1.28.0.tar.gz # tar xzf 3.3.7.0.tar.gz # cd snort3-3.1.28.0 # cd snort3-3.3.7.0 # ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc # cd build # export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig # make # make install |
共有ライブラリを更新
1 2 3 |
# ln -s /usr/local/lib/libtcmalloc.so.4 /lib/ # ln -s /usr/local/lib/libdaq.so.3 /lib/ # ldconfig |
バージョンを確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# snort -V ,,_ -*> Snort++ <*- o" )~ Version 3.3.7.0 '''' By Martin Roesch & The Snort Team http://snort.org/contact#team Copyright (C) 2014-2024 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using DAQ version 3.0.16 Using libpcap version 1.9.1 (with TPACKET_V3) Using LuaJIT version 2.1.0-beta3 Using LZMA version 5.2.4 Using OpenSSL 1.1.1k FIPS 25 Mar 2021 Using PCRE version 8.42 2018-03-20 Using ZLIB version 1.2.11 |
3. ネットワークインターフェースカードの設定
Snortがネットワークトラフィックをリッスンしているインタフェースをプロミスキャスモードにして、Snortに送信されたすべてのネットワークトラフィックを参照できるようにします。
1 |
# ip link set dev ens160 promisc on |
検証
1 2 3 4 5 6 |
# ip add sh ens160 2: ens160: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:0c:29:02:01:27 brd ff:ff:ff:ff:ff:ff altname enp3s0 inet 192.168.11.83/24 brd 192.168.11.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever |
インターフェイス オフロードを無効にする
まずこの機能が有効になっているかどうかを確認
1 2 3 |
# ethtool -k ens160 | grep receive-offload generic-receive-offload: on large-receive-offload: on |
GRO,LROを無効にする
1 |
# ethtool -K ens160 gro off lro off |
システムの再起動後も変更が持続するように、systemd サービスユニットを作成して有効にし、変更を反映する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# vi /etc/systemd/system/snort3-nic.service 下記内容を記述 [Unit] Description=Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/ip link set dev ens160 promisc on ExecStart=/usr/sbin/ethtool -K ens160 gro off lro off TimeoutStartSec=0 RemainAfterExit=yes [Install] WantedBy=default.target |
設定をリロードして、起動時にサービスを開始し、有効にする
1 2 |
# systemctl daemon-reload # systemctl enable --now snort3-nic.service |
4.コミュニティルールの使用
①Snort Rulesディレクトリを作成
1 |
# mkdir /usr/local/etc/rules |
➁Snort 3ダウンロードページからSnort 3コミュニティルールをダウンロード
ルールを抽出し、構成フォルダーにコピー
1 2 |
# wget -qO- https://www.snort.org/downloads/community/snort3-community-rules.tar.gz \ | tar xz -C /usr/local/etc/rules/ |
構成フォルダーの中を確認する
1 2 3 4 5 6 |
# ls -1 /usr/local/etc/rules/snort3-community-rules/ AUTHORS LICENSE sid-msg.map snort3-community.rules VRT-License.txt |
5. メイン設定ファイル編集
1 |
# vi /usr/local/etc/snort/snort.lua |
1 2 3 4 5 6 7 8 9 10 11 |
24行目: 自サーバーIPアドレスに変更 HOME_NET = '192.168.11.83/24' 28行目 : 変更 EXTERNAL_NET = '!$HOME_NET' 193行目あたり : ipsセクションの中のルールのパスを更新 variables = default_variables, rules = [[ include $RULE_PATH/snort3-community-rules/snort3-community.rules ]] |
OpenAppID インストール
Snort 3のダウンロードページからSnort OpenAppIDをダウンロードしインストール
バージョンについては最新のものに変更してください
1 2 3 |
# wget https://www.snort.org/downloads/openappid/33380 # tar -xzvf 33380 # cp -R odp /usr/local/lib/ |
snort 3設定ファイルを編集し、OpenAppIDライブラリの場所を定義
1 2 3 4 5 6 7 8 9 10 |
# vi /usr/local/etc/snort/snort.lua 98行目当たり : appidセクションに追加 appid = { -- appid requires this to use appids in rules --app_detector_dir = 'directory to load appid detectors from' app_detector_dir = '/usr/local/lib', log_stats = true, } |
Snorts ログディレクトリー作成
1 |
# mkdir /var/log/snort |
設定ファイルのチェック
1 |
# snort -T -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq -i ens160 -l /var/log/snort |
チェックの結果次のように表示されればOK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
-------------------------------------------------- o")~ Snort++ 3.3.7.0 -------------------------------------------------- Loading /usr/local/etc/snort/snort.lua: Loading snort_defaults.lua: Finished snort_defaults.lua: ssh host_cache pop so_proxy stream_tcp mms smtp gtp_inspect packets dce_http_proxy ips stream_icmp normalizer binder wizard appid js_norm file_id http2_inspect http_inspect stream_udp daq ftp_data ftp_server port_scan dce_http_server dce_tcp dce_smb iec104 cip telnet ssl sip rpc_decode netflow modbus host_tracker stream_user stream_ip trace back_orifice classifications dnp3 active ftp_client alerts decode search_engine stream network references arp_spoof output hosts process dns dce_udp imap file_policy s7commplus stream_file Finished /usr/local/etc/snort/snort.lua: Loading file_id.rules_file: Loading file_magic.rules: Finished file_magic.rules: Finished file_id.rules_file: Loading ips.rules: Loading ../rules/snort3-community-rules/snort3-community.rules: Finished ../rules/snort3-community-rules/snort3-community.rules: Finished ips.rules: -------------------------------------------------- pcre counts pcre_rules: 1081 pcre_native: 1081 -------------------------------------------------- ips policies rule stats id loaded shared enabled file 0 4236 0 4236 /usr/local/etc/snort/snort.lua -------------------------------------------------- rule counts total rules loaded: 4236 text rules: 4236 option chains: 4236 chain headers: 324 flowbits: 48 flowbits not checked: 23 -------------------------------------------------- port rule counts tcp udp icmp ip any 472 58 147 22 src 169 15 0 0 dst 775 150 0 0 both 6 11 0 0 total 1422 234 147 22 -------------------------------------------------- service rule counts to-srv to-cli dcerpc: 72 20 dhcp: 2 2 dns: 28 7 file_id: 219 219 ftp: 90 4 ftp-data: 1 94 http: 2084 253 http2: 2084 253 http3: 2084 253 imap: 35 115 irc: 5 2 kerberos: 3 0 ldap: 0 1 mysql: 3 0 netbios-dgm: 1 1 netbios-ns: 4 3 netbios-ssn: 69 17 nntp: 2 0 pop3: 23 115 rdp: 5 0 sip: 5 5 smtp: 129 2 snmp: 18 7 ssdp: 3 0 ssl: 20 42 sunrpc: 68 4 telnet: 12 6 tftp: 1 0 wins: 1 0 total: 7071 1425 -------------------------------------------------- fast pattern groups src: 114 dst: 312 any: 8 to_server: 69 to_client: 48 -------------------------------------------------- search engine (ac_bnfa) fast pattern only: 7097 appid: MaxRss diff: 227424 appid: patterns loaded: 11537 -------------------------------------------------- pcap DAQ configured to passive. Snort successfully validated the configuration (with 0 warnings). o")~ Snort exiting |
6. カスタムローカルルールを作成
1 2 3 |
# vi /usr/local/etc/rules/local.rules alert icmp any any -> $HOME_NET any (msg:"ICMP connection test"; sid:1000001; rev:1;) |
7. 設定の検証
パラメーター -T を使用して構成をテストし、テスト・モードを使用可能にします
1 |
# snort -T -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules --daq-dir /usr/local/lib/daq -i ens160 -l /var/log/snort |
次に、以下のコマンドを実行してテストを実行する
1 |
# snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules --daq-dir /usr/local/lib/daq -i ens160 -l /var/log/snort -A alert_fast -s 65535 -k none |
同じローカルネットワーク内の別のPCから本サーバーにpingを実行すると、下記のように本サーバーコンソール画面ににアラート行が書き出される
1 2 3 4 5 6 7 8 9 10 |
Commencing packet processing ++ [0] ens160 10/15-13:08:28.802938 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:08:28.803041 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 10/15-13:08:29.804054 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:08:29.804116 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 10/15-13:08:30.806895 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:08:30.806966 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 10/15-13:08:31.811418 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:08:31.811476 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 |
ログファイルに書き込む設定
1 2 3 4 5 6 7 8 |
# vi /usr/local/etc/snort/snort.lua 258行目当たり-- 7. configure outputsセクションの中に下記追加 alert_fast = { file = true, packet = false, limit = 10, } |
構文チェックを実行
1 |
# snort -c /usr/local/etc/snort/snort.lua --daq-dir /usr/local/lib/daq |
今度は、-A alert_fastというオプションはつけずに、-l /var/log/snortというログ・ディレクトリを指定するオプションをつけ実行する
1 |
# snort -c /usr/local/etc/snort/snort.lua -R /usr/local/etc/rules/local.rules --daq-dir /usr/local/lib/daq -i ens160 -s 65535 -k none -l /var/log/snort/ |
l別のPCからpingを実行するとlogsディレクトリをチェックすると、alert_fast.txtファイルが作成されている
1 2 3 4 5 6 7 8 9 10 |
# tail -f /var/log/snort/alert_fast.txt 10/15-13:12:46.124370 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:12:46.124449 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 10/15-13:12:47.123470 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:12:47.123543 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 10/15-13:12:48.126071 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:12:48.126173 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 10/15-13:12:49.129393 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.100 -> 192.168.11.83 10/15-13:12:49.129478 [**] [1:1000001:1] "ICMP connection test" [**] [Priority: 0] [AppID: ICMP] {ICMP} 192.168.11.83 -> 192.168.11.100 |
snort.luaにローカルルールを含める
1 2 3 4 5 6 7 |
# vi /usr/local/etc/snort/snort.lua 198行目あたりipsセクションの中に追加 rules = [[ include $RULE_PATH/snort3-community-rules/snort3-community.rules include $RULE_PATH/local.rules ]] |
8. Snort用のユーザー作成
Snort用の非ログイン システム ユーザー アカウントを作成
1 |
# useradd -r -s /usr/sbin/nologin -M -c SNORT_IDS snort |
9. Snort用のsystemdサービスユニットを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vi /etc/systemd/system/snort3.service 下記内容を記述 [Unit] Description=Snort Daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/snort --daq-dir /usr/local/lib/daq -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -D -i ens160 -m 0x1b -u snort -g snort ExecStop=/bin/kill -9 $MAINPID [Install] WantedBy=multi-user.target |
systemdの設定をリロードする
1 |
# systemctl daemon-reload |
ログファイルの所有権とパーミッションを設定
1 2 |
# chmod -R 5775 /var/log/snort # chown -R snort:snort /var/log/snort |
システム起動時にSnortを起動し、実行できるようにする
1 2 |
# systemctl enable --now snort3 Created symlink /etc/systemd/system/multi-user.target.wants/snort3.service → /etc/systemd/system/snort3.service. |
ステータスチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# systemctl status snort3 ● snort3.service - Snort Daemon Loaded: loaded (/etc/systemd/system/snort3.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2024-10-15 13:17:00 JST; 9s ago Main PID: 95855 (snort3) Tasks: 2 (limit: 16915) Memory: 273.2M CGroup: /system.slice/snort3.service └─95855 /usr/local/bin/snort --daq-dir /usr/local/lib/daq -c /usr/local/etc/snort/snort.lua -s 65535 -k none -l /var/log/snort -> Oct 15 13:17:00 Lepard snort[95855]: -------------------------------------------------- Oct 15 13:17:00 Lepard snort[95855]: search engine (ac_bnfa) Oct 15 13:17:00 Lepard snort[95855]: instances: 334 Oct 15 13:17:00 Lepard snort[95855]: patterns: 10776 Oct 15 13:17:00 Lepard snort[95855]: pattern chars: 175132 Oct 15 13:17:00 Lepard snort[95855]: num states: 123161 Oct 15 13:17:00 Lepard snort[95855]: num match states: 10496 Oct 15 13:17:00 Lepard snort[95855]: memory scale: MB Oct 15 13:17:00 Lepard snort[95855]: total memory: 3.67905 Oct 15 13:17:00 Lepard snort[95855]: pattern memory: 0.577772 |