Linux: ファイル改ざん検知ソフト「AIDE」を無料インストールしてみた


###### 実施環境：

```Linux:Linux
[root@testhost ~]# uname -a
Linux testhost 4.18.0-338.el8.x86_64 #1 SMP Fri Aug 27 17:32:14 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@testhost ~]# cat /etc/redhat-release
CentOS Stream release 8
[root@testhost ~]# aide -v
Aide 0.16

Compiled with the following options:

WITH_MMAP
WITH_PCRE
WITH_POSIX_ACL
WITH_SELINUX
WITH_XATTR
WITH_E2FSATTRS
WITH_LSTAT64
WITH_READDIR64
WITH_ZLIB
WITH_CURL
WITH_GCRYPT
WITH_AUDIT
CONFIG_FILE = "/etc/aide.conf"
```

### 1. 概要

不正アクセス事件が頻発する昨今、不正アクセス対策はますます重要なものとなっています。
そんな不正アクセス対策に用いられるソフトウェアの1つに、「 Advanced Intrusion Detection Environment ( AIDE ) 」と呼ばれるものがあります。

今回はその AIDE について、 Linux にインストールしてみます。

### 2. AIDE について

 AIDE とは「 Intrusion Detection System ( IDS ) 」と呼ばれるシステムを提供する無料ソフトウェアの1つです。

 IDS とは日本語だと不正侵入検知システムとも呼ばれ、外部からの不正なアクセスやその兆候がないかを確認し、確認できたら管理者に通知する形でセキュリティを確保します。

 AIDE はファイルやディレクトリのサイズやパーミッション等をマスタデータと比較して改ざんされていないかを確認することで、不正なアクセスを検知します。

 AIDE の確認処理はコマンドを入力することで実行されます。
リアルタイムで確認するわけではないので、リアルタイムでの検知が必要なら別のソフトウェアを使用したほうがよいです。

 AIDE は Linux のパッケージとしてインストールできます。
今回は dnf コマンドを使用してインストールしていきます。

```Linux:Linux
[root@testhost ~]# dnf info aide
メタデータの期限切れの最終確認: 0:31:46 時間前の 2023年03月17日 10時33分15秒 に実施しました。
利用可能なパッケージ
名前         : aide
バージョン   : 0.16
リリース     : 14.el8_5.1
Arch         : x86_64
サイズ       : 156 k
ソース       : aide-0.16-14.el8_5.1.src.rpm
リポジトリー : appstream
概要         : Intrusion detection environment
URL          : http://sourceforge.net/projects/aide
ライセンス   : GPLv2+
説明         : AIDE (Advanced Intrusion Detection Environment) is a file
             : integrity checker and intrusion detection program.

```

必要なパッケージは以下のコマンドで確認できますが、 dnf コマンドでインストールすれば必要なパッケージは自動的にインストールされるので、個人で試す分にはあまり気にしなくて問題ありません。

