顰に倣う - Tripwireの導入

# はじめに
Tripwireを実装するという案件があったので、私の検証環境に実装してみました。
ただ内容は
ググって、私の環境でも適用出来ますよ。と、エラーが出た際に私はこのように対処しました。
という構成となっており、自身の備忘録としての意味合いが強くなっております。

# Tripwireとは
ホスト型IDS(IDS=Intrusion Detection System)。改竄検知システム

# 導入概要
 1. Tripwireをインストール
 2. ポリシーファイルの作成
 3. Tripwireのデータベース構築

# 導入(Tripwireのインストール)
## ■参考URL:
ファイル改竄検知システム導入(Tripwire)
http://centossrv.com/tripwire.shtml
※本項はほぼコチラのコピペになります！

【公式】Tripwire for Servers 簡単操作ガイド
https://www.tripwire.co.jp/products/data/guide/

## ■環境

```bash
# cat /etc/redhat-release
CentOS release 6.5 (Final)
   
# uname -r
2.6.32-431.23.3.el6.x86_64
```

## ■以下配布先から入手する。
・「Tripwire Open Source Project」
http://www.tripwire.org/

もしくは

・sourceforge
http://sourceforge.net/projects/tripwire/files/

## ■ソースからコンパイルする
・ダウンロード
上記sourceforgeで、ソース版のダウンロード件数が多かったのでそれに倣ってみる。

```bash
# cd /usr/local/src
# wget http://sourceforge.net/projects/tripwire/files/tripwire-src/tripwire-2.4.2.2/tripwire-2.4.2.2-src.tar.bz2
# ll
-rw-r--r-- 1 root          root     716616 Nov 22  2011 tripwire-2.4.2.2-src.tar.bz2
# tar jxvf tripwire-2.4.2.2-src.tar.bz2
```

・コンパイル

```bash
# cd tripwire-2.4.2.2-src
# ./configure --prefix=/usr/local/tripwire --sysconfdir=/etc/tripwire && make && make install
```

・コンパイル時の応答内容と対応

```bash
 Press ENTER to view the License Agreement.　#空ENTER
 
 (SPACEキー押下でライセンス表示を流す)
 
 Please type "accept" to indicate your acceptance of this
 license agreement. [do not accept] accept #accept応答

 Continue with installation? [y/n] y　#y応答
 
 Enter the site keyfile passphrase:　#任意のサイトパスフレーズ応答
 Verify the site keyfile passphrase:　#任意のサイトパスフレーズ応答(確認)
 
 Enter the local keyfile passphrase:　#任意のローカルパスフレーズ応答
 Verify the local keyfile passphrase:　#任意のローカルパスフレーズ応答(確認)
 
 Creating signed configuration file...
 Please enter your site passphrase:　#サイトパスフレーズ応答
 
 Creating signed policy file...
 Please enter your site passphrase:　#サイトパスフレーズ応答
 
 The installation succeeded.
```

・tripwire実行ファイル格納ディレクトリへパスを通す

```bash
# echo PATH=$PATH:/usr/local/tripwire/sbin >> ~/.bashrc ; source ~/.bashrc
```

## ■補足1
・コンパイル時、C++コンパイラがないとエラーが発生した場合

```bash
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
See `config.log' for more details.
```

・C++コンパイラをインストールしたら無事コンパイル出来ました

```bash
# yum install gcc-c++
```

## 導入(Tripwireの設定)
(1) Tripwire設定

```bash
# cp -p /etc/tripwire/twcfg.txt /etc/tripwire/twcfg.txt.org
# vi /etc/tripwire/twcfg.txt
LOOSEDIRECTORYCHECKING =false
 ↓
LOOSEDIRECTORYCHECKING =true　←　ファイル変更時に所属ディレクトリの変更を通知しないようにする

REPORTLEVEL   =3
 ↓
REPORTLEVEL   =4　←　リポートレベルを変更する
```

・Tripwire設定ファイル(暗号署名版)作成

```bash
# twadmin -m F -c /etc/tripwire/tw.cfg -S /etc/tripwire/site.key /etc/tripwire/twcfg.txt
 
