[Linux] chkrootkitのバージョンアップ作業

Linux

はじめに

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」は警告なので無視します。

makeコマンドの「sense」ですが、なんのオプションかとGeminiに聞いてみたら、製作者のジョークらしく意味は無いそうです。
でも、「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

コメント