|
CARGAL? |
CARGAL is a project to promote free webculture and to provide a plattform for everyone to express him/herself.
Please read the about
//
CARGAL ist ein Projekt um die freie Netzkultur zu fördern und jedem/r Interessierten eine Plattform zu bieten, sich frei zu entfalten.
Bitte lies vorher die Info |
|
|
CONTACT |
If you want to get in direct contact with us use a jabberclient
and go to the conference "cargal" on "jabber.cargal.org"
more infos
Wenn du mit uns in direkten Kontakt treten willst benutze einen Jabberclient
und gehe zur Konferenz namens "cargal" auf "jabber.cargal.org"
mehr Infos |
|
|
Projekte |
Wo werden Leute, ob CARGALvereinsmitglied oder nicht, gebraucht, welches Thema würde sich über Aufmerksamkeit freuen?
|
|
|
|
Workpages of CARGAL |
CARGAL-BOX-HOWTO - Various articles & HOWTOs
|
| Einführung in User Mode Linux Last updated by citizen428@cargal.org on Thursday, 25/03/2004 - 12:44 | Disclaimer: Dieser Text wurde von mir ursprünglich im Juli 2003 geschrieben, und erschien in der österreichischen Computerzeischrift WCM.
Don't drink and root! Einführung in User Mode Linux
Daß der Linuxkernel und die verschiedenen darauf aufbauenden Distributionen höchst flexibel einsetzbar sind, ist weithin bekannt. Eine Vielzahl an Software läuft bereits auf diesem freien Betriebssystemkern. Doch damit nicht genug, läuft doch auch Linux mittlerweile auf Linux.
Bevor jetzt jemand ernsthafte Zweifel an meiner geistigen Gesundheit anmeldet (ob diese begründet wären überlasse ich qualifizierteren Personen ;), sollte der Schlußsatz obiger Einleitung erläutert werden. Im vorliegenden Artikel beschäftigen wir uns mit User Mode Linux, also einer speziellen Variante des Linuxkernels die wie ein "normales" Programm vom Benutzer gestartet wird. Dabei werde ich versuchen zu erklären um was es sich bei UML handelt, wie man es installiert und natürlich auch warum man sich denn überhaupt mit dieser Thematik beschäftigen sollte.
Eine kleine Einleitung
Zu Beginn dieses Artikel habe ich erwähnt daß mittlerweile auch Linux auf Linux läuft. Dies hat mir sicher das eine oder andere Kopfschütteln eingebracht. "Was meint er damit?" oder "Das sollte doch wohl klar sein." könnten typische Reaktionen gewesen sein. Ziehen wir deshalb einmal eine Definition von der UML-Homepage zu Rate: "run Linux inside itself". Also Linux in sich selbst laufen lassen. Wie ein ganz "normales" Programm wird ein UML-Kernel dabei gestartet wenn man ihn braucht, und kann ebenso leicht wieder beendet werden. Dabei läuft dieser Kernel im sogenannten "Userspace", hat also (vereinfacht gesagt) nicht die volle Gewalt über das System. Dadurch hat der im Falle eines Fehlers oder Hacks entstehende Schaden so gut wie keine Auswirkungen auf das sogenannte Hostsystem, also die GNU/Linuxumgebung in welcher der UML-Kernel gestartet wurde. Hört sich jetzt vielleicht kompliziert an, ist es aber eigentlich gar nicht. Dieser Artikel wird in weiterer Folge hoffentlich etwas zum Verständnis beitragen können.
Kernkompetenz
Was kann User Mode Linux? Eigentlich alles was der "normale" Kernel auch kann. Nur daß er eben als neuer Prozess in einem bereits laufenden System gestartet wird. Dabei arbeiten sowohl der Scheduler (der dafür zuständig ist wann welchem Prozeß Systemressourcen zugeteilt werden) und Speicherverwaltung unabhängig vom Hostsystem. Dieses wird "legiglich" für die Hardwareunterstützung zu Hilfe gezogen.
So hat man zum Beispiel Zugriff auf Blockgeräte. Bei diesen handelt es sich normalerweise um Dateien des Hostsystems welche ein Filesystem enthalten und in UML ganz normal gemountet werden. Doch darüber werden wir später noch etwas mehr erfahren.
Doch auch in vernetzten Umgebungen kann sich UML sehen lassen. Auf mehrere Arten ist es möglich ein virtuelles Netzwerk mit dem Wirtsystem und anderen Rechnern im Netzwerk aufzubauen. Selbst ein komplett virtuelles Netzwerk meherer UMLs auf einem Rechner ohne Zugriff auf das Hostsystem ist dabei möglich.
Sollte man es bunter mögen lässt sich natürlich auch X unter UML einsetzen. Dabei kommt "xnest" als Client zum Einsatz der mit dem Server auf dem Hostsystem interagiert. Selbst auf Sound muß man dabei nicht verzichten, kann UML doch so konfiguriert werden daß es seine Soundausgaben an das Wirtsystem weiterleitet.
Dies ist natürlich keinesfalls eine erschöpfende Aufzählung der Fähigkeiten von User Mode Linux, stattdessen soll auch die Neugier und Experimentierfreude der Lesergeschaft geweckt werden. Dazu noch eine kleine Anregung: man kann in einem UML System einen weiteren UML-Kernel erstellen und starten!
Warum das alles?
Als echter Geek war für mich natürlich schnell ein Grund gefunden UML zu installieren: neues Spielzeug! Mein System läuft ohnehin viel zu rund, was soll man mit der vielen Freizeit denn sonst machen? ;) Spaß beseite, natürlich gibt es eine ganze Reihe von Szenarien wo der Einsatz von User Mode Linux durchaus sinnvoll sein kann. Auf einige davon wollen wir jetzt etwas näher eingehen:
Virtuelles Hosting - da es sich bei UML eigentlich um einen vollwertigen Kernel handelt, ermöglicht es Hostingprovidern ein physisches System in mehere, von einander unabhängige, virtuelle Maschinen aufzuteilen. So läuft z.B. die Communityseite usermodelinux.org unter UML, auf der Projekthomepage finden sich aber auch Links zu kommerziellen Betreibern.
Sandbox oder Jail - Prozesse die unter UML laufen haben keinen Zugriff auf das Hostsystem. So könnte man z.B. einen sicherheitskritischen Dienst unter UML laufen lassen. Sollte er tatsächlich gehackt werden nimmt lediglich das UML-System Schaden.
Testsystem - Neugierig auf eine neue Distribution aber kein Testrechner in Reichweite? Warum nicht einfach unter UML ausprobieren? Filesysteme für verschiedenste Distributionen finden sich im Web zum Download. Man könnte natürlich auch einfach mal den neuesten Kernel testen, oder sich davon überzeugen ob der Rechner mit der neuen optimierten Konfiguration auch booten würde. Doch auch andere Situationen kann man unter Zuhilfenahme von UML bequem testen: wollten wir nicht alle schon mal wissen was denn bei einem "rm -rf /" wirklich passiert? Ich weiß es mittlerweile. :)
Softwareentwicklung - der UML-Kernel innerhalb der virtuellen Maschine kann anders als das Hostsystem konfiguriert werden. Dies versetzt Softwareentwickler in die Lage Software unter geänderten Bedingungen zu entwickeln und zu testen. Oder Entwickler von netzwerkbasierten Programmen können zu Testzwecken ein virtuelles Netzwerk auf einem einzigen Rechner aufziehen um ihre Applikation bequem testen zu können. Und durch das Vorhandensein eines komplett ausgestatten Hostsystems, ist UML natürlich auch für Kernelentwickler sehr interessant.
Linuxemulation - noch läuft UML nur unter Linux. Doch würde es auf andere Betriebssystem portiert, würde dies bedeuten daß Programme die für GNU/Linux geschrieben wurden nativ laufen könnten.
Weitere Anwendungsgebiete fallen dem geneigten Leser mit ein wenig Nachdenken sicher noch ein, also wird es Zeit unseren Rechner tauglich für User Mode Linux zu machen.
Lasst die Spiele beginnen
Was braucht man also für das Abenteuer UML? Die einfache Antwort: einen dafür geeigneten Kernel. Diesen kann man entweder in vorkompilierter Form herunterladen und sofort loslegen, oder man besorgt sich einen Patch gegen die Vanillasources und legt selbst Hand an beim Kernelbau. Beide Varianten werden auf der Webseite des Projekts zum Download angeboten. Auf Installation und Inbetriebname werden wir etwas später noch genauer eingehen.
Zusätzlich zu einem usermodefähigen Kernel ist auch ein sogenanntes Rootfilesystem erforderlich. Dabei handelt es sich um die komplette Verzeichnisstruktur (also /bin, /etc/, /var usw.) einer regulären GNU/Linuxinstallation, die in einer einzigen Datei, dem sogenannten Image, enthalten ist. Fertige Rootfilesysteme für verschiedenste Distributionen finden sich auf der UML-Homepage, bei Bedarf oder Interesse lassen sich diese aber auch mit Hilfe diverser Tools und den Installationsmedien der gewünschten Distribution selbst erstellen.
Doppelt hält besser
Im Rahmen dieses Artikels wurde UML auf zwei verschiedenen Rechnern installiert. Unter Gentoo Linux wurde dazu der entsprechende Ebuild aus dem Portagetree verwendet und der Kernel selbst kompiliert, während auf dem Red Hat Linux Testsystem ein vorkompilierter Kernel zum Einsatz kam.
Sehen wir uns jetzt die Installation bei Gentoo Linux etwas genauer an. Zuerst bringen wir einmal unsere Paketdatenbank auf den neuesten Stand:
# emerge sync
Danach installieren wir UML:
# emerge usermode-sources
Dieser Befehl lädt die "normalen" Kernelquellen sowie den dazu passenden UML-Patch, welcher auch automatisch angewendet wird. Die gepatchen Sourcen finden sich dann in /usr/src/uml/linux. In dieses Verzeichnis wechseln wir auch um dort unseren Kernel zu konfigurieren:
# cd /usr/src/uml/linux # make menuconfig ARCH=um
Natürlich funktioniert auch xconfig, allerdings ist der Autor kein großer Freund dieser Methode. Zu beachten ist die Angabe "ARCH=um", mit welcher dem Konfigurationssystem mitgeteilt wird daß man einen Usermodekernel erzeugen möchte. Bis auf einige neue Optionen (denen leider oft die Hilfetexte fehlen) sollte die Konfiguration keine Überraschungen bieten. Die Warnung im offiziellen Gentoo UML HOWTO devfs NICHT automatisch beim Start des Kernels zu mounten (in der Sektion "File systems" - "Automatically mount at boot" unterhalb von "/dev file system support") bezieht sich darauf Gentoo auch in der virtuellen Maschine laufen zu lassen. Für Slackware- und Debianimages war diese Option bei mir nötig!
Ist die Konfiguration abgeschlossen kompilieren wir unseren Kernel und kopieren ihn an seine endgültige Position im Dateisystem:
# make linux ARCH=um # cp linux /usr/local/bin/linux
Danach ist es ratsam sich die nützlichen Zusatztools zu installieren:
# emerge usermode-utilities
Auf dem System mit Red Hat Linux würde man das RPM von der UML Webseite mit folgendem Befehl installieren:
# rpm -i user_mode_linux-2.4.19.5um-0.i386.rpm
Der Konjuktiv rührt daher daß der dabei installierte Kernel auf meinem Testsystem mit RH9 nicht laufen wollte. Also wurde kurzerhand ein vorkompilierter Kernel aus dem Web nach /usr/local/bin kopiert. Für die Fehlersuche ist später immer noch Zeit...
Die Utilities wurden von Hand kompiliert:
# cd /usr/local/src # tar xfvj uml_utilities_20030605.tar.bz2 # cd tools # make all # make install DESTDIR=/
Darf es noch etwas sein?
Zu unserem neuen Usermodekernel empfiehlt der Chef des Hauses ein Rootfilesystem nach Belieben, sowie ein Image einer Swappartition. Der Autor hat sich dabei für Slackware- und Debiandateisysteme von der UML-Homepage entschieden, um zu zeigen daß Host- und Gastdistribution nicht ident sein müssen.
Dieses Rootfilesystem entpackt man in einem Verzeichnis auf welches man Schreizugriff hat:
# bunzip2 root_fs_slack8.1.bz2
Danach erzeugen wir uns eine leere Datei die 256MB groß ist und legen darin ein Swap-Dateisystem an:
# dd if=/dev/zero of=swap_fs seek=256 count=1 bs=1M # mkswap -f swap swap_fs
Nun können wir unser neues Spielzeug mal unter die Lupe nehmen. Dabei ist zu beachten daß wir das Rootfilesystem explizit als Parameter an den Kernel übergeben müssen wenn es einen anderen Namen als "root_fs" trägt.
# linux ubd0=root_fs_slack8.1 ubd1=swap_fs
Und schon kann man wie gewohnt einen Kernelstart verfolgen. In der Standardeinstellung öffnen sich nun mehrere virtuelle Konsolen in xterms. Dieses Verhalten kann in der Konfiguration aber geändert werden. Nähere Informationen dazu finden sich auf der Homepage des Projekts. Zugang zum neuen System erhält man als Benutzer "root", und das ganz ohne Passwort. Dieses lässt sich aber natürlich wie gewohnt mittels "passwd" setzen. Auch sonst kann man eigentlich arbeiten wie man es von einem GNU/Linuxsystem gewohnt ist, egal ob es darum geht Programme zu installieren oder Dienste zu starten.
Praktisch im Umgang mit UML ist die Managementkonsole die man sich auf jeden Fall etwas näher ansehen sollte. Damit kann man die Kernelversion des UML-Systems abfragen, Geräte hinzufügen und entfernen, die virtuelle Maschine pausieren und noch einiges mehr. Dafür muß die Option CONFIG_MCONSOLE (in "General Setup") in der Kernelkonfiguration gesetzt sein. Um später einfach darauf zugreifen zu können, startet man User Mode Linux mit einer eindeutigen Identifikation:
# linux ubd0=Debian-3.0r0.ext2 ubd1=swap_fs umid=Debian
Dadurch wird ein File angelegt (in meinem Fall /home/michi/.uml/Debian/mconsole) welches zur Kommunikation zwischen den beiden Systemen dient. Beim Starten der Konsole muß einfach nur die vorher gewählte ID angegeben werden:
# uml_mconsole Debian (Debian) version OK Linux (none) 2.4.20-6um #2 Mon Jul 28 19:32:03 CST 2003 i686
Eine Liste weiterer Optionen bekommt man durch Eingabe von "help" am Prompt der Managementkonsole.
Gib mir deine Files!
Nun kann man seiner Neugier freien Lauf lassen und nach Herzenslust experimentieren. Dabei kann es aber natürlich durchaus mal vorkommen daß man auf Dateien aus dem Hostsystem innerhalb der virtuellen Maschine zugreifen will oder muß. Dies wäre natürlich über ein virtuelles Netzwerk und damit verbunden NFS oder scp möglich, geht aber auch einfacher, und zwar mittels hostfs welches bei der Kernelkonfiguration (in der Sektion "General Setup") aktiviert werden kann.
Zuerst wollen wir uns versichern daß hostfs in unserem UML auch verfügbar ist (der Prompt 'uml#' steht dabei für Befehle die innerhalb der virtuellen Maschine ausgeführt werden):
uml# cat /proc/filesystems
In dieser Liste sollte hostfs aufscheinen. Und schon kann man mittels
uml#mount none /mnt/host -t hostfs
das Rootdirectory des Wirtsystems nach /mnt/host (der Mountpoint muß eventuell selbst angelegt werden) mounten. Da man meistens nicht daß komplette Filesystem benötigt lässt sich mit der Option -o auch ein Verzeichnis angeben welches gemountet werden soll:
uml# mount none /mnt/michi -t hostfs -o /home/michi
Schon steht mir mein Homeverzeichnis innerhalb von UML in /mnt/michi zur Verfügung.
Vernetzt
Wie bereits erwähnt kann sich UML auch in vernetzten Umgebungen durchaus sehen lassen. So kann man sich mit dem Wirtsystem, anderen Rechnern oder sogar mit anderen virtuellen Maschinen vernetzen. Eine vollständige Anleitung zu allen Möglichkeiten und den verschiedenen Transports (ethertap, TUN/TAP, Multicast etc.) würde den Rahmen dieses Artikel sprengen. Auf der Homepage des Projekts findet sich aber ein sehr gutes HOWTO zu dieser Thematik. Der Einfachheit halber wollen wir darum an dieser Stelle nur den Aufbau eines komplett virtuellen Netzwerks ohne Verbindung zur Aussenwelt besprechen.
Dafür starten wir zuerst den in den Utilities enthaltenen uml_switch, welcher alternativ auch als Hub betrieben werden kann:
# uml_switch -hub uml_switch will be a hub instead of a switch uml_switch attached to unix socket '/tmp/uml.ctl'
Die Kommandozeile bietet noch weitere Möglichkeiten: so kann man damit die Sockets spezifizieren welche zur Kommunikation verwendet werden oder den Switch mit dem Netzwerk des Hostsystems verbinden. Doch für unser Beispiel ist obiger Aufruf mehr als ausreichend. Jetzt starten wir zwei UMLs und teilen ihnen mit daß der Daemon uml_switch für ihr Netzwerk verantwortlich ist:
# linux ubd0=Debian-3.0r0.ext2 eth0=daemon # linux ubd0=root_fs_slack8.1 eth0=daemon
Dann noch schnell bei beiden ein "ifconfig eth0 $IP" gemacht (wobei ich die IPs 192.168.0.100 und 192.168.0.101 verwendet habe), und schon steht einem erfolgreichen ping nichts mehr im Weg!
Honigtopf
Wie wir bis jetzt gesehen haben handelt es sich bei UML um einen voll funktionalen Linuxkernel, welcher auch im Netzwerk eine gute Figur macht. Damit eignet sich User Mode Linux natürlich auch als sogenannter Honeypot, also als System welches (vereinfacht gesagt) bewusst angreifbar gemacht wird, um somit Auskunft über die Strategien der Angreifer zu liefern. Durch die Besonderheiten von UML wird es mögliche eine Vielzahl an virtuellen Honeypots auf einem physischen System laufen zu lassen und dabei sogar noch ein komplettes Netzwerk zu simulieren. Dadurch ist das Interesse an User Mode Linux als Honeypot natürlich ziemlich groß, was im Lauf der Zeit zu einigen diesbezüglichen Features geführt hat.
So gibt es zum Beispiel die Möglichkeit alle Tastatureingaben innerhalb von UML auf dem Hostsystem aufzuzeichnen. Da keinerlei Netzwerktraffic oder dergleichen verursacht wird ist dies aus dem UML-System nicht erkennbar. Da Honeypots welche auf UML basieren relativ leicht an den sehr spezifischen Informationen in /proc erkennbar waren, gibt es mittlerweile hppfs, das "HoneyPot ProcFS". Dadurch kann das Wirtsystem /proc-Einträge innerhalb von UML ergänzen, löschen oder modifizieren um es schwerer identifizierbar zu machen. Als neueste Änderung gibt es noch einen neuen Patch mit dem Namens "SKAS" (Seperate Kernel Address Space) für den Kernel des Hostsystems, der UML-Kernel und die darin laufenden Prozesse in voneinander verschiedenen Adressräumen des Wirtsystem laufen lässt. Da sich beim standardmässigen "Tracing Thread"-Modus UML und die darin laufenden Prozesse einen Adressraum teilten war der Honeypot für einen Angreifer leicht als solcher identifizierbar.
Mehr zur Verwenung von User Mode Linux als "Honigtopf" und den eben erwähnten Patch findet der interessierte Leser auf der Webseite des Projekts.
...going down for system halt NOW!
Ich hoffe daß dieser Artikel einen guten Einstieg in die interessanten Möglichkeiten von User Mode Linux geboten hat. Ausprobieren lohnt sich auf alle Fälle, es kann eigentlich nichts schief gehen.
Michael Kohl |
|
| | previous | index | next | | | up | LaTeX und Netzwerk-HOWTO |
| | |
|
|
Latest poll: Wenn eins der folgenden Smartphones, dann.... |
|
|
|
|