CentOS にファイル改ざん検知システムを導入する【AIDE】

AIDEとは

AIDEとはAdvanced Intrusion Detection Environment の略で、オープンソースの改ざん・侵入検知システムです。

侵入検知システム(IDS:Intrusion Detection System)にはネットワーク型とホスト型がありますが、AIDEはホスト型のIDSです。

具体的な用途としては、

  • ウェブサイトの改ざんの検出
  • ルートキットの検出(Linuxのコアファイルの改ざん検出)

が考えられます。

インストール

まずはインストールから見ていきましょう。

yum install aide

設定

AIDEの設定ファイルは比較的簡単なようです。

設定ファイル

設定ファイルの場所です。

/etc/aide.conf

検査規則

/etc/aide.confの中を見ると、検査の規則が書かれています。

# These are the default rules.
#
#p:      permissions
#i:      inode:
#n:      number of links
#u:      user
#g:      group
#s:      size
#b:      block count
#m:      mtime
#a:      atime
#c:      ctime
#S:      check for growing size
#acl:           Access Control Lists
#selinux        SELinux security context
#xattrs:        Extended file attributes
#md5:    md5 checksum
#sha1:   sha1 checksum
#sha256:        sha256 checksum
#sha512:        sha512 checksum
#rmd160: rmd160 checksum
#tiger:  tiger checksum

#haval:  haval checksum (MHASH only)
#gost:   gost checksum (MHASH only)
#crc32:  crc32 checksum (MHASH only)
#whirlpool:     whirlpool checksum (MHASH only)

#R:             p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
#L:             p+i+n+u+g+acl+selinux+xattrs
#E:             Empty group
#>:             Growing logfile p+u+g+i+n+S+acl+selinux+xattrs


記号検査対象
pパーミッション 
ii-node
nリンク番号
uユーザー
gグループ
sサイズ
bブロックカウント
aatime(最終アクセス時刻)
mmtime(最終変更時刻)
cctime(最終ステータス変更時刻)
aclアクセスコントロール
Sgrowing size
selinuxSElinuxセキュリティ・コンテキスト
xattrs拡張ファイル属性
md5md5 checksum
rmd160rmd160 checksum
sha1sha1 checksum
sha256sha256 checksum
sha512sha512 checksum
tigertiger checksum
havalhaval checksum (MHASH only)
gostgost checksum (MHASH only)
crc32crc32 checksum (MHASH only)
whirlpoolwhirlpool checksum (MHASH only)


『p』はパーミッション、『u』はユーザーというようにAIDEに検知させたい項目を表しており、これらを組み合わせてユーザーオリジナルの設定を作ることができます。また、デフォルトでもいくつかの設定が用意されており、わざわざユーザー定義することは少ないかもしれません。以下が設定ファイルに書かれているデフォルトの設定です。

ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
# Everything but access time (Ie. all changes)
EVERYTHING = R+ALLXTRAHASHES

# Sane, with multiple hashes
NORMAL = R+rmd160+sha256

# For directories, don't bother doing hashes
DIR = p+i+n+u+g+acl+selinux+xattrs

# Access control only
PERMS = p+i+u+g+acl+selinux

# Logfile are special, in that they often change
LOG = >

# Just do md5 and sha256 hashes
LSPP = R+sha256

# Some files get updated automatically, so the inode/ctime/mtime change
# but we want to know when the data inside them changes
DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+md5+sha256+rmd160+tiger


記号検査内容
ALLXTRAHASHESmd5以外のハッシュ
EVERYTHINGatime以外すべての項目
NORMAL通常モード
DIRディレクトリ
PERMSp+i+u+g+acl+selinux
LOGログファイル
LSPPNORMALからrmd160を除いた項目
DATAONLYinode/ctime/mtimeの変更は検知しないでデータの中身のみ


check sumについては、こちらを参照されたい。

http://www.xmisao.com/2014/02/07/linux-file-hash-checksum.html

http://www.mk-mode.com/octopress/2014/02/24/linux-checksum-command


改ざん検知させたいディレクトリの指定

/etc/yum.conf NORMAL
/etc/yumex.conf NORMAL

検知させたくないディレクトリの指定

!/etc/.*~

初期設定のまま利用すると、かなり広範囲をチェックするので処理が重たくなる。必要なところだけチェックするように設定することをおすすめします。

データベースファイルの作成

$ aide -i

AIDE, version 0.14

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.
$ aide --init でも可

データベースの保存先、参照先の設定

データベースの保存先は、デフォルトでは以下のような設定になっている。

@@define DBDIR /var/lib/aide

# The location of the database to be read.
database=file:@@{DBDIR}/aide.db.gz

# The location of the database to be written.
database_out=file:@@{DBDIR}/aide.db.new.gz

この設定だと、参照するデータベースは/var/lib/aide/aide.db.gzであり、先ほど作成したデータベースの名前を変えないとaideはデータベースを参照できないので、

 mv -f /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

としてあげる。

チェックコマンド

$ aide -C

AIDE, version 0.14

### All files match AIDE database. Looks okay!
$ aide --check でも可

試しに、rootにtestというファイルを作って、チェックを実行した結果

$ aide -C
AIDE found differences between database and filesystem!!
Start timestamp: 2016-03-31 10:56:49

Summary:
  Total number of files:    68413
  Added files:          1
  Removed files:        0
  Changed files:        1


---------------------------------------------------
Added files:
---------------------------------------------------

added: /root/test

---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /root

--------------------------------------------------
Detailed information about changes:
---------------------------------------------------


Directory: /root
  Mtime    : 2016-03-31 10:28:30              , 2016-03-31 10:56:46
  Ctime    : 2016-03-31 10:28:30              , 2016-03-31 10:56:46

ログ

実行結果は以下のファイルに保存されるが、改ざんが検知されない場合は空ファイルに変更されるので注意。実行するごとに中身が更新される。

/var/log/aide/aide.log

アップデートコマンド

ファイルの改ざんのチェックとデータベースの更新を一緒に行ってくれる。(データベースの名前は自分で変更する必要あり)

aide --update

定期チェックのテンプレート

AIDEは定期的にチェックコマンドを実行するようこちら側が設定しないと監視はしてくれません。 そこで、定期チェックの設定の一例を紹介します。

スクリプト

以下のようなスクリプトを適当なところに置きます。

## aidechecker.sh ##
#!/bin/bash

MAILTO=??????
LOGFILE=/var/log/aide/aide.log
AIDEDIR=/var/lib/aide
/usr/sbin/aide  -u > $LOGFILE
cp $AIDEDIR/aide.db.new.gz $AIDEDIR/aide.db.gz
x=$(grep "Looks okay" $LOGFILE | wc -l)
if [ $x -eq 1 ]
then
  echo "All Systems Look OK" | /bin/mail -s "AIDE OK" $MAILTO
else
  echo "$(egrep "added|changed|removed" $LOGFILE)" | /bin/mail -s "AIDE DETECTED CHANGES" $MAILTO
fi
exit

メール内容

変更が検知されていない場合は、

subject: AIDE OK

All Systems Look OK

変更がある場合は

subject: AIDE DETECTED CHANGES

added: /root/test
added: /root/test/aa.txt
changed: /root

となります。

cronの設定

あとは

## 毎時15分に実行する
15 * * * * root /path/aidechecker.sh

などとcronに設定してあげればOKです。

まとめ

比較的簡単にLinux環境で構築でき、無償で利用できるファイル改ざん検知 AIDE について紹介しました。 AIDEは、例えばWordPressのサイトでDocumetRootを監視対象にしNORMALの設定で動かすと、処理が終わるのに数分かかります。 ファイル数が多い場合処理にかかる時間が比例して大きくなっていくので、サーバーによっては数時間に一度実行するとか負荷低い夜中に一度だけ実行するという形になります。 この理由からリアルタイムで改ざんを検出したい場合は別の仕組みが必要になりますが、 監視範囲をかなり絞ればcronから1分に1度実行することは可能です。

ミドルウェアやアプリケーションで脆弱性はよく出てしまうので、AIDEのようなIDSを使い被害を抑える対策をとることは大事なことだと思います。