改竄検知システム(AIDE)の導入と設定

AIDE は、ホスト型の侵入検知システムであり、ファイルの改竄を検知することができる。

公式サイト
AIDE - Advanced Intrusion Detection Environment

公式サイトによると、Advanced Intrusion Detection Environment の略らしい。
読み方は、「エイド」なのか「アイーデ」なのか不明。


【環境】
CentOS 7

CentOS 6でも、同等の手順で導入、設定できる。

導入

CentOS 6/7 なら、yum でインストールできる。

# yum install aide

インストールされるものは以下。

# rpm -ql aide
/etc/aide.conf
/etc/logrotate.d/aide
/usr/sbin/aide
/usr/share/doc/aide-0.15.1
/usr/share/doc/aide-0.15.1/AUTHORS
/usr/share/doc/aide-0.15.1/COPYING
/usr/share/doc/aide-0.15.1/ChangeLog
/usr/share/doc/aide-0.15.1/NEWS
/usr/share/doc/aide-0.15.1/README
/usr/share/doc/aide-0.15.1/README.quickstart
/usr/share/doc/aide-0.15.1/contrib
/usr/share/doc/aide-0.15.1/contrib/aide-attributes.sh
/usr/share/doc/aide-0.15.1/contrib/bzip2.sh
/usr/share/doc/aide-0.15.1/contrib/gpg2_check.sh
/usr/share/doc/aide-0.15.1/contrib/gpg2_update.sh
/usr/share/doc/aide-0.15.1/contrib/gpg_check.sh
/usr/share/doc/aide-0.15.1/contrib/gpg_update.sh
/usr/share/doc/aide-0.15.1/contrib/sshaide.sh
/usr/share/doc/aide-0.15.1/manual.html
/usr/share/man/man1/aide.1.gz
/usr/share/man/man5/aide.conf.5.gz
/var/lib/aide
/var/log/aide

設定

設定ファイルは、/etc/aide.conf である。

最初の方に、参照するデータベースやレポートの出力先などの定義がある。

@@define DBDIR /var/lib/aide
@@define LOGDIR /var/log/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=sql:host:port:database:login_name:passwd:table
#database_out=file:aide.db.new
database_out=file:@@{DBDIR}/aide.db.new.gz

# Whether to gzip the output to database.
gzip_dbout=yes

# Default.
verbose=5

report_url=file:@@{LOGDIR}/aide.log
report_url=stdout
#report_url=stderr
#NOT IMPLEMENTED report_url=mailto:root@foo.com
#NOT IMPLEMENTED report_url=syslog:LOG_AUTH


デフォルトでは、次のようになっている。

データベース:/var/lib/aide/aide.db.gz
新しく書き込むデータベース:/var/lib/aide/aide.db.new.gz
ログファイル:/var/log/aide/aide.log

「NOT IMPLEMENTED」とあるが、メールやsyslogへ出力する機能を予定しているのかもしれない。
(AIDE の最終更新が2016年だけど・・・)


設定ファイルでは、監視対象と除外のディレクトリ/ファイルを列挙する。
例えば、デフォルトでは、下記のディレクトリが監視対象になっている。

/boot   NORMAL
/bin    NORMAL
/sbin   NORMAL
/lib    NORMAL
/lib64  NORMAL
/opt    NORMAL
/usr    NORMAL
/root   NORMAL

デフォルトでは、下記のディレクトリが監視対象から除外されている。
(先頭に ! を付けると除外になる)

# These are too volatile
!/usr/src
!/usr/tmp


「NORMAL」は、検査ルールであり、設定ファイルのコメントに記載がある。
<ルールの一覧>

# 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)

FIPSR = p+i+n+u+g+s+m+c+acl+selinux+xattrs+sha256

#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

# You can create custom rules like this.
# With MHASH...
# ALLXTRAHASHES = sha1+rmd160+sha256+sha512+whirlpool+tiger+haval+gost+crc32
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
# Everything but access time (Ie. all changes)
EVERYTHING = R+ALLXTRAHASHES

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

