ulimitロギングを設定する方法は?

ulimitロギングを設定する方法は?

記録された内容があるか知りたいです。限界値ヒットしました(ファイルを開くなど)。それではどこに文書化されており、何を見つけるべきですか? 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 の「セキュリティガイド」には「システム監査」このトピックの詳細については、ここで読むことができます。

*行ってくれてありがとうFaqieこれを指摘してください。

答え2

これにはカーネルソースコードを確認する必要があります。

例:

LinuxカーネルのCPUタイマー(posix-cpu-timers.c) ハード制限に達すると、SIGKILL はそのプロセスにのみ送信されます。ソフトリミットは、毎秒1回SIGXCPUと監視メッセージをトリガします。

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

関連情報