Tripwire で Web公開用ディレクトリの変更をチェックする

Linux
Linux
スポンサーリンク

Tripwireは、指定したファイルやディレクトリ等の変更を検知して、レポートに出力したり、管理者にメールで通知してくれるソフトウェアです。侵入者により、不正な改ざんが行われた事を検知することが Tripwire の目的であるため、ホスト型IDS(侵入検知システム)とも呼ばれています。そこで今回は、Tripwire を使って、Web公開用ディレクトリの変更をチェックしてみたいと思います。

設定の概要

今回の設定内容は、Web公開用ディレクトリ「/var/www/html/」以下の変更を、毎日決まった時間に自動チェックして、チェック結果のレポートをメールで通知するといった、シンプルな内容です。

以下のもくじが、Tripwire のインストール〜設定の流れです。設定ファイルやポリシーファイルの暗号署名や、データーベースの作成が必要なため手順が多いですが、一つ一つの手順は簡単です。(サーバOSはCentOS7.2を使っています)

Tripwire のインストール

EPELリポジトリの追加

yum でインストールする場合は、EPELからのインストールになりますので、EPELリポジトリを追加しておきます。

rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7

Tripwire のインストール

Tripwire をインストールします。

yum -y install tripwire

サイトキーとローカルキーの作成

暗号署名を行うのに使う、サイトキーとローカルキーを作成します。ここで設定するサイトパスフレーズとローカルパスフレーズが分からなければ、攻撃者がサーバに侵入できたとしても、Tripwire の設定やデータベースを書換えることは出来ません。

※パスフレーズは8文字以上であることが必要です。

tripwire-setup-keyfiles ←キーのセットアップスクリプト実行
 
(略)
Enter the site keyfile passphrase: <サイトパスフレーズ>
Verify the site keyfile passphrase: <サイトパスフレーズ>
Generating key (this may take several minutes)...Key generation complete.
(略)
Enter the local keyfile passphrase: <ローカルパスフレーズ>
Verify the local keyfile passphrase: <ローカルパスフレーズ>
Generating key (this may take several minutes)...Key generation complete.
(略)
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」と、ポリシーファイル「twpol.txt」の2つのみです。

ls -1 /etc/tripwire/
 
site.key・・・・・・・サイトキー
tw.cfg・・・・・・・・(暗号署名済)設定ファイル
tw.pol・・・・・・・・(暗号署名済)ポリシーファイル
twcfg.txt・・・・・・・設定ファイル
twpol.txt・・・・・・・ポリシーファイル
localhost-local.key・・ローカルキー

Tripwire の設定

設定ファイルを編集して、Tripwire の動作を指定します。

vim /etc/tripwire/twcfg.txt

LOOSEDIRECTORYCHECKING =false
 ↓
LOOSEDIRECTORYCHECKING =true

LOOSEDIRECTORYCHECKING
 パラメータが「false」の場合は、ファイルがディレクトリから追加または削除された場合、ファイルとディレクトリ両方の変更を報告しますが、これを「true」とすると、ファイルの変更のみを報告します。

(参考資料)Tripwire 設定ファイルの man ページ

man twconfig

設定ファイルの暗号署名

twadmin コマンドを使って、設定ファイルに暗号署名を行います。

cd /etc/tripwire/
twadmin --create-cfgfile -c tw.cfg -S site.key twcfg.txt
Please enter your site passphrase: <サイトパスフレーズ>
Wrote configuration file: /etc/tripwire/tw.cfg

オプションの指定方法は以下の通りです。

twadmin --create-cfgfile -c <出力先> -S <サイトキー> <設定ファイル>

暗号署名された設定ファイルの内容は、以下のオプションで確認できます。

twadmin --print-cfgfile

(参考資料)twadmin コマンドの man ページ

man twadmin

ポリシーファイルの作成

オリジナルのポリシーファイル(twpol.txt)は、参考用にとっておいて、新しくポリシーファイルを作成します。オリジナルのポリシーファイルの「@@section FS」に、UNIX用の変数が定義されていますので、今回はこれを流用して設定しています。

vim /etc/tripwire/my_twpol.txt

@@section FS
SEC_CRIT      = $(IgnoreNone)-SHa ;  # Critical files that cannot change
SEC_SUID      = $(IgnoreNone)-SHa ;  # Binaries with the SUID or SGID flags set
SEC_BIN       = $(ReadOnly) ;        # Binaries that should not change
SEC_CONFIG    = $(Dynamic) ;         # Config files that are changed infrequently but accessed often
SEC_LOG       = $(Growing) ;         # Files that grow, but that should never change ownership
SEC_INVARIANT = +tpug ;              # Directories that should never change permission or ownership
SIG_LOW       = 33 ;                 # Non-critical files that are of minimal security impact
SIG_MED       = 66 ;                 # Non-critical files that are of significant security impact
SIG_HI        = 100 ;                # Critical files that are significant points of vulnerability

(
  rulename = "Web Public Directory",
  severity = $(SIG_HI),
  emailto = sample@example.com
)
{
  /var/www/html -> $(SEC_CONFIG);
}

ポリシーの設定方法

「()」ブロック内には属性を「,」カンマ区切りで指定します。設定値に空白や記号がある場合は「"<設定値>"」のようにクオートします。

rulename
 ルール名を指定します。

severity
 重要度の指定、0〜1,000,000の値を指定できます。今回は定義済変数の「$(SIG_HI)」を指定しました。

emailto
 通知先のメールアドレスの指定。複数の場合は「emailto="foo@example.com;bar@example.com"」のように指定します。

