ツボ!その16

Tripwire で改ざんをチェック!!

みなさんの管理されてるマシンは大丈夫ですか? 「あのデータはいつの間に消えたんだろう」とか 「これって、こんな設定だったっけ?」なんて 思ったりしたことありませんか?もしかしたら システムが自動的に変更したのかもしれませんし、 ご自分で削除したり変更したりしたのかもしれませんが、 もしかしたら誰かが勝手に何かしたのかもしれませんよね・・・。

今回ご紹介する Tripwire は 一言で言いますと、

ファイルやディレクトリの変化を チェックするツール

です。もう少し具体的には

といったことを教えてくれます。実際には もっと細かくチェックすることができます。 (Tripwire では、上記の内容をチェックすることを 「整合性チェック」 といいます。)

しかし、何にでもできることとできないことがあるように、 Tripwire にもできないことはあります。

以上のように、Tripwire は、 ファイルが変更されてからそれを教えてくれる ツールであることが分かると思います。

「それじゃ意味がないよ」と思われるかもしれませんが、 改ざんされてしまったことを認識するのはとっても大切なことです。 攻撃者は改ざんするだけでなく、あなたのサーバを他のサイトへの 攻撃の踏み台にしてしまうかもしれないのです。そんなことに ならないためにも、管理下にあるシステムの状態を 把握しておくことはセキュリティ対策上、大変重要です。 どうですか?Tripwire の必要性が分かっていただけましたか?

INDEX

  1. インストールの前に・・・
  2. インストール
  3. キーの作成
  4. 設定ファイルの作成
  5. ポリシーファイルの作成
  6. データベースの作成
  7. 動作確認
  8. データベースのアップデート
  9. ポリシーのアップデート
  10. 定期的にチェックする
  11. レポートを表示させる

Index (1) インストールの前に…

Tripwire をインストールするシステムは、 全てのサービスが問題なく インストールされていることを確認してください。

また、Tripwire の設定が完了するまでは インターネットに接続しないで下さい。 もしも、構築中に不正侵入され、ファイル等が改ざんされた場合、 Tripwire の効果がなくなってしまいます。

Index (2) インストール

  1. ダウンロード

    http://www.tripwire.org/から tripwire-2.3-47.i386.tar.gz を ダウンロードします。

    ちなみに、RPM3.0版はRed Hat Linux 5.x〜6.x用、RPM4.0版は Red Hat Linux 7.x用です。


  2. 解凍・インストール

    $ tar zxvf tripwire-2.3-47.i386.tar.gz
    # rpm -ivh tripwire-2.3-47.i386.rpm
    

    今回は rpm でのインストールですから簡単ですね。

Index (3) キーの作成

では、 サイトキー ( Tripwire の設定時に用いるパスワード)と ローカルキー (レポートなどに利用されるパスワード)を 作成しましょう。スクリプトを使えば簡単なのですが、 コマンドに慣れていただくため、あえて コマンドを使う方法をご紹介します。

Index (4) 設定ファイルの作成

Tripwire の設定ファイルは tw.cfg ファイルです。Tripwire はこのファイルに設定されている内容に したがって動作します。この tw.cfg ファイルは バイナリファイルで、サイトキーにより暗号署名 されています。実際の設定変更は、クリアテキストの twcfg.txt ファイルを使用します。

つまり・・・

  1. twcfg.txt ファイルの作成
  2. twcfg.txt ファイルをバイナリ変換して tw.cfg を生成

とする必要があります。

では、まずは twcfg.txt ファイルを作成しましょう。

エディタで /etc/tripwire/twcfg.txt を以下のように編集しましょう。

ROOT                   =/usr/sbin
POLFILE                =/etc/tripwire/tw.pol
DBFILE                 =/var/lib/tripwire/$(HOSTNAME).twd
REPORTFILE             =/var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr
SITEKEYFILE            =/etc/tripwire/site.key
LOCALKEYFILE           =/etc/tripwire/local.key
EDITOR                 =/bin/vi
LATEPROMPTING          =false
LOOSEDIRECTORYCHECKING =true
MAILNOVIOLATIONS       =true
EMAILREPORTLEVEL       =4
REPORTLEVEL            =4
MAILMETHOD             =SMTP
SMTPHOST               = メールサーバアドレス
SMTPPORT               =25
SYSLOGREPORTING        =true

*それぞれのキーワードの意味は 資料編を参照してください。

次に、twcfg.txt ファイルをバイナリに変換しましょう。

# /usr/sbin/twadmin -m F -S /etc/tripwire/site.key \
-c /etc/tripwire/tw.cfg /etc/tripwire/twcfg.txt

サイトキーのパスフレーズを要求されますので、 入力します。その後、以下のようなメッセージが 表示されれば、バイナリファイルが生成されています。

Wrote configuretion file: /etc/tripwire/tw.cfg

また、先ほどの twcfg.txt で「SYSLOGREPORTING」を "true"にしたので、 /etc/syslog.conf ファイルにて、

*.infouser.notice を追加して保存してください。

* 設定ファイル作成のコマンドとオプションの一覧→ 資料編

Index (5) ポリシーファイルの作成

