Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスのスクリーンショットとシステムログに「audit callbacks suppressed」と「audit: backlog limit exceeded」というエラーメッセージが表示されます。これらのメッセージが発生するのはなぜですか。また、メッセージの再発を防ぐにはどうすればよいでしょうか。
簡単な説明
Linux システムの監査バックログバッファは、オペレーティングシステムが監査イベントを維持またはログに記録するために使用するカーネルレベルのソケットバッファキューです。新しい監査イベントがトリガーされると、システムはイベントをログに記録し、監査バックログバッファキューに追加します。
backlog_limit パラメータ値は、監査バックログバッファの数です。次の例に示すように、パラメータはデフォルトで 320 に設定されています。
# auditctl -s
enabled 1
failure 1
pid 2264
rate_limit 0
backlog_limit 320
lost 0
backlog 0
デフォルト数である 320 を超えてログに記録された監査イベントは、インスタンスで次のエラーを引き起こします。
audit: audit_backlog=321 > audit_backlog_limit=320
audit: audit_lost=44393 audit_rate_limit=0 audit_backlog_limit=320
audit: backlog limit exceeded
audit_printk_skb: 153 callbacks suppressed
audit_printk_skb: 114 callbacks suppressed
監査バッファキューが容量を超えていると、インスタンスがフリーズしたり、応答不能状態のままになることがあります。
バックログ制限を超えたエラーを回避するには、backlog_limit パラメータ値を大きくします。大規模なサーバーでは、トリガーされる監査ログの数が多いため、バッファ領域を増やすと、エラーメッセージを避けることができます。
注意: 監査バッファを増やすと、インスタンスのメモリ消費量が多くなります。backlog_limit パラメータのサイズは、インスタンスの合計メモリによって異なります。システムに十分なメモリがある場合は、既存の backlog_limit パラメータ値を 2 倍にしてみてください。
監査バックログに必要なメモリの計算を次に示します。この計算を使用して、インスタンスにメモリ負荷を発生させることなく、バックログキューを作成できるサイズを決定します。
1 つの監査バッファ = 8970 バイト
監査バッファのデフォルト数 (backlog_limit パラメータ) = 320
320 * 8970 = 2870400 バイト、つまり 2.7 MiB
監査バッファのサイズは、MAX_AUDIT_MESSAGE_LENGTH パラメータによって定義されます。詳細については、github.com の Linux監査ライブラリにある MAX_AUDIT_MESSAGE_LENGTH を参照してください。
注意: インスタンスがアクセス不能で、システムログに backlog limit exceeded というメッセージが表示される場合は、インスタンスを停止して起動します。次に、以下の手順を実行して、監査バッファ値を変更します。
解決方法
注意: この例では、 backlog_limit パラメータ値を 8192 バッファに変更しています。8192 バッファは、前述の計算に基づいて 70 MiB のメモリに相当します。メモリ計算に基づいて、任意の値を使用できます。
1.SSH を使用してインスタンスにアクセスします。
2.現在の監査バッファサイズを確認します。
注意: backlog_limit パラメータは、-b としてリストされます。詳細については、auditctl-man-page の auditctl(8) を参照してください。
Amazon Linux 1 および systemd を持たないその他のオペレーティングシステム:
$ sudo cat /etc/audit/audit.rules
# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.
# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 320
# Disable system call auditing.
# Remove the following line if you need the auditing.
-a never,task
# Feel free to add below this line. See auditctl man page
Amazon Linux 2 および systemd を使用するその他のオペレーティングシステム:
$ sudo cat /etc/audit/audit.rules
# This file is automatically generated from /etc/audit/rules.d
-D
-b 320
-f 1
3.vi エディタなどのエディタを使用して audit.rules ファイルにアクセスします。
Amazon Linux 1 および systemd を使用しないその他のオペレーティングシステム:
$ sudo vi /etc/audit/audit.rules
Amazon Linux 2 および systemd を使用するその他のオペレーティングシステム:
$ sudo vi /etc/audit/rules.d/audit.rules
4.-b パラメータをより大きな値に編集します。次の例では、 -b 値を 8192 に変更します。
$ sudo cat /etc/audit/audit.rules
# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.
# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 8192
# Disable system call auditing.
# Remove the following line if you need the auditing.
-a never,task
# Feel free to add below this line. See auditctl man page
$ sudo auditctl -s
enabled 1
failure 1
pid 2264
rate_limit 0
backlog_limit 320
lost 0
backlog 0
5.auditd サービスを再起動します。新しい backlog_limit 値が有効になります。次の例に示すように、auditctl -s でも値が更新されます。
# sudo service auditd stop
Stopping auditd: [ OK ]
# sudo service auditd start
Starting auditd: [ OK ]
# auditctl -s
enabled 1
failure 1
pid 26823
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
注意: インスタンスがアクセス不能で、システムログに backlog limit exceeded というメッセージが表示される場合は、インスタンスを停止して起動します。次に、前の手順を実行して、監査バッファ値を変更します。