はじめに
Linuxなどに不正な侵入ツールである「rootkit(ルートキット)」が仕掛けられていないかを検知するためのオープンソースのセキュリティ診断スクリプト『chkrootkit』のバージョンアップをしたので、その時の覚書です。
なお、サーバーには既に chkrootkit version 0.53-github2 がインストールされており、今回は入替作業です。
サーバー環境
chkrootkitをバージョンアップするサーバー環境は以下の通りです。
Rocky Linux release 8.7 (Green Obsidian)
chkrootkitのバージョン確認方法は、
[root@sv01 ~]# chkrootkit -V
chkrootkit version 0.53-github2
バージョンアップ手順
必要なものを先にインストール
事前に必要なものを先にインストールしておきます。
私のサーバーでは「gcc」「glibc-static」が必要でした。
[root@sv01 ~]# dnf install gcc -y
[root@sv01 ~]# dnf --enablerepo=powertools install glibc-static -y
ソースコードを取得
公式サイトから最新版ver0.59のchkrootkitのソースコードを取得します。
「/home/works」は作業用フォルダです。
[root@sv01 ~]# mkdir /home/works
[root@sv01 ~]# cd /home/works/
[root@sv01 ~]# wget ftp://ftp.chkrootkit.org/pub/seg/pac/chkrootkit.tar.gz
ビルドする
chkrootkit.tar.gz を展開して、「chkrootkit-0.59」に移動してから、makeコマンドでビルドします。
[root@sv01 ~]# tar -zxvf ./chkrootkit.tar.gz
[root@sv01 ~]# cd /home/works/chkrootkit-0.59
[root@sv01 ~]# make sense
cc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
cc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
cc -o chkproc chkproc.c
cc -o chkdirs chkdirs.c
cc -o check_wtmpx check_wtmpx.c
cc -static -o strings-static strings.c
strip: strings-static[.gnu.build.attributes__libc_freeres_fn]: Warning: version note missing - assuming version 3
cc -o chkutmp chkutmp.c
※「Warning: version note missing – assuming version 3」は警告なので無視します。
でも、「sense」を付けないとビルドに失敗しますので要注意です。
「sense」をつけ忘れてビルドに失敗した際は、make cleanでゴミ掃除してから、再度 make sense です。
ソースコードを取得
このサーバーには古い「chkrootkit version 0.53-github2」が入っているので、これを無効化しておきます。
ちなみに、このサーバーでは古いchkrootkitが /usr/bin/ 配下に入っていました。
新しいchkrootkitは、/usr/local/bin/に設置します。
[root@sv01 ~]# mv /usr/bin/chkrootkit /usr/bin/chkrootkit.old
新バージョンを/usr/local/bin/に設置
新バージョン0.59に関するスクリプトファイルを/usr/local/bin/にコピー設置する。
[root@sv01 ~]# cp ./chkrootkit /usr/local/bin/
[root@sv01 ~]# cp chklastlog chkwtmp chkproc chkdirs check_wtmpx strings-static chkutmp /usr/local/bin/
[root@sv01 ~]# chmod 755 /usr/local/bin/chkrootkit
[root@sv01 ~]# chmod 755 /usr/local/bin/chklastlog /usr/local/bin/chkwtmp /usr/local/bin/chkproc /usr/local/bin/chkdirs /usr/local/bin/check_wtmpx /usr/local/bin/strings-static /usr/local/bin/chkutmp
新しいchkrootkitの確認
古いchkrootkitのコマンドパスを記憶しているので、その情報を削除してからchkrootkitコマンドのバージョン確認をします。
[root@sv01 ~]# hash -r
[root@sv01 ~]# chkrootkit -V
chkrootkit version 0.59
新しいchkrootkitで感染チェック
[root@sv01 ~]# chkrootkit | grep INFECTED
chkrootkitの実行結果は何も表示されないのが正解です。
「INFECTED」と表示された場合はrootkitに感染しているので大騒ぎしてください。
Cron用のスクリプトを修正
cronで毎日chkrootkitを実行し、rootkitに感染していないかチェックし、感染していたらメールを送信するスクリプトを設置してあります。
今回、chkrootkitコマンドを配置場所が変わったので、スクリプト内の変数PATHのところだけ修正しておきます。
[root@sv01 ~]# vi /etc/cron.daily/chkrootkit
#!/bin/sh
#PATH=/usr/bin:/bin
PATH=/usr/local/bin:/usr/bin:/bin
LOG=/tmp/$(basename ${0})
# chkrootkit実行
chkrootkit > $LOG 2>&1
# ログ出力
cat $LOG | logger -t $(basename ${0})
# SMTPSのbindshell誤検知対応
if [ ! -z "$(grep 465 $LOG)" ] && \
[ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then
sed -i '/465/d' $LOG
fi
# upstartパッケージ更新時のSuckit誤検知対応
if [ ! -z "$(grep Suckit $LOG)" ] && \
[ -z "$(rpm -V `rpm -qf /sbin/init`)" ]; then
sed -i '/Suckit/d' $LOG
fi
# rootkit検知時のみroot宛メール送信
[ ! -z "$(grep INFECTED $LOG)" ] && \
grep INFECTED $LOG | mail -s "chkrootkit report in `hostname`" root

コメント