ulimit에 대한 로깅을 어떻게 구성합니까?

ulimit에 대한 로깅을 어떻게 구성합니까?

언제 어떤 것이 기록되는지 궁금합니다.한도적중되었습니다(열린 파일 등). 그렇다면 이는 어디에 기록되며 무엇을 찾아야 합니까? CentOS 6을 사용하고 있습니다.

답변1

당신이 사용할 수있는심사모든 초과 항목이 이런 식으로 나타나는 것은 아니지만 해당 시스템 호출(syscall)의 실패를 기록합니다. 예를 들어 헨크 랑게벨트초과하면 RLIMIT_RTTIME커널이 신호를 보내게 됩니다.

예를 들어보자.RLIMIT_NOFILE한계:

이 프로세스에서 열 수 있는 최대 파일 설명자 수보다 1 큰 값을 지정합니다. 시도 횟수(open(2), pipe(2), dup(2) 등) 이 제한을 초과하면 오류가 발생합니다 EMFILE. (역사적으로 이 제한은 BSD에서 명명되었습니다 RLIMIT_OFILE.)

따라서 예를 들어 syscall을 모니터링해야 합니다 open. 그것은매뉴얼 페이지말한다:

반환 값

open(), openat(), creat()새 파일 설명자를 반환하거나 오류가 발생한 경우 -1을 반환합니다(이 경우errno적절하게 설정되어 있습니다).

오류

open(), openat()creat()다음 오류로 인해 실패할 수 있습니다.

EMFILE- 프로세스에 이미 최대 개수의 파일이 열려 있습니다.

open이는 실패하는 syscall을 감사해야 함을 의미합니다 EMFILE. 매뉴얼 페이지에서는 open-1을 반환하고 로 설정한다고 errno제안 EMFILE하지만 실제로 일어나는 일은open 시스템콜반품 -EMFILEglibc 개종하다-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 커널의 CPU 타이머(posix-cpu-timers.c)는 하드 제한에 도달하면 문제가 있는 프로세스에 SIGKILL을 보냅니다. 소프트 제한은 1초에 한 번씩 SIGXCPU와 Watchdog 메시지를 트리거합니다.

자세한 내용을 보려면 다른 한도 및/또는 신호를 검색할 수 있습니다.

관련 정보