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은 해당 프로세스에만 전송됩니다. 소프트 제한은 초당 한 번씩 SIGXCPU 및 감시 메시지를 트리거합니다.

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

관련 정보