Snort3(PulledPork によるルールファイルの自動更新)

PulledPork

・Perl モジュール
    [root]# cpan LWP::UserAgent::Determined Net::SSLeay
                            LWP::Protocol::https Sys::Syslog Archive::Tar
・インストール
    [root]# mkdir -p /usr/local/pulledpork/etc
    [root]# git clone https://github.com/shirkdog/pulledpork.git
    [root]# cp -v pulledpork/pulledpork.pl /usr/local/pulledpork/
    [root]# cp -v pulledpork/etc/* /usr/local/pulledpork/etc/
    [root]# chown -R snort:snort /usr/local/pulledpork/
    [root]# chmod 755 /usr/local/pulledpork/pulledpork.pl
・設定
    [root]# vim /usr/local/pulledpork/etc/pulledpork.conf

      # 最新のルールセットより30日遅れのルールセット
      rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|<OINKCODE>

      # tarball から無視するルールカテゴリ
      #ignore=deleted.rules,experimental.rules,local.rules

      # 取得した全てのルールを含むファイルのパス
      rule_path=/usr/local/snort/rules/snort.rules

      # 自作の local.rules ファイルのパス
      local_rules=/usr/local/snort/rules/local.rules

      # sid-msg.map ファイルのパス
      sid_msg=/usr/local/snort/etc/snort/sid-msg.map

      # 変更ログファイル
      sid_changelog=/var/log/sid_changes.log

      # Snort のパス
      snort_path=/usr/local/snort/bin/snort

      # Snort の設定ファイル
      config_path=/usr/local/snort/etc/snort/snort.lua

      # ディストリビューション
      distro=Centos-8

      # IP レピュテーションで使用するブロックリストファイル
      block_list=/usr/local/snort/intel/ip-blocklist

      # IP リストのリロードで使用するバージョンファイルの設置場所
      IPRVersion=/usr/local/snort/intel/

      # snort_control ツールの場所
      snort_control=/usr/local/bin/snort_control

      # Snort の PID ファイル
      pid_path=/var/log/snort/snort.pid

      # ルールファイルのバージョン(省略時、インストールされた Snort と同じバージョン)
      #snort_version=3.1.0.0
      snort_version=3.2.0.0

      # PulledPork がルールを処理する方法
      # enablesid.conf(全てのルールを有効)disablesid.conf(特定のルールを無効)
      enablesid=/usr/local/pulledpork/etc/enablesid.conf
      dropsid=/usr/local/pulledpork/etc/dropsid.conf
      disablesid=/usr/local/pulledpork/etc/disablesid.conf
      modifysid=/usr/local/pulledpork/etc/modifysid.conf

      # 基本ルールセット
      #ips_policy=security  <-- コメントアウト

      version=0.8.0
・PulledPork を実行し、ルールファイルを更新
    [root]# /usr/local/pulledpork/pulledpork.pl 
                -c /usr/local/pulledpork/etc/pulledpork.conf -PE -v -T -H SIGHUP

      -c : 設定ファイル
      -P : 新しいルールがダウンロードされていない場合でもルールを処理
      -E : 有効なルールのみを出力ファイルに書き込み
      -v : 詳細モード
      -T : テキストベースのルールファイルのみ処理(so_rules は処理しない)
      -H : 設定ファイルに記述 PID に再起動送信(SIGHUP または SIGUSR2)

    ※ ルールファイルの更新が出来ない場合

    [root]# curl -Lo snortrules-snapshot-3200.tar.gz
                https://www.snort.org/rules/snortrules-snapshot-3200.tar.gz?oinkcode=<OINKCODE>

    [root]# tar xvfz snortrules-snapshot-3200.tar.gz
    [root]# cat rules/*.rules > /usr/local/snort/rules/snort.rules
    [root]# ls -lh /usr/local/snort/rules/snort.rules

      -rw-r--r-- 1 root root   23M  2月 13 17:42 /usr/local/snort/rules/snort.rules
・cron でなく、systemd タイマーで PulledPork を定期実行
    [root]# vim /etc/systemd/system/pulledpork.service

      [Unit]
      Description=PulledPork service for updating Snort 3 rules
      Wants=pulledpork.timer

      [Service]
      Type=oneshot
      RemainAfterExit = yes  # Type=oneshot 終了後もサービスをアクティブとみなす
      ProtectSystem = true   # /usr, /boot 読み取りのみ
      ProtectHome = true     # /home, /root, /run/user アクセスできない
      ReadWritePaths = /usr/local/snort /usr/local/pulledpork  # 指定ディレクトリ読み書き許可
      ExecStart=/usr/local/pulledpork/pulledpork.pl
                    -c /usr/local/pulledpork/etc/pulledpork.conf -PE -v -T -H SIGHUP

      [Install]
      WantedBy=multi-user.target

    [root]# vim /etc/systemd/system/pulledpork.timer

      [Unit]
      Description=PulledPork service timer for updating Snort 3 rules
      Requires=pulledpork.service

      [Timer]
      Unit=pulledpork.service
      OnCalendar=*-*-* 00:15:00
      AccuracySec=1us

      [Install]
      WantedBy=timers.target

    [root]# systemctl daemon-reload
    [root]# systemctl enable pulledpork.timer