Please enter your site passphrase: <サイトパスフレーズ応答>
Wrote configuration file: /etc/tripwire/tw.cfg
```

```bash
# rm -f /etc/tripwire/twcfg.txt　←　Tripwire設定ファイル(テキスト版)削除
```

※Tripwire設定ファイル(テキスト版)を復元する場合

```bash
# twadmin -m f -c /etc/tripwire/tw.cfg > /etc/tripwire/twcfg.txt
```

(2) ポリシーファイル設定
Tripwireはポリシーファイルを元に作成したデータベース と 現在のファイル状態を比較することにより、
ファイルが変更されたかどうかを検知するが、デフォルトのポリシーファイルでは存在しないファイルのチェックが有効になっていたり、
逆に存在するファイルのチェックが無効になっていたりするため、存在しないファイルのチェックを無効に、
存在するファイルのチェックを有効にするPerlスクリプトを作成して、ポリシーファイルを最適化する。

```bash
# vi /etc/tripwire/twpolmake.pl　←　ポリシーファイル最適化スクリプト作成
#!/usr/bin/perl
# Tripwire Policy File customize tool
# ----------------------------------------------------------------
# Copyright (C) 2003 Hiroaki Izumi
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
# ----------------------------------------------------------------
# Usage:
#    perl twpolmake.pl {Pol file}
# ----------------------------------------------------------------
#
$POLFILE=$ARGV[0];

open(POL,"$POLFILE") or die "open error: $POLFILE" ;
my($myhost,$thost) ;
my($sharp,$tpath,$cond) ;
my($INRULE) = 0 ;

