AIDE は、ホスト型の侵入検知システムであり、ファイルの改竄を検知することができる。
公式サイト
AIDE - Advanced Intrusion Detection Environment
公式サイトによると、Advanced Intrusion Detection Environment の略らしい。
読み方は、「エイド」なのか「アイーデ」なのか不明。
【環境】
CentOS 7
※CentOS 6でも、同等の手順で導入、設定できる。
導入
# 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:アクセスコントロール
selinux:SELinuxセキュリティ・コンテキスト
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