Tripwire は、ポリシーファイルに設定されている 内容にしたがってファイルやディレクトリのチェックを 行います。ポリシーファイルも設定ファイルと同様に、 まずクリアテキストを編集してから、バイナリに 変換します。

/etc/tripwire ディレクトリに twpol.txt という サンプルポリシーファイルがあると思いますが、 これはあくまでサンプルであって、すべての システムに対応しているわけではありません。 ですから、今回は新規にポリシーファイルを 作成することにしましょう。

さて、ポリシーファイルを作成する場合、 どのファイルやディレクトリを監視対象に するかは大変重要です。例えば、Webサーバのコンテンツ 改ざんを検知するなら、コンテンツに関する ファイルが監査対象となるでしょう。しかし、 もしもたくさんのファイルを 監視対象にしてしまうと、その分システムに 負荷が生じてしまいます。Tripwire の導入の 目的を考えて、 必要最小限のファイルを監視対象にすべき と思います。

ここでご紹介するポリシーファイルはあくまで ひとつの例です。みなさんのそれぞれの システムに合わせて監視対象を決定してください。

では、ポリシーファイルを sample.txt として /etc/tripwire ディレクトリに新規作成します。

#sample.txt
#
# 2003/06
(
 rulename = sample ,
 emailto = 管理者のメールアドレス
)

{
/	-> $(ReadOnly)	(rulename = root, recurse = 1);
/bin	-> $(ReadOnly)	(rulename = bin );
/boot	-> $(ReadOnly)	(rulename = boot );
/etc	-> $(ReadOnly)	(rulename = etc );
/lib	-> $(ReadOnly)	(rulename = lib );
/sbin	-> $(ReadOnly)	(rulename = sbin );
}

*ポリシーファイルの内容については 資料編を参照してください。

では、ポリシーファイルをバイナリに変換しましょう。

# /usr/sbin/twadmin -m P -c /etc/tripwire/tw.cfg -p \
/etc/tripwire/tw.pol -S /etc/tripwire/site.key \
/etc/tripwire/sample.txt

サイトキーのパスフレーズを要求されますので、 入力します。その後、以下のようなメッセージが 表示されれば、ポリシーファイルが生成されています。

Wrote policy file: /etc/tripwire/tw.pol

* ポリシーファイルの作成のコマンドとオプションの一覧→ 資料編

Index (6) データベースの作成

Tripwire がどうやって改ざんを検知するかというと、 ポリシーによって指定されたディレクトリやファイルの ハッシュ値をデータベースに保存しておき、 そのデータベースと現在のハッシュ値を比較することによって 監査を行います。というわけで、現在の ポリシーに基づいたデータベースを作成しましょう。

では、下記のコマンドを実行します。

# /usr/sbin/tripwire -m i

すると、ローカルキーのパスフレーズを要求されるので 入力してください。以下のようなメッセージが 表示されればデータベース作成は完了です。

Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***
Wrote database file: /var/lib/tripwire/xxxx.twd
The database was successfully generated.

* データベースの作成のコマンドとオプションの一覧→ 資料編

Index (7) 動作確認

ポリシーファイルが間違いなく反映されているか 確認してみましょう。

# /usr/sbin/twadmin -m p -c /etc/tripwire/tw.cfg \
-p /etc/tripwire/tw.pol -S /etc/tripwire/site.key

上記のコマンドを実行すると、先ほど作成した sample.txt の内容が表示されたらO.K.です。

表示を確認できたらセキュリティ上、sample.txt 削除しておきましょう。

* ポリシーファイルの表示コマンドとオプションの一覧→ 資料編

では、整合性チェックを行いましょう。

これ以降の作業は、管理者宛メールの確認も行うので、 ネットワークに接続した上で実行します。

# tripwire -m c

しばらくするとレポートが出力されます。 (資料編参照)

整合性チェックの前に sample.txt を削除しているので Removed の項目でエラーが出ていると思います。 これは、データベースを作成してからファイルを削除したためです。 (データベースの更新方法は後述します)

また、ポリシーファイルで recurse = 1 にしたので

Parsing policy file: /etc/tripwire/tw.pol
*** Processing Unix File System ***
Performing integrity check...
The object: "/home" is on a different file system...ignoring.
The object: "/proc" is on a different file system...ignoring.
The object: "/usr" is on a different file system...ignoring.
The object: "/var" is on a different file system...ignoring.

というエラーも出ているはずです。 (このエラーの回避法は 資料編にて)

次は、改ざんをチェックできるか試してみましょう。

/etc/group ファイルに一行追加してみましょう。 そして、チェック後、管理者宛にメールでレポートするように してみます。

# /usr/sbin/tripwire -m c -M

管理者宛にメールが届いたでしょうか?→ 資料編

ちゃんと届いていればメール設定も正常です。

また、/var/log/messages に下記のようなログが残っているか 確認してください。

Jun 11 14:10:03 xxxx  xx月 xx xx:xx:xx tripwire[1947]: Integrity 
Check Complete: /var/lib/tripwire/xxxx.twd TWReport xxxx 
2003xxxxxxxxxx V:2 S:0 A:0 R:0 C:2

