AIDE(オープンソースのIDS)の設定方法



●関連リンク先

AIDE constantly reporting prelink errors
錦稜会Web


●AIDE(Advanced Intrusion Detection Environment)とは

 AIDEは、オープンソースの侵入検知システム(IDS:Intrusion Detection System)で、CentOSなどの主要なディストリビューションで無償で利用することができます。
 IDSにはネットワーク型とホスト型の2種類があり、ネットワーク型はネットワーク上に設置し複数台のサーバーを監視することができます。ホスト型はサーバーにIDSをインストールして監視します。AIDEはホスト型のIDSになります。

●AIDEのインストール

 AIDEをCentOS 6.xにインストールするには、以下のコマンドを実行します。
# yum install aide

●設定ファイルの編集

 AIDE の動作設定は、/etc/aide.confで行います。デフォルト設定でも問題ないですが、変更する場合はaide.confを編集します。例えば、/usr/log を監視対象から外すには、以下のように記述します。
!/usr/log


●データベースの初期化

 AIDEは、ファイル状態を格納するデータベースをあらかじめ持っておいて、データベースの内容とファイルの状態が異なっているかをチェックします。ですので、まず、このデーターベースを初期化します。
 下記コマンドは全ファイルをスキャンするため時間がかかります。
# aide --init
 生成されたaide.db.new.gzはスナップショットなので、これをマスターのデータベースにするために以下のコマンドを実行します。
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

●改ざんのチェック

 改ざんのチェックをするために、ファイルを作成します。
# echo "TEST" >> dummy.txt
 改ざんをチェックします。
# aide --check
 実行結果は以下のようになり、ファイルの追加が検出されたことが分かります。
※バージョン0.16の場合
Start timestamp: 2021-12-22 09:57:00 +0900 (AIDE 0.16)
AIDE found differences between database and filesystem!!

Summary:
  Total number of entries:	163705
  Added entries:		1
  Removed entries:		0
  Changed entries:		0

---------------------------------------------------
Added entries:
---------------------------------------------------

f++++++++++++++++: /root/dummy.txt

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : i4WST/llELrNNERL6ABsKQ==
  SHA1     : 4/RgEoz/Sa+ZHYuj1H24e+liR5Y=
  RMD160   : CIsyHB3zVaqdz6Gix/JRcuF5wJU=
  TIGER    : ktjq2yNsy+VwM6bI7ZFEqHVTFw0bJeIZ
  SHA256   : jXIZUuOx2Hn7gIR5SuLrnmU1d3u5gmRI
             d6utNM8YKZw=
  SHA512   : I/FyyyTXwOurA/1c74xZuQ/xH6OHnhDf
             UYHzFg4hXZkTvGEB7lTrTOLJXSfN7dGt
             C5tjx8PL/perbXYQoTxwiQ==


End timestamp: 2021-12-22 09:57:17 +0900 (run time: 0m 17s)


※バージョン0.15の場合
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2021-12-22 10:09:44

Summary:
  Total number of files:	457626
  Added files:			1
  Removed files:		0
  Changed files:		2


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

added: /root/dummy.txt

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

changed: /etc/cups/subscriptions.conf
changed: /etc/cups/subscriptions.conf.O

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


File: /etc/cups/subscriptions.conf
 SHA256   : cFQdwc2V6GVtYK1uU7H5gF0Bm4xCj4IL , heOlOw+3t7o+6D3FhPrwrrhEaam8zSFO

File: /etc/cups/subscriptions.conf.O
 SHA256   : y3nHipklSdQx2LQUUUJJVCByneVBWpWQ , iONLpZMr2LItSByLH3fZe5wTi8DHo+ND

●データベースの更新

 改ざんのチェックをしただけでは、データベースは更新されないので、以下のコマンドでデータベースを更新します。
# aide --init
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
 上記コマンドはデータベースを更新するだけですが、下記のコマンドを実行すると、ファイルの改ざんチェックとデータベースの更新の両方を行ってくれます。
# aide --update
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz


●スクリプトによる定期チェック(CentOS 7)

 AIDEは手動でコマンドを実行できますが、定期実行するには独自にスクリプトを作成する必要があります。ここでは、/etc/cron.daily/aideというファイルでスクリプトを作成します。このスクリプトはデイリー処理されます。MAILTOにはメールの送信先を指定します。
#!/bin/bash
 
MAILTO=root
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
 忘れずに、実行権限もつけておきます。
# chmod +x /etc/cron.daily/aide
 後はデイリーでスクリプトが実行され、実行結果がメールで通知されるようになります。ログは /etc/log/aide/aide.log に出力されます。
 メールで通知される内容は以下のようになります。
Subject: AIDE DETECTED CHANGES
 
changed: /usr/sbin
changed: /usr/bin
changed: /usr/lib/rpm
changed: /usr/libexec
changed: /usr/libexec/getconf
changed: /usr/libexec/git-core
changed: /usr/libexec/gcc/x86_64-redhat-linux/4.4.4
changed: /usr/libexec/polkit-1
changed: /usr/libexec/awk
changed: /usr/libexec/utempter
changed: /usr/lib64
changed: /usr/lib64/sa
changed: /usr/lib64/perl5/CORE
changed: /usr/lib64/gettext
changed: /usr/lib64/nss/unsupported-tools
changed: /usr/lib64/pm-utils/bin
changed: /usr/lib64/mysql
changed: /sbin
changed: /bin
changed: /lib/udev
changed: /lib64
changed: /lib64/dbus-1
 なお、このスクリプトは1日ごとのファイルの差分をとっていることに注意してください。具体的には、スクリプトの実行時にデータベースの更新をしているということです。システムリリース時点などのデータベースとの差分を比較する厳密な運用をする場合は、データベースの更新部分(cp...の行)を削除してください。

●スクリプトによる定期チェック(CentOS Stream 8)

 nkfコマンドが必要なのでインストールします。
 チェック結果のログファイル(/var/log/aide/aide.log])はチェックのたびに上書きされます。
 チェック結果を毎回保存しておきたい場合は、シェルスクリプトで対応するか、毎回メールで結果を送信する等の工夫が必要です。
 今回は毎日5時30分にチェックし、その結果をroot宛に送信するようにCronに登録します。
 また、「aide --update」を実行する前にデータベースをコピーしておく必要がありますので、データベースのコピーについてもCronに登録します。
 ただし、cpコマンドの強制上書きは「-f」を付加しただけではうまく動作しません。
 cpコマンドはaliasがあらかじめ設定されていることが多いため、エイリアスを外し(cpコマンドの前に「\」を付加する)て強制上書きするように設定します。
# dnf --enablerepo=powertools install nkf

# crontab -e
20 04 * * * \/usr/bin/cp -f /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz > /dev/null 2>&1
25 04 * * * /usr/sbin/aide --update | mail -s 'Daily Check by AIDE' root > /dev/null 2>&1
 メールの内容は下記のとおりです。
Start timestamp: 2021-06-06 05:30:00 +0900 (AIDE 0.16)
AIDE found differences between database and filesystem!!
New AIDE database written to /var/lib/aide/aide.db.new.gz

Summary:
  Total number of entries:	247072
  Added entries:		2
  Removed entries:		1
  Changed entries:		19

---------------------------------------------------
Added entries:
---------------------------------------------------

f++++++++++++++++: /etc/cron.d/aide
f++++++++++++++++: /root/aide

---------------------------------------------------
Removed entries:
---------------------------------------------------

f----------------: /etc/cron.daily/aide

---------------------------------------------------
Changed entries:
---------------------------------------------------

f   ...    .C... : /boot/grub2/grubenv
f   ...    .C... : /etc/cups/subscriptions.conf
f   ...    .C... : /etc/cups/subscriptions.conf.O
f   ...    .C... : /etc/dnf/dnf.conf
f < ...    . ... : /var/log/letsencrypt/letsencrypt.log.2
f < ...    . ..S : /var/log/letsencrypt/letsencrypt.log.30
f < ...    . ... : /var/log/letsencrypt/letsencrypt.log.31
f < ...    . ... : /var/log/letsencrypt/letsencrypt.log.32
f = ...    . ..S : /var/log/letsencrypt/letsencrypt.log.33
f < ...    . ..S : /var/log/letsencrypt/letsencrypt.log.34
f = ...    . ..S : /var/log/letsencrypt/letsencrypt.log.35
f < ...    . ... : /var/log/messages
f < ...    . ... : /var/log/pcp/pmcd/nfsclient.log
f < ...    . ... : /var/log/pcp/pmcd/pmcd.log.prev
f < ...    . ... : /var/log/pcp/pmcd/root.log.prev
f < ...    . ... : /var/log/pcp/pmie/nezumi.bigbang.dyndns.org/pmie.log
f < ...    . ... : /var/log/pcp/pmlogger/nezumi.bigbang.dyndns.org/pmlogger.log
f < ...    . ... : /var/log/pcp/pmlogger/pmlogger_check.log.prev
f           C    : /var/spool/anacron/cron.daily

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

File: /boot/grub2/grubenv
  SHA512   : ******************************** | ********************************
             ******************************** | ********************************
             **********************==         | **********************==

File: /etc/cups/subscriptions.conf
  SHA512   : ******************************** | ********************************
             ******************************** | ********************************
             **********************==         | **********************==

File: /etc/cups/subscriptions.conf.O
  SHA512   : ******************************** | ********************************
             ******************************** | ********************************
             **********************==         | **********************==

File: /etc/dnf/dnf.conf
  SHA512   : ******************************** | ********************************
             ******************************** | ********************************
             **********************==         | **********************==

File: /var/log/letsencrypt/letsencrypt.log.2
  Size     : 2706                             | 2617

File: /var/log/letsencrypt/letsencrypt.log.30
  Size     : 26269                            | 2706
  SELinux  : unconfined_u:object_r:var_log_t: | system_u:object_r:var_log_t:s0
             s0                               | 

File: /var/log/letsencrypt/letsencrypt.log.31
  Size     : 26437                            | 26269

File: /var/log/letsencrypt/letsencrypt.log.32
  Size     : 38346                            | 26437

File: /var/log/letsencrypt/letsencrypt.log.33
  SELinux  : system_u:object_r:var_log_t:s0   | unconfined_u:object_r:var_log_t:
                                              | s0

File: /var/log/letsencrypt/letsencrypt.log.34
  Size     : 46030                            | 2706
  SELinux  : unconfined_u:object_r:var_log_t: | system_u:object_r:var_log_t:s0
             s0                               | 

File: /var/log/letsencrypt/letsencrypt.log.35
  SELinux  : system_u:object_r:var_log_t:s0   | unconfined_u:object_r:var_log_t:
                                              | s0

File: /var/log/messages
  Size     : 1391146                          | 1019940

File: /var/log/pcp/pmcd/nfsclient.log
  Size     : 679                              | 283

File: /var/log/pcp/pmcd/pmcd.log.prev
  Size     : 6898                             | 3966

File: /var/log/pcp/pmcd/root.log.prev
  Size     : 1012                             | 879

File: /var/log/pcp/pmie/nezumi.bigbang.dyndns.org/pmie.log
  Size     : 66324                            | 116

File: /var/log/pcp/pmlogger/nezumi.bigbang.dyndns.org/pmlogger.log
  Size     : 169199                           | 56166

File: /var/log/pcp/pmlogger/pmlogger_check.log.prev
  Size     : 143                              | 71

File: /var/spool/anacron/cron.daily
  SHA512   : ******************************** | ********************************
             ******************************** | ********************************
             **********************==         | **********************==


---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : **********************==
  SHA1     : ***************************=
  RMD160   : ***************************=
  TIGER    : ********************************
  SHA256   : ********************************
             ***********=
  SHA512   : ********************************
             ********************************
             **********************==

/var/lib/aide/aide.db.new.gz
  MD5      : **********************==
  SHA1     : ***************************=
  RMD160   : ***************************=
  TIGER    : ********************************
  SHA256   : ********************************
             ***********=
  SHA512   : ********************************
             ********************************
             **********************==


End timestamp: 2021-06-06 05:37:22 +0900 (run time: 7m 22s)


●ログのローテーション

 AIDEをインストールすると、/etc/logrotate.d/aideにログのローテションの設定ファイルが作成されますが、デフォルトの設定だとほぼ役に立たないので注意が必要です。
/var/log/aide/*.log {
        weekly
        missingok
        rotate 12
        compress
        delaycompress
        copytruncate
        minsize 100k
}
 具体的には、ウィークリーでファイルサイズが 100KB 以上ないとログのローテーションを行いません。なお、AIDEのログは追記ではなく上書きなので、なぜこのような設定になっているのか不思議です。
 これでは使えないので、以下のようにデイリーで7世代管理するように変更します。世代は1ヶ月位あってもいいかもしれませんね。
/var/log/aide/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
}


●aide --update時のDisk I/O

 cronでi04:25にaide --updateを実行していたが、Disk I/Oが凄かった問題。

aide_diskio01.png

 監視対象から除外する対象を検討する必要がありそうです。

●Error on exit of prelink child process

 一日一回aideをcronで動作するよう設定していて、その際メールを飛ばすようにしていたがそのメールが来なくなっていました。
 そこでデータベースを再初期化しようとしたところ、下記のようなエラーが表示されました。

# aide --init
/usr/sbin/prelink: /usr/bin/signver: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/crlutil: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/modutil: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/ssltap: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/pk12util: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/signtool: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/cmsutil: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process
/usr/sbin/prelink: /usr/bin/certutil: at least one of file's dependencies has changed since prelinking
Error on exit of prelink child process

AIDE, version x.xx

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


 これはインストール後、時間が経過し、yumのupdateが走り、リンク済みのバイナリと新しいバイナリではハッシュ値が合わないので、prelinkがエラーを出している模様です。
CentOS 6で、aideのバージョンが0.14-7及び0.15.1-1でも発生しました。
 このような場合は、下記ファイルを修正してください。
#vi /etc/sysconfig/prelink
PRELINKING=yes
 ↓
PRELINKING=no
 続けて下記を実行してください。
# /usr/sbin/prelink -av -mR ← この作業は必要ないかも
(このコマンド終了には時間がかかる場合があります。)
# /usr/sbin/prelink -ua
(このコマンド終了には時間がかかる場合があります。)
# aide --update
(このコマンド終了には時間がかかる場合があります。)
 この時に表示されるError on exit of prelink child processは1行だけとなりました。(2015.03.26)
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
 また、cronでの自動定期チェックも動作するようになりました。
条件変更
/etc/sysconfig/prelinkのPRELINKINGの設定を元に戻す。(2015.03.27)
 PRELINKING=yes
・・・を実行し、同様のエラーが出力されるようであれば
# aide --check 
# /etc/cron.daily/prelink
# aide --update
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
を実施してください。

●Caught SIGBUS/SEGV while mmapping

 ログに下記のようなエラーが記録されていました。
Caught SIGBUS/SEGV while mmapping. File was truncated while aide was running?
Caught SIGBUS/SEGV. Exiting
 mmapperをインストールして様子を見ることにします。

 CentOS 7にはmmapperはありません。
 CentOS 7で上記のエラーが出力されたのは、HDDのセクタに異常があり、その部分を読み込めなかった時に出力されたようです。
 /var/log/messageに下記のようなエラーが記録されていました。
Aug  4 10:25:57 server kernel: ata2.00: exception Emask 0x0 SAct 0x800 SErr 0x40000 action 0x0
Aug  4 10:25:57 server kernel: ata2.00: irq_stat 0x40000008
Aug  4 10:25:57 server kernel: ata2: SError: { CommWake }
Aug  4 10:25:57 server kernel: ata2.00: failed command: READ FPDMA QUEUED
Aug  4 10:25:57 server kernel: ata2.00: cmd 60/08:58:e8:bc:1d/00:00:00:00:00/40 tag 11 ncq 4096 in#012         res 41/40:00:ea:bc:1d/0
0:00:00:00:00/40 Emask 0x409 (media error) <F>
Aug  4 10:25:57 server kernel: ata2.00: status: { DRDY ERR }
Aug  4 10:25:57 server kernel: ata2.00: error: { UNC }
Aug  4 10:25:57 server kernel: ata2: hard resetting link
Aug  4 10:25:57 server kernel: ata2: SATA link up 6.0 Gbps (SStatus 133 SControl 300)
Aug  4 10:25:57 server kernel: ata2.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out
Aug  4 10:25:57 server kernel: ata2.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out
Aug  4 10:25:57 server kernel: ata2.00: configured for UDMA/133
Aug  4 10:25:57 server kernel: sd 1:0:0:0: [sdb] tag#11 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE cmd_age=0s
Aug  4 10:25:57 server kernel: sd 1:0:0:0: [sdb] tag#11 Sense Key : Medium Error [current] [descriptor] 
Aug  4 10:25:57 server kernel: sd 1:0:0:0: [sdb] tag#11 Add. Sense: Unrecovered read error - auto reallocate failed
Aug  4 10:25:57 server kernel: sd 1:0:0:0: [sdb] tag#11 CDB: Read(16) 88 00 00 00 00 00 00 1d bc e8 00 00 00 08 00 00
Aug  4 10:25:57 server kernel: blk_update_request: I/O error, dev sdb, sector 1948906
Aug  4 10:25:57 server kernel: ata2: EH complete
 このエラーは、 aide --checkや aide --updateを実行するたびに記録されるようです。
 このため、セクタエラーが発生しているHDDの交換を実施しました。
 交換以降、aide --checkや aide --updateを実行しても正常に動作するようになりました。