/var/log/messages に 'kernel: audit: backlog limit exceeded' というメッセージが表示される
Environment
- Red Hat Enterprise Linux (RHEL)
- auditd
Issue
-
/var/log/messagesに、audit_backlogが許容制限を超えたことを示すメッセージが繰り返し表示されます。kernel: audit: audit_backlog=65537 > audit_backlog_limit=65536 kernel: audit: audit_lost=126533574 audit_rate_limit=0 audit_backlog_limit=65536
Resolution
注記: 'audit backlog exceeded' メッセージの存在は一般的とも言え、根本原因が複数ある場合があります。
原因 1: 監査サブシステムの設定がワークロードに対して正しくない
システムで検出されたワークロードによっては、ルールが多くヒットが集中している場合 (例: システム更新時) には特に、監査カーネルバッファーサイズに -b 16384 や -b 32768 などの大きな値が必要になることがあります。
-
RHEL5 および 6 の場合は
/etc/audit/audit.rules、RHEL7 以降の場合は/etc/audit/rules.d/audit.rulesの-bに設定されている値を増やします。# Increase the buffers to survive stress events. # Make this bigger for busy systems -b 8192 # service auditd restart注記: バッファー値を増やすと、一部のシステムに悪影響が出る可能性があります。次の点に注意してください。
-
システムコール (特に、ファイル名と現在の作業ディレクトリーを取得するための dentry 操作によるパスベースのシステムコール) を監査すると、システムにオーバーヘッドが発生します。監査するシステムコールを選択するときは、監査が必要なものだけが有効になるように注意する必要があります。監査が不要なシステムコールは監査せず、監査が必要なシステムコールは障害のみを監査することを検討してください。
-
バックログを増やすと、カーネルメモリーの使用量が増える可能性がありますが、その量はわずかです。ただし、すでにメモリーが逼迫しているるシステムでは、余分なメモリー消費によって問題が悪化する可能性があります。
-
監査デーモンがレコードを失うことなく監査エントリーを処理し続けることができるようにバックログを増やすと、監査デーモンがより多くの監査エントリーを書き出せるようになるため、システムに余分な負荷がかかる可能性があります (つまり、余分な CPU が使用され、より多くのディスク I/O が生成されます)。
-
-
auditd サービスを再起動します。
# service auditd restart注記: RHEL7 以降では、サービス定義に
RefuseManualStop=yesがあるため、systemctl stop/start/restart auditd.serviceは受け入れられません。そのため、RHEL7 以降ではデーモンを再起動するためにservice auditd restartを実行する必要があります。
原因 2: フリーズしたファイルシステム (多くの場合はシステムスナップショットが原因)
これが原因の場合、監査メッセージの発生時にシステムハングが発生することもよくあります。 この根本原因の詳細は、https://access.redhat.com/solutions/473223 を参照してください。
原因 3: 監査 ログの繰り返しローテーション
監査バッファー (原因 1) を拡大したにもかかわらず (原因 1)、audit_lost メッセージが引き続き表示される場合は、次の例のように、auditd がログファイルを頻繁にローテーションしているか確認します。
Jan 7 23:44:17 [...] auditd[29958]: Audit daemon rotating log files
Jan 7 23:44:18 [...] auditd[29958]: Audit daemon rotating log files
Jan 7 23:44:19 [...] auditd[29958]: Audit daemon rotating log files
上記では、毎秒ローテーションが発生しています。
ローテーションが数秒ごとに発生する場合は、より大きなログファイルを使用するように /etc/audit/auditd.conf にあるデフォルトを変更して、継続的なローテーションを回避します。
max_log_file = 8
num_logs = 5
上記の数字は、ファイルのサイズが 8 MB になるたびに auditd がローテーションすることを示しています。ヒット率の高いルールが多数ある場合、これは非常に小さいサイズです。128 MB 程度が推奨されます。
max_log_file = 128
num_logs = 5
このような設定では、監査ログを保存するために最大 6 x 128 MB = 768 MB のファイルシステム領域が必要になります。ファイルシステムのサイズが適切であることを確認してください。
Root Cause
-
マシン上で監査が有効になっており、監査メッセージまたはアクティビティーのフローが大量にある場合、システムのデフォルトのバッファー領域が枯渇して前述のメッセージがログに記録されます。
-
audit_backlog_limit値を増やすと、この問題を解決できます。デフォルト値は低く設定されており、auditctl がバッファー領域からのログを正常に処理できる、監査ログが少ないマシンを対象としています。 したがって、監査トラフィックが大量にあるマシンでは、バッファー領域を増やすことがこの問題を回避する回避策となります。 -
適切なバッファー値を決定するには、少し実験が必要です。システムに十分なメモリーがある場合は、メモリーを 2 倍程度に増やしてみて、エラーがなくなるか確認してください。 値を高くするとシステムリソースの使用量が増える場合は、値を低くする方が適切な可能性があります。
-
以下は、auditd バックログバッファーに必要なメモリーの計算を示しています。この計算を使用して、システムに高いメモリー負荷をかけずに監査バックログキューをどの程度増やせるか決定します。
1 監査バッファーサイズ = 8970 バイト
変更しない限り、/etc/audit/rules.d/audit.rulesのデフォルトのバックログの上限 (backlog_limit パラメーター) は 320 です。
320 * 8970 = 2870400 バイト、または 2.7 MiB -
監査バッファーのサイズは、
MAX_AUDIT_MESSAGE_LENGTHパラメーターで定義されます。詳細は、Visit github.com! を参照してください。
Diagnostic Steps
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments