Linux/tripwireのインストール

Tripwireのインストール(2016-11-27)


tripwire はファイルの整合性チェックツールです。
例えば社外・社内のクラッカーが、重要な設定ファイルやら /bin/su やらを改竄した場合に、
それを検知することができます。
ただし、リアルタイムで検知する訳では無いので、運用方法はちゃんと検討しましょう。
(チェックする周期や、tripwireの設定更新など)*1



tripwire でググるとtripwire.co.jp や tripwire.com がヒットするはずです。
会社で使うなら、より安全なこちらの検討も視野に入れた方が良いと思います。
が、私の場合はフリーウェア版で十分なので、そちらをインストールしています。

参考:tripwireするほどでもない人は

なお、簡易的な整合性チェックなら、他の手段でやることもできると思います。
ほんの一例ですが、/etc 配下をチェックしたい場合。

# find /etc -type f -exec md5sum {} \; | tee md5-`date +%Y%m%d`.txt
# md5sum `which md5sum` | tee -a md5-`date +%Y%m%d`.txt
# md5sum `which find` | tee -a md5-`date +%Y%m%d`.txt
# md5sum `which tee` | tee -a md5-`date +%Y%m%d`.txt

(etc配下のファイル、使ったコマンド自身のハッシュ値をとっておきます。
 この出力結果を控えておいて、次の実行時に diff を取ることで、変更が無いか確認します。)

初期設定

私の環境だと CentOS 7なのですが、
今回は、ソースからビルドではなくて yum で入れちゃいます。

# yum install tripwire
# cd /etc/tripwire/
# ls
twcfg.txt  twpol.txt
# chmod 600 twcfg.txt  twpol.txt

既に設定内容の目途がついている場合は、この2ファイル(.txt)を更新してしまいましょう。
最後のchmod は保険です。(最後には削除する2ファイルですが、設定に時間がかかるなら必要)

2つのファイルは中身を見てもらえば何となく分かると思いますが。

  • twcfg.txt: tripwire のコンフィグ
  • twpol.txt: tripwire がチェックするファイルの一覧

になります。
そして次に install.sh を実行する・・・と大抵の解説にはあるのですが、
遺憾ながら私の環境にはありません。(yum め・・・いや、yum は悪くないのですが・・・yum め)
というわけで、自力で頑張ります。

鍵の作成

まず鍵を2つ作ります。パスワードを決めるように言われるので、忘れないように。
また、必要なら鍵のバックアップを取っておくこと。
「chmod 600」は root でやっている前提なので、 必要なら「chown root:root」もやること。

# twadmin --generate-keys --site-keyfile site.key
# twadmin --generate-keys --local-keyfile local.key
# chmod 600 site.key local.key
# vi twcfg.txt
(LOCALKEYFILE を前述の local.key に合わせる)

この鍵が、tripwire 自体の設定を改竄されないための、鍵になります。

署名済みファイル作成と、設定の初期化

次に設定、ポリシーの .txt に署名をしたファイルを作ります。
署名・・・つまり、鍵をかけるようなイメージです。これでファイルが暗号化されます。

twadmin のパスワードは site.key のパスワードを入力。
tripwire --init のパスワードは、local.key のパスワードを入力します。
最後の rm は保険です。万が一、誰かに設定内容が見られることを避けるためです。

# twadmin --create-cfgfile --cfgfile tw.cfg --site-keyfile site.key twcfg.txt
# twadmin --create-polfile --polfile tw.pol --site-keyfile site.key twpol.txt
# chmod 600 tw.pol tw.cfg
# tripwire --init
# rm twcfg.txt twpol.txt

設定の更新

初回時は「### No such file or directory」が大量発生したと思います。
メッセージの通り、デフォルト値には存在しないPATHが沢山指定されているからです。(一括して削る方法の例は後述)
逆に、必要だけど指定されていないPATHもあると思います。
それらを更新しましょう。

# twadmin --print-polfile > twpol.txt
# twadmin --print-cfgfile > twcfg.txt
# vi twpol.txt twcfg.txt
(それっぽい内容に更新する)

更新後は、前述の「署名済みファイル作成と、設定の初期化」へ戻ります。

チェックする

これでファイルが改竄されていないか、チェックできるようになりました。

# tripwire --check

オプションは色々ありますので、お好みで。以下のように絞り込めます。

# tripwire --check --severity 50 /etc
( /etc 配下の重要度 50 以上のファイルだけをチェックする)

参考

自前のサーバでtripwire を運用するなら、必要なデータをCD-ROM等の外部記録媒体に入れて運用する方法があります。
tripwire 自体が改竄されることを回避するためです。

  • サイトキー
  • ローカルキー
  • tripwire 本体(/usr/sbin/tripwire ですかね。各環境に合わせて。)

この3つを外部媒体で運用すれば、設定周りを改竄されるとキーの署名でわかる仕組みです。
外部媒体以外だと、上記の3ファイルを別の安全なマシンに保存して、その別マシンから rsync 等させて改竄を避けるとか。

さぁ、No such file を削るぞ!

「tripwire --check」 コマンドを使ったすぐ後に出る

### Warning: File system error.
### Filename: /usr/sbin/xxxxx
### No such file or directory

の3行をキーにして、いらないファイルをコメントアウト(先頭に # を追加)します。
twpol.txt は先に作っておいてください。

以下、triptrim.sh(仮) の内容

#! /bin/sh

export LANG=C

# temporary files
CHECK_RESULT=./check_result_`date +%m%d%H%M%S`.txt
NOT_FOUND_LIST=./not_found_`date +%m%d%H%M%S`.txt

# you need "twpol.txt"
POL_FILE=$1
if [ ! -r "$POL_FILE" ]; then
    echo "usage: $0 twpol.txt"
    exit 0
fi

# check "No such file" message. get from STDERR.
tripwire --check 2> $CHECK_RESULT > /dev/null

# if it's all right, exit.
grep -q '### No such file or directory' $CHECK_RESULT
if [ $? -eq 1 ]; then
    echo "nothing to do. exit"
    \rm $CHECK_RESULT
    exit 0
fi

# make NOT_FOUND_LIST
awk '{
    if (/^### Warning: File system error./){
        flag=1
    }
    else if (flag == 1 && match($0, /^### Filename: /)){
        filepath = substr($0, RLENGTH + 1)
        flag=2
    }
    else if (flag == 2 && match($0, /^### No such file or directory/)){
        print filepath
        flag=0
    }
    else {
        flag=0
    }
}' $CHECK_RESULT | tee $NOT_FOUND_LIST

# replace by NOT_FOUND_LIST
NEW_POL_FILE="${POL_FILE}.`date +%m%d%H%M%S`"
cp $POL_FILE  $NEW_POL_FILE
for ff in `cat $NOT_FOUND_LIST`; do
    exp=`printf 's|\\(^\\s\\+%s\\)|#%s|'  $ff '\1'`
    sed $exp ${NEW_POL_FILE} > ${NEW_POL_FILE}.tmp
    \mv -f ${NEW_POL_FILE}.tmp ${NEW_POL_FILE}
done

# I use "\rm", if you aliase "rm=rm -i", bother.
\rm $NOT_FOUND_LIST
\rm $CHECK_RESULT

使い方

# sh triptrim.sh twpol.txt

とすると、twpol.txt.1122123456 のような数字ファイルができるので、
diff -y 等でオリジナルと差分確認して、問題なければ差し替える。

・・・結果、わりと何もチェックしなくなったりする場合があるので、必ずポリシー(twpol.txt)は更新していきましょう。
最低でも、環境変数 PATH にあるようなものは再確認して下さい。*2

最後に

導入して暫くの間は毎日チェックして、ポリシー(twpol.txt)をチューニングすることをお勧めします。
放っておくと差分がどんどん溜まっていきますが、
ログは多くなると見なくなるのが人情です。それはセキュリティ上、好ましくありません。
それが手間なら、いっそ tripwire よりも、別の運用で 小さい範囲に集中した方が 効率的でベターかと。
(最初に例に挙げた find コマンドを軸に何らかの shell を組むのもアリだと、私は思います)

セキュリティ、とは別の観点ですが、
私の場合は、tripwire のおかげで かなり勉強になりました。
というのも、自分の知らない場所、身に覚えのないファイルが結構更新されているんです。
cron 周りや、パッケージを更新したタイミング等で。
その原因を調べていくだけで、日々新しい発見があってとても つらい 勉強になります。
そういった意味でなら、前述とは逆になりますが、気分転換に入れてみるのもアリです。


*1 yum install した場合は、自動的に cron に入るのかもしれません(私の場合は「/etc/cron.daily/tripwire-check」)
*2 特に、あとからパッケージ追加や make install したものは抜ける可能性があります。例えば "/usr/local/sbin"、"/usr/local/lib64"、"/etc/postfix 等の config関連" は初期値にありません。場所によっては recurse させるのも忘れずに。