Ein MCP namens SystemD

Bunte Linien kreisen vor meinen Augen und bilden bunte Muster. Die Augen schmerzen. Der Kopf schmerzt und auch das Gehirn hat Schaden genommen. Die Welt ist dunkel, aber bunt.  Ich öffne die Augen. Ein rötlich strahlender Wächter stößt mich mit einer Energielanze an: „Aufstehen, Programm!“ Er will, daß ich mit ihm komme. Wir beschreiten Wege aus Energie… bunter Energie, seltsam neonfarbend und doch schwarz, wie die Nacht. Unterwegs treffen wir andere „Programme“ mit Ihren „Wächtern“. Bald stehe ich vor einem Kopf aus Licht: Der MCP, es gibt ihn wirklich!!!!!!

Verstört wache ich auf. Ein Computeradminalptraum, mitten am Tag, vermutlich am Keyboard eingenickt. Aber was könnte mir so einen Schrecken eingejagt haben, daß ich davon einen Tron .. ähm… traum hatte ?

Es fällt mir wieder ein, ich war grade dabei den Beitrag „Revenge of MariaDB“ Part II zu schreiben. Ja, MariaDB, was war doch gleich … achja.. ging mal wieder nicht nach dem Wechsel von F23 auf F24. Einer unserer Datenbankserver  macht merkwürdige Dinge. Die Webanwendung produzierte sporadisch „Kann nicht in die Datenbank verbinden“ Fehlermeldungen und brachte damit die QA vom Kunden an den Rand des Nervenzusammenbruchs.

Die Analyse geschaltete sich schwierig, weil die Admins immer erst nach einem Vorfall gerufen wurden, aber da ging es wieder. Erst eine zeitnahe Analyse des Netzwerkverkehrs bracht dann den ersten Hinweis: „Can’t create a new Thread. If you have enough free memory, check if … “

Damit konnte man etwas anfangen, ein Blick in eine spezielle Überwachungsdatei brachte dann den Hinweis, daß statt 40.000 Datenbankprozessen, nur wenige Hundert liefen. Also half nur ein Testlauf, mit einer Software, die Verbindungen in die Datenbank aufbaut und offen hält. Sowas kann man schnell in PHP, Perl oder Java schreiben:

import ordb.*;

public class Test {

    public static void main(String[] args) {

        Httpd[] liste = new Httpd[100000];
        for(int i=0;i< Integer.parseInt( args[0] );i++) {
            System.out.println("i="+i);
            liste[i] = new Httpd();
        }
        try {
            Thread.sleep(30000);
        } catch(Exception e) {

            e.printStackTrace();
            System.out.println(e);
        }

    }

}

In einer zweiten Konsole, kann man dann den Datenbankserver überwachen :

strace -e send,read,write -s 1024 -f -p `pidof mysqld`

Damit hat man alle Datenbankserverinstanzen im Blick, was die so Lesen und Schreiben und tatsächlich bestätigte dies den Anfangsverdacht, daß der Datenbankserver nicht genug Prozesse spawnen kann. Er setzte bei 512 Prozessen aus, viel zu wenig für unsere Anwendung.

Der schwierige Teil : Limits prüfen

Als erstes denkt man natürlich, daß sich bei den Limits aus Systemd und die Limits : The Revenge of Mariadb etwas geändert hätte, hatte es aber nicht. Wenn man das OS updatet können aber noch ganz andere Dinge passieren, also muß man hier nach „neuen“ Limits suchen.  Um überhaupt die Limits eines Prozesses Live einsehen zu können, muß man ins /proc/ eintauchen:  cat /proc/`pidof mysqld`/limits

Das kann dann so aussehen:

Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            unlimited            unlimited            bytes     
Max core file size        unlimited            unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             unlimited            unlimited            processes 
Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       32195                32195                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us

Dummerweise sagt dies genau, was man nicht hören will: Alles ok, es gibt keine Limits bei den Prozessen.

Und jetzt steht man da, wo zum Geier kommt dieses 512 Prozesse Limit her?

Es gibt eine Datei namens:  /etc/security/limits.conf

In der könnte man Limits für User eintragen, was aber nicht der Fall war. Außerdem wäre das in der Auflistung genau dieser Limits aufgefallen. Wo kommt dann das Limit her ?

An der Stelle muß man dann praktisch zu Denken anfangen, weil Docs lesen bringt einen fast nicht weiter, weil man gar nicht damit rechnet, daß es noch mehr Limitmöglichkeiten gibt, also auch nicht weiß in welcher Richtung man suchen sollte. Ein gesunder Pragmatismus ist jetzt hilfreich, vielleicht wars auch eine Verzweiflungstat :  grep -r 512 /etc/ /proc/sys/

Also in allen Dateien von ETC und PROC nach einer EIntragung mit 512 zu suchen. Und genau das hat zum Erfolg geführt, so daß ich jetzt eine Anklage wegen Ruhestörung und einen Abdruck meiner Hand an der Stirn habe 😀

Der SystemD macht mehr als er sollte

Im SystemD gibt es eine Konfigurationsdatei : /etc/systemd/system.conf

Der Auslieferungszustand bei Fedora ist, daß dort alle Werte auskommentiert sind, also ungültig sind. Dort fand sich eine 512 Eintragung und der Name der Option war … DefaultTasksMax=512 !

