如何配置 ulimit 的日志记录?

如何配置 ulimit 的日志记录?

我想知道是否有任何内容被记录极限值被击中(打开文件等)。如果是这样,它记录在哪里,我应该寻找什么?我使用的是 CentOS 6。

答案1

您可以使用审计记录相应系统调用 (syscalls) 的失败,尽管并非所有多余的情况都以这种方式显示。例如作为 亨克·朗格维尔德指出,超过RLIMIT_RTTIME会导致内核发送信号。

我们以RLIMIT_NOFILE限制:

指定一个比该进程可以打开的最大文件描述符数大一的值。尝试(open(2)pipe(2)、dup(2) 等)超过此限制会产生误差EMFILE。 (历史上,这个限制是RLIMIT_OFILE在 BSD 上命名的。)

因此,您必须监视例如open系统调用。它是手册页说:

返回值

open()openat()、 并creat()返回新的文件描述符,如果发生错误则返回 -1(在这种情况下,errno已适当设置)。

错误

open()openat()、 和creat()可能会失败并出现以下错误:

EMFILE- 该进程已经打开了最大数量的文件。

这意味着您必须审核open失败的系统调用EMFILE。手册页建议open返回 -1 并设置errnoEMFILE,但实际发生的情况是open 系统调用返回-EMFILEglibc 皈依者它变成 -1 并设置errnoEMFILE *

现在我们已经解决了这个问题,让我们添加一条审核规则:

[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。软限制每秒触发一次 SIGXCPU 和一条看门狗消息。

您可以搜索其他限制和/或信号以获取更多详细信息。

相关内容