Contents
1.SNORTインストール
Snortは、IPネットワーク上でリアルタイムのトラフィック分析とパケットロギングを実行できるオープンソースのネットワーク侵入検知システムです。
「プロトコル分析」「コンテンツ検索」「マッチング」を実行でき、「バッファオーバーフロー」「ステルスポートスキャン」「CGI攻撃」「SMBプローブ」「OSフィンガープリント試行」「セマンティックURL攻撃」「サーバメッセージブロック探査」など、さまざまな攻撃検出に使用できます。
1.1 インストール
①必要なライブラリーインストール
1 |
# apt install -y gcc libpcre3-dev zlib1g-dev libluajit-5.1-dev libpcap-dev openssl libssl-dev libnghttp2-dev libdumbnet-dev bison flex libdnet autoconf libtool |
②作業ディレクトリー作成
1 2 |
# mkdir /usr/src/snort_src # cd /usr/src/snort_src |
③Daqダウンロード、インストール
Snort Webサイトから、wgetコマンドを使用して最新のDAQソースパッケージをダウンロードします。 新しいソースが利用可能な場合は、コマンドのバージョン番号を置き換えてください
https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
1 2 3 4 5 6 |
# wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz # tar -xvzf daq-2.0.7.tar.gz # cd daq-2.0.7 # autoreconf # ./configure && make && make install # cd ../ |
④SNORTのダウンロード、インストール
1 2 3 4 5 6 |
# wget https://www.snort.org/downloads/snort/snort-2.9.19.tar.gz # tar -xvzf snort-2.9.19.tar.gz # cd snort-2.9.19 # ./configure --enable-sourcefire && make && make install # ldconfig # ln -s /usr/local/bin/snort /usr/sbin/snort |
1.2 ユーザーとフォルダー構造の設定
ルートアクセスなしでSnort を安全に実行するには、新しい特権のないユーザーと、デーモンを実行するための新しいユーザーグループを作成する必要があります
1 2 3 4 5 6 7 8 9 10 11 12 |
# groupadd snort # useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort # mkdir -p /etc/snort/rules # mkdir /var/log/snort # mkdir /usr/local/lib/snort_dynamicrules # mkdir /etc/snort/preproc_rules # chmod -R 5775 /etc/snort # chmod -R 5775 /var/log/snort # chmod -R 5775 /usr/local/lib/snort_dynamicrules # chown -R snort:snort /etc/snort # chown -R snort:snort /var/log/snort # chown -R snort:snort /usr/local/lib/snort_dynamicrules |
下記ファイル作成
1 2 3 |
# touch /etc/snort/rules/white_list.rules # touch /etc/snort/rules/black_list.rules # touch /etc/snort/rules/local.rules |
1.3 設定ファイルのセットアップ
すべてのファイルを構成ディレクトリにコピーします。
1 2 |
# cp /usr/src/snort_src/snort*/etc/*.conf* /etc/snort # cp /usr/src/snort_src/snort*/etc/*.map /etc/snort |
1.4 コミュニティルールの使用
自由に利用できるコミュニティルールを取得する。
①コミュニティルールを取得し、構成フォルダにコピー
1 2 3 |
# wget https://www.snort.org/rules/community -O ~/community.tar.gz # tar -xvf ~/community.tar.gz -C ~/ # cp ~/community-rules/* /etc/snort/rules |
②不要な行を一括してコメントアウト
1 |
# sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf |
1.5 登録済みユーザールールの取得
ウェブサイトに無料で登録することで、登録ユーザールールセットをダウンロードできるOinkコードにアクセスできます。
①Oinkcodeを取得
Snort 公式サイトでユーザー登録を行い、コミュニティルール取得に必要なOinkcodeを取得する
最新ルールファイルをダウンロードする為に、Snort の公式でユーザー登録をします。
「Email」、「Passsword」、「Password confirmation」を入力とその他項目をチェックし、「Sign up」をクリック
「Sign up」が成功すると、登録したメールアドレスに下記のメールが届く、本文のリンクをクリック
「Oinkcodes」をクリックし、「Oinkcode」を別に保存しておく
②登録済みユーザールールをダウンロード
下記の「oinkcode」の箇所を上記で取得したコードに置き換える
1 |
# wget https://www.snort.org/rules/snortrules-snapshot-29181.tar.gz?oinkcode= oinkcode -O ~/registered.tar.gz |
③構成ディレクトリにルールを抽出
1 |
# tar -xvf ~/registered.tar.gz -C /etc/snort |
1.6 ネットワーク・セットおよびルール・セットの構成
①snort.conf を編集
1 |
# vi /etc/snort/snort.conf |
編集内容
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 |
45行目 192.168.11.0/24は自サーバーの環境に合わす # Setup the network addresses you are protecting ipvar HOME_NET 192.168.11.0/24 48行目 # Set up the external network addresses. Leave as "any" in most situations ipvar EXTERNAL_NET !$HOME_NET 104-106行目コメントアウトにして下記追記 # Path to your rules files (this can be a relative path) #var RULE_PATH ../rules #var SO_RULE_PATH ../so_rules #var PREPROC_RULE_PATH ../preproc_rules var RULE_PATH /etc/snort/rules var SO_RULE_PATH /etc/snort/so_rules var PREPROC_RULE_PATH /etc/snort/preproc_rules 115,116行目コメントアウトにして下記追記 # Set the absolute path appropriately #var WHITE_LIST_PATH ../rules #var BLACK_LIST_PATH ../rules var WHITE_LIST_PATH /etc/snort/rules var BLACK_LIST_PATH /etc/snort/rules Step #6 まで下にスクロールし、次のように snort.log のファイル名でログに記録するように unified2 の出力を設定します。 526行目あたり追記 # unified2 # Recommended for most installs # output unified2: filename merged.log, limit 128, nostamp, mpls_event_types , vlan_event_types output unified2: filename snort.log, limit 128 最後に、ファイルの一番下までスクロールして、含まれているルール セットの一覧を見つけます。Snort がカスタム ルールを読み込むようにするには、local.rules のコメントを解除する必要があります。 550行目あたり include $RULE_PATH/local.rules コミュニティ ルールを使用している場合は、local.rules 行のすぐ下に追加します。 include $RULE_PATH/community.rules |
パラメーター -T を使用して構成をテストし、テスト・モードを使用可能にします
1 |
# snort -T -c /etc/snort/rules/snort.conf |
「ファイルが見つからない」というエラーが出た場合、エラーが出るファイルを/etc/snort/rulesにコピーする
当方の場合次のファイルエラーが出た
1 2 3 4 |
# cp /usr/src/snort_src/snort-2.9.19/etc/classification.config /etc/snort/rules # cp /usr/src/snort_src/snort-2.9.19/etc/reference.config /etc/snort/rules # cp /usr/src/snort_src/snort-2.9.19/etc/threshold.conf /etc/snort/rules # cp /usr/src/snort_src/snort-2.9.19/etc/unicode.map /etc/snort/rules/ |
invalidエラーが出た場合次のようにする
1 2 3 4 5 |
# vi /etc/snort/rules/snort.conf 321~322行目を次のように変更 #decompress_swf {deflate lzma} \ decompress_swf {deflate} \ decompress_pdf {deflate} |
再度
1 |
# snort -T -c /etc/snort/rules/snort.conf |
実行すると次の例のようなメッセージが表示されます
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 |
--== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.9.19 GRE (Build 85) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2021 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.10.0 (with TPACKET_V3) Using PCRE version: 8.39 2016-06-14 Using ZLIB version: 1.2.11 Rules Engine: SF_SNORT_DETECTION_ENGINE Version 3.2 <Build 1> Preprocessor Object: SF_IMAP Version 1.0 <Build 1> Preprocessor Object: SF_SDF Version 1.1 <Build 1> Preprocessor Object: SF_SSLPP Version 1.1 <Build 4> Preprocessor Object: SF_MODBUS Version 1.1 <Build 1> Preprocessor Object: SF_REPUTATION Version 1.1 <Build 1> Preprocessor Object: SF_DNS Version 1.1 <Build 4> Preprocessor Object: SF_DCERPC2 Version 1.0 <Build 3> Preprocessor Object: SF_S7COMMPLUS Version 1.0 <Build 1> Preprocessor Object: SF_DNP3 Version 1.1 <Build 1> Preprocessor Object: SF_SIP Version 1.1 <Build 1> Preprocessor Object: SF_SSH Version 1.1 <Build 3> Preprocessor Object: SF_POP Version 1.0 <Build 1> Preprocessor Object: appid Version 1.1 <Build 5> Preprocessor Object: SF_FTPTELNET Version 1.2 <Build 13> Preprocessor Object: SF_SMTP Version 1.1 <Build 9> Preprocessor Object: SF_GTP Version 1.1 <Build 1> Total snort Fixed Memory Cost - MaxRss:838892 Snort successfully validated the configuration! Snort exiting |
1.7 構成のテスト
Snort が意図したとおりにアラートをログに記録しているかどうかをテストするには、着信 ICMP 接続に関するカスタム検出ルールアラートを local.rules ファイルに追加します
1 2 3 |
# vi /etc/snort/rules/local.rules 最終行に下記を追記 alert icmp any any -> $HOME_NET any (msg:"ICMP test"; sid:10000001; rev:001;) |
テスト実行
1 |
# snort -A console -i eno1 -u snort -g snort -c /etc/snort/snort.conf |
「eno1」は各自のネットワークインターフェイスに書き換える。
ターミナルをこの状態のままにして、同じネットワーク上にある他のPC(Windows等)からPingを本サーバーに実行すると、Snort を実行しているターミナルに ICMP 呼び出しごとに次のような通知が表示されます
1 2 3 4 5 6 7 8 9 |
Commencing packet processing (pid=32562) 05/30-19:12:23.196891 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.20 -> 192.168.11.83 05/30-19:12:23.196923 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.83 -> 192.168.11.20 05/30-19:12:24.205069 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.20 -> 192.168.11.83 05/30-19:12:24.205090 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.83 -> 192.168.11.20 05/30-19:12:25.211122 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.20 -> 192.168.11.83 05/30-19:12:25.211191 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.83 -> 192.168.11.20 05/30-19:12:26.225269 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.20 -> 192.168.11.83 05/30-19:12:26.225324 [**] [1:10000001:1] ICMP test [**] [Priority: 0] {ICMP} 192.168.11.83 -> 192.168.11.20 |
1 |
# snort -r /var/log/snort/snort.log.<id_number> |
1.8 バックグラウンドで Snortを実行
サービスとしてSnort を実行するため、Snort のスタートアップスクリプトを新規追加する
1 |
# vi /lib/systemd/system/snort.service |
「eno1」は各自環境に合わす
1 2 3 4 5 6 7 8 9 10 |
[Unit] Description=Snort NIDS Daemon After=syslog.target network.target [Service] Type=simple ExecStart=/usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i eno1 [Install] WantedBy=multi-user.target |
1 2 |
# systemctl daemon-reload # systemctl start snort |
2.Tripwireインストール
クラッカーによるLinuxサーバーのファイルの改竄を検知するシステムを導入する。
今回は、ファイル改竄検知システムにホスト型IDS(IDS=Intrusion Detection System)のTripwireを導入する。
Tripwireは、導入時のファイル状態をデータベース化し、そのデータベースとファイルの現状を比較することにより、ファイルの追加/変更/削除を検知する。
2.1 インストールと構成
1 |
# apt install tripwire |
Tripwire は、「tw.cfg」tripwire構成ファイルと 「tw.pol」tripwireポリシーファイルをセキュリティで保護するためにサイトパスフレーズを必要とします。指定されたパスフレーズを使用して両方のファイルを暗号化します。 サイトパスフレーズは、単一インスタンスのtripwireに対しても必要です。
②ローカルキーパスフレーズ
tripwireデータベースとレポートファイルの保護にはローカルパスフレーズが必要です。tripwireベースラインデータベースの不正な変更を避けるためにtripwireが使用するローカルキー。
③tripwire構成パス
tripwireの設定は /etc/tripwire/twcfg.txt ファイルに保存されています。暗号化された構成ファイル tw.cfg を生成するために使用されます。
④tripwire ポリシー パス
tripwireは/etc/tripwire/twpol.txtファイルにポリシーを保存します。これは、tripwire で使用される暗号化されたポリシー ファイル tw.pol の生成に使用されます。
⑤サイトキーパスフレーズの入力
再度サイトキーパスフレーズの入力を求められる
⑥ローカールキーパスフレーズの入力
⑦再度ローカールキーパスフレーズの入力を求められる
⑧インストールが進み完了します
2.2 構成ファイルの設定
①トリップワイヤ構成ファイル (twcfg.txt)
トリップワイヤ構成ファイル (twcfg.txt) の詳細を以下の通りです。暗号化されたポリシー ファイル (tw.pol)、サイトキー (site.key)、およびローカルキー (ホスト名ローカル.key) などのパスは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ROOT =/usr/sbin 実行ファイル POLFILE =/etc/tripwire/tw.pol DBFILE =/var/lib/tripwire/$(HOSTNAME).twd データベースファイル REPORTFILE =/var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr SITEKEYFILE =/etc/tripwire/site.key LOCALKEYFILE =/etc/tripwire/$(HOSTNAME)-local.key EDITOR =/usr/bin/editor LATEPROMPTING =false LOOSEDIRECTORYCHECKING =false MAILNOVIOLATIONS =true EMAILREPORTLEVEL =3 REPORTLEVEL =3 SYSLOGREPORTING =true MAILMETHOD =SMTP SMTPHOST =localhost SMTPPORT =25 TEMPDIRECTORY =/tmp |
2.3 キーの作成やデータベース作成等の初期設定
①twcfg.txt編集
1 2 3 4 5 6 7 8 |
# cd /etc/tripwire # vi twcfg.txt 9 行目あたり 行頭に「#」を追加し、その下の行に「LOOSEDIRECTORYCHECKING =true」を追加 #LOOSEDIRECTORYCHECKING =false LOOSEDIRECTORYCHECKING =true 12行目:必要に応じて変更 (レポートレベル : 4 が最大) REPORTLEVEL =4 |
1 2 3 |
# twadmin -m F -c tw.cfg -S site.key twcfg.txt Please enter your site passphrase: <サイトキーパスフレーズ> Wrote configuration file: /etc/tripwire/tw.cfg |
次のポリシー最適化スクリプトを利用し、ポリシーを最適化する
1 |
# vi twpolmake.pl |
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 |
#!/usr/bin/perl $POLFILE=$ARGV[0]; open(POL,"$POLFILE") or die "open error: $POLFILE" ; my($myhost,$thost) ; my($sharp,$tpath,$cond) ; my($INRULE) = 0 ; while (<POL>) { chomp; if (($thost) = /^HOSTNAME\s*=\s*(.*)\s*;/) { $myhost = `hostname` ; chomp($myhost) ; if ($thost ne $myhost) { $_="HOSTNAME=\"$myhost\";" ; } } elsif ( /^{/ ) { $INRULE=1 ; } elsif ( /^}/ ) { $INRULE=0 ; } elsif ($INRULE == 1 and ($sharp,$tpath,$cond) = /^(\s*\#?\s*)(\/\S+)\b(\s+->\s+.+)$/) { $ret = ($sharp =~ s/\#//g) ; if ($tpath eq '/sbin/e2fsadm' ) { $cond =~ s/;\s+(tune2fs.*)$/; \#$1/ ; } if (! -s $tpath) { $_ = "$sharp#$tpath$cond" if ($ret == 0) ; } else { $_ = "$sharp$tpath$cond" ; } } print "$_\n" ; } close(POL) ; |
1 2 3 4 |
# perl twpolmake.pl twpol.txt > twpol.txt.new # twadmin -m P -c tw.cfg -p tw.pol -S site.key twpol.txt.new Please enter your site passphrase: <サイトキーパスフレーズ> Wrote policy file: /etc/tripwire/tw.pol# echo ! "/var/lib/tripwire/`hostname`.twd ;" >> /etc/tripwire/twpol.txt.new ← Tripwireデータベース自体をチェック対象外にする |
1 2 |
# tripwire -m i -s -c tw.cfg Please enter your local passphrase: <ローカールキーパスフレーズ> |
1 2 |
# tripwire -m i -c tw.cfg --verbose Please enter your local passphrase: <ローカールキーパスフレーズ> |
1 2 |
# chmod -R 5775 <止まるファイルを絶対パスで指定> # chown -R snort:snort <止まるファイルを絶対パスで指定> |
/etc/snort/etc
/etc/snort/preproc_rules
/etc/snort/rules
/etc/snort/so_rules
/root/community-rules
上記ファイルに所有権と、権限を与えた後、再度次を実行
1 2 |
# tripwire -m i -s -c tw.cfg Please enter your local passphrase: <ローカールキーパスフレーズ> |
2.4 チェックを実行
1 |
# echo test > /root/test.txt |
1 |
# tripwire -m c -s -c /etc/tripwire/tw.cfg |
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 |
Open Source Tripwire(R) 2.4.3.7 Integrity Check Report Report generated by: root Report created on: 2022年05月30日 20時04分34秒 Database last updated on: Never ============================================================ Report Summary: ============================================================ Host name: debian Host IP address: 127.0.1.1 Host ID: None Policy file used: /etc/tripwire/tw.pol Configuration file used: /etc/tripwire/tw.cfg Database file used: /var/lib/tripwire/debian.twd Command line used: tripwire -m c -s -c /etc/tripwire/tw.cfg ============================================================ Rule Summary: ============================================================ ------------------------------------------------------------------------------- Section: Unix File System ------------------------------------------------------------------------------- Rule Name Severity Level Added Removed Modified --------- -------------- ----- ------- -------- Other binaries 66 0 0 0 Tripwire Binaries 100 0 0 0 Other libraries 66 0 0 0 Root file-system executables 100 0 0 0 Tripwire Data Files 100 0 0 0 System boot changes 100 0 0 0 Root file-system libraries 100 0 0 0 (/lib) Critical system boot files 100 0 0 0 Other configuration files 66 0 0 0 (/etc) Boot Scripts 100 0 0 0 Security Control 66 0 0 0 * Root config files 100 1 0 0 Devices & Kernel information 100 0 0 0 (/dev) Invariant Directories 66 0 0 0 Total objects scanned: 32064 Total violations found: 1 ============================================================ Object Summary: ============================================================ ------------------------------------------------------------------------------- # Section: Unix File System ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- Rule Name: Root config files (/root) Severity Level: 100 ------------------------------------------------------------------------------- Added: "/root/test.txt" ============================================================ Error Report: ============================================================ No Errors ------------------------------------------------------------------------------- *** End of report *** Open Source Tripwire 2.4 Portions copyright 2000-2018 Tripwire, Inc. Tripwire is a registered trademark of Tripwire, Inc. This software comes with ABSOLUTELY NO WARRANTY; for details use --version. This is free software which may be redistributed or modified only under certain conditions; see COPYING for details. All rights reserved. |
1 |
# rm -f /root/test.txt |
2.5 Tripwire 自動実行
①自動実行スクリプト(tripwire.sh)を作成し、自動実行させる
1 2 |
# cd /opt/script # vi tripwire.sh |
自動実行スクリプト(tripwire.sh)の内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash PATH=/usr/sbin:/usr/bin:/bin:/usr/local/tripwire/sbin # パスフレーズ設定 LOCALPASS=xxxxxxxx # ローカルキーパスフレーズ SITEPASS=xxxxxxxx # サイトキーパスフレーズ cd /etc/tripwire # Tripwireチェック実行 tripwire -m c -s -c tw.cfg|mail -s "Tripwire(R) Integrity Check Report in `hostname`" root # ポリシーファイル最新化 twadmin -m p -c tw.cfg -p tw.pol -S site.key > twpol.txt perl twpolmake.pl twpol.txt > twpol.txt.new twadmin -m P -c tw.cfg -p tw.pol -S site.key -Q $SITEPASS twpol.txt.new > /dev/null rm -f twpol.txt* *.bak # データベース最新化 rm -f /usr/local/tripwire/lib/tripwire/*.twd* tripwire -m i -s -c tw.cfg -P $LOCALPASS |
1 2 3 |
# chmod 700 tripwire.sh # crontab -e 0 5 * * * /opt/script/tripwire.sh |
参考: メールで結果報告用スクリプト
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 |
#!/bin/bash PATH=/usr/sbin:/usr/bin:/bin:/usr/local/tripwire/sbin # パスフレーズ設定 LOCALPASS=xxxxx # ローカルキーパスフレーズ SITEPASS=xxxxx # サイトキーパスフレーズ #通知先メールアドレス指定 MAIL="<your mailaddress> " cd /etc/tripwire # Tripwireチェック実行 tripwire -m c -s -c tw.cfg|mail -s "Tripwire(R) Integrity Check Report in `hostname`" $MAIL # ポリシーファイル最新化 twadmin -m p -c tw.cfg -p tw.pol -S site.key > twpol.txt perl twpolmake.pl twpol.txt > twpol.txt.new twadmin -m P -c tw.cfg -p tw.pol -S site.key -Q $SITEPASS twpol.txt.new > /dev/null rm -f twpol.txt* *.bak # データベース最新化 rm -f /usr/local/tripwire/lib/tripwire/*.twd* tripwire -m i -s -c tw.cfg -P $LOCALPASS |