Aber die Option war abgeschaltet, also ist doch die erste Annahme, daß es kein Limit gibt, oder? Tja, Pech gehabt! Der Wert ist nur Deko, weil als Default in den SystemD einkompiliert 🙁

Zum Glück kann man den Wert in dieser Config ändern, den SystemD + MariaDB neustarten und dann wird der neue, unlimitierte Wert auch übernommen. Er taucht in keiner ( mir bekannten ) Procdatei auf. (Hinweise willkommen)

Alles in allem eine Änderung die wohl zu einer heftigen Reaktion seitens der Betroffenen geführt hat, weil die Systemd Entwickler das in einer neueren Version auf 15% der möglichen Prozesse eines Systems limitiert haben. In  unserem Fall wäre das noch schlimmer gewesen, weil wir so noch schlechter hätten Debuggen können, weil es sehr viel seltener passiert wäre.

Warum gibt es das Limit überhaupt ? Ja, weil es Bomben gibt. Das sind z.b. Bashscripte die sich selbst starten und dabei von der Shell abforken, so daß nach kurzer Zeit alle Resourcen eines Systems aufgebraucht sind. Hackt man also einen Server, könnte man den so intern dosen. Damit das nicht geht, gibt wenigstens ein Limit 😉 Das mal jemand Fedora als Server benutzt und dann auch noch als High Performance, damit hatte wohl niemand gerechnet 😀

Meiner Meinung nach, sollte sich der SystemD auf das Starten von Programmen konzentrieren, denn da ist er bedingt besser als SystemV. Aber die ganzen anderen Anmaßungen die das Teil so vornimmt, sind nicht so schön. Der SystemD kann einen echt fertig machen 😉

Ich bin mal gespannt, was beim nächsten OS Upgrade auf uns wartet 😉

Event: Real World Java Web Security

Folgende Veranstaltung der Java User Group Braunschweig, findet am 2. Juni bei LINEAS statt:

Real World Java Web Security

Es geht um die Sicherheit von Java Webanwendungen. Wir dürfen gespannt sein, was uns da präsentiert wird. Als Sprecher kommt Dominik Schadow , welcher als Senior Consultant beim IT-Beratungsunternehmen bridgingIT arbeitet.

Er ist spezialisiert auf die Architektur und Entwicklung von Java Enterprise Applikationen, Enterprise Application Integration und die sichere Softwareentwicklung mit Java. In Trainings und Coachings überzeugt er andere Entwickler von der sicheren Entwicklung mit Java.

Ort:  LINEAS Informationstechnik, Theodor-Heuss-Str. 2, 38122 Braunschweig

F5 Firewalls ?

Wer täglich die Warnung des Cert liest, wird die Firma F5 mit Ihren Firewalllösungen kennen, ob wir Sie mögen sollten, ist eine andere Sache. Jedenfalls sind die in letzter Zeit Dauergäste in den Emails des Cert.

Heute konnte ich in einer Meldung zu einem lokalen Kernelprivilegienescalation Problem folgendes lesen:

Version 1 (2015-04-30 14:38)
Neues Advisory
Version 2 (2015-05-04 11:00)
Für die Distributionen Fedora 20, 21 und 22 stehen Sicherheitsupdates zur Behebung der Schwachstelle bereit. Die Updates für Fedora 20 und 21 befinden sich im Status ‚testing‘, das Update für Fedora 22 im Status ’stable‘.
Version 3 (2015-05-06 09:32)
Canonical stellt für die Distributionen Ubuntu 12.04 LTS inkl. Trusty HWE, Ubuntu 14.04 LTS inkl. Utopic HWE, Ubuntu 14.10 und Ubuntu (vivid) Sicherheitsupdates zur Behebung der Schwachstelle bereit.
Version 4 (2016-02-01 10:49)
F5 Networks informiert über die betroffenen Produkte und Versionen. Unter anderem ist BIG-IP Protocol Security Module (PSM) in den Versionen 10.1.0 – 10.2.4 und 11.0.0 – 11.4.1 verwundbar. Um Angriffe zu vermeiden, sollten nur vertrauenswürdige Administratoren Zugang zu der erweiterten Shell haben. Im Appliance-Modus kann die Schwachstelle nicht ausgenutzt werden, da Benutzer in diesem Modus keinen Zugriff auf die erweiterte Shell haben.
Quelle:
DFN-CERT Services GmbH

Da ich natürlich zuerst lese, um was es geht und welche Plattform betroffen ist, fiel mit nicht sofort auf, daß es sich um Kernel 4.0.1 handelte, da entgegen sonst üblichen Emails der Kernel gar nicht genannt wurde. (Das DNF Cert schickt manchmal Emailteaser für Ihr Webangebot rum, für den Fall egal.)

Wenn man nun genauer hinschaut, muß man schon etwas stutzen, da Version 1 der Meldung vom 30.4. 2015 ist und erst heute, am 1.2.2016 F5 merkt, daß sie auch betroffen sind. Von einer Firma aus dem Securitybereich, erwarte ich mir mehr, wenn jede Linuxdesktopdistribution schneller ist, als meine Firewalllösung.

Vielleicht mag der eine oder andere ja mal einen Kommentar dazu abgeben.

Wie schnell sollte eine Unternehmensfirewall reagieren ?

Was ist das maximal Grenze, die noch akzeptabel ist, klar sofort die Norm sein sollte.