```Linux:Linux
[root@testhost ~]# dnf deplist aide
メタデータの期限切れの最終確認: 0:32:53 時間前の 2023年03月17日 10時33分15秒 に実施しました。
package: aide-0.16-14.el8.x86_64
  dependency: libacl.so.1()(64bit)
   provider: libacl-2.2.53-1.el8.x86_64
  dependency: libacl.so.1(ACL_1.0)(64bit)
   provider: libacl-2.2.53-1.el8.x86_64
  dependency: libattr.so.1()(64bit)
   provider: libattr-2.4.48-3.el8.x86_64
  dependency: libaudit.so.1()(64bit)
   provider: audit-libs-3.0.7-4.el8.x86_64
  dependency: libc.so.6(GLIBC_2.28)(64bit)
   provider: glibc-2.28-225.el8.x86_64
  dependency: libcurl.so.4()(64bit)
   provider: libcurl-7.61.1-30.el8.x86_64
   provider: libcurl-minimal-7.61.1-30.el8.x86_64
  dependency: libe2p.so.2()(64bit)
   provider: e2fsprogs-libs-1.45.6-5.el8.x86_64
  dependency: libgcrypt >= 1.8.5
   provider: libgcrypt-1.8.5-7.el8.i686
   provider: libgcrypt-1.8.5-7.el8.x86_64
  dependency: libgcrypt.so.20()(64bit)
   provider: libgcrypt-1.8.5-7.el8.x86_64
  dependency: libgcrypt.so.20(GCRYPT_1.6)(64bit)
   provider: libgcrypt-1.8.5-7.el8.x86_64
  dependency: libgpg-error.so.0()(64bit)
   provider: libgpg-error-1.31-1.el8.x86_64
  dependency: libm.so.6()(64bit)
   provider: glibc-2.28-225.el8.x86_64
  dependency: libm.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc-2.28-225.el8.x86_64
  dependency: libpcre.so.1()(64bit)
   provider: pcre-8.42-6.el8.x86_64
  dependency: libselinux.so.1()(64bit)
   provider: libselinux-2.9-8.el8.x86_64
  dependency: libz.so.1()(64bit)
   provider: zlib-1.2.11-21.el8.x86_64
  dependency: rtld(GNU_HASH)
   provider: glibc-2.28-225.el8.i686
   provider: glibc-2.28-225.el8.x86_64

package: aide-0.16-14.el8_5.1.x86_64
  dependency: libacl.so.1()(64bit)
   provider: libacl-2.2.53-1.el8.x86_64
  dependency: libacl.so.1(ACL_1.0)(64bit)
   provider: libacl-2.2.53-1.el8.x86_64
  dependency: libattr.so.1()(64bit)
   provider: libattr-2.4.48-3.el8.x86_64
  dependency: libaudit.so.1()(64bit)
   provider: audit-libs-3.0.7-4.el8.x86_64
  dependency: libc.so.6(GLIBC_2.28)(64bit)
   provider: glibc-2.28-225.el8.x86_64
  dependency: libcurl.so.4()(64bit)
   provider: libcurl-7.61.1-30.el8.x86_64
   provider: libcurl-minimal-7.61.1-30.el8.x86_64
  dependency: libe2p.so.2()(64bit)
   provider: e2fsprogs-libs-1.45.6-5.el8.x86_64
  dependency: libgcrypt >= 1.8.5
   provider: libgcrypt-1.8.5-7.el8.i686
   provider: libgcrypt-1.8.5-7.el8.x86_64
  dependency: libgcrypt.so.20()(64bit)
   provider: libgcrypt-1.8.5-7.el8.x86_64
  dependency: libgcrypt.so.20(GCRYPT_1.6)(64bit)
   provider: libgcrypt-1.8.5-7.el8.x86_64
  dependency: libgpg-error.so.0()(64bit)
   provider: libgpg-error-1.31-1.el8.x86_64
  dependency: libm.so.6()(64bit)
   provider: glibc-2.28-225.el8.x86_64
  dependency: libm.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc-2.28-225.el8.x86_64
  dependency: libpcre.so.1()(64bit)
   provider: pcre-8.42-6.el8.x86_64
  dependency: libselinux.so.1()(64bit)
   provider: libselinux-2.9-8.el8.x86_64
  dependency: libz.so.1()(64bit)
   provider: zlib-1.2.11-21.el8.x86_64
  dependency: rtld(GNU_HASH)
   provider: glibc-2.28-225.el8.i686
   provider: glibc-2.28-225.el8.x86_64
```

### 3. インストール

まずはインストールする前に、現在サーバに入っているパッケージを最新化しておきます。

```Linux:Linux
[root@testhost ~]# dnf check-update
(省略)
[root@testhost ~]# dnf upgrade -y
(省略)
完了しました!
```

パッケージの最新化が終わったら、いよいよインストールです。
「 `-y` 」をコマンドに指定すれば確認メッセージをすべてスキップできるので、個人で試す分にはおすすめです。

```Linux:Linux
[root@testhost ~]# dnf instal l -y aide
(省略)
完了しました!
```

インストールが完了したら、「 `aide -v` 」を実行してみましょう。
正しくインストールできていれば、 AIDE のバージョン情報が表示されます。

```Linux:Linux
[root@testhost ~]# aide -v
Aide 0.16

Compiled with the following options:

WITH_MMAP
WITH_PCRE
WITH_POSIX_ACL
WITH_SELINUX
WITH_XATTR
WITH_E2FSATTRS
WITH_LSTAT64
WITH_READDIR64
WITH_ZLIB
WITH_CURL
WITH_GCRYPT
WITH_AUDIT
CONFIG_FILE = "/etc/aide.conf"
```

### 4. 基本的な設定

 AIDE の設定ファイルは `/etc/aide.conf` です。

```bash:/etc/aide.conf
# Example configuration file for AIDE.

@@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

# 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

# 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
# NORMAL = R+sha512
NORMAL = p+i+n+u+g+s+m+c+acl+selinux+xattrs+sha512

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

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

# Logfile are special, in that they often change
LOG = p+u+g+n+S+acl+selinux+xattrs

# Content + file type.
CONTENT = sha512+ftype

# Extended content + file type + access.
CONTENT_EX = sha512+ftype+p+u+g+n+acl+selinux+xattrs

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

# Next decide what directories/files you want in the database.

/boot       CONTENT_EX
/opt        CONTENT

# Admins dot files constantly change, just check perms
/root/\..* PERMS
# Otherwise get all of /root.
/root   CONTENT_EX

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

# Otherwise get all of /usr.
/usr    CONTENT_EX

# trusted databases
/etc/hosts$      CONTENT_EX
/etc/host.conf$  CONTENT_EX
/etc/hostname$   CONTENT_EX
/etc/issue$      CONTENT_EX
/etc/issue.net$  CONTENT_EX
/etc/protocols$  CONTENT_EX
/etc/services$   CONTENT_EX
/etc/localtime$  CONTENT_EX
/etc/alternatives CONTENT_EX
/etc/sysconfig   CONTENT_EX
/etc/mime.types$ CONTENT_EX
/etc/terminfo    CONTENT_EX
/etc/exports$    CONTENT_EX
/etc/fstab$      CONTENT_EX
/etc/passwd$     CONTENT_EX
/etc/group$      CONTENT_EX
/etc/gshadow$    CONTENT_EX
/etc/shadow$     CONTENT_EX
/etc/subgid$     CONTENT_EX
/etc/subuid$     CONTENT_EX
/etc/security/opasswd$ CONTENT_EX
/etc/skel        CONTENT_EX
/etc/subuid$     CONTENT_EX
/etc/subgid$     CONTENT_EX
/etc/sssd        CONTENT_EX
/etc/machine-id$ CONTENT_EX
/etc/swid        CONTENT_EX
/etc/system-release-cpe$ CONTENT_EX
/etc/shells$     CONTENT_EX
/etc/tmux.conf$  CONTENT_EX
/etc/xattr.conf$ CONTENT_EX


# networking
/etc/hosts.allow$   CONTENT_EX
/etc/hosts.deny$    CONTENT_EX
/etc/firewalld      CONTENT_EX
!/etc/NetworkManager/system-connections
/etc/NetworkManager CONTENT_EX
/etc/networks$ CONTENT_EX
/etc/dhcp CONTENT_EX
/etc/wpa_supplicant CONTENT_EX
/etc/resolv.conf$ DATAONLY
/etc/nscd.conf$ CONTENT_EX

# logins and accounts
/etc/login.defs$ CONTENT_EX
/etc/libuser.conf$ CONTENT_EX
/var/log/faillog$ PERMS
/var/log/lastlog$ PERMS
/var/run/faillock PERMS
/etc/pam.d CONTENT_EX
/etc/security CONTENT_EX
/etc/securetty$ CONTENT_EX
/etc/polkit-1 CONTENT_EX
/etc/sudo.conf$ CONTENT_EX
/etc/sudoers$ CONTENT_EX
/etc/sudoers.d CONTENT_EX

# Shell/X startup files
/etc/profile$ CONTENT_EX
/etc/profile.d CONTENT_EX
/etc/bashrc$ CONTENT_EX
/etc/bash_completion.d CONTENT_EX
/etc/zprofile$ CONTENT_EX
/etc/zshrc$ CONTENT_EX
/etc/zlogin$ CONTENT_EX
/etc/zlogout$ CONTENT_EX
/etc/X11 CONTENT_EX

# Pkg manager
/etc/dnf CONTENT_EX
/etc/yum.conf$ CONTENT_EX
/etc/yum CONTENT_EX
/etc/yum.repos.d CONTENT_EX

# This gets new/removes-old filenames daily
!/var/log/sa
# As we are checking it, we've truncated yesterdays size to zero.
!/var/log/aide.log

# auditing
# AIDE produces an audit record, so this becomes perpetual motion.
/var/log/audit PERMS
/etc/audit CONTENT_EX
/etc/libaudit.conf$ CONTENT_EX
/etc/aide.conf$  CONTENT_EX

# System logs
/etc/rsyslog.conf$ CONTENT_EX
/etc/rsyslog.d CONTENT_EX
/etc/logrotate.conf$ CONTENT_EX
/etc/logrotate.d CONTENT_EX
/etc/systemd/journald.conf$ CONTENT_EX
/var/log LOG+ANF+ARF
/var/run/utmp LOG

# secrets
/etc/pkcs11 CONTENT_EX
/etc/pki CONTENT_EX
/etc/crypto-policies CONTENT_EX
/etc/certmonger CONTENT_EX
/var/lib/systemd/random-seed$ PERMS

# init system
/etc/systemd CONTENT_EX
/etc/rc.d CONTENT_EX
/etc/tmpfiles.d CONTENT_EX

# boot config
/etc/default CONTENT_EX
/etc/grub.d CONTENT_EX
/etc/dracut.conf$ CONTENT_EX
/etc/dracut.conf.d CONTENT_EX

# glibc linker
/etc/ld.so.cache$ CONTENT_EX
/etc/ld.so.conf$ CONTENT_EX
/etc/ld.so.conf.d CONTENT_EX
/etc/ld.so.preload$ CONTENT_EX

# kernel config
/etc/sysctl.conf$ CONTENT_EX
/etc/sysctl.d CONTENT_EX
/etc/modprobe.d CONTENT_EX
/etc/modules-load.d CONTENT_EX
/etc/depmod.d CONTENT_EX
/etc/udev CONTENT_EX
/etc/crypttab$ CONTENT_EX

#### Daemons ####

# cron jobs
/var/spool/at CONTENT
/etc/at.allow$ CONTENT
/etc/at.deny$ CONTENT
/var/spool/anacron CONTENT
/etc/anacrontab$ CONTENT_EX
/etc/cron.allow$ CONTENT_EX
/etc/cron.deny$ CONTENT_EX
/etc/cron.d CONTENT_EX
/etc/cron.daily CONTENT_EX
/etc/cron.hourly CONTENT_EX
/etc/cron.monthly CONTENT_EX
/etc/cron.weekly CONTENT_EX
/etc/crontab$ CONTENT_EX
/var/spool/cron/root CONTENT

# time keeping
/etc/chrony.conf$ CONTENT_EX
/etc/chrony.keys$ CONTENT_EX

# mail
/etc/aliases$ CONTENT_EX
/etc/aliases.db$ CONTENT_EX
/etc/postfix CONTENT_EX

# ssh
/etc/ssh/sshd_config$ CONTENT_EX
/etc/ssh/ssh_config$ CONTENT_EX

# stunnel
/etc/stunnel CONTENT_EX

# printing
/etc/cups CONTENT_EX
/etc/cupshelpers CONTENT_EX
/etc/avahi CONTENT_EX

# web server
/etc/httpd CONTENT_EX

# dns
/etc/named CONTENT_EX
/etc/named.conf$ CONTENT_EX
/etc/named.iscdlv.key$ CONTENT_EX
/etc/named.rfc1912.zones$ CONTENT_EX
/etc/named.root.key$ CONTENT_EX

# xinetd
/etc/xinetd.conf$ CONTENT_EX
/etc/xinetd.d CONTENT_EX

# IPsec
/etc/ipsec.conf$ CONTENT_EX
/etc/ipsec.secrets$ CONTENT_EX
/etc/ipsec.d CONTENT_EX

# USB guard
/etc/usbguard CONTENT_EX

# Ignore some files
!/etc/mtab$
!/etc/.*~

# Now everything else
/etc    PERMS


# With AIDE's default verbosity level of 5, these would give lots of
# warnings upon tree traversal. It might change with future version.
#
#=/lost\+found    DIR
#=/home           DIR

# Ditto /var/log/sa reason...
!/var/log/and-httpd

# Admins dot files constantly change, just check perms
/root/\..* PERMS
!/root/.xauth*
```

上記の通り、デフォルトの時点で様々なファイルやディレクトリに対して設定が記載されています。

設定の記載方法は簡単に言うと以下の通りです。

まず、 p (パーミッション)や s (サイズ)等、確認したいもののセットを作ります。
例えば以下では、「 LOG 」というセットを作っています。

```bash:/etc/aide.conf
LOG = p+u+g+n+S+acl+selinux+xattrs
```

次に、ファイルやディレクトリに対し適用するセットを選択します。
例えば以下では、「 `/var/log` 」というディレクトリ内のファイルに対し「 LOG 」「 ANF 」「 ARF 」という3つのセットを適用しています。

```bash:/etc/aide.conf
/var/log LOG+ANF+ARF
```

今回はわかりやすくするために以下のフォルダだけを確認する形で設定してみます。

```Linux:Linux
[root@testhost ~]# ls -l /root/test
合計 0
-rw-r--r--. 1 root root 0  3月 17 11:18 test_a.txt
-rw-r--r--. 1 root root 0  3月 17 11:18 test_b.txt
-rw-r--r--. 1 root root 0  3月 17 11:18 test_c.txt
```

コンフィグは、 `# Next decide ...` 以降を以下のように書き換えます。

```bash:/etc/aide.conf
# Next decide what directories/files you want in the database.
/root/test LOG
```

### 5. 基本的な使用方法

まずは `aide -i` または `aide --init` を実行し、比較のもととなるマスタデータを作成します。

```Linux:Linux
[root@testhost ~]# aide -i
Start timestamp: 2023-03-17 11:20:17 +0900 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz

Number of entries:	5

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

/var/lib/aide/aide.db.new.gz
  MD5      : WZxjEui3rEqxFYfPUbX4VA==
  SHA1     : fehKaLuK4Sl1uoVVnsvSaLz2Va8=
  RMD160   : MPveSUfoQUfOMXfIefLcd0t0/lY=
  TIGER    : WDJMZSwmJUufmzRL91b2D+jSV6Yy1owO
  SHA256   : fl2o0dQlsu06s9YBI4EvpM4o+hGBbWfP
             sV6haTptZQo=
  SHA512   : TpUmac/8eFl/a3tAmJT3MTlhFyPyMyxD
             DlhSG25HpceTVTnBffU6fK2bHJcrMp/3
             GbK7xDkqFXlQ5G4KgNOIBA==


End timestamp: 2023-03-17 11:20:17 +0900 (run time: 0m 0s)
```

実行すると、以下のようにマスタデータが作成できます。

```Linux:Linux
[root@testhost ~]# ls -l /var/lib/aide
合計 4
-rw-------. 1 root root 377  3月 17 11:20 aide.db.new.gz
```

改ざんを確認するコマンドは `aide -C` または `aide --check`です。
このコマンドを実行すると、マスタデータと現在のデータを比較して改ざんされているかを確認します。
ただ、実は今のままだと確認コマンドは正しく動きません。

```Linux:Linux
[root@testhost ~]# aide -C
Couldn't open file /var/lib/aide/aide.db.gz for reading
```

これは、マスタデータが生成されたときのファイル名と比較時に参照されるときのファイル名が異なることが原因です。
先ほどのコンフィグだと `database` の値が比較時に参照されるファイル名、 `database_out` の値が生成されたときのファイル名です。

```bash:/etc/aide.conf
# 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
```

なので、上記に従ってマスタデータのファイル名を変更します。

```Linux:Linux
[root@testhost ~]# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
[root@testhost ~]# 
[root@testhost ~]# ls -l /var/lib/aide
合計 4
-rw-------. 1 root root 377  3月 17 11:20 aide.db.gz
```

これで、確認コマンドが正常に動作します。

```Linux:Linux
[root@testhost ~]# aide -C
Start timestamp: 2023-03-17 11:21:50 +0900 (AIDE 0.16)
AIDE found NO differences between database and filesystem. Looks okay!!

Number of entries:	5

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

/var/lib/aide/aide.db.gz
  MD5      : WZxjEui3rEqxFYfPUbX4VA==
  SHA1     : fehKaLuK4Sl1uoVVnsvSaLz2Va8=
  RMD160   : MPveSUfoQUfOMXfIefLcd0t0/lY=
  TIGER    : WDJMZSwmJUufmzRL91b2D+jSV6Yy1owO
  SHA256   : fl2o0dQlsu06s9YBI4EvpM4o+hGBbWfP
             sV6haTptZQo=
  SHA512   : TpUmac/8eFl/a3tAmJT3MTlhFyPyMyxD
             DlhSG25HpceTVTnBffU6fK2bHJcrMp/3
             GbK7xDkqFXlQ5G4KgNOIBA==


End timestamp: 2023-03-17 11:21:50 +0900 (run time: 0m 0s)
```

なお、実行時に出力されるメッセージについては、同じものがログファイルにも出力されます。
ログファイルのデフォルトのパスは「 `/var/log/aide/aide.log` 」です。

```bash:/etc/aide.conf
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
```

### 6. 検知させてみる

では次に、ファイルの改ざんを検知させてみましょう。
先ほどのファイルのうち「 `test_b.txt` 」のサイズを増やし、「 `test_c.txt` 」のパーミッションを変更してみました。

```Linux:Linux
[root@testhost ~]# ls -l /root/test
合計 4
-rw-r--r--. 1 root root 0  3月 17 11:18 test_a.txt
-rw-r--r--. 1 root root 5  3月 17 11:24 test_b.txt
-rwxrwxrwx. 1 root root 0  3月 17 11:18 test_c.txt
```

これで確認コマンドを再度実行してみると、「 LOG 」の設定に引っかかる「 `test_c.txt` 」だけが以下の通り検知されました。

```Linux:Linux
[root@testhost ~]# aide -C
Start timestamp: 2023-03-17 11:25:03 +0900 (AIDE 0.16)
AIDE found differences between database and filesystem!!

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

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

f = p..    . A.. : /root/test/test_c.txt

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

File: /root/test/test_c.txt
  Perm     : -rw-r--r--                       | -rwxrwxrwx
  ACL      : A: user::rw-                     | A: user::rwx
             A: group::r--                    | A: group::rwx
             A: other::r--                    | A: other::rwx


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

/var/lib/aide/aide.db.gz
  MD5      : WZxjEui3rEqxFYfPUbX4VA==
  SHA1     : fehKaLuK4Sl1uoVVnsvSaLz2Va8=
  RMD160   : MPveSUfoQUfOMXfIefLcd0t0/lY=
  TIGER    : WDJMZSwmJUufmzRL91b2D+jSV6Yy1owO
  SHA256   : fl2o0dQlsu06s9YBI4EvpM4o+hGBbWfP
             sV6haTptZQo=
  SHA512   : TpUmac/8eFl/a3tAmJT3MTlhFyPyMyxD
             DlhSG25HpceTVTnBffU6fK2bHJcrMp/3
             GbK7xDkqFXlQ5G4KgNOIBA==


End timestamp: 2023-03-17 11:25:03 +0900 (run time: 0m 0s)
```

もちろんこれだけだとメッセージが標準出力やログファイルに出るだけなので、うまく検知メッセージやコマンドの戻り値(何か問題を検知した場合0以外となる)を拾って、メールなどで通知する必要はあります。
また、 cron などを使って定期的にコマンドを実行する必要もあります。
このあたりは様々な方法があるので、今回は話しません。
どのようなソフトウェアを使用しているのか、どのような通知が欲しいのかなど、個別の環境に合わせて実施してください。

### 7. 除外してみる

「 `/etc/aide.conf` 」では、ファイルやディレクトリのパスの前に以下のように「 ! 」を付けることで、そのファイルやディレクトリを検索対象から除外できます。

```bash:/etc/aide.conf
# Next decide what directories/files you want in the database.
/root/test LOG
!/root/test/test_c.txt
```

### 8. マニュアル

 aide コマンドは、 man コマンドでマニュアルを見ることができます。

```Linux:Linux
[root@testhost ~]# man aide
```

コンフィグのマニュアルもあります。

```Linux:Linux
[root@testhost ~]# man aide.conf
```

より細かい情報が欲しい方は、上記のようにしてマニュアルを確認してみてください。