Sind Resource Limits bei Linux einfach unmöglich?

FreeBSD, Gentoo, openSUSE, CentOS, Ubuntu, Debian
philwo
Posts: 24
Joined: 2006-05-12 02:05

Sind Resource Limits bei Linux einfach unmöglich?

Post by philwo » 2007-08-14 00:34

Hallo,

ich verzweifle hier etwas.. seit Tagen lese ich im Netz darüber nach, wie ich meinen Usern Limits aufzwingen kann, in Bezug auf Speichernutzung, CPU-Last und Anzahl der Prozesse.

Halt, stop :wink: - ja, ich habe gegoogled und hier im Forum gesucht, und zwar eine ganze Menge. :-/
Ich weiß, es gibt die /etc/security/limits.conf (von PAM), die /etc/limits (von Shadow), es gibt im Apache die RLimit-Optionen, es gibt grsecurity und RSBAC - und all das Zeug kriegt es nicht auf die Reihe einfach nur zu sagen:

Alle Prozesse (!) die dem User kd5000 gehören, unterliegen folgenden Beschränkungen:

- gesamter maximaler RAM-Verbrauch des Users ist XYZ MByte,
- der User darf maximal 100 Prozesse starten,
- keins seiner Programme darf mehr als 30 Sekunden CPU-Zeit verbrauchen

Ich krieg noch die Krise.. Unix und Linux werden doch schon seit Ewigkeiten im multi-user Betrieb eingesetzt, da kann es doch nicht sein, dass man heute noch jeden Server mit einer Fork-Bombe platt machen kann :twisted:

So, aber nun genug geschimpft (liegt vermutlich eh daran, dass ich die Lösung einfach nicht sehe). Meine Config sieht wie folgt aus (und darf auch gern kritisch kommentiert werden):

Ubuntu Feisty,
jeder User soll bald SSH-Zugang haben,
Apache 2.2 mit PHP 5.2.3, Python 2.5.1 und Ruby 1.8.5,

SuEXEC für jeden Virtualhost auf den jeweiligen User, die Wrapper-Skripte sind allerdings für den jeweiligen User zugänglich und editierbar (meiner Meinung nach bringt es nichts, das zu beschränken, weil der User sonst das Programm einfach in seiner Shell startet, wenn er unbedingt will..)

PHP und Ruby werden über mod_fcgid als FastCGI eingebunden,
Python über mod_wsgi im Daemon-Mode

Das heißt, alle Sachen, die ein User über den Apache oder die Shell starten kann, laufen auch unter seiner User-ID. Der Trick ist aber eben, dass er sie über den Apache per FastCGI *oder* per Shell starten kann - und dann je nach dem die Limits nicht greifen.

Die Shell zu limitieren, ist einfach - da reicht /etc/security/limits.conf, das funktioniert wunderbar. Wenn ein User also über die Shell die CPU zum Glühen bringen will, sollte ihm das dank Limits recht schnell wieder abgewöhnt werden.

Aber das funktioniert nicht mehr, sobald die Programme überhaupt nicht erst durch die Shell gehen - wenn ich als User ein PHP-/Python-/Ruby-Programm erstelle, was 500 MB RAM verbrät, unendlich oft forkt und irgendein großes Programm von der Platte startet, kommen die limits.conf Einträge nie zur Wirkung.

RLimitCPU / RLimitNPROC etc. zeigen überhaupt keine Wirkung (dabei scheint mir das die Lösung zumindest für den Apache-Teil zu sein..). Ich habe sie mal testweise in eine VirtualHost-Section eingebaut und Apache mit "apache2ctl graceful" neugestartet, mein PHP-Skript lief ohne Probleme 30 Sekunden bei 100% CPU, bis das max_execution_time Limit von PHP selbst gegriffen hat..

Irgendwie steh ich gerade im Wald und seh die Bäume nicht - ich will jetzt auf meinem fertigen Produktivserver nicht nachträglich grsecurity oder RSBAC installieren, auch weil ich von diesen Zusätzen noch überhaupt keine Ahnung habe und erstmal in einer VMware experimentieren will..

Gibt es denn dann keine Möglichkeit, diese Resource Limits *global per User* zu setzen? Es kann doch nicht sein, dass ich in jedem Programm was auf der Kiste existiert und zugänglich für den User ist, einzeln Beschränkungen (falls überhaupt möglich) setzen muss - für PHP in der ini, für Python und Ruby weiß ich noch überhaupt nicht wie, ...

Hat irgendjemand eine Idee? Wie macht ihr das denn oder wie machen das die "großen Provider"?

In meiner Verzweiflung überlege ich mir schon, ein Cronjob-Skript zu verwenden, was einfach die Prozessliste durchgeht und alles killt, was ihm nicht passt - aber das hilft natürlich auch nichts.. dann hat der böse User im worst-case 60 Sekunden Zeit um das System abzuschießen. Eine Fork-Bomb hat das in meiner VMware in 3 Sekunden geschafft. ;)

Viele Grüße und vielen Dank im voraus,
Philipp

codc
Posts: 97
Joined: 2004-01-08 02:55
Location: Tübingen

Re: Sind Resource Limits bei Linux einfach unmöglich?

Post by codc » 2007-08-16 19:03

