#freeze
[[LinuxSoft]]
#contents
----
* PortSentry に関する日本語情報 [#la517d29]
** PortSentry って何? [#w38162cd]
IDS としては Snort が非常に有名ですが、Snort はあくまでネットワークやホストに対する侵入検知、検知のログの記録のみです。気がついた頃には既に不正アクセスを受けてしまった、という事も十分あり得ます。
対して PortSentry は侵入(ポートスキャン)を"いまそこにある危機"として、直ちに iptables でフィルタリングを実施する機能を備えています(必要とあれば報復用の Dos 攻撃を行うようなコマンドも実行できます……が推奨されていません、あたり前ですね)。
通常のポートに対するアタックやポートスキャン、ステルス・スキャンにも対応しています。面白いのは監視対象のポートが一見開いているように見えること。ちゃんと応答しているように見せかけて、その直後にネットワークを遮断するプログラム(iptablesなど)を実行します。攻撃者からすると、あれ?ポートが開いているはずなのに何故応答しないかなぁとイライラさせることも目的だそうです(ドキュメントにありました)……詳しくは[[PortSentry README 日本語訳>PortSentry/README 日本語訳]]をご覧下さい。
** URL [#i2b6b3cc]
http://sourceforge.net/projects/sentrytools/
** ライセンス [#db06221f]
Common Public License, GNU General Public License (GPL)
** PortSentry のインストール [#g582c07f]
このインストールは Red Hat Linux 7.3 で行いました。最近の REHL や Fedora Core でも同様の方法でセットアップできると思います。
まずはアーカイブの取得と展開です。このあたりはお約束ですね。
$ wget http://jaist.dl.sourceforge.net/sourceforge/sentrytools/portsentry-1.2.tar.gz
$ tar xfz portsentry-1.2.tar.gz
$ cd portsentry_beta
設定ファイル portsentry_config.h を編集します。
$ vi portsentry_config.h
インストール先や hosts.deny ファイルのパスの確認です。標準のまま特に変更しないで用いることにします。
#define CONFIG_FILE "/usr/local/psionic/portsentry/portsentry.conf"
#define WRAPPER_HOSTS_DENY "/etc/hosts.deny"
#define SYSLOG_FACILITY LOG_DAEMON
#define SYSLOG_LEVEL LOG_NOTICE
次は portsentry.conf で検出対象とするポートを指定します。
TCP_PORTS="1,11,15,79,111,119,143,540,635,(略),49724,54320"
UDP_PORTS="1,7,9,69,161,162,513,635,640,641,(略),32774,31337,54321"
ここも特に変更せず、デフォルトのまま使うことにします。
侵入検出時、ネットワークを遮断させる方法は iptables を使うことにします。206 行目に移動して該当行のコメントを削除して、iptables のパスを /sbin/iptables に修正します。
# iptables support for Linux
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
(route コマンドを使って /sbin/route add xxx.xxx.xxx.xxx reject でも機能はします、man 読むとファイアウォールとしては使うな、とあるので、素直に iptables を使うことにします。)
次は監視対象外とするホスト情報の登録です。
$ vi portsentry.ignore
ファイルを開いて、IP アドレス、もしくはネットワーク+サブネットマスクで範囲を指定します。ここは自分の接続環境を記述しておきませんと、何かあると接続できなくなってしまいます。そうなると困るので、必ず自分の環境は追加しておきましょう。
127.0.0.1/32
0.0.0.0
ここまできて、ようやくコンパイルです。make とうつと、使い方が表示されます。
$ make
Usage: make <systype>
<systype> is one of: linux, debian-linux, bsd, solaris, hpux, hpux-gcc,
freebsd, osx, openbsd, netbsd, bsdi, aix, osf, irix, generic
This code requires snprintf()/vsnprintf() system calls
to work. If you run a modern OS it should work on
your system with 'make generic'. If you get it to
work on an unlisted OS please write us with the
changes.
Install: make install
NOTE: This will install the package in this
directory: /usr/local/psionic
Edit the makefile if you wish to change these paths.
Any existing files will be overwritten.
いろいろ出てきますが、こちらのシステムは Red Hat Linux なので「make linux」としてコンパイルします。
$ make linux
# make install
必要に応じて設定ファイル /usr/local/psionic/portsentry/portsentry.conf を確認・編集します。
最後に起動させます。TCP と UDP を監視対象としたいので -tcp と -udp のオプションをつけた2つのデーモンを稼働させます。
# /usr/local/psionic/portsentry/portsentry -tcp
# /usr/local/psionic/portsentry/portsentry -udp
ps コマンドで問題なく動作している事が確認できます。
$ ps ax | grep port
25267 ? S 0:00 /usr/local/psionic/portsentry/portsentry -tcp
25269 ? S 0:00 /usr/local/psionic/portsentry/portsentry -udp
最後にサーバ起動時に PortSentry も自動起動するように記述を行います。
# vi /etc/rc.d/rc.local
ファイルを開いたら末尾あたりに以下の記述を追加します。
# PortSentry
/usr/local/psionic/portsentry/portsentry -tdp
/usr/local/psionic/portsentry/portsentry -udp
** PortSentry の動作確認 [#v94e03bb]
デーモンの起動後は /var/log/messages にメッセージが表示されます。tail /var/log/messages で動作確認。
Jul 24 21:13:37 nsx portsentry[25266]: adminalert: PortSentry 1.2 is starting.
Jul 24 21:13:37 nsx portsentry[25267]: adminalert: Going into listen mode on TCP port: 1
Jul 24 21:13:37 nsx portsentry[25267]: adminalert: Going into listen mode on TCP port: 11
(長いので略)
Jul 24 21:13:39 nsx portsentry[25269]: adminalert: Going into listen mode on UDP port: 54321
Jul 24 21:13:39 nsx portsentry[25269]: adminalert: PortSentry is now active and listening.
正常稼働しているようです。問題なし。netstat -na を実行すると、結構壮観。見張ってますって感じがして安心できます。
では、実際にアタックを試みてみます。
こちらは外部のホストから。
$ telnet nsx.pocketstudio.jp 143
Trying 210.128.158.225...
Connected to nsx.pocketstudio.jp.
Escape character is '^]'.
* OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS STARTTLS
LOGINDISABLED] nsx.pocketstudio.jp IMAP4rev1 2004.349 at Sun, 24 Jul 2005
21:16:12 +0900 (JST)
001 LOGOUT
* BYE nsx.pocketstudio.jp IMAP4rev1 server terminating connection
001 OK LOGOUT completed
Connection closed by foreign host.
・・・・ん〜、、特に制限がかかってないのでは・・・?
ふつうのプロトコルだからかな。ドキュメントにも普通の通信かどうかは識別できるって書いてあったので、、、では違うポートをたたいてみる。
$ telnet nsx.pocketstudio.jp 111
Trying 210.128.158.225...
Connected to nsx.pocketstudio.jp.
Escape character is '^]'.
Connection closed by foreign host.
おっ、蹴られた。ログを読んでみると……ばっちり不正アクセスを検出して、しかも /etc/hosts.deny への追加と iptables でパケットを DROP したという記録。
Jul 24 21:20:27 nsx portsentry[25316]: attackalert: Connect from host:
sv.pocketstudio.jp/210.239.46.254 to TCP port: 111
Jul 24 21:20:27 nsx portsentry[25316]: attackalert: Host 210.239.46.254
has been blocked via wrappers with string: "ALL: 210.239.46.254"
Jul 24 21:20:27 nsx portsentry[25316]: attackalert: Host 210.239.46.254
has been blocked via dropped route using command: "/sbin/iptables -I
INPUT -s 210.239.46.254 -j DROP"
/etc/hosts.deny ファイルを開いてみると、末尾にちゃんと攻撃元(210.239.46.254) の情報が追加されてました。
ALL: 210.239.46.254
iptables でも -L オプションをつけてみると、パケットを DROP (廃棄)する設定が反映されてました。バッチリ。
# /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- sv.pocketstudio.jp anywhere
(略)
これで外部からのポートスキャンがあっても自動的に遮断してくれる事が確認できました。もしどこかから狙われることがあっても、これなら安心ですね。典型的ですけど、まず侵入を試みるときはポートスキャンであいてるポートを調べる所から始めますから、大抵の不正アクセスについては PortSentry で自動排除してくれるでしょう。
他にもいろいろな機能があるので、詳しくは README をご覧になってください。
** PortSentry README [#y52fef9c]
[[PortSentry README 日本語訳>PortSentry/README 日本語訳]]