Audit フレームワーク
Linux の audit フレームワークは CAPP (Controlled Access Protection Profile) に準拠した監査システムであり、システム上のセキュリティに関係した(または無関係な)イベントを収集できます。audit を使うことにより、システム上で行われた動作を追跡できるようになります。
Linux audit はシステム上で何が起きているかを詳細に分析できる手段であり、システムをよりセキュアにするために役に立ちます。しかしそれ自体がなにかセキュリティを強化するものではありません。つまり、それ自体が悪意のあるコードや様々な悪用からシステムを守ってくれるものではありません。そうではなく、これらの問題を追跡し、セキュリティ対策を施すための情報を audit は提供します。
audit フレームワークはカーネルが報告するイベントを受信し、ログファイルに書き込みます。
目次
インストール
CONFIG_AUDIT
を有効にしたカスタムカーネルをインストールします。もしくは linux-hardened パッケージをインストールしてカーネルパラメータに audit=1
を追加してください。
audit をインストールし、 auditd.service
を起動・有効化します。
audit フレームワークは auditd デーモンから構成されます。アプリケーションやシステムの動作によりカーネルの audit インターフェイスが発動し、audit インターフェイスが生成した audit メッセージを auditd が書き込みます。
このデーモンはいくつかのコマンドとファイルにより制御されます:
- auditctl : その場でデーモンの挙動をコントロールします。ルールを追加するなど
/etc/audit/audit.rules
: ルールや auditd のパラメータを記述します- aureport : システムの動作レポートを生成します
- ausearch : イベントを検索します
- auditspd : イベント通知をディスク上のログに書き込む代わりに他のアプリケーションに中継するデーモンです
- autrace : プロセスをトレースするためのコマンド。straceに似ています
/etc/audit/auditd.conf
: ログに関する設定ファイルです
ルールの追加
ルールを追加する前に注意しなければならないのは、audit フレームワークは非常に饒舌で、ルールを実際に運用する前に注意深くテストする必要があることです。実際、たった1つのルールにより2,3分でログを溢れてしまうこともあり得ます。
ファイルとディレクトリへのアクセスを監査する
audit フレームワークの一番簡単な使い方は、特定のファイルへのアクセスをログに記録することです。それには -w
オプションを使います。一番簡単なルールの例として passwd ファイルへのアクセスを追跡する例:
# auditctl -w /etc/passwd -p rwxa
フォルダへのアクセスを追跡するには:
# auditctl -w /etc/security/
最初のルールは /etc/passwd
への読み込み r
、書き込み w
、実行 x
、属性変更 a
を追跡します。2番目のルールは /etc/security/
への全てのアクセスを追跡します。
有効なルールのリストを表示するには:
# auditctl -l
全てのルールを削除するには:
# auditctl -D
ルールが正しく動作することを確認したら、それを /etc/audit/audit.rules
に書きます:
-w /etc/audit/audit.rules -p rwxa -w /etc/security/
システムコールを監査する
-a
オプションをつけると、システムコール呼び出しを監査できます。
セキュリティに関連したルールの例として、chmod システムコール
を追跡し、ファイル所有権の変更を検出する例:
auditctl -a entry,always -S chmod
全てのシステムコールのリスト: syscalls(2)。
たくさんのルールと方法が考えられます。auditctl(8) と audit.rules(7) を参照してください。
ログを検索する
audit フレームワークにはシステム上で発生したイベントを調べるためのツールがいくつか含まれています。
PID を指定する
特定の PID に関係するイベントを検索するには ausearch
を使います:
# ausearch -p 1
このコマンドを実行すると、ルールに応じて記録されたイベントの中から PID 1 (systemd) に関係するものすべてを表示します。
キーの使い方
イベントを管理するためにキーを使うことが推奨されます。
イベントの検索を容易にするために、ルールに -k
オプションをつけます:
# auditctl -w /etc/passwd -p rwxa -k KEY_pwd
するとキー KEY_pwd
を使ってイベントを検索できるようになります。次のコマンドにより /etc/passwd
に関係するイベントだけを表示できます:
# ausearch -k KEY_pwd
異常を探す
aureport
を使うと異常なイベントの発生を素早く報告させることができます。異常なイベントとは、ネットワークインターフェイスがプロミスキャスモードに設定された、プロセスまたはスレッドが ENOMEM エラーで異常終了した、などです。
aureport
の一番簡単な使い方は :
# aureport -n
aureport を使ってカスタムレポートを生成することもできます。aureport(8) を参照してください。
どのファイル・システムコールを監査すべきか?
ルールを追加するとログの量も増えます。その情報量が処理できる範囲内でなければならないことを忘れないで下さい。基本的に、セキュリティに関係したイベント・ファイルは監視しなければなりません。ids、ips、anti-rootkits などです。逆に、全ての write システムコールを追跡することはまったく無意味です。ちょっとコンパイルしただけでログが溢れてしまうでしょう。
粒度を非常に小さくして複雑なルールセットを構成することもできます。もしそうしたい場合は auditctl(8) の man ページは読む価値があります。
他のホストからのログを収集する
audit フレームワークはプラグインシステムを備えており、それによりローカルのログファイルをリモートの auditd に送ることができます。
ログファイルを送信する
ログファイルをリモートホストに送るには、audisp-remote
プラグインが必要です。これは audit パッケージにより自動的にインストールされます。このパッケージを有効にするには:
/etc/audisp/plugins.d/au-remote.conf
active = yes direction = out path = /usr/bin/audisp-remote type = always format = string
そしてログの送り先になるリモートホストを設定します:
/etc/audisp/audisp-remote.conf
remote_server = domain.name.or.ip port = 60 ##local_port = optional transport = tcp
ログファイルを受け取る
リモートの audispds からのメッセージを受信できるようにするには、tcp オプションをセットするだけです:
/etc/audit/auditd.conf
tcp_listen_port = 60 tcp_listen_queue = 5 tcp_max_per_addr = 1 ##tcp_client_ports = 1024-65535 #任意 tcp_client_max_idle = 0
これで設定した全部のホストのログが受信する auditd のログファイルに書き込まれるようになります。