Du gibst Usern denen du nicht vertraust ein Shell? Ich ehrlich gesagt nicht.

Ansonsten /home und /tmp als noexec mounten hilft schon eine Menge und /etc/security/limits.conf da kann kannst du eine Forkbombe durch die Anzahl der Prozesse pro User verhindern.

philwo
Posts: 24
Joined: 2006-05-12 02:05

Re: Sind Resource Limits bei Linux einfach unmöglich?

Post by philwo » 2007-08-16 19:53

Hi!

Erstmal danke für deine Antwort. :)

codc wrote:Du gibst Usern denen du nicht vertraust ein Shell? Ich ehrlich gesagt nicht.


Naja, es ist nicht so, dass die User bösartig sind - wenn sie absichtlich was kaputt machen, kriegen sie richtig Ärger mit mir. Das soll eher gegen Programmierfehler eine erste Barriere sein.. (Endlosschleifen mit SQL-Abfragen und 100% CPU-Last oder einfach nur PHP-/Python-/Ruby-Code, der gegen den Server als DoS eingesetzt werden kann, wenn er 100 mal pro Sekunde aufgerufen wird -.-)

Da sie über Python oder Ruby theoretisch sowieso jedes Programm ihrer Wahl starten könnten, kann ich ihnen auch gleich eine Shell geben - die hält sich wenigstens an die Limits die ich in /etc/security/limits.conf setze ^^ Genauer gesagt ist die Shell sogar das geringste Problem (weil sie sich eben an diese Datei hält).. zur Not chroote ich die User noch gesammelt..

codc wrote:Ansonsten /home und /tmp als noexec mounten hilft schon eine Menge


Ich hab jetzt /home als nodev,nosuid und /tmp als nodev,nosuid,noexec.. danke :)

codc wrote:und /etc/security/limits.conf da kann kannst du eine Forkbombe durch die Anzahl der Prozesse pro User verhindern.


Das ist eigentlich genau das und auch das einzige Problem was ich hab - die Limits werden nicht angewendet! Ich kann da eintragen, dass mein User auf 20 CPU-Sekunden beschränkt ist, aber das PHP-Skript verbrät trotzdem ohne Ärger zu kriegen 30 Sekunden mit 100% Last.. (mit "top" gecheckt). Ich hätte gern eine /etc/security/limits.conf die wirklich global gilt und nicht nur bei Programmen, die die auswerten.

Hat da jemand eine Idee?

Viele Grüße,
Philipp

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Sind Resource Limits bei Linux einfach unmöglich?

Post by daemotron » 2007-08-16 20:11

philwo wrote:es gibt grsecurity und RSBAC - und all das Zeug kriegt es nicht auf die Reihe
OK, grsecurity leistet das nicht - das wesentlich umfangreichere RSBAC hingegen schon. Dabei nimmt sich RSBAC im Prinzip den Scheduler vor, also die Stelle im Kernel, an der kein Prozess vorbei kommt:

Gentoo Linux RSBAC Overview wrote:RES

Linux Resources. For all users and programs you can define a minimum and a maximum Linux process resource set (e.g. memory size, number of open files, number of processes per user). Internally, these sets are applied to the standard Linux resource flags
.

//EDIT//
Hier noch der passende Link aus der RSBAC-Dokumentation (RES ist wirklich genau das, was Du suchst): http://www.rsbac.org/documentation/rsba ... ources_res

philwo
Posts: 24
Joined: 2006-05-12 02:05

Re: Sind Resource Limits bei Linux einfach unmöglich?

Post by philwo » 2007-08-16 20:31

Hey, das klingt super :) Ich hätte zwar lieber etwas ohne so eine große Änderung am System, aber das scheint es ja nicht zu geben..

Kennt sich denn jemand mit RSBAC aus? Hat da jemand vielleicht sogar schon ein kleines How-To zu geschrieben? ;) Ich möchte eigentlich gar nicht die ganzen Funktionen nutzen, sondern erstmal nur das RES-Modul..

Ich les schon mal die Dokumentation und probiere es in meiner VMware-Box aus..
Vielen Dank :)

philwo
Posts: 24
Joined: 2006-05-12 02:05

Re: Sind Resource Limits bei Linux einfach unmöglich?

Post by philwo » 2007-08-23 14:10

Narf.

So wie es aussieht, ist RSBAC größtenteils undokumentiert, wie man das überhaupt (korrekt) administriert. Außerdem stürzt der Kernel auf meinem Laptop, wo ich das mal testen wollte, seit dem RSBAC-Patch ständig mit einem Oops ab.. obwohl RSBAC noch im soft-mode läuft. Eigentlich wollte ich ja auch nur das RES-Modul, aber wenn man dann die Hilfetexte liest, scheint man in Teufelsküche zu kommen, wenn man nicht mindestens noch AUTH und am besten noch RC, CAP, FF und JAIL nimmt. -.- Ich gebe es zu, ich habe keine Ahnung von RSBAC, grsec oder SElinux, vielleicht bin ich deswegen so frustriert. ;)

Also werd ich als letztes noch versuchen, als einziges Modul RES zu verwenden.. vielleicht klappt das ja doch. Sonst muss das bis zum nächsten Server-Reinstall warten.