![Как настроить ведение журнала для ulimits?](https://rvso.com/image/38703/%D0%9A%D0%B0%D0%BA%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B6%D1%83%D1%80%D0%BD%D0%B0%D0%BB%D0%B0%20%D0%B4%D0%BB%D1%8F%20ulimits%3F.png)
Мне было интересно, регистрируется ли что-нибудь, когдаulimits(открытые файлы и т. д.). Если да, то где это регистрируется и что мне следует искать? Я использую 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 и устанавливает errno
значение EMFILE
, но на самом деле происходит следующее:open
системный вызоввозвращается -EMFILE
иглибк преобразуетпреобразует его в -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 содержит«Системный аудит»главу, где вы можете прочитать больше по этой теме.
* Спасибо, перейдите по ссылкеfcheза указание на это.
решение2
Для этого вам необходимо проверить исходный код ядра.
Пример:
Таймеры ЦП в ядре Linux (posix-cpu-таймеры.c) просто отправит SIGKILL процессу-нарушителю при достижении жесткого предела. Мягкий предел запускает SIGXCPU раз в секунду и сообщение Watchdog.
Для получения более подробной информации вы можете поискать другие лимиты и/или сигналы.