Ich habe mich gefragt, ob irgendetwas protokolliert wird, wennuGrenzwertewerden getroffen (offene Dateien usw.). Wenn ja, wo wird dies protokolliert und wonach muss ich suchen? Ich verwende CentOS 6.
Antwort1
Sie könnenPrüfungdie Fehler der entsprechenden Systemaufrufe (Syscalls) zu protokollieren, obwohl sich nicht jeder Überschuss auf diese Weise manifestiert. Zum Beispiel als
Henk LangeveldWie darauf hingewiesen wird, RLIMIT_RTTIME
führt ein Überschreiten dazu, dass der Kernel ein Signal sendet.
Nehmen wir zum Beispiel dieRLIMIT_NOFILE
Grenze:
Gibt einen Wert an, der um eins größer ist als die maximale Dateideskriptornummer, die von diesem Prozess geöffnet werden kann. Versuche (
open
(2),pipe
(2),dup
(2) usw.), die diesen Grenzwert überschreiten, führen zum FehlerEMFILE
. (Historisch wurde dieser Grenzwert nach BSD benanntRLIMIT_OFILE
.)
Sie müssen also beispielsweise den open
Systemaufruf überwachen.manpagesagt:
RÜCKGABEWERT
open()
,openat()
, undcreat()
geben den neuen Dateideskriptor zurück, oder -1, wenn ein Fehler aufgetreten ist (in diesem Fallerrno
ist entsprechend eingestellt).FEHLER
open()
,openat()
, undcreat()
können mit den folgenden Fehlern fehlschlagen:
EMFILE
– Der Prozess hat bereits die maximale Anzahl an Dateien geöffnet.
Das bedeutet, dass Sie die Systemaufrufe überprüfen müssen open
, die mit fehlschlagen EMFILE
. Die Manpage schlägt vor, dass open
-1 zurückgibt und errno
auf setzt EMFILE
, aber was tatsächlich passiert, ist, dass dieopen
SystemaufrufRenditen -EMFILE
undglibc konvertiertes in -1 und setzt es errno
auf EMFILE
* .
Nachdem wir das geklärt haben, fügen wir eine Prüfregel hinzu:
[root@h ~]# auditctl -a always,exit -F arch=`uname -m` -S open \
-F uid=ciupicri -F exit=-EMFILE -k "UL-SE"
Testen wir die Grenzen:
[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'
Und überprüfen Sie die Protokolle:
[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"
...
Der "Security Guide" für Red Hat Enterprise Linux 6 enthält eine"Systemprüfung"Kapitel, in dem Sie mehr zu diesem Thema lesen können.
* Dank geht anfchefür den Hinweis.
Antwort2
Hierzu müssen Sie den Kernelquellcode überprüfen.
Beispiel:
Die CPU-Timer im Linux-Kernel (posix-cpu-timers.c) sendet einfach ein SIGKILL an den fehlerhaften Prozess, wenn das harte Limit erreicht ist. Das weiche Limit löst einmal pro Sekunde ein SIGXCPU und eine Watchdog-Meldung aus.
Für weitere Einzelheiten können Sie nach den anderen Grenzwerten und/oder Signalen suchen.