Tripwireは、指定したファイルやディレクトリ等の変更を検知して、レポートに出力したり、管理者にメールで通知してくれるソフトウェアです。侵入者により、不正な改ざんが行われた事を検知することが Tripwire の目的であるため、ホスト型IDS(侵入検知システム)とも呼ばれています。そこで今回は、Tripwire を使って、Web公開用ディレクトリの変更をチェックしてみたいと思います。
設定の概要
今回の設定内容は、Web公開用ディレクトリ「/var/www/html/」以下の変更を、毎日決まった時間に自動チェックして、チェック結果のレポートをメールで通知するといった、シンプルな内容です。
以下のもくじが、Tripwire のインストール〜設定の流れです。設定ファイルやポリシーファイルの暗号署名や、データーベースの作成が必要なため手順が多いですが、一つ一つの手順は簡単です。(サーバOSはCentOS7.2を使っています)
Tripwire のインストール
EPELリポジトリの追加
yum でインストールする場合は、EPELからのインストールになりますので、EPELリポジトリを追加しておきます。
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
Tripwire のインストール
Tripwire をインストールします。
サイトキーとローカルキーの作成
暗号署名を行うのに使う、サイトキーとローカルキーを作成します。ここで設定するサイトパスフレーズとローカルパスフレーズが分からなければ、攻撃者がサーバに侵入できたとしても、Tripwire の設定やデータベースを書換えることは出来ません。
※パスフレーズは8文字以上であることが必要です。
(略)
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つのみです。
site.key・・・・・・・サイトキー
tw.cfg・・・・・・・・(暗号署名済)設定ファイル
tw.pol・・・・・・・・(暗号署名済)ポリシーファイル
twcfg.txt・・・・・・・設定ファイル
twpol.txt・・・・・・・ポリシーファイル
localhost-local.key・・ローカルキー
Tripwire の設定
設定ファイルを編集して、Tripwire の動作を指定します。
vim /etc/tripwire/twcfg.txt
↓
LOOSEDIRECTORYCHECKING =true
LOOSEDIRECTORYCHECKING
パラメータが「false」の場合は、ファイルがディレクトリから追加または削除された場合、ファイルとディレクトリ両方の変更を報告しますが、これを「true」とすると、ファイルの変更のみを報告します。
(参考資料)Tripwire 設定ファイルの man ページ
設定ファイルの暗号署名
twadmin コマンドを使って、設定ファイルに暗号署名を行います。
twadmin --create-cfgfile -c tw.cfg -S site.key twcfg.txt
Please enter your site passphrase: <サイトパスフレーズ>
Wrote configuration file: /etc/tripwire/tw.cfg
オプションの指定方法は以下の通りです。
暗号署名された設定ファイルの内容は、以下のオプションで確認できます。
(参考資料)twadmin コマンドの man ページ
ポリシーファイルの作成
オリジナルのポリシーファイル(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 コマンドを使って暗号署名を行います。
Please enter your site passphrase: <サイトパスフレーズ>
Wrote policy file: /etc/tripwire/tw.pol
暗号署名されたポリシーファイルの内容は、以下のオプションで確認できます。
ベースラインデータベースの作成
ポリシーファイルを元に、現在のオブジェクト(ファイルやディレクトリ)の状態を保存する、ベースラインデータベースを作成します。チェック時にこのデータベースと、その時点のオブジェクトの状態が比較され、変更があれば報告されます。
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公開ディレクトリにファイルを追加してチェックを実行してみます。
テスト用ファイルの追加
整合性チェックの実行
レポートが表示され、ファイルが追加されたことが確認できるかと思います。
(略) =============================================================================== 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
パスワードを書いているので、パーミッションを変更(root のみアクセス可)
chmod 600 /etc/postfix/gmail
PostfixのDBファイルを生成
・Postfixの設定
vim /etc/postfix/main.cf
-----(下記を最終行に追加)-----
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
設定した内容を読込みます
tripwire コマンドでメールが送信できることを確認します。送信先のメールアドレス宛に、件名「Test email message from Tripwire」のメールが届いていればOKです。
【補足】
言語(LANG)の設定によっては、メールの送信日時が「1970/1/1」になるなど、正しく表示されないことがあります。その場合は「env LANG=C」と合わせて上記のコマンドを実行してください。
自動チェックの設定(crontab)
毎日決まった時間に整合性チェックを行い、結果をメールで送信するように設定します。
Tripwire のインストール時に、/etc/cron.daily/ 以下に自動チェックスクリプトが配置されていますが、今回は別にスクリプトを作成しますので、これを退避しておきます。
新たに自動チェックスクリプトを作成します。「--email-report」オプションを追加して、チェック結果のレポートをメールで通知します。また、変更があった場合、ベースラインデータベースを更新しないと、同じ報告が繰り返しレポートされてしまいますので、整合性チェック後にベースラインデータベースを再作成しています。
vim /etc/tripwire/my_tripwire-check.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 以外は閲覧できないようにし、実行権限を付けます。
chmod 700 /etc/tripwire/my_tripwire-check.sh
自動チェックスクリプトを crontab に登録します。以下の設定例は、毎日朝4時に整合性チェックが行われ、結果がメールで通知されます。
crontab -u root -e
終わりに
今回チェック対象として、Web公開ディレクトリのみを設定してみましたが、Tripwire Japan サイトの「Web改ざん検知対策」ページによると、アプリケーションの構成ファイルや、WebサーバのOS構成ファイルなどもチェックすることも必要とされています。合わせて設定しておきたいですね。
コメント
勉強になりました。ありがとうございました。