Raspberry pi with Suricata

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

コメントをどうぞ