Linux 上搭建 Snort+BASE 入侵檢測系統
阿新 • • 發佈:2020-05-05
## 配置實驗環境
由於本人電腦的儲存空間不足,無法再承擔安裝一個虛擬機器的開銷,因此在阿里雲上申請了一個雲伺服器進行本次實驗。
伺服器配置如下:
* 1 核 - 2GB 記憶體 - 40GB 系統盤
* 作業系統:Ubuntu 18.04
![aliyun](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpxahtpmj30k909k407.jpg)
## 修改 Ubuntu 源
檢視 /etc/apt/sources.list 發現已經配置好了阿里源,故不再做修改。如有需要,可自行改為阿里源或清華源,提高安裝包下載速度。
![aliyuan](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpxla7epj30k708i0ur.jpg)
## 安裝 Lamp
1. **安裝 Apache 2 Web 伺服器**
```bash
sudo apt install apache2 -y
```
2. **安裝 MySQL 資料庫,並進行保護**
```shell
sudo apt install mysql-server libmysqlclient-dev mysql-client autoconf libtool -y
sudo mysql_secure_installation
```
3. **安裝 PHP 超文字前處理器**
```shell
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update -y
sudo apt-get install -y libapache2-mod-php5.6 php5.6 php5.6-common php5.6-gd php5.6-cli php5.6-xml php5.6-mysql
sudo apt-get install -y php-pear libphp-adodb
```
執行第一句命令時報了 sudo: add-apt-repository: command not found 錯誤,查閱資料後得知需要先安裝 software-properties-common(如下),然後再執行以上命令。
```shell
sudo apt-get install software-properties-common
```
最後,重新啟動 Apache Web 伺服器。
```shell
sudo systemctl restart apache2
```
4. **測試 PHP**
在 /var/www/html 中建立一個名為 info.php 的新檔案,寫入如下內容,儲存並退出。
```php
```
現在瀏覽 http://localhost/info.php ,可以看到 PHP 資訊頁面,說明 PHP 工作正常。
![php](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpxt8sbqj30sg0lywie.jpg)
## 安裝 Snort
1. **安裝 DAQ,解壓編譯**
```shell
tar -xvzf daq-2.0.6.tar.gz
cd daq-2.0.6
./configure
sudo make & make install
```
然而 ./configure 命令並沒有成功生成 Makefile 檔案,檢查輸出的資訊發現如下錯誤:
![flex_bison](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpxx07rjj30k8042t9g.jpg)
意思是缺少一些依賴,於是先安裝 flex 和 bison。
```shell
sudo apt-get install flex
sudo apt-get install bison
```
再次執行 ./configure,又提示 libpcap 版本太低:
![libpcap](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpy0ovr9j30k703laah.jpg)
重新安裝 libpcap。
```shell
sudo apt-get install libpcap-dev
```
此時再執行最開始的命令,DAQ 編譯成功。
2. **安裝 Snort,解壓編譯**
```shell
tar -xvzf snort-2.9.12.tar.gz
cd snort-2.9.12
./configure --enable-sourcefire
sudo make & make install
```
執行 ./configure 的過程中同樣因為缺少一些依賴庫而報錯,需要安裝 libpcre、dumbnet、luajit、libnghttp。
```shell
sudo apt-get install libpcre3-dev
sudo apt-get install libdumbnet-dev
sudo apt-get install liblua5.2-dev
sudo apt-get install libnghttp2-dev
```
最後修復連結。
```shell
sudo ldconfig
```
3. **測試 Snort 是否安裝成功**
```shell
snort -V
```
![snort](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpy4gr2nj30k705njsi.jpg)
4. **配置使用者和目錄**
建立使用者和使用者組:
```shell
sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort
```
建立Snort目錄:
```shell
sudo mkdir /etc/snort
sudo mkdir /etc/snort/rules
sudo mkdir /etc/snort/rules/iplists
sudo mkdir /etc/snort/preproc_rules
sudo mkdir /usr/local/lib/snort_dynamicrules
sudo mkdir /etc/snort/so_rules
```
建立檔案來儲存規則:
```shell
sudo touch /etc/snort/rules/iplists/black_list.rules
sudo touch /etc/snort/rules/iplists/white_list.rules
sudo touch /etc/snort/rules/local.rules
```
建立日誌目錄:
```shell
sudo mkdir /var/log/snort
sudo mkdir /var/log/snort/archived_logs
```
修改檔案許可權:
```shell
sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort/so_rules
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
```
修改檔案的歸屬使用者:
```shell
sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules
```
複製配置檔案:
```shell
cd /opt/snort-2.9.12/etc/
sudo cp *.conf* /etc/snort
sudo cp *.map /etc/snort
sudo cp *.dtd /etc/snort
cd /opt/snort-2.9.12/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/
sudo cp * /usr/local/lib/snort_dynamicpreprocessor/
```
5. **修改配置檔案**
```shell
sudo vi /etc/snort/snort.conf
```
```shell
# ipvar HOME_NET 修改為本機的內部網路
ipvar HOME_NET 172.25.45.23/18
# 設定以下配置檔案路徑
var RULE_PATH /etc/snort/rules
SO_RULE_PATH /etc/snort/so_rules
PREPROC_RULE_PATH /etc/snort/preproc_rules
WHITE_LIST_PATH /etc/snort/rules/iplists
BLACK_LIST_PATH /etc/snort/rules/iplists
# 在 output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types 之後新增
output unified2: filename snort.u2, limit 128
# 啟用 local.rules 檔案,其後的 include 檔案均註釋掉
include $RULE_PATH/local.rules
```
6. **新增規則**
```shell
tar -xzf community-rules.tar.gz
cp community-rules/* /etc/snort/rules/
```
檢查規則。
```shell
snort -T -c /etc/snort/snort.conf
```
![6檢查規則](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpy88g97j30o70gnjve.jpg)
在規則中新增一條對 ICMP 包的規則,以便測試。
```shell
sudo vi /etc/snort/rules/local.rules
```
```shell
alert icmp any any -> $HOME_NET any (msg:"ICMP Test detected!!!"; classtype:icmp-event; sid:10000001; rev:001; GID:1; )
```
設定 sid 對應資訊,新增 sid-msg 檔案。
```shell
sudo touch /etc/snort/sid-msg.map
sudo vi /etc/snort/sid-msg.map
```
```shell
1 || 10000001 || 001 || icmp-event || 0 || ICMP Test detected || url,tools.ietf.org/html/rfc792
```
7. **測試配置檔案和功能**
```shell
sudo snort -T -c /etc/snort/snort.conf -i eth0
sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
```
關閉防火牆。
```shell
ufw disable
```
此時用本機 ping 伺服器網口 eth0 的 IP,可以看到伺服器上 Snort 在控制檯打印出 alert 告警,說明新增的 ICMP 規則已生效。
![test_icmp](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpye8zifj30td0mh132.jpg)
## 安裝 Barnyard2
1. **安裝 Barnyard2,解壓編譯**
```shell
tar zxvf barnyard2-2-1.13.tar.gz
cd barnyard2-2-1.13
autoreconf -fvi -I ./
./configure --with-mysql --with-mysql-libraries=/usr/lib/x86_64-linux-gnu
sudo make & make install
```
這裡 make 時發生錯誤:
![barnyard2_error](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpyh1loyj30k905kab1.jpg)
意思是 spo_alert_fwsam.c 中存在 SOCKET 型別的重複定義。查閱大量資料後得知,這是原始碼中的 bug,在 GitHub 上已經有人給出瞭解決辦法:將該檔案中所有的 `SOCKET` 替換為 `BARNYARD2_SOCKET`。具體可參考 https://github.com/Gerjo/barnyard2/commit/cc53c5573ba016489518bcda69ca64ca7acee2e8#diff-c1f3b2342b04cc7ae2df530b1a871cbeL122
然後重新執行上述指令,編譯成功。
2. **測試**
```shell
barnyard2 -V
```
![barnyard2](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpyuotpvj30k903hq3j.jpg)
3. **設定配置檔案**
```shell
sudo cp /opt/barnyard2-2-1.13/etc/barnyard2.conf /etc/snort/
sudo mkdir /var/log/barnyard2
sudo chown snort.snort /var/log/barnyard2
sudo touch /var/log/snort/barnyard2.waldo
sudo chown snort.snort /var/log/snort/barnyard2.waldo
```
4. **配置資料庫**
```shell
mysql -u root -p
```
```mysql
mysql> create database snort;
mysql> use snort;
mysql> source /opt/barnyard2-2-1.13/schemas/create_mysql;
mysql> CREATE USER 'snort'@'localhost' IDENTIFIED BY '123456';
mysql> grant create, insert, select, delete, update on snort.* to 'snort'@'localhost';
mysql> exit;
```
5. **新增資料庫配置**
```shell
sudo vi /etc/snort/barnyard2.conf
```
在末尾新增資料庫配置:
```shell
output database: log, mysql, user=snort password=123456 dbname=snort host=localhost sensor name=sensor01
```
修改 barnyard2.conf 的許可權,防止被修改。
```shell
sudo chmod 644 /etc/snort/barnyard2.conf
```
6. **測試**
啟動 MySQL。
```shell
service mysql start
```
開啟 Snort,並向 eth0 傳送 ping 資料包。
```shell
sudo snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
```
開啟 Barnyard2,將日誌資訊存入資料庫。
* **連續處理模式,設定 barnyard2.waldo 為書籤**
```shell
sudo barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -w /var/log/snort/barnyard2.waldo -g snort -u snort
```
控制檯打印出剛才 ping 的記錄。
![連續](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpz0pvghj30q80abtb9.jpg)
/var/log/snort 目錄下也生成了相應的日誌檔案。
![連續log](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpz3kjhoj30k502i74x.jpg)
* **檔案處理模式,處理單個日誌檔案**
```shell
sudo barnyard2 -c /etc/snort/barnyard2.conf -o /var/log/snort/snort.u2.1588583079
```
這裡選擇其中一個日誌檔案進行處理,同樣可以看到剛才的記錄。
![單個](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpz5zzi4j30qh0lo0wo.jpg)
再檢視一下資料庫條目數量,有所增加。
```shell
mysql -u snort -p -D snort -e "select count(*) from event"
```
![mysql數量](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpz9mr79j30jp03zt92.jpg)
## 安裝 BASE
1. **安裝 ADOdb**
```shell
sudo tar zxvf adodb-5.20.14.tar.gz -C /var/www/html
sudo mv /var/www/html/adodb5 /var/www/html/adodb
```
2. **安裝 BASE**
```shell
sudo tar zxvf base-1.4.5.tar.gz -C /var/www/html
sudo mv /var/www/html/base-1.4.5 /var/www/html/base
sudo /etc/init.d/apache2 restart
```
3. **配置**
修改 /etc/php/5.6/apache2/php.ini 。
```ini
error_reporting = E_ALL & ~E_NOTICE
```
重啟 Apache 使配置生效。
```shell
sudo /etc/init.d/apache2 restart
```
設定目錄許可權。
```shell
chown -R root:root /var/www/html
chmod 755 /var/www/html/adodb
```
開啟 http://localhost/base/setup/index.php 。
![index](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpzdwijkj30sg0lyn01.jpg)
設定頁面中,最好每一項都為綠色,表示通過。這裡顯示 Web 伺服器對 BASE 的安裝目錄不可寫。按照提示,可以在設定完成後建立 base_conf.php。
現在點選 Continue,跟著導引一步步完成設定。
**第 1 步:**選擇語言 simplified_chinese ,填寫 ADOdb 所在目錄 /var/www/html/adodb 。
**第 2 步:**填入資料庫的資訊,按之前配置的資訊填即可(Archive 資料庫的資訊可以不填)。
**第 3 步:**填入管理賬號:snort,密碼:123456。
**第 4 步:**建立資料表。
**第 5 步:**提示將顯示的資訊複製到 /var/www/html/base/base_conf.php 中。
![BASE](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpzh1tnjj30sg0lyaed.jpg)
完成設定後,顯示以上頁面,代表 BASE 安裝成功,可以看到 MySQL 中的資料。
## 使用 Snort
Snort 有三種工作模式:Sniffer、Packet Logger 和 Network Intrusion Detection System 。
1. **Sniffer 模式只是簡單地從網路上抓取資料包並在終端顯示出來。**
如果只是想在螢幕上打印出 IP 和 TCP/UDP/ICMP 包的頭資訊,可以用:
```shell
snort -v
```
![sniffer](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpzkf8myj30kp0ct0v6.jpg)
2. **Packet Logger 模式可把資料包儲存在磁碟中。**
如果想把資料包資訊存在磁碟上,就要用 Packet Logger Mode 。用以下命令可使 Snort 自動把資料包資訊存到磁碟中:
```shell
snort -vde -l log_directory
```
當 Snort 執行在該模式下時,它會把所有抓取的資料包按 IP 分類地存放到 log_directory 中。可用 -h 指定本地網路,以使 Snort 記錄與本地網路相關的資料包:
```shell
snort -vde -l log_directory -h 192.168.1.0/24
```
如果在一個高速網路中,或者想記錄資料包以備分析,可以以二進位制方式記錄資料包,在這裡不用指定 -vde,因為二進位制方式將記錄整個包的資訊。如:
```shell
snort -l log_directory -b
```
二進位制模式把資料包存成 tcpdump 格式,使用如下命令將二進位制檔案中的資訊列印到螢幕上:
```shell
snort -dv -r snort.log
```
![packet_logger](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpznaz2qj30kp0ct41s.jpg)
3. **Network Intrusion Detection 模式最複雜,具有高可配置性。它可使 Snort 根據使用者定義的規則分析網路流量,並作出反應。**
用以下命令開啟 NIDS 模式:
```shell
snort -dev -l log_directory -h 192.168.1.0/24 -c snort.conf
```
snort.conf 是規則集配置檔案。在 log_directory 目錄下會生成 alter 日誌,記錄入侵檢測的警報資訊。
執行命令後,會有一系列的初始化資訊。
![初始化](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpztfkz3j30sy0ob0z4.jpg)
初始化成功。
![初始化成功](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegpzzu9gfj30n70dn77u.jpg)
之後也會打印出包資訊。
![包資訊](https://tva1.sinaimg.cn/large/007S8ZIlgy1gegq02zbn5j30mz0cj