Die Nov 13 16:27:42 CET 2001
LIDS (Linux Intrusion Detection System) ist ein Linux Kernel Patch und Administrations Tools (lidsadm) um den original Linus Kernel zu erweitern. Es implementiert ein Sicherheits Modell, Referenz Modell und ein Mandatory Access Control Modell im Kernel. In diesem Artikel werden wir uns LIDS anschauen und sehen, wass man tun kann und wie man ein sicheres Linux System entwickelt.
Mit der zunehmenden Popularität von Linux auf dem Intenet, mehr und mehr Sicherheitsloecher werden in den Applikationen gefunden. Viele Exploits entstehen durch den verantwortungslosen Umgang der Programmierer, wie z.B. Buffer Over Flow und Format String Attack. Nachdem ein System mit dem Exploit geknackt wurde und der Hacker bekommt RooT Privilegien, wird das ganze System rd durch die Eindringlinge kontrolliert.
Dank der Open Source Gemeinschaft, bekommen wir viele Linux Applikationen mit dem Source Code und können es nach unserem Belieben veraendern. Die Bugs können einfach gefunden werden und koennen auch schnell behoben werden. Wenn das Sicherheitsloch durch die Oeffentlichkeit entdeckt worden ist und der Administrator ist zu schlaff das Loch zu stopfen, ist es sehr einfach so ein System zu knacken und in das ungepatchte System einzudringen und es ist eine Katastrophe dass der eine Root Shell bekommt. Mit dem momentanen GNU/Linux System, er kann alles tun was er will. Das ist das Problem das wir mit LIDS loesen wollen.
Schauen wir, was mit dem momentanen GNU/Linux System nicht in Ordnung ist.
Das File System ist ungeschützt. Es gibt viele wichtige Dateien, wie z.B. /bin/login, im System. Wenn ein Hacker einbricht, kann er ein veraendertes login Programm einspielen um das alte zu ersetzen. Damit kann er sich einloggen ohne ein gültiges Login und Passwort zu besitzen. Das wird oftmals als Trojanisches Pferd bezeichnet. Aber diese Dateien müssen nicht oft geändert werden, ausser man will das System Upgraden.
Ein Prozess ist ungeschuetzt. Ein laufender Prozess im System dient in irgendeiner Weise dem System, wie z.B. ein HTTPD als Webserver dazu dient Web Inhalt einem entfernten Client zur Verfuegung zu stellen. Als ein Web Server System, es ist sehr wichtig den Prozess von einem Verschwinden zu schuetzen. Aber wir koennen nichts machen, wenn der Angreifer Root Privilegien erlangt.
System Administration ist ungeschuetzt. Viel Arbeit bei der System Administration, wie z.B. das Laden/Entladen von Modulen, Routing Konfiguration und Firewall Regeln können modifiziert werden, wenn die ID des User's 0 ist. Es ist unsicher, wenn der Eindringling Root Privilegien erlangt.
Superuser (root) kann die Rechte missbrauchen. Root sein bedeutet, man kann alles machen was man will. Selbst die Moeglichkeiten im momentanen System, er kann immer noch die Möglichkeiten veraendern.
Als Zusammenfassung laesst sich sagen, dass die Moeglichkeiten eines normalen Linux Systems nicht genung sind um eine sichere Umgebung zu entwickeln. Wir muessen ein neues Modell dem Kernel beibringen um sich mit diesen Problemen auseinander zu setzen.
Das macht LIDS.
Das Linux Intrusion Detection System ist ein Patch und Admin Tools die die Kernel Sicherheit erhoehen. Es implementiert ein Ueberwachungstool und Mandatory Access Control im Linux Kernel. Wenn es aktiviert ist, ausgewaehlter Datei Zugriff, jede System/Netzwerk Administration, jeder Capability Gebrauch, Raw Devices, Speicher und I/O Zugriff kann verunmoeglicht werden, selbst fuer Root. Es benuetzt und erweitert die System Capabilities um das ganze System zu kontrollieren und fuegt ein paar Netzwerk und Datei-System Sicherheit Features im Kernel um die Sicherheit zu erhoehen. Man kann den Schutz online fein tunen, sensible Prozesse schuetzen, Sicherheits Meldungen durch das Netzwerk und mehr.
Mit dem Sicherheits Modell im Kernel, LIDS bietet Ein Schutz, Erkennungs und Antwort im Linux System.
Fuer mehr Information wie das Sicherheitsmodell von LIDS funktioniert, siehe LIDS Hacking HOWTO.
LIDS bietet den folgenden Schutz.
LIDS kann wichtige Dateien und Verzeichnisse auf der Festplatte schuetzen, unabhaengig davon was fuer ein Filesystem eingesetzt wird. Jeder, inklusive Root, kann diese Dateien nicht veraendern.
LIDS kann auch wichtige Prozesse davor schuetzen, geschlossen zu werden.
LIDS kann rohen (RAW) IO Operationen von einem unauthorisierten Programm schuetzen. Es kann auch die Festplatte, inklusive dem MBR, schuetzen usw.
LIDS kann sensible Dateien schuetzen und unerlaubten Zugriff(inklusive Root) von unerlaubten Programmen den Zugriff verweigern.
Mehr.
Wenn jemand den Host scanned, erkennt LIDS das und wird den Administrator informieren.
Wenn jemand die Regeln bricht, dann loggt LIDS die Details ueber den Zugriff an ein sicheres Log das von LIDS geschuetzt wird. LIDS kann die Nachricht auch an einen Mail Empfaenger weiterleiten. In diesem Fall kann LIDS die Session des Users auf einmal schliessen
Mit den LIDS Features, schauen wir einmal wie man ein sicheres System mit LIDS bekommt und das Schritt fuer Schritt.
Den LIDS Patch und das Admin Tool kann man von http://www.lids.org und ftp://ftp.lids.org und anderen LIDS Mirrors rund um die Welt, schau unter http://www.lids.org fuer eine nahe Mirror Site. Der Patch Name wird lids-x.xx-y.y.y.tar.gz, x.xx zeigt die LIDS Version und y.y.y zeigt die Linux Kernel Version. Z.B. lids-0.9.9-2.2.17.tar.gz entspricht LIDS version 0.9.9 und die entsprechende Kernel Version ist 2.2.17. Man sollte den entsprechenden Patch der zur Kernel Version passt runterladen. Z.B., wenn man lids-0.9.9-2.2.17.tar.gz runterlaedt, sollte man auch den Linux Kernel 2.2.17 Source runterladen. Den Kernel Source bekommt man von ftp://ftp.linux.org oder anderen Mirror Sites.
Nachdem braucht man den Kernel Source und den LIDS Tarball zu entpacken. Z.B. wenn man lids-0.9.9-2.2.17.tar.gz von www.lids.org und linux-2.2.17.tar.bz2 von ftp.us.kernel.org.
|
3. Patch LIDS zum Linux Kernel Source.
|
|
[*] Prompt for development and/or incomplete code/drivers [*] Sysctl support Nachdem findest du eine neue Option die am Ende des Konfigurationmenu mit dem Namen "Linux Intrusion Detection System" aufgefuehrt ist. Selektier dieses Menu und stell [*] Linux Intrusion Detection System support (EXPERIMENTAL) (NEW). |
# make dep # make clean # make bzImage # make modules # make modules_install |
4. Kopieren von bzImage nach /boot/ und anpassen von /etc/lilo.conf
|
# /sbin/lilo |
Bevor man neu startet muss man das LIDS System konfigurieren um die Moeglichkeiten den Beduerfnissen anzupassen. Man kann Dateien schuetzen, Prozesse schuetzen usw.
Standarmaessig, lidsadm wird die standard Konfigurationsdateien in /etc/lids/ installieren. Man muss es nach den eigenen Beduerfnissen anpassen. Zuerst werden die inode/dev Werte von lids.conf geupdated.
# /sbin/lidsadm -U |
Nachdem man das Linux System konfiguriert hat, startet man das System. Wenn der LILO erscheint waehlt man den LIDS erweiterten zum laden. Danach betritt man die wunderbare Welt von LIDS.
Nach dem Systemstart, sollte man nicht vergessen den Kernel mit lidsadm abzusiegeln. Man kann den Befehl in die letzte Zeile von /etc/rc.local schreiben.
# /sbin/lidsadm -I |
Nachdem der Kernel abgesiegelt ist, wird das System durch LIDS geschuetzt. Man kann einige Tests machen. Wenn man eine Konfiguration veraendern will, wie z.B. das Aendern der Capability Option, kann man die LIDS sicherheitstufe online durch ein Passwort verändern.
# /sbin/lidsadm -S -- -LIDS |
# /sbin/lidsadm -S -- +RELOAD_CONF |
In diesem Kapitel wird gezeigt wie man LIDS konfiguriert.
Nach dem installieren von lidsadm findet man raus, dass ein LIDS Konfigurations Verzeichnis in /etc/lids/ vorhanden ist. Wenn der Kernel bootet wird die Konfiguration in den Kernel eingelesen um das LIDS System zu initialisieren.
lids.conf Diese Datei speichert die LIDS ACL Informationen. Sie beinhaltet die ACLs um einem Objekt einen Zugriffstyp zu geben. Ein Eintrag kann durch lidsadm hinzugefuegt oder geloescht werden.
lids.cap Diese Datei enthaltet alle Capabilities auf dem System. Man kann durch editieren dieser Datei entscheiden welche Capability man auf dem System aktivieren oder deaktivieren will. Man entweder ein "+" zum einschalten oder ein "-" zum abschalten der Capability nehmen. Wenn das System installiert wurde, die bekommt die lids.cap einen standard Wert. Man sollte es anpassen nach Bedarf.
lids.net Diese Datei deint der Konfiguration um einen Alarm durch das Netzwerk auszuloesen. Man kann den SMTP Server, Port, Subject usw. einstellen.
Diese Datei wird gebraucht, wenn man den Kernel damit konfiguriert
[*] Send security alerts through network (NEW) |
lids.pw Diese Datei wird gebraucht um das Passwort, dass mit "lidsadm -P" generiert wird zu speichern. Es ist notwendig wenn der Kernel damit konfiguriert wurde
[*] Allow switching LIDS protections (NEW) |
Zuerst muss man feststellen welche Dateien man eigentlich schuetzen will. In den meisten Faellen ist sind das die System Binaries und Konfigurationen, wie z.B. /usr/, /sbin/, /etc/, /var/log/.
Zweitens, muss man entscheiden welchen Weg man einschlagen will umd die Dateien zu schuetzen. LIDS bietet 4 schutztypen:
Die Datei oder Verzeichniss als DENY markiert bedeutet, dass es niemand sehen oder modifizieren kann. Die kritischsten Dateien sollte als DENY konfiguriert werden. Z.B., kann man /etc/shadow als DENY markieren und damit den Zugriff fuer irgendjemanden sperren.
|
|
Die Dateien die mit Nur-Lesen markiert sind, bedeuten dass niemand diese Dateien aendern kann. Wir glauben, folgende Dateien gehoeren dazu: /etc/passwd, /bin/passwd usw.
|
Die meisten der Anhaenge-Nur Dateien sind System Log Dateien, wie z.B. /var/log/message oder /var/log/secure. Diese Dateien koennen nur mit Append Modus geoeffnet werden und koennen nicht geloescht oder modifiziert (frueherer Inhalt) werden.
|
Dieser Mode einem Objekt zugewiesen kann Schreibzugriff gewaehren.
Mann kann definieren welches Subject (Programm) auf welches Object(Datei) mit welchen Zugriffs Modi - READ, APPEND und WRITE, zugreifen darf.
Z.B. kann man /home/httpd auf DENY für jedermann setzen und nur /usr/sbin/httpd kann von diesem Verzeichniss READ (lesen). In diesem Fall kann der Webserver seine Dienste ganz normal fortsetzen, aber der Inhalt und Programme unter /home/httpd kann nicht gesehen oder modifiziert werden (MACL). Wenn der Eindringling eine Root Shell bekommt durch Sicherheitsloecher in httpd, sieht er nicht mal die Dateien in der Root Shell. Selbst wenn er gefaehrlichen Code in httpd indem er den Stack ueberschreibt, kann er nur die Dateien unter /home/httpd lesen, aber er kann sie nicht modifizieren.
|
Hier ist ein Beispiel vom LIDS HOWTO von Philippe Biondi
|
LIDS kann Prozesse schuetzen deren Vater init(pid=1) ist, so dass man die Capability wie folgt konfiguriert (/etc/lids/lids.cap)
-29:CAP_INIT_KILL |
Man markiert den Prozess als HIDDEN (versteckt), so dass wenn der prozess aufstartet er nicht in der prozess tabelle gefunden wird, die jeder mit "ps" auflisten kann oder als Dateien in "/proc".
|
Capabilities sind wie Privilegien die man einem Prozess geben kann. Ein Root Prozess hat alle Capabilities. Aber es existiert eine Tabelle mit Capabilities an die gebunden werden kann. In einem normalen Kernel, wenn man eine Capability von der Verknuepfung loest, kann sie niemand mehr wieder gebrauchen, bis wieder neu gestartet wird. (siehe http://www.netcom.com/~spoon/lcap fuer den normalen Gebrauch).
LIDS modifiziert dieses Verhalten um sie ein- und auszuschalten, wannimmer man will. Ein Zugriff zum /proc/sys/kernel/cap_bset ist abgefangen und sendet einen Sicherheits Alert. lidsadm macht den ganzen Job.
Man kann all die Capabilties in einem LIDS mit lidsadm auflisten und man sieht was die exakte Bedeutung von jedem Capability ist.
Der System Capability Wert ist in /etc/lids/lids.cap gespeichert. Man muss diese Datei editieren um sie an die Beduerfnisse anzupassen. Wir diskutieren hier zwei von ihnen,
CAP_SYS_RAWIO Mit diesem Capability koennen wir,
erlauben von ioperm/iopl und /dev/port Zugriff, erlauben von /dev/mem und /dev/kmem Zugriff und erlauben von raw block devices (/dev/[sh]d??) Zugriff |
Aber manche Prozesse brauchen dieses Capability um laufen zu koennen, wie z.B. XF86_SVGA. In diesem Fall kann man das Programm in die Ausnahmeliste wenn man den Kernel kompiliert reintun.
CAP_NET_ADMIN Dieses Capability bekommt folgende Eigenschaft,
Interface Konfiguration Administration einer IP Firewall, masquerading und Accounting Setzen von Debug Optionen auf Sockets Modifikationen der Routing Tabellen Setzen von zufaelligen Prozessen / Prozess Gruppen Zugehoerigkeiten auf Sockets Binden an irgendein beliebige Adresse fuer einen transparenten Proxy Setzen von TOS (type of service) Setzen von Promiscuous Mode Löschen der Treiber Statistiken Multicasting Lese/Schreiben von Geraete-spezifischen Registern |
Man kann eine Capability aktivieren indem man ein "+" vor den Capability Namen setz oder ein "-" schreibt um die Capability zu deaktivieren.
|
Man kann einem Prozess sagen, dass er mit mit aktivierten Capabilities laufen soll, wen sonst das Capability deaktiviert ist.
Z.B. kann man CAP_SYS_RAWIO als deaktiviert(-) in /etc/lids/lids.cap markieren. Aber man braucht immer noch den X Server welcher diese spezielle Capability braucht um zu starten. So kann man
# lidsadm -A -s /usr/X11R6/bin/XF86_SVGA -t -o CAP_SYS_RAWIO -j INHERIT |
Nach dem Kernelboot, die System Capabilities sind nicht aktiviert bevor man nicht den Kernel absiegelt. Man *MUSS* folgende linie in /etc/rc.d/rc.lcoal einfuegen. Bei RedHat Systemen oder anderen Systemen ist das an einem anderen Ort,
#/sbin/lidsadm -I |
LIDS bietet einige Netzwerk Sicherheitserweiterungen.
Mit diesem Capability, koennen wir die Netzwerk Sicherheit erhoehen. Wie z.B. Anti-Sniffing, kann man nicht an den Port binden der kleiner als 1024 ist oder koennen nicht die Firewall und Routing Tabellen aendern. Also was man empfiehlt ist, die Bedeutung jeder Capability sorgfaeltig zu studieren.
LIDS bietet ein Scan Detektor im Kernel an um rauszufinden wer unser System scanned. Der Scanner kann half-open Scans, SYN stealth port scan, Stealth FIN, Xmas, oder Null Scan usw. Tools wie nmap, satan koennen entdeckt werden durch den Detektor.
Es ist nueztlich wenn Raw Sockets deaktiviert ist. In diesem Fall, ein Userland Detektor basierend auf Sniffing wird nicht arbeiten. Der Detektor braucht keinen Socket, er wird sicherer als ein Userland Detektor. Wenn man dieses Feature will, sollte man die Option anwaehlen wenn man den Kernel kompiliert.
Wenn LIDS etwas entdeckt das gegen die Regeln verstoesst, kann es nach folgender Methode Antwort geben.
Wenn jemand die Regeln bricht, lids_security_log wird eine log message an klogd schicken. Das Logging hat auch die Möglichkeit um anti_logging_flood zu machen. Man es einstellen wenn man den Kernel kompiliert.
Jetzt, LIDS hat ein paar Features um die Nachricht zu seinem Mail Account zu mailen. Man kann die Mailserver IP definieren, die out-coming Mail Adresse usw., in /etc/lids/lids.net, fuer mehr Details schau bitte in dieser Datei nach.
Hier ist ein Beispiel.
|
Wenn ein Benutzer die Regeln bricht, kann die aktuelle User Konsole runtergefahren werden.
First of all, I want thank my dear kate , who always encourage me to write document of that, this document is dedicated to her.
I also want to thank Philippe Biond and Christophe Long who give many helps to the project. Without them, the project can not even develop to this step.
Many thanks must go to all the LIDS users, without their contribution and discussion, LIDS can not has so many great ideas.
More thanks will go here if you sent your contribution to the LIDS project, especially this documentation error corrections. Any suggestion is welcome!
The German translator congratulates the whole LIDS team for this great piece of software.