1. 概要
「portsentry」が、「ports」からなくなったので、別のものを試してみようと「snort」を使ってみましたが。
警告が出るのみで、遮断できるわけでもなく。
やたらログが多く、うまかログをローテーションさせきれなくて、ディスク容量を圧迫するようなことになってしまいました。
で、また、「portsentry」に戻ってみるのです。
「ports」からは、なくなりましたが、元々のソースは、残っているので、うまく、「make」できれば使えるのではないかと・・・。
2. ダウンロード
「github」のサイトは
「GitHub - Perdjesk/portsentry: Portsentry (part of Sentry Tools)」
なのですが、そこのダウンロードをたどると
「Sentry Tools download | SourceForge.net」
になります。
ここから
portsentry-1.2.tar.gz
をダウンロードします。
3. 編集
以下、「root」ユーザ権限で。
ダウンロードしたファイルは
/tmp
に配置します。
解凍。
cd /tmp
tar -xvzf portsentry-1.2.tar.gz
cd portsentry_beta
いくつかファイルを編集します。
vi portsentry_config.h
#define CONFIG_FILE "/usr/local/psionic/portsentry/portsentry.conf"
を下記へ変更します。
#define CONFIG_FILE "/usr/local/etc/portsentry/portsentry.conf"
vi portsentry.conf
# Hosts to ignore
IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
# Hosts that have been denied (running history)
HISTORY_FILE="/usr/local/psionic/portsentry/portsentry.history"
# Hosts that have been denied this session only (temporary until next restart)
BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"
を下記へ。
# Hosts to ignore
IGNORE_FILE="/usr/local/etc/portsentry/portsentry.ignore"
# Hosts that have been denied (running history)
HISTORY_FILE="/usr/local/etc/portsentry/portsentry.history"
# Hosts that have been denied this session only (temporary until next restart)
BLOCKED_FILE="/usr/local/etc/portsentry/portsentry.blocked"
vi portsentry.c
printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot
sourceforget dot net>\n");
を下記へ。
printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot sourceforget dot net>\n");
vi Makefile
INSTALLDIR = /usr/local/psionic
を下記へ。
INSTALLDIR = /usr/local/etc
「make」して、インストール。
make freebsd
make install
実行モジュールがコピーされなかったので
cp portsentry /usr/local/bin/.
4. 構成ファイルの編集
ここからは、前ページと同じになりますので、端的に。
vi /usr/local/etc/portsentry/portsentry.conf
#KILL_ROUTE="/bin/echo 'block in log on external_interface from $TARGET$/32 to any' | /sbin/ipf -f -"
の先頭の「#」を削除して生かします。
これで、攻撃してきた「IP」を遮断します。
vi /usr/local/etc/portsentry/portsentry.ignore
127.0.0.1/32
0.0.0.0
の下に、遮断しないアドレス(自分の「LAN」アドレス等)を記述します。
5. 起動
起動スクリプトを作成します。
vi /usr/local/etc/rc.d/portsentry
下記を記述します。
#!/bin/sh
#
# PROVIDE: portsentry
# REQUIRE: LOGIN cleanvar
# KEYWORD: shutdown
portsentry_enable=${portsentry_enable:=NO}
. /etc/rc.subr
name=portsentry
rcvar=portsentry_enable
load_rc_config $name
start_cmd=portsentry_start
stop_cmd=portsentry_stop
pidfile=/var/run/portsentry.pid
procname=/usr/local/bin/portsentry
PORTSENTRY="/usr/local/bin/portsentry"
portsentry_start()
{
${PORTSENTRY} -tcp
${PORTSENTRY} -udp
pgrep ${name} > $pidfile
}
portsentry_stop()
{
killall `basename ${PORTSENTRY}`
}
run_rc_command "$1"
本当は、もう少し、うまい書き方ができそうなのですが・・・。
起動スクリプトを実行可能にします。
chmod +x /usr/local/etc/rc.d/portsentry
sysrc portsentry_enable=YES
起動。
service portsentry start
6. 試験
「portsentry」を実行している状態で、ポートスキャンをかけると。
「/var/log/message」に
Aug 23 16:40:36 ns portsentry[3070]: attackalert: ERROR: cannot open ignore file. Blocking host anyway.
Aug 23 16:40:36 ns portsentry[3070]: attackalert: Connect from host: SHOW202003/192.168.100.100 to TCP port: 1
Aug 23 16:40:36 ns portsentry[3070]: attackalert: Host 192.168.100.100 has been blocked via wrappers with string: "ALL: 192.168.100.100"
Aug 23 16:40:36 ns portsentry[3070]: attackalert: Host 192.168.100.100 has been blocked via dropped route using command: "/bin/echo 'block in log on external_interface from 192.168.100.100/32 to any' | /sbin/ipf -f -"
Aug 23 16:40:38 ns portsentry[3070]: attackalert: ERROR: cannot open ignore file. Blocking host anyway.
Aug 23 16:40:38 ns portsentry[3070]: attackalert: Connect from host: SHOW202003/192.168.100.100 to TCP port: 11
Aug 23 16:40:38 ns portsentry[3070]: attackalert: Host: 192.168.100.100 is already blocked. Ignoring
Aug 23 16:40:39 ns portsentry[3070]: attackalert: ERROR: cannot open ignore file. Blocking host anyway.
Aug 23 16:40:39 ns portsentry[3070]: attackalert: Connect from host: SHOW202003/192.168.100.100 to TCP port: 15
Aug 23 16:40:39 ns portsentry[3070]: attackalert: Host: 192.168.100.100 is already blocked. Ignoring
Aug 23 16:40:41 ns sshd[3083]: error: Fssh_kex_exchange_identification: Connection closed by remote host
Aug 23 16:40:52 ns portsentry[3070]: attackalert: ERROR: cannot open ignore file. Blocking host anyway.
Aug 23 16:40:52 ns portsentry[3070]: attackalert: Connect from host: SHOW202003/192.168.100.100 to TCP port: 79
Aug 23 16:40:52 ns portsentry[3070]: attackalert: Host: 192.168.100.100 is already blocked. Ignoring
Aug 23 16:40:58 ns portsentry[3070]: attackalert: ERROR: cannot open ignore file. Blocking host anyway.
Aug 23 16:40:58 ns portsentry[3070]: attackalert: Connect from host: SHOW202003/192.168.100.100 to TCP port: 111
Aug 23 16:40:58 ns portsentry[3070]: attackalert: Host: 192.168.100.100 is already blocked. Ignoring
Aug 23 16:41:00 ns portsentry[3070]: attackalert: ERROR: cannot open ignore file. Blocking host anyway.
Aug 23 16:41:00 ns portsentry[3070]: attackalert: Connect from host: SHOW202003/192.168.100.100 to TCP port: 119
Aug 23 16:41:00 ns portsentry[3070]: attackalert: Host: 192.168.100.100 is already blocked. Ignoring
てな感じでログが出力されます。
/usr/local/etc/portsentry/portsentry.ignore
を編集して、ポートスキャンをかけているアドレスを遮断しないように設定して、「portsentry」を再起動します。
すると、ログが出てこなくなったのでうまく動作しているようです。
7. メンテナンス
「portsentry」は、アタックを受けたとみなしたアドレスを
/etc/hosts.deny
へ記録します。
解除する場合は、上記のファイルも編集します。
「/etc/hosts.allow」「/etc/hosts.deny」によってセキュリティ制限をかけている場合は、注意が必要です。
逆に、「FreeBSD」のデフォルトで
/etc/hosts.allow
の有効行の先頭に
# Start by allowing everything (this prevents the rest of the file
# from working, so remove it when you need protection).
# The rules here work on a "First match wins" basis.
ALL : ALL : allow
の記述があれば、「/etc/hosts.deny」に記録されてもなんの効力もありません。
「/etc/hosts.deny」によってやたら制限がかかったり、ちっともかからないとしても、中身のチェックはときどきおこないましょう。
やたら、行数が増えていたりしますし、同じアドレスが、複数回記録されていたりしますので、ソートしたり、重複行を削除したりすることが必要です。