Raspberry pi 4B 8GBにSuricata(6.0.3)をインストールする。
■Suricataインストール
1.必要なパッケージのインストール
sudo apt install libpcre3 libpcre3-dbg libpcre3-dev build-essential libpcap-dev libyaml-0-2 libyaml-dev pkg-config zlib1g zlib1g-dev make libmagic-dev libjansson-dev rustc cargo python-yaml python3-yaml liblua5.1-dev
2.Suricataのダウンロードと解凍
wget https://www.openinfosecfoundation.org/download/suricata-6.0.3.tar.gz
tar -xvf suricata-6.0.3.tar.gz suricata-6.0.3
3.Suricataインストール
cd suricata-6.0.3/
./configure –prefix=/usr –sysconfdir=/etc –localstatedir=/var –enable-nfqueue –enable-lua
make
sudo make install
cd suricata-update/
sudo python setup.py build
sudo python setup.py install
cd ..
sudo make install-full
sudo suricata-update
4.Suricata環境変数の設定
sudo vi /etc/suricata/suricata.yaml
■Suricataのルール追加
sudo vi /var/lib/suricata/rules/suricata/rules
最終行に以下を追加
alert icmp $HOME_NET any -> any any (msg:”ICMP Packet found”; sid:1; rev:1; )
■Suricata起動
sudo suricata -c /etc/suricata/suricata.yaml -i wlan0 -S /var/lib/suricata/rules/suricata.rules
■Suricataログの確認
sudo tail -f /var/log/suricata/fast.log
■iperfでの負荷試験
1.iperfを下記サイトからダウンロード
https://iperf.fr/iperf-download.php
2.ダウンロードしたファイルを解凍しコマンドプロンプトで解凍したフォルダに移動
3.iperfサーバ側の起動
iperf3 -s
4.iperfクライアント側の起動(サーバ側のIPが192.168.0.1の場合)
iperf3 -c 192.168.0.1
5.指定した帯域幅のUDPトラヒック(10M)を指定した時間(30秒)送信する場合
サーバ側:iperf -s -u
クライアント側:iperf -c 192.168.0.1 -u -b 10000000 -t 30
★Raspberry pi にインストールしたSuricataがどれくらいのトラヒックまで攻撃を検知可能か試験する。
■攻撃を検知した場合にラズパイに接続したLCDで表示するPythonプログラム
ラズパイとLCDをI2C通信で接続する。Pythonでfast.logの最終行を3秒毎に読みに行き表示するプログラム
1.I2Cシリアルインターフェースとラズパイの接続
I2CのGNDとラズパイのGND
I2CのVCCとラズパイの5V
I2CのSDAとラズパイのSDA
I2CのSCLとラズパイのSCL
を接続する。

2.LCD表示するPythonプログラムの実行
以下のプログラムはSuricataのfast.logを3秒毎に読み、新しい攻撃を検知した場合にLCDに表示するプログラム。
import smbus
import time
import subprocess
I2C_ADDR = 0x27 # I2C address
LCD_WIDTH = 16
LCD_CHR = 1
LCD_CMD = 0
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_BACKLIGHT = 0x08
bus = smbus.SMBus(1)
def init_display():
send_byte_to_data_pin(0x33,LCD_CMD)
send_byte_to_data_pin(0x32,LCD_CMD)
send_byte_to_data_pin(0x06,LCD_CMD)
send_byte_to_data_pin(0x0C,LCD_CMD)
send_byte_to_data_pin(0x28,LCD_CMD)
send_byte_to_data_pin(0x01,LCD_CMD)
time.sleep(0.0005)
def send_byte_to_data_pin(bits, mode):
upper_bits = mode | (bits & 0xF0) | LCD_BACKLIGHT
lower_bits = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT
bus.write_byte(I2C_ADDR, upper_bits)
enable_toggle_button(upper_bits)
bus.write_byte(I2C_ADDR, lower_bits)
enable_toggle_button(lower_bits)
def enable_toggle_button(bits):
time.sleep(0.0005)
bus.write_byte(I2C_ADDR, (bits | 0b00000100))
time.sleep(0.0005)
bus.write_byte(I2C_ADDR,(bits & ~0b00000100))
time.sleep(0.0005)
def send_string_to_display(message,line):
message = message.ljust(LCD_WIDTH," ")
send_byte_to_data_pin(line, LCD_CMD)
for i in range(LCD_WIDTH):
send_byte_to_data_pin(ord(message[i]),LCD_CHR)
def main():
#init_display()
before_attack=""
attack=""
while True:
init_display()
attack = subprocess.check_output('sudo tail -n 1 /var/log/suricata/fast.log',shell=True)
if attack!=before_attack:
print(attack)
send_string_to_display(attack[0:16] , LCD_LINE_1)
send_string_to_display(attack[16:32] , LCD_LINE_2)
before_attack=attack
else:
send_string_to_display("No Attack", LCD_LINE_1)
send_string_to_display("", LCD_LINE_2)
time.sleep(3)
try:
main()
except Exception:
pass
finally:
LCD_BACKLIGHT = 0x00
send_byte_to_data_pin(0x01, LCD_CMD)
■Pcapファイルの読み込みについて
-rオプションでpcapファイルの読み込みができる。注意する点はAlertが記録されるfast.logの場所である。–rでpcapを読み込む場合、fast.logは指定しない限り、suricataコマンドを実行したディレクトリに作成される。また、pcapファイルを読み込んだ際に大量の「invalid checksum」が表示される場合がある。この場合、checksumを無効にしないとパケットの検査がこれ以上行われず、想定したAlertが出ない。checksumを無効化するにはsuricata.yamlの「checksum-valitation」をnoに変更する必要がある。
suricataで取得したpcapファイルを検査するコマンド例
> sudo suricata -c /etc/suricata/suricata.yaml -S /var/lib/suricata/rules/suricata.rules -r attack.pcapng