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.9.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-3900.tar.gz
                https://www.snort.org/rules/snortrules-snapshot-3900.tar.gz?oinkcode=<OINKCODE>

    [root]# tar xvfz snortrules-snapshot-3900.tar.gz
    [root]# ls

      builtins  etc  rules  snortrules-snapshot-3900.tar.gz  so_rules

    [root]# cat rules/*.rules > /usr/local/snort/rules/snort.rules
    [root]# cp -v builtins/builtins.rules /usr/local/snort/builtin_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
# Type=oneshot 終了後もサービスをアクティブとみなす
RemainAfterExit = yes
ExecStart=perl /usr/local/pulledpork/pulledpork.pl \
    -c /usr/local/pulledpork/etc/pulledpork.conf -PE -v -I security -T -H SIGHUP

SystemCallArchitectures = native
SystemCallFilter=~@clock
SystemCallFilter=~@cpu-emulation
SystemCallFilter=~@debug
SystemCallFilter=~@module
#× SystemCallFilter=~@mount
SystemCallFilter=~@obsolete
#× SystemCallFilter=~@privileged
SystemCallFilter=~@raw-io
SystemCallFilter=~@reboot
SystemCallFilter=~@resources
SystemCallFilter=~@swap

RestrictRealtime = yes

RemoveIPC = yes
PrivateIPC = yes

CapabilityBoundingSet =~ CAP_SYS_TIME CAP_SYS_PACCT CAP_KILL CAP_WAKE_ALARM \
    CAP_(DAC_*|FOWNER|IPC_OWNER) CAP_BPF CAP_LINUX_IMMUTABLE \
    CAP_IPC_LOCK CAP_SYS_MODULE CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_SYS_CHROOT \
    CAP_BLOCK_SUSPEND CAP_LEASE CAP_(CHOWN|FSETID|SETFCAP) CAP_SET(UID|GID|PCAP) \
    CAP_SYS_PTRACE CAP_SYS_(NICE|RESOURCE) CAP_SYS_RAWIO CAP_NET_ADMIN \
    CAP_NET_(BIND_SERVICE|BROADCAST|RAW) CAP_AUDIT_* CAP_SYS_ADMIN CAP_SYSLOG \
    CAP_MKNOD CAP_MAC_*

UMask = 0077

RestrictNamespaces = yes

#× ProtectSystem = strict
#× PrivateTmp = yes
PrivateMounts = yes
ProtectHome = yes
ReadWritePaths = /usr/local/snort /usr/local/pulledpork

PrivateDevices = yes
ProtectClock = yes
ProtectKernelLogs = yes
ProtectKernelModules = yes
ProtectKernelTunables = yes
ProtectControlGroups = yes

NoNewPrivileges = yes
MemoryDenyWriteExecute = yes
ProcSubset = pid

RestrictSUIDSGID = yes
ProtectHostname = yes
LockPersonality = yes
ProtectProc = invisible

[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