* 整合性チェックコマンドとオプションの一覧→ 資料編

Index (8) データベースのアップデート

先ほど /etc/group に変更を加えたので、 データベースに保存されている状態とは異なっているので、 次回以降チェックの度に違反が報告されてしまいます。

違反の内容が正常な修正の結果であるような場合、つまり、 /etc/group の内容を変更したのは自分自身で、修正の 理由も分かっている場合には、データベースの内容と レポートで報告されたファイルの状態を一致させておく =アップデートする必要があります。

# /usr/sbin/tripwire -m u -c /etc/tripwire/tw.cfg \
-p /etc/tripwire/tw.pol -r \
/var/lib/tripwire/report/最新のレポートファイル名

これを実行すると、vi でレポートが表示されます。その中に

[x]"/etc/group"

と[x]マークがついている行があります。これは、このファイルに ついて変更をデータベースに反映させるという意味の チェックマークです。反映させる場合はそのままに、 反映させない場合は、チェックマークを削除します。 今回は反映させるので、そのままにして vi を終了します。

すると、ローカルキーのパスフレーズを要求されるので、 入力します。その後、下記のようなメッセージが表示されれば データベースに反映されています。

Wrote detabase file: /var/lib/tripwire/xxxx.twd

念のため、整合性チェックを行ってみてください。 何も違反が報告されなかったら、きちんとデータベースは アップデートされています。

注意点

インタラクティブモードでデータベースをアップデート

インタラクティブモードを利用すれば、整合性チェックをした後に 表示されるレポートを使って、データベースのアップデートモードに 自動的に移行するので便利です。

/usr/sbin/tripwire -m c -I

* データベースのアップデートコマンドとオプションの一覧→ 資料編

Index (9) ポリシーのアップデート

ファイルを追加したり変更したり、新たにチェック対象を 増やしたい場合などはポリシーを アップデートしましょう。

先ほど sample.txt は削除してしまったので、 下記コマンドでテキストファイル化します。

# /usr/sbin/twadmin -m p > /etc/tripwire/sample.txt

sample.txt に必要な変更を加えたら、 下記コマンドでポリシーをバイナリに変換します。

# /usr/sbin/tripwire -m p -c /etc/tripwire/tw.cfg \
-p /etc/tripwire/tw.pol /etc/tripwire/sample.txt

ローカルキーとサイトキーのパスフレーズを要求されるので 入力します。その後、以下のように表示されれば アップデートは完了です。

======== Policy Update: Processing section Unix File System.
======== Step 1: Gathering information for the new policy.
======== Step 2: Updating the database with new objects.
======== Step 3: Pruning unneeded objects from the database.
Wrote policy file: /etc/tripwire/tw.pol
Wrote database file: /var/lib/tripwire/xxxx.twd 
注意点

ポリシーファイルのアップデートにもlowモードとhighモードが あり、デフォルトはhighモードです。ポリシーのアップデートが 実行されると、Tripwire は新旧2つのポリシーを元にして 整合性チェックを行います。

新旧両方のポリシーファイルに共通する違反があった場合・・・

lowモードの場合は違反がレポートされますが、データベースは アップデートされます。 highモードの場合は違反がレポートされ、データベースは アップデートされません。

lowモードでアップデートするのはセキュリティ上好ましくありませんが、 どうしてもアップデートしたい場合は-Z lowオプションをつけると lowモードになります。

# /usr/sbin/tripwire -m p -c /etc/tripwire/tw.cfg \
-p /etc/tripwire/tw.pol -Z low /etc/tripwire/sample.txt

*ポリシーのアップデートコマンドとオプションの一覧→ 資料編

Index (10) 定期的にチェックする

毎回手動でチェックするのは面倒ですよね? 定期的に Tripwire を実行するには cron を編集します。 下記の例は、毎日午前3時から整合性チェックを行い、 管理者宛にメールでレポートを送る設定です。 ノードの負荷などを考慮して、ノードごとになるべく負荷の無い 時間帯を選びましょう。

/etc/crontab に下記の項目を追加してください。

0 3 * * * root /usr/sbin/tripwire -m c -M

Index (11) レポートを表示させる

レポートは設定ファイルで指定したように、 /var/lib/tripwire/report ディレクトリに保存されます。 /var/lib/tripwire/report にあるレポートはバイナリなので less コマンドなどでは読めません。 twprint コマンドを使う必要があります。

レポートファイルに付けられるファイル名は デフォルトでは以下のような規則になっています。

ホスト名-年月日-時分秒.twr

レポートを表示させるには、以下のようなコマンドを使います。

/usr/sbin/twprint -m r -c /etc/tripwire/tw.cfg -r \
/var/lib/tripwire/report/表示させたいレポート名 \
-L /etc/tripwire/local.key -t 4

* レポートの表示コマンドとオプションの一覧→ 資料編

いかがでしたか?チェックできるようになったでしょうか? 最初から環境に適したポリシーファイルを作成するのはとても 難しいと思います。Tripwire を活かすも殺すも あなた次第です。根気よく調整してセキュリティ強化に 頑張ってください。