ulimits のログ記録を構成するにはどうすればよいですか?

ulimits のログ記録を構成するにはどうすればよいですか?

何かが記録されるのか気になっていましたulimitsヒットした場合 (開いているファイルなど)。もしそうなら、これはどこに記録され、何を探せばいいのでしょうか? CentOS 6 を使用しています。

答え1

使用できます監査対応するシステムコール(syscall)の失敗をログに記録しますが、すべての過剰がこのように現れるわけではありません。たとえば、 ヘンク・ランゲフェルト指摘された場合、超過するとRLIMIT_RTTIMEカーネルがシグナルを送信します。

例えば、RLIMIT_NOFILE制限:

このプロセスで開くことができる最大ファイル記述子番号より1つ大きい値を指定します。試行回数(open(2)pipe(2)、dup(2)など)がこの制限を超えるとエラーが発生しますEMFILE。(歴史的に、この制限はRLIMIT_OFILEBSDで命名されました。)

そのため、例えばopenシステムコールを監視する必要があります。マニュアルページ言う:

戻り値

open()、、新しいファイル記述子を返すopenat()creat()、エラーが発生した場合は-1を返します(その場合、errno適切に設定されている必要があります。

エラー

open()、、openat()およびは、creat()次のエラーで失敗する可能性があります。

EMFILE- プロセスではすでに最大数のファイルが開かれています。

openこれは、 で失敗するシステムコールを監査する必要があることを意味しますEMFILE。マニュアルページには、 がopen-1 を返し、errnoに設定すると書かれていますEMFILEが、実際には、open システムコール返品-EMFILEおよびglibc 改宗するそれを -1 に変換し、*errnoに設定します。EMFILE

これで問題が解決したので、監査ルールを追加しましょう。

[root@h ~]# auditctl -a always,exit -F arch=`uname -m` -S open \
                                    -F uid=ciupicri -F exit=-EMFILE -k "UL-SE"

限界をテストしてみましょう:

[ciupicri@h ~]$ ulimit -n 10
[ciupicri@h ~]$ python -c 'from __future__ import print_function; f = [(print(i), open("/etc/passwd")) for i in range(10)]'
0
1
2
3
4
5
6
7
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 24] Too many open files: '/etc/passwd'

ログを確認します:

[root@h ~]# ausearch --start recent -k UL-SE
...
time->Wed Jun 25 21:27:37 2014
type=PATH msg=audit(1403720857.418:63): item=0 name="/etc/passwd" nametype=UNK
NOWN
type=CWD msg=audit(1403720857.418:63):  cwd="/home/ciupicri"
type=SYSCALL msg=audit(1403720857.418:63): arch=40000003 syscall=5 success=no 
exit=-24 a0=8ed72e0 a1=8000 a2=1b6 a3=8f24d11 items=1 ppid=1110 pid=1139 auid=
5000 uid=5000 gid=5000 euid=5000 suid=5000 fsuid=5000 egid=5000 sgid=5000 fsgi
d=5000 tty=pts3 ses=2 comm="python" exe="/usr/bin/python" subj=unconfined_u:un
confined_r:unconfined_t:s0-s0:c0.c1023 key="UL-SE"
...

Red Hat Enterprise Linux 6の「セキュリティガイド」には、「システム監査」このテーマについてさらに詳しく読むことができる章です。

*感謝しますフチェこれを指摘していただきありがとうございます。

答え2

このためにはカーネルソースを検査する必要があります。

例:

LinuxカーネルのCPUタイマー(posix-cpu-timers.c) は、ハード制限に達したときに、問題のあるプロセスに SIGKILL を送信するだけです。ソフト制限は、1 秒に 1 回 SIGXCPU とウォッチドッグ メッセージをトリガーします。

詳細については、他の制限や信号を検索してください。

関連情報