2011年11月3日木曜日

RHEL セキュリティ: ファイル監視による侵入検知 AIDE


このエントリーをはてなブックマークに追加


セキュリティ問題が立て続けに起こって物騒な世の中になったものです。セキュリティは基本的な技術対策を施すことでほぼ対応できるので面倒ですがきっちり対応することが重要です。

セキュリティ対策の基本的方針としては、
-----------------------------------
◆攻撃対象にならないようにする
不要なデーモンを起動しない
ソフトウェアの種類・バージョンを隠蔽する
特定パターンのアクセスを禁止する(IPS等)

◆侵入経路減らす
ファイアーウォールによる防御(iptables等)
セキュリティパッチの定期的な適用(RHN等)

◆侵入された事をいち早く検知する
不正侵入検知(IDS等)
ログ監視(いろいろ)
ファイル変更監視(AIDE等)

◆侵入されても操作できる範囲を限定し被害拡大を防ぐ
権限の限定化(SELinux等)
-----------------------------------
*物理的・ソーシャル的な対策は除く

等々ありますが、今回はAIDEを使って「侵入された事をいち早く検知する」で「ファイル変更監視」を行う簡単な方法を紹介。


AIDE(Advanced Intrusion Detection Environment)

AIDEはオープンソースのホスト侵入検知システムで、ファイルシステムの状態データベースを作成し、cron等で定期的にデータベースと現状を比較。ポリシー違反が発生した場合に管理者への通知を行う。

これで予期せぬ設定ファイルの編集や、コマンドの差し替え、Rootkitのインストール等をチェックしていくことが可能。

RHEL5以降(Cent5, SL5含む)には標準パッケージに含まれている。


AIDEの導入

標準リポジトリに登録されているので導入は簡単。
# yum install aide

インストールメディアにも含まれているので以下でも可能。
# rpm -ihv aide-xxxxxxx.rpm

で終わり。複雑な依存関係も持っていない。


基本的な使い方

aide というコマンドがインストールされます。使うのはこのコマンドのみ。

# aide -h
Aide 0.14

Usage: aide [options] command

Commands:
  -i, --init            Initialize the database
  -C, --check           Check the database
  -u, --update          Check and update the database non-interactively
      --compare         Compare two databases

Miscellaneous:
  -D, --config-check    Test the configuration file
  -v, --version         Show version of AIDE and compilation options
  -h, --help            Show this help message

Options:
  -c [cfgfile]  --config=[cfgfile]      Get config options from [cfgfile]
  -B "OPTION"   --before="OPTION"       Before configuration file is read define OPTION
  -A "OPTION"   --after="OPTION"        After configuration file is read define OPTION
  -r [reporter] --report=[reporter]     Write report output to [reporter] url
  -V[level]     --verbose=[level]       Set debug message level to [level]


そして /etc/aide.conf に設定ファイルが配置されます。これはaideの動作ポリシーを決める。
# cat /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
~~~省略~~~


初期データベースの作成

まず最初に初期データベースを作成する必要がある。これはネットワーク接続前に行うのが望ましい。

# aide -i
AIDE, version 0.14

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


これにより /var/lib/aide にデータベースが作成される。このコマンドは既存DBを上書きするので注意。

[root@lamp ~]# ll -h /var/lib/aide/
合計 5.1M
-rw-------. 1 root root 5.1M 11月  3 21:34 2011 aide.db.new.gz


ファイルチェック

ファイルチェックを行うには -C で起動してやればいいが、このままだと監視ができない。

# aide -C
Couldn't open file /var/lib/aide/aide.db.gz for reading

データベースにnewがついているので名前を変えてコピーしてやる。
# cp aide.db.new.gz aide.db.gz
# aide -C
AIDE found differences between database and filesystem!!
Start timestamp: 2011-11-03 21:38:51

Summary:
  Total number of files:        70110
  Added files:                  0
  Removed files:                0
  Changed files:                29


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

changed: /var/log/lastlog
changed: /usr/sbin
changed: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib
changed: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/jli
changed: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/bin
changed: /usr/lib/cups/filter
changed: /usr/lib64
changed: /usr/lib64/pm-utils/bin
changed: /usr/lib64/perl5/CORE
changed: /usr/lib64/sa
changed: /usr/lib64/gettext
changed: /usr/lib64/nss/unsupported-tools
changed: /usr/bin
changed: /usr/libexec
changed: /usr/libexec/certmonger
changed: /usr/libexec/gstreamer-0.10
changed: /usr/libexec/polkit-1
changed: /usr/libexec/sssd
changed: /usr/libexec/gcc/x86_64-redhat-linux/4.4.4
changed: /usr/libexec/getconf
changed: /usr/libexec/awk
changed: /usr/libexec/oddjob
changed: /usr/libexec/utempter
changed: /lib/udev
changed: /lib64
changed: /lib64/security/pam_krb5
changed: /lib64/dbus-1
changed: /bin
changed: /sbin

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


