![ulimits のログ記録を構成するにはどうすればよいですか?](https://rvso.com/image/38703/ulimits%20%E3%81%AE%E3%83%AD%E3%82%B0%E8%A8%98%E9%8C%B2%E3%82%92%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
何かが記録されるのか気になっていましたulimitsヒットした場合 (開いているファイルなど)。もしそうなら、これはどこに記録され、何を探せばいいのでしょうか? CentOS 6 を使用しています。
答え1
使用できます監査対応するシステムコール(syscall)の失敗をログに記録しますが、すべての過剰がこのように現れるわけではありません。たとえば、
ヘンク・ランゲフェルト指摘された場合、超過するとRLIMIT_RTTIME
カーネルがシグナルを送信します。
例えば、RLIMIT_NOFILE
制限:
このプロセスで開くことができる最大ファイル記述子番号より1つ大きい値を指定します。試行回数(
open
(2)、pipe
(2)、dup
(2)など)がこの制限を超えるとエラーが発生しますEMFILE
。(歴史的に、この制限はRLIMIT_OFILE
BSDで命名されました。)
そのため、例えば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 とウォッチドッグ メッセージをトリガーします。
詳細については、他の制限や信号を検索してください。