Wie konfiguriere ich die Protokollierung für ulimits?

Wie konfiguriere ich die Protokollierung für ulimits?

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_RTTIMEführt ein Überschreiten dazu, dass der Kernel ein Signal sendet.

Nehmen wir zum Beispiel dieRLIMIT_NOFILEGrenze:

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 Fehler EMFILE. (Historisch wurde dieser Grenzwert nach BSD benannt RLIMIT_OFILE.)

Sie müssen also beispielsweise den openSystemaufruf überwachen.manpagesagt:

RÜCKGABEWERT

open(), openat(), und creat()geben den neuen Dateideskriptor zurück, oder -1, wenn ein Fehler aufgetreten ist (in diesem Fallerrnoist entsprechend eingestellt).

FEHLER

open(), openat(), und creat()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 errnoauf setzt EMFILE, aber was tatsächlich passiert, ist, dass dieopen SystemaufrufRenditen -EMFILEundglibc konvertiertes in -1 und setzt es errnoauf 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.

verwandte Informationen