インターネットに公開するサーバーのセキュリティ対策のひとつに「改ざん検知」があります。たとえば、インターネットに公開しているWebサーバーなどでは、Webサイトが悪意のある第三者からの攻撃で、サーバー上のファイルなどを意図しない状態に変更されてしまう(改ざんされてしまう)危険性があります。
そのため、そのようなサーバーでは改ざんを防ぐ対策を実施しますが、改ざんは100%は防ぎきれないため、改ざんを防ぐ対策とともに、改ざんをいち早く検出する仕組みが重要になります。
そこでここでは、Linuxサーバーでの改ざんを検知するソフトウェアとして有名な「Tripwire」を使って改ざんを検知する方法を解説します。
目次
Tripwireとは
Tripwireは、ファイルやディレクトリの状態を監視して改ざんを検知するソフトウェアとして有名で、米Tripwire, Inc.が開発、販売している「Tripwire Enterprise」と呼ばれる商用版と、無償公開されているオープンソース版があります。
情報処理推進機構(IPA)においても、企業でWebサーバーの改ざんを検知する場合、商用版の「Tripwire Enterprise」の採用が推奨されており、日本においても多くの企業で導入されています。
無償公開されているオープンソース版は、商用版に比べると機能面などで劣りますが、小規模なLinuxシステムで基本的な改ざん検知の仕組みを構築したい場合では、現在でも有効な選択肢です。
Tripwireの基本的な仕組みは、ベースとなるシステムの状態を内部データベースに記録しておき、現在の状態と比較することで改ざんを検知しており、次のような改ざんを検知できます。
- ファイル内容の変更
- ファイルやディレクトリの追加
- ファイルやディレクトリの削除
- ファイルやディレクトリの属性の変更
Tripwireの使い方
ここからは、RedHat系のLinux(AlmaLinux9)を例にオープンソース版のTripwireを使って改ざん検知の仕組みを構築する手順を解説します。
インストールと初期設定
Tripwireは、EPELリポジトリからインストールが可能なので、以下のコマンドを順に実行してインストールします。
# dnf install epel-release
# dnf install tripwire
Tripwireをインストールしたら、以下のコマンドを実行して「サイトパスフレーズ」と「ローカルパスフレーズ」を設定します。
# tripwire-setup-keyfiles
:
Enter the site keyfile passphrase: ←サイトパスフレーズの入力
Verify the site keyfile passphrase: ←サイトパスフレーズの確認
:
Enter the local keyfile passphrase: ←ローカルパスフレーズの入力
Verify the local keyfile passphrase: ←ローカルパスフレーズの確認
:
Signing configuration file...
Please enter your site passphrase: ←サイトパスフレーズの入力
Wrote configuration file: /etc/tripwire/tw.cfg
:
Signing policy file...
Please enter your site passphrase: ←サイトパスフレーズの入力
Wrote policy file: /etc/tripwire/tw.pol
設定ファイルの作成
次に、tripwireの設定ファイル/etc/tripwire/twcfg.txtをテキストエディターで開いて、レポートレベルを設定します。
# vi /etc/tripwire/twcfg.txt
:
EMAILREPORTLEVEL =3 ←0~4の範囲でレポートの詳細レベルを指定(4が最も詳細)
REPORTLEVEL =3 ←0~4の範囲でレポートの詳細レベルを指定(4が最も詳細)
:
設定ファイルの編集を完了したら、以下のコマンドを実行して暗号署名済みの設定ファイルを生成します。
# twadmin --create-cfgfile -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
Please enter your site passphrase: ←サイトパスフレーズを入力
Wrote configuration file: /etc/tripwire/tw.cfg
暗号署名済みの設定ファイルを作成したら、安全のため元のテキスト版の設定ファイルは削除しておきます。
# rm /etc/tripwire/twcfg.txt
設定ファイルを変更するときは、以下のコマンドで暗号署名済み設定ファイルの内容をテキストファイルとして出力して、出力したテキストファイルを編集し、編集後に再度上の手順で暗号署名済みの設定ファイルにします。
# twadmin --print-cfgfile > /etc/tripwire/twcfg.txt
ポリシーファイルの作成
次に、どのようなチェック行うのかを定義するポリシーファイルを作成します。
ポリシーファイルとして、デフォルトで「/etc/tripwire/twpol.txt」が用意されていますが、デフォルトのポリシーファイルには、システム上に存在しないファイルやディレクトリも記述されおりエラーの原因となるので、そのような記述をコメントアウトしたファイルを生成する必要があります。
エラーの原因となる記述を「twpol.txt」からコメントアウトするには、以下のようなスクリプトファイルを作成して実行します。
# vi /etc/tripwire/fixtwpol.sh
#!/bin/sh
error=$1.err
output=$1.new
cp $1 $output
tripwire --init 2> $error
paths="`cat $error | grep Filename | sed -r -e "s/[ #]+Filename: +//"`"
for path in $paths
do
echo $path
sed -r -e "s;$path([ ¥t]);#$path¥1;" $output > $output~
cp $output~ $output
done
rm $error $output~
シェルスクリプトを作成したら、デフォルトのポリシーファイルを引数として指定して実行することで、新しいポリシーファイル「/etc/tripwire/twpol.txt.new」が生成されます。
# bash /etc/tripwire/fixtwpol.sh /etc/tripwire/twpol.txt
Please enter your local passphrase: ←ローカルパスフレーズを入力
:
Generating the database...
:
The database was successfully generated.
:
ポリシーファイルを作成したら、以下のコマンドを実行して暗号署名済みのポリシーファイルを生成します。
# twadmin --create-polfile -S /etc/tripwire/site.key /etc/tripwire/twpol.txt.new
Please enter your site passphrase: ←サイトパスフレーズを入力
Wrote policy file: /etc/tripwire/tw.pol
暗号署名済みのポリシーファイルを作成したら、安全のため元のテキスト版のポリシーファイルは削除しておきます。
# rm /etc/tripwire/twpol.txt.new
ポリシーファイルを変更したいときは、暗号署名済みのポリシーファイルの内容をテキストファイルとして出力して、出力したテキストファイルを編集し、編集後に再度上の手順で暗号署名済みのポリシーファイルにします。
# twadmin --print-polfile > /etc/tripwire/twpol.txt.new
tripwireデータベースの作成
次に、以下のコマンドを実行して、ベースとなるファイルやディレクトリの状態をデータベースに記録します。
# tripwire --init
Please enter your local passphrase: ←ローカルパスフレーズを入力
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
:
The database was successfully generated.
整合性チェックの実行
データベースを作成したら、以下のコマンドで整合性チェックを実行します。実行結果は、画面上に表示されるとともにレポートファイルに記録されます。
実行結果では、改ざんされた可能性のあるファイル(整合性に問題のあるファイル)の数やファイル名などを確認できます。
# tripwire --check
Parsing policy file: /etc/tripwire/tw.pol
*** Processing Unix File System ***
Performing integrity check...
The object: "/boot/efi" is on a different file system...ignoring.
Wrote report file: /var/lib/tripwire/report/sv001.local-20250206-004601.twr
:
Open Source Tripwire(R) 2.4.3.7 Integrity Check Report
:
Total violations found: 0
========================================================
Object Summary:
========================================================
-------------------------------------------------------------------------------
# Section: Unix File System
-------------------------------------------------------------------------------
No violations.
========================================================
Error Report:
========================================================
No Errors
-------------------------------------------------------------------------------
*** End of report ***
:
Integrity check complete.(チェック完了)
整合性チェックで生成されるレポートファイルはバイナリ形式ファイルですが、以下のようにコマンドを実行することで、テキスト形式で表示できます。
# twprint --print-report --twrfile /var/lib/tripwire/report/sv001.local-20250206-004601.twr
tripwireデータベースの更新
データベースを更新するときは、以下のようにコマンドを実行します。(レポートファイルのパスは、整合性チェックを実行したときに表示されています。)
# tripwire --update --twrfile <レポートファイルのパス>
コマンドを実行するとViエディターが開くので、以下の個所を確認し「x」のついている部分がデータベースに追加されるので、追加したくないファイルは「x」を削除します。
:
Remove the "x" from the adjacent box to prevent updating the database
with the new values for this object.
Added:
[x] "/var/lib/tripwire/centos8r.twd.bak"
:
Viエディター上での確認・編集を完了したら、Viエディターを終了することでデータベースの更新処理が実行されます。(なお、Viエディターでの編集方法やファイルの保存方法はここでは割愛します。)
Please enter your local passphrase: ←ローカルパスフレーズを入力
Wrote database file: /var/lib/tripwire/sv001.local.twd
整合性チェックの定期実行
tripwireによる整合性チェック、チェック結果のメール送信、tripwireデータベースの更新を定期的に実行したいときは、以下のようなシェルスクリプトを作成し、cronで定期実行させます。
# vi /etc/tripwire/tripwire.sh
#!/bin/sh
LOCALPASS="<ローカルパスフレーズ>"
RUNDATE=`date +%Y%m%d-%H%M%S`
TWRFILE=/tmp/tripwire_$RUNDATE.twr
TRIPWIRE=/usr/sbin/tripwire
HOSTNAME=`hostname`
MAILADDR=<送信先メールアドレス>
SUBJECT="Tripwire Check Report: "
$TRIPWIRE --check --twrfile $TWRFILE | mail -s "$SUBJECT $HOSTNAME" ¥
-S v15-compat=yes ¥
-S mta=smtp://<ユーザー名>:<パスワード>@<SMTP サーバーホスト名>:<ポート番号> ¥
-S smtp-auth=login ¥
-S smtp-use-starttls ¥
-S from=<送信元メールアドレス> ¥
-S nss-config-dir=/etc/openldap/certs/ ¥
$MAILADDR
$TRIPWIRE --update --twrfile $TWRFILE --local-passphrase $LOCALPASS --accept-all
rm -f $TWRFILE
電子メールを送信するmailコマンドがシステムにインストールされていない時は、以下のコマンドでインストールできます。
# dnf install s-nail
次に、以下のコマンドで作成したシェルスクリプトをcronに登録します。以下では、毎日4時に実行するよう設定しています。
# vi /etc/crontab
* 4 * * * root bash /etc/tripwire/tripwire.sh 2>&1
シェルスクリプトをバイナリ化すればより安全
シェルスクリプト内にはパスフレーズやパスワードを記述しているので、安全を期すならバイナリ化して難読化するのがおすすめです。
シェルスクリプトをバイナリ化するときは、以下のコマンドを順に実行します。
# dnf install shc
# shc -r -f tripwire.sh
シェルスクリプトをバイナリ化したら、元ファイルと中間ファイルは削除しておきます。
# rm tripwire.sh tripwire.sh.x.c ←元ファイルと中間ファイルの削除
あとがき
個人や小規模システムで利用するLinuxマシンでディレクトリやファイルの改ざんを検知したいなら、オープンソース版のTripwireを利用するのも選択肢として十分にありではないでしょうか。ご検討あれ。