while (<POL>) {
    chomp;
    if (($thost) = /^HOSTNAME\s*=\s*(.*)\s*;/) {
        $myhost = `hostname` ; chomp($myhost) ;
        if ($thost ne $myhost) {
            $_="HOSTNAME=\"$myhost\";" ;
        }
    }
    elsif ( /^{/ ) {
        $INRULE=1 ;
    }
    elsif ( /^}/ ) {
        $INRULE=0 ;
    }
    elsif ($INRULE == 1 and ($sharp,$tpath,$cond) = /^(\s*\#?\s*)(\/\S+)\b(\s+->\s+.+)$/) {
        $ret = ($sharp =~ s/\#//g) ;
        if ($tpath eq '/sbin/e2fsadm' ) {
            $cond =~ s/;\s+(tune2fs.*)$/; \#$1/ ;
        }
        if (! -s $tpath) {
            $_ = "$sharp#$tpath$cond" if ($ret == 0) ;
        }
        else {
            $_ = "$sharp$tpath$cond" ;
        }
    }
    print "$_\n" ;
}
close(POL) ;
```

・ポリシーファイル最適化

```bash
# perl /etc/tripwire/twpolmake.pl /etc/tripwire/twpol.txt > /etc/tripwire/twpol.txt.new
```

・差分チェック

```bash
# diff /etc/tripwire/twpol.txt /etc/tripwire/twpol.txt.new
 149c149
 <   /etc/mail/statistics           -> $(Growing) ;
 ---
 >   #/etc/mail/statistics           -> $(Growing) ;
 154c154
 <   /etc/sysconfig/hwconf          -> $(Dynamic) -m ;
 ---
 >   #/etc/sysconfig/hwconf          -> $(Dynamic) -m ;
 169,170c169,170
 <   /cdrom                        -> $(Dynamic) ;
 <   /floppy                       -> $(Dynamic) ;
 ---
 >   #/cdrom                        -> $(Dynamic) ;
 >   #/floppy                       -> $(Dynamic) ;
186c186
 <   /initrd                       -> $(Dynamic) ;
 ---
 >   #/initrd                       -> $(Dynamic) ;
189,190c189,190
 <   /var/lost+found               -> $(Dynamic) ;
 <   /home/lost+found              -> $(Dynamic) ;
  ---
 >   #/var/lost+found               -> $(Dynamic) ;
 >   #/home/lost+found              -> $(Dynamic) ;
213c213
 <   /usr/X11R6/lib                -> $(ReadOnly) ;
 ---
 >   #/usr/X11R6/lib                -> $(ReadOnly) ;
 229c229
 <   /usr/local/doc                -> $(ReadOnly) ;
 ---
 >   #/usr/local/doc                -> $(ReadOnly) ;
 235c235
 <   /usr/local/man                -> $(ReadOnly) ;
 ---
 >   #/usr/local/man                -> $(ReadOnly) ;
 239c239
 <   /usr/local/sysinfo            -> $(ReadOnly) ;
 ---
 >   #/usr/local/sysinfo            -> $(ReadOnly) ;
 256c256
 <   #/root/.bash_logout            -> $(Dynamic) ;
 ---
 >   /root/.bash_logout            -> $(Dynamic) ;
258c258
 <   /root/.cshrc                  -> $(Dynamic) ;
 ---
 >   #/root/.cshrc                  -> $(Dynamic) ;
293c293
 <   #/tmp/.ICE-unix                -> $(Temporary) ;
 ---
 >   /tmp/.ICE-unix                -> $(Temporary) ;
 309c309
 <   /.autofsck                    -> $(Dynamic) -m ;
 ---
 >   #/.autofsck                    -> $(Dynamic) -m ;
```

・最適化済ポリシーファイルを元にポリシーファイル(暗号署名版)作成

```bash
# twadmin -m P -c /etc/tripwire/tw.cfg -p /etc/tripwire/tw.pol -S /etc/tripwire/site.key  /etc/tripwire/twpol.txt.new

Please enter your site passphrase: <サイトパスフレーズ応答>
Wrote policy file: /etc/tripwire/tw.pol
```

・ポリシーファイル(テキスト版)削除

```bash
# rm -f /etc/tripwire/twpol.txt*
```

※ポリシーファイル(テキスト版)を復元する場合

```bash
# twadmin -m p -c /etc/tripwire/tw.cfg -p /etc/tripwire/tw.pol -S /etc/tripwire/site.key > /etc/tripwire/twpol.txt
```

(3) データベース作成
・Tripwireデータベース作成

```bash
# tripwire -m i -s -c /etc/tripwire/tw.cfg
Please enter your local passphrase: <ローカルパスフレーズ応答>
（結構待ちます）
```


# 導入(Tripwireの確認)
## ■補足2
設定時から hostnameを変更していると、コマンド実行時にエラーとなる。
・エラー例

```bash
# tripwire -m c -s -c /etc/tripwire/tw.cfg
### Error: File could not be opened.
### Filename: /usr/local/tripwire/lib/tripwire/Mitzi-veri.twd
###   \xe3\x81\x9d\xe3\x81\xae\xe3\x82\x88\xe3\x81\x86\xe3\x81\xaa\xe3\x83\x95\xe3\x82\xa1\xe3\x82\xa4\xe3\x83\xab\xe3\x82\x84\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xac\xe3\x82\xaf\xe3\x83\x88\xe3\x83\xaa\xe3\x81\xaf\xe3\x81\x82\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93
### Exiting...
```

▽対処
・コンパイルからやり直す
(おそらくhostnameが記載された``設定ファイル``、``ポリシーファイル``、``データベース``を作りなおせば エラーは解消されると思われます。)

## ■Tripwireチェック実行
    # tripwire -m c -s -c /etc/tripwire/tw.cfg > /etc/tripwire/20140825-before.log

## ■試しにファイルを追加し、再度チェックを実行すると追加したファイルが検知される
    # echo test > test.txt
    # tripwire -m c -s -c /etc/tripwire/tw.cfg > /etc/tripwire/20140825-after.log

```bash
# view /etc/tripwire/20140825-after.log
 (抜粋)
 Added:
 "/etc/tripwire/test.txt"　←追加したことを検知
```

 ※過去のチェック結果を参照する場合

```bash
# twprint -m r -c /etc/tripwire/tw.cfg -r /usr/local/tripwire/lib/tripwire/report/Mitzi-veri-20140825-182656.twr
```

# 導入(Tripwire定期自動実行設定)
・Tripwire定期自動実行スクリプト作成

```bash
# mkdir ~/sh
# vi /root/sh/tripwire.sh
```

```bash
#!/bin/bash

PATH=/usr/sbin:/usr/bin:/bin:/usr/local/tripwire/sbin

# パスフレーズ設定
LOCALPASS=xxxxxxxx # ローカルパスフレーズ
SITEPASS=xxxxxxxx  # サイトパスフレーズ
 
cd /etc/tripwire
 
# Tripwireチェック実行
tripwire -m c -s -c tw.cfg | mail -s "Tripwire(R) Integrity Check Report in \`hostname\`" root #rootの箇所にメールアドレスを指定する
 
# ポリシーファイル最新化
twadmin -m p -c tw.cfg -p tw.pol -S site.key > twpol.txt
perl twpolmake.pl twpol.txt > twpol.txt.new
twadmin -m P -c tw.cfg -p tw.pol -S site.key -Q $SITEPASS twpol.txt.new > /dev/null
rm -f twpol.txt* *.bak
 
# データベース最新化
rm -f /usr/local/tripwire/lib/tripwire/*.twd*
tripwire -m i -s -c tw.cfg -P $LOCALPASS
```

・Tripwire定期自動実行スクリプトへ実行権限付加

``# chmod 700 /root/sh/tripwire.sh
``

・Tripwire定期自動実行設定追加
``# echo "0 3 * * * root /root/sh/tripwire.sh >/dev/null 2>&1" > /etc/cron.d/tripwire
``
※毎日3:00にTripwire定期実行スクリプトを実行する


ひと通り導入出来ました。今回は以上になります。