「{}」ブロック内には、オブジェクト(ファイルやディレクトリ)と、プロパティ(どのようなチェックを行うか)を、以下の形式で指定します。

{
  <オブジェクト> -> <プロパティ>;
}

Webのコンテンツファイルは、たまに更新されるので「$(SEC_CONFIG)」=「$(Dynamic)」プロパティを設定しておきます。

上記の設定は、ほんの一例です。ポリシーはかなり細かく柔軟に設定できます。詳細は「man twpolicy」をご参照ください。

ポリシーファイルの暗号署名

ポリシーファイルについても twadmin コマンドを使って暗号署名を行います。

twadmin --create-polfile /etc/tripwire/my_twpol.txt
Please enter your site passphrase: <サイトパスフレーズ>
Wrote policy file: /etc/tripwire/tw.pol

暗号署名されたポリシーファイルの内容は、以下のオプションで確認できます。

twadmin --print-polfile

ベースラインデータベースの作成

ポリシーファイルを元に、現在のオブジェクト(ファイルやディレクトリ)の状態を保存する、ベースラインデータベースを作成します。チェック時にこのデータベースと、その時点のオブジェクトの状態が比較され、変更があれば報告されます。

tripwire --init
Please enter your local passphrase: <ローカルパスフレーズ>
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***
Wrote database file: /var/lib/tripwire/localhost.twd
The database was successfully generated.

整合性チェックの実行

ベースラインデータベースが作成されれば、整合性チェックが実行できます。試しに、Web公開ディレクトリにファイルを追加してチェックを実行してみます。

テスト用ファイルの追加

touch /var/www/html/text.txt

整合性チェックの実行

tripwire --check

レポートが表示され、ファイルが追加されたことが確認できるかと思います。
 

(略)
===============================================================================
Rule Summary: 
===============================================================================

-------------------------------------------------------------------------------
  Section: Unix File System
-------------------------------------------------------------------------------

  Rule Name                       Severity Level    Added    Removed  Modified 
  ---------                       --------------    -----    -------  -------- 
* Web Public Directory            100               1        0        0        
  (/var/www/html)

Total objects scanned:  6
Total violations found:  1

===============================================================================
Object Summary: 
===============================================================================

-------------------------------------------------------------------------------
# Section: Unix File System
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Rule Name: Web Public Directory (/var/www/html)
Severity Level: 100
-------------------------------------------------------------------------------

Added:
"/var/www/html/text.txt"

===============================================================================
Error Report: 
===============================================================================

No Errors

メール送信設定(Gmail経由)

メールで、整合性チェック結果を通知するため、サーバからメールを送信できるようにしておきます。以下は、Gmail経由でのメール送信設定です。

・GmailのSMTP認証情報ファイルの作成
vim /etc/postfix/gmail

[smtp.gmail.com]:587 <Gmailのアドレス>:<Gmailのパスワード>

パスワードを書いているので、パーミッションを変更(root のみアクセス可)

chown root /etc/postfix/gmail
chmod 600 /etc/postfix/gmail

PostfixのDBファイルを生成

postmap /etc/postfix/gmail

・Postfixの設定
vim /etc/postfix/main.cf
-----(下記を最終行に追加)-----

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes

設定した内容を読込みます

systemctl reload postfix

tripwire コマンドでメールが送信できることを確認します。送信先のメールアドレス宛に、件名「Test email message from Tripwire」のメールが届いていればOKです。

tripwire --test --email sample@example.com

【補足】
言語(LANG)の設定によっては、メールの送信日時が「1970/1/1」になるなど、正しく表示されないことがあります。その場合は「env LANG=C」と合わせて上記のコマンドを実行してください。

env LANG=C tripwire --test --email sample@example.com

自動チェックの設定(crontab)

毎日決まった時間に整合性チェックを行い、結果をメールで送信するように設定します。

Tripwire のインストール時に、/etc/cron.daily/ 以下に自動チェックスクリプトが配置されていますが、今回は別にスクリプトを作成しますので、これを退避しておきます。

mv /etc/cron.daily/tripwire-check /etc/tripwire/

新たに自動チェックスクリプトを作成します。「--email-report」オプションを追加して、チェック結果のレポートをメールで通知します。また、変更があった場合、ベースラインデータベースを更新しないと、同じ報告が繰り返しレポートされてしまいますので、整合性チェック後にベースラインデータベースを再作成しています。
vim /etc/tripwire/my_tripwire-check.sh

#!/bin/sh
env LANG=C /usr/sbin/tripwire --check --email-report > /dev/null 2>&1
env LANG=C /usr/sbin/tripwire --init -P ローカルパスフレーズ > /dev/null 2>&1
exit 0

ローカルパスフレーズを書いているため root 以外は閲覧できないようにし、実行権限を付けます。

chown root /etc/tripwire/my_tripwire-check.sh
chmod 700 /etc/tripwire/my_tripwire-check.sh

自動チェックスクリプトを crontab に登録します。以下の設定例は、毎日朝4時に整合性チェックが行われ、結果がメールで通知されます。
crontab -u root -e

00 04 * * * /etc/tripwire/my_tripwire-check.sh

終わりに

今回チェック対象として、Web公開ディレクトリのみを設定してみましたが、Tripwire Japan サイトの「Web改ざん検知対策」ページによると、アプリケーションの構成ファイルや、WebサーバのOS構成ファイルなどもチェックすることも必要とされています。合わせて設定しておきたいですね。

コメント

  1. 匿名希望 より:

    勉強になりました。ありがとうございました。

タイトルとURLをコピーしました