# 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 sha256 and sha512 hashes
LSPP = FIPSR+sha512

# 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+sha256


上記によると、
 FIPSR = p+i+n+u+g+s+m+c+acl+selinux+xattrs+sha256
 NORMAL = FIPSR+sha512
である。
それぞれの識別子の意味は、以下の通り。

p:パーミッション
i:i-node番号
n:対象のファイルを指すリンク数
u:所有者
g:グループ
s:サイズ
m:修正日時
c:アクセス日時
acl:アクセスコントロール
selinuxSELinuxセキュリティ・コンテキスト
xattrs:拡張ファイル属性
sha256:チェックサム
sha512:チェックサム



例えば、/var/log/lastlog ファイルは、デフォルトで LSPP がセットされているが、これではユーザがログインする度に変更が発生する。
パーミッションだけチェックするように変更するには、次のようにする。

/var/log/lastlog LSPP
 ↓
/var/log/lastlog PERMS

使い方

最初に、データベースの初期化を以下のコマンドで行う。

# aide -i

AIDE, version 0.15.1

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.


表示される通り、DBは「aide.db.new.gz」として作成される。
実際にAIDEによる検査を行う際は、ここで作成した新しい定義を参照する用のファイルへコピーする必要がある。

データベースのファイル名は設定ファイルに定義があるが、デフォルトでは次のように上書きする。

# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

検査

以下のコマンドで行う。

# aide -C

AIDE, version 0.15.1

### All files match AIDE database. Looks okay!


試しに、「/bin/aide-dummy」というダミーファイルを作成し、AIDEに検出させてみる。

# touch /bin/aide-dummy
# aide -C
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2018-11-03 13:23:39

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


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

added: /usr/bin/aide-dummy

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

changed: /usr/bin

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


Directory: /usr/bin
 Mtime    : 2018-11-03 08:35:57              , 2018-11-03 13:23:37
 Ctime    : 2018-11-03 08:35:57              , 2018-11-03 13:23:37


チェック結果はコマンドの戻り値でも確認できる。

変更がある場合

# echo $?
5

変更が無い場合

# echo $?
0


結果は、/var/log/aide/aide.log にも出力されるが、追記ではなく上書きされる模様。
CentOS 7.x/AIDE Ver-0.15.1 の場合)

また、/etc/logrotate.d/aide にはログローテーションの設定があるが、ログファイルは追記ではなく上書きなので、デフォルトのままではローテーションされにくい。
必要に応じて、daily などを設定して、ローテーションすると良い。

データベースの更新

セキュリティパッチを適用した後などは、AIDE のデータベースを更新する必要がある。

更新は、以下のコマンドで行う。

# aide -u
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz


実際の運用では、
 ・定期的にAIDEによる改竄チェックを実行
 ・セキュリティパッチ適用前には、改竄チェックを行い、異常が無い事を確認後に適用する
 ・セキュリティパッチ適用後には、AIDE のデータベースを更新
のようになると思われる。

定期的にAIDE でチェックを行うには、シェルスクリプトをcronなどで実行する方法が考えられる。


簡単なチェックスクリプトの例(変更があった場合のみ、root へメールする。AIDE のデータベースを更新するまで通知し続ける)

#!/bin/bash

MAIL_TO="root"
MAIL_SUBJECT="AIDE detected warning"
MAIL_TEXT=`mktemp /tmp/temp.XXXXXX`

aide -C > $MAIL_TEXT

if [ $? -gt 0 ]; then
  mail -s "$MAIL_SUBJECT" $MAIL_TO < $MAIL_TEXT
fi

rm -rf $MAIL_TEXT

参考

RHEL セキュリティ: ファイル監視による侵入検知 AIDE
http://aikotobaha.blogspot.jp/2011/11/rhel-aide.html

OpenSUSE - 第12章 AIDE を利用した侵入検知
http://manual.geeko.cpon.org/ja/cha.aide.html