○ Portsentry-2.0b1の設定

・iptablesを通過したportscanをキャッチします
・Portsentry-2.0b1をソースからインストールし、設定します
・iptablesでTARGETをDROPします (INPUTチェーンのみ)
・本家psionicのリンクは切れています
・アドレス指定があるので固定IPでないとうまくいかないと思う
・make はメンテナンスマシンで行っています

・ソースの取得、削除は省略します
・エディタ、ファイラーの操作は省略します
・ソースを展開したら説明文を読みましょう
・Enterキーを省略します

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○関連サイト

:portsentry-2.0b1.tar.gz (http://www.linux-sxs.org/files/psionic/)

○参照ファイル

パッケージの追加
最初の設定 (Router)

○インストール環境

:OS CentOS 6.9
:selinux permissive
:インストール先  /usr/local/portsentry2
:作業 ~/src
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行

・メンテナンスの場合は一般ユーザから行います



○portsentry-2.0b1

○ソースの展開・インストール

# cd ~/src
[root@venus:~/src]
# tar zxvf portsentry-2.0b1.tar.gz
# chown -R root:root portsentry-2.0b1
# cd portsentry-2.0b1
[root@venus:~/src/portsentry-2.0b1]

・パッチを当てます (下記参照)
・~/srcにパッチファイルを置きます

# patch -p1 < ../portsentry.patch
# make linux
# make install
# cd ..
[root@venus:~/src]
# tar jcvf portsentry-2.0b1-rt-160529.tar.bz2 portsentry-2.0b1/

portsentry.patch

・CFLAGS="-march=i686 -mtune=atom" (CPU最適化オプション)
・該当しない場合は指定しない
・installディレクトリの変更
・BUGによるLOGを出力しない (KNOWNBUGSを参照)

○portsentry.confの修正 (変更追加分)

・チェックするのはportsentry.confで指定してあるポートのみです
・必要ならば各自追加します
・iptablesのインストール場所を確認します
・host.denyに"ALL: ALL"を指定しているのでhost.denyの書き込みをしない
・"wan-fwz"は独自に作成したiptablesチェーンです
・KILL_ROUTEを実行後にKILL_RUN_CMDを実行します

# Interface Configuration #
INTERFACE_ADDRESS="219.117.201.3"

# Configuration Files #
IGNORE_FILE="/usr/local/portsentry2/portsentry.ignore"
HISTORY_FILE="/usr/local/portsentry2/portsentry.history"
BLOCKED_FILE="/usr/local/portsentry2/portsentry.blocked"

# Dropping Routes #
#KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP"
KILL_ROUTE="/usr/local/sbin/iptables -I wan-fwz -s $TARGET$ -j DROP"

# TCP Wrappers #
#KILL_HOST_DENY="ALL:$TARGET$"

# External Command #
KILL_RUN_CMD_FIRST = "0"
KILL_RUN_CMD="/usr/local/sbin/pschk-clear $TARGET$"

# Scan trigger value #
SCAN_TRIGGER="0"

・ここでは、"KILL_RUN_CMD"でatを利用し48時間後にiptablesルールを削除します
・"wan-fwz"は独自に作成したiptablesチェーンです
・"portsentry.blocked"に記録されたアドレスは無視されるので、クリアします

:/usr/local/sbin/pschk-clear (root root 700)

#!/bin/bash

TARGET="$1"
PBLOCKED='/usr/local/portsentry2/portsentry.blocked'
IPTABLES='/usr/local/sbin/iptables'

/bin/echo $TARGET >> /root/fwz-drop

/bin/echo "/bin/sed -e "/$TARGET/d" -i $PBLOCKED && \
/bin/sed -e "/$TARGET/d" -i /root/fwz-drop && \
$IPTABLES -D wan-fwz -s $TARGET -j DROP > /dev/null 2>&1" \
| /usr/bin/at now+48hour > /dev/null 2>&1

:/etc/ppp/firewall-masq

・省略

if [ -s /root/lsv-drop ]; then
    for ip1 in `cat /root/fwz-drop`
    do
        $IPTABLES -I wan-fwz -s $ip1 -j DROP
    done
fi

・省略


○portsentry.ignoreの修正 (変更追加分)

127.0.0.0/8
192.168.0.0/24
#0.0.0.0

○自動起動スクリプトを作成します

/etc/rc.d/init.d/portsentry (詳細別記)

○selinuxヘの対応 (selinuxが有効の場合)

:新規インストールファイルのselinuxラベルを修正

# cd ~
[root@venus:~]
# restorecon -Rv /etc
# restorecon -Rv /usr/local

○portsentryを起動します

[root@venus:~]
# chkconfig --add portsentry
# service portsentry start

○iptablesチェーンに追加された例

・上手く働くとすれば、iptablesがリフレッシュされるまで接続できません
・portsentryで新しくチェックされるごとにチェーンに書き加えられます

Chain wan-fwz (1 references)
num  target     prot opt source               destination
1    DROP       all  --  95.215.16.13         0.0.0.0/0

・省略


○iptablesのチェーンの削除

・ユーザの誤操作?でチェーンに組み込まれてしまった場合
・"--line-numbers"オプションをつけてチェーンの順番を調べます
・"-D"オプションでチェーンを削除します
・(例)INPUTチェーンの1番目を削除

[root@venus:~]
# iptables -L INPUT -n --line-numbers
# iptables -D INPUT 1

○atデーモンの起動

・予約されたatジョブを表示します (portscanを検知した場合)

[root@venus:~]
# at -l
1       2012-07-24 15:58 a root

・予約されたジョブの詳細(-cオプションで番号を指定)

# at -c 1

・省略

・atジョブをモニターして実行します

[root@venus:~]
# service atd start
# chkconfig --level 345 atd on



○参考 CentOS6のnet.ipv4.ip_local_port_range

・webクライアントを複数起動すると、portsentryで捕えられる場合があります
・CentOS6を使う場合は、クライアントの"local_port_range"を変更しておく

・net.ipv4.ip_local_port_range(デフォルト)

[root@venus:~]
# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    61000

・net.ipv4.ip_local_port_rangeの変更

# cp -a /etc/sysctl.conf /etc/sysctl.conf.orig
# echo "net.ipv4.ip_local_port_range = 16385 65535" >> /etc/sysctl.conf
# sysctl -p

・確認

# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 16385    65535

○ Copyright(c) 528p.com All Rights Reserved.