File: /var/log/lastlog
  Mtime    : 2011-11-03 20:46:52              , 2011-11-03 21:31:48
  Ctime    : 2011-11-03 20:46:52              , 2011-11-03 21:31:48
  MD5      : 6J8fQ+PuBzPa403ddvc71Q==         , 5ivxGExNOaNwfna16MfFSQ==
  SHA256   : XyBfW5o+lreS8jsHpqJmy0umcQNenFrf , uiNU7pRqgZ14XhtutaIKdPfT9kBqtJ4z

Directory: /usr/sbin
  Mtime    : 2011-11-03 21:18:34              , 2011-11-03 21:28:43
  Ctime    : 2011-11-03 21:18:34              , 2011-11-03 21:28:43

Directory: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib
  Mtime    : 2011-10-30 19:52:53              , 2011-11-03 21:28:48
  Ctime    : 2011-10-30 19:52:53              , 2011-11-03 21:28:48

Directory: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/jli
  Mtime    : 2011-10-30 19:52:38              , 2011-11-03 21:28:52
  Ctime    : 2011-10-30 19:52:38              , 2011-11-03 21:28:52
~~~省略~~~


戻り値によるチェック

チェック結果はコマンドの戻り値で確認できる。上の例ではファイルの変更が検知されている。

# echo $?
4

戻り値の意味は、

1 * (new files detected?) +

2 * (removed files detected?) +

4 * (changed files detected?)

Additionally, the following exit codes are defined for generic error conditions:

14 Error writing error

15 Invalid argument error

16 Unimplemented function error

17 Invalid configureline error

18 IO error

19 Version mismatch error


データベースの更新

ファイルのチェックを行い、仮に問題ない変更のみの検知であればデータベースを更新する必要がある。

# aide -C
# aide -i
# cp aide.db.new.gz aide.db.gz


もしくは、チェックと同時にDBの更新を行う場合、

# aide -u
# cp aide.db.new.gz aide.db.gz

でも可能。


設定を編集する

AIDEはデフォルトで、/var 以下も含めてチェックをかけるので予期せぬ検知が非常に多い。対象ディレクトリは/etc/aide.conf で設定される。

# vim /etc/aide.conf
~~~抜粋~~~
# Next decide what directories/files you want in the database.
/boot   NORMAL
/bin    NORMAL
/sbin   NORMAL
/lib    NORMAL
/lib64  NORMAL
/opt    NORMAL
/usr    NORMAL
/root   NORMAL

# These are too volatile
!/usr/src
!/usr/tmp
~~~抜粋~~~

この設定ファイルにはかなり丁寧に例が記載されているので設定に困ることは無いはず。

対象ディレクトリやファイルの指定には正規表現も利用できる上、パーミッションの変更だけでなくSELinuxコンテキストのチェックまで可能なため柔軟なチェックが行える。

設定ファイルは複数作成して、aide -c conf_file としてチェック方法を分ける事ができる。


DBの保存場所

重要なのがこのDBをどこに保存するか?という事になる。このファイルが改竄されてしまったらAIDEは全くの無力になってしまう。

推奨なのが別サーバに配置しReadOnlyでNFSマウントしておく事。


チェックのタイプ

設定ファイルは複数持てるので、2パターンのチェックタイプとDBを用意しておくのがお勧め。

インストール直後や、サービス開始直前に/ 以下の完全なDBを作成し、万一に侵入が発覚した場合に全ファイルシステムを検索できるような設定ファイル。


もう一つは、日々のチェックで行う簡単なもの。これは提供するサービスによって大きく異なるが、

・本来なら絶対変更が発生しないパス(/bin /lib /boot 等)
・サービスに関連するファイル類
・/etc 以下

等をチェックする。この方法は合わせてSELinuxによるプロセスのアクセス範囲を限定しておかないとあまり意味が無いので注意。


AIDEに関する情報

パッケージをインストールすると以下のファイルが配置される。マニュアルやサンプルが充実している。

/usr/share/doc/aide-0.14/README
/usr/share/doc/aide-0.14/README.quickstart
/usr/share/doc/aide-0.14/contrib/bzip2.sh
/usr/share/doc/aide-0.14/contrib/gpg2_check.sh
/usr/share/doc/aide-0.14/contrib/gpg2_update.sh
/usr/share/doc/aide-0.14/contrib/gpg_check.sh
/usr/share/doc/aide-0.14/contrib/gpg_update.sh
/usr/share/doc/aide-0.14/contrib/sshaide.sh
/usr/share/doc/aide-0.14/manual.html
/usr/share/man/man1/aide.1.gz
/usr/share/man/man5/aide.conf.5.gz

0 件のコメント:

コメントを投稿