サーバーに侵入・改変防止プログラムを導入してみました
ますは簡単に出来ることから始めてみました
rkhunterの導入
chkrootkitの様にrootkitを検出します。
ウイルススキャンのように定期的にデータを更進しスキャンしてくれます。
chkrootkitとの違いはよくわかりません。
chkrootkitの導入
クラッカーが侵入した際にシステムにインストールするrootkitを検出します。
apt-get install chkrootkit #パッケージをインストールします。
/usr/sbin/chkrootkit #rootkitがインストールされていないか検査します。
実際にはcronで1日数回検査を繰り返します。
integritの 導入
ファイルの変更があったことを検出するプログラムです。結果をメールで知らせてくれます。
このようなプログラムではtripwireが有名ですが、debianではintegritがパッケージにあります。
apt-get install integrit #パッケージをインストールし、設定をします
/etc/integrit/integrit.conf を自分のシステムにあわせて変更します。
!/hogehoge で検査の対象からはずします。基本的には /proc, /dev, /cdrom, /floppy 以外はファイルサイズかチェックサムを含めて検査するようにしています。
=/hogehoge でサブディレクトリーを検査の対象から外します。
cronで1日数回検査を繰り返します。
setuidのチェック
Debianではデフォルトでファイルのsetuidのチェックをしています。
結果は/var/log/setuid.changes に記録されていますがメールで受け取ることも出来ます。/etc/checksecurity.conf のCHECKSECURITY_EMAIL="root" にすれば変更できます。
swatchの導入
ログファイルを監視して、条件があえばコマンドを実行します。
sshdへの辞書攻撃が頻回にあるのでswatchを利用してアクセス拒否をしています。
パスワードの入力を誤ってエラーが出たときにアクセス不能になってしまうのが玉に瑕です。
こちらのペー ジを参考にしています。
このサーバーに対する最近の不正アクセス状況はこちらです。 そのほとんどがおそらくブ ルートフォースアタックと思われます。
最近 tDiary に対してTrackBack SPAM が非常に多くて、ひどいときには80%程度の負荷が持続していました。(通常は10−15%)
完全な対処法ではありませんが apache のログも swatch に監視させて iptables で弾くようにしました。
ユーザーエージェントを見ているので向こうが変化するとかわされてしまいますが…。
apt-get install swatch #swatchをインストール/etc/init.d/swatch を参考ページからコピーします。ただしswachを呼び出すところにnohup ***** & と変更しています。
/etc/swatch.conf を作成します#!/bin/sh
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="swatch"
DAEMON="/usr/bin/swatch"
DESC="simple watcher"
CONFFILE="/etc/swatch.conf"
#LOGFILE="/var/log/secure"
LOGFILE="/var/log/auth.log"
PIDFILE="/var/run/swatch.pid"
SCRIPTDIR="/var/log/swatch"
OPTS="--config-file $CONFFILE --tail-file $LOGFILE --pid-file=$PIDFILE --script-dir=$SCRIPTDIR \
--awk-field-syntax --daemon"
test -x $DAEMON || exit 0
start() {
if [ ! -f "$CONFFILE" ]; then
echo "Error: $CONFFILE does not exist."
exit 1
fi
if [ ! -f "$LOGFILE" ]; then
echo "Error: $LOGFILE does not exist."
exit 1
fi
if [ -f "$PIDFILE" ]
then
echo "Error: $NAME is already running."
else
/usr/bin/nohup $DAEMON $OPTS &
fi
}
stop() {
if [ -f "$PIDFILE" ]
then
PID=`cat $PIDFILE`
if ps h $PID > /dev/null
then
pkill -P $PID
rm -f /root/.swatch-script*
else
echo "Error: $NAME is not running, but PID file exists. Deleting it."
fi
rm -f $PIDFILE
else
echo "Error: $NAME is not running."
fi
}
case "$1" in
start)
echo "Starting $DESC: $NAME"
start
;;
stop)
echo "Stopping $DESC: $NAME"
stop
;;
restart)
echo "Restarting $DESC: $NAME"
stop
sleep 1
start
;;
*)
echo "Usage: $0 start|stop|restart"
exit 1
;;
esac
exit 0
#
# Personal Swatch configuration file
#
# Alert me of bad login attempts and find out who is on that system
ignore /CRON/
watchfor /Did not receive identification string from/
exec "/sbin/iptables -A INPUT -s $12 -j ACCEPT"
watchfor /Illegal user/
exec "/sbin/iptables -A INPUT -s $10 -j ACCEPT"
exec "echo '/sbin/iptables -D INPUT -s $10 -j ACCEPT' | at now+2min"
mail=root,subject=[Swatch] Invalid access
watchfor /Authentication failure for root/
exec "/sbin/iptables -A INPUT -s $13 -j ACCEPT"
$12とか$13というのはログファイルの該当する行の12番目、13番目の単語と言う意味です。
ここでいったんswatchを起動します。
/etc/init.d/swatch start
sshで存在しないユーザーでログインを試みてわざとエラーを出します。
次に正しくログインし/var/log/auth.logにエラーが記録されているか確認します。
ルート当てに通知のメールが届いていることを確認します。
iptablesが正しく機能して言るか確認します。
/sbin/iptables -L
さきほどエラーを出したIPアドレスが表示されればOKです。
/etc/swatch.confの ACCEPTをDROPに変更して、swatchをリスタートします。
最後にlogrotateに対応するため/etc/cron.daily/sysklogdを修正します。
/etc/cron.daily/sysklogd
中略
# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart > /dev/null
/etc/init.d/seatch restart > /dev/null
これでsshdへの攻撃があると2分間アクセスを遮断してルートに通知のメールを出します。
全てのアクセスを遮断しますのでパスワードを誤ってしまったときには2分間辛抱するしかありません。
ワームのapacheヘの攻撃もこれで遮断できるかも知れませんが、最近ワームからのアクセスが減って来ているので今回は見送ることにしました。
この他にもharden,sXid,AIDE, などのパッケージもあります。
しかし、これらのソフトは侵入を検知するソフトで、侵入を防ぐソフトではありません。
もう少し研究が必要です。