Jails unter FreeBSD, v.02/2005. copyright (c) 2004-2005 Axel S. Gruner (asg@encephalon.de)



Ähnliche Dokumente
OP-LOG

Step by Step Webserver unter Windows Server von Christian Bartl

FreeBSD Jails. Seminararbeit von: Adler Dominique, 5Im. Fachhochschule Nordwestschweiz Departement Technik Studiengang Informatik

Tutorial -

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

How to install freesshd

Installation Messerli MySQL auf Linux

Guide DynDNS und Portforwarding

Powermanager Server- Client- Installation

INSTALLATION VON INSTANTRAILS 1.7

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

2. Einrichtung der ODBC-Schnittstelle aus orgamax (für 32-bit-Anwendungen)

Anleitung Captain Logfex 2013

SANDBOXIE konfigurieren

Anleitungen zum Publizieren Ihrer Homepage

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Backup der Progress Datenbank

TeamSpeak3 Einrichten

Installationsanleitungen

Legen Sie nun dieses Verzeichnis mit dem Namen "joomla" hier an: C:xampphtdocs.

Update Messerli MySQL auf Linux

Linux 08. Linux WS 04/05 by DNS - named: in /etc/named.conf. DNS Top-Level-DNS

Installation SQL- Server 2012 Single Node

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

HTBVIEWER INBETRIEBNAHME

2. Die eigenen Benutzerdaten aus orgamax müssen bekannt sein

Folgende Einstellungen sind notwendig, damit die Kommunikation zwischen Server und Client funktioniert:

Anleitung für Zugriff auf den LEM-FTP-Server

0. VORBEMERKUNG VORBEREITUNG DES SYSTEMS INSTALLATION UND KONFIGURATION VON PD-ADMIN Installation...3

-Bundle auf Ihrem virtuellen Server installieren.

1) JAVA JRE auf der QNAP Box installieren

Anleitung zur Konfiguration eines NO-IP DynDNS-Accounts mit der TOOLBOXflex-3.2

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Musterlösung für Schulen in Baden-Württemberg. Windows Basiskurs Windows-Musterlösung. Version 3. Stand:

Installation Linux agorum core Version 6.4.5

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

PHPNuke Quick & Dirty

System-Update Addendum

Test mit lokaler XAMPP Oxid Installation

Einrichten einer Festplatte mit FDISK unter Windows 95/98/98SE/Me

MailUtilities: Remote Deployment - Einführung

FTP Server unter Windows XP einrichten

BEDIENUNG ABADISCOVER

FTP-Server einrichten mit automatischem Datenupload für

Netzwerkeinstellungen unter Mac OS X

Anleitung für den Zugriff auf Mitgliederdateien der AG-KiM

In 15 einfachen Schritten zum mobilen PC mit Paragon Drive Copy 10 und Microsoft Windows Virtual PC

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

Tutorial: Erstellen einer vollwertigen XP Home CD aus der EEE 901 Recover DVD

ASA Schnittstelle zu Endian Firewall Hotspot aktivieren. Konfiguration ASA jhotel

Enigmail Konfiguration

Installationsanleitung für pcvisit Server (pcvisit 12.0)

NX Standardinstallation

Scharl 2010 Dokument ist Urheberrechtlich geschützt. Port Forwarding via PuTTY und SSH. Was ist Port forwarding?

Speichern. Speichern unter

Artikel Schnittstelle über CSV

Konfiguration Firewall (Zyxel Zywall 10) (von Gruppe Schraubenmeier)

- Installation. Systemvoraussetzungen für Debian/Ubuntu. conversations installieren conversations wird als TGZ-Archiv mit dem Namen

Ablaufbeschreibung für das neu Aufsetzen von Firebird und Interbase Datenbanken mit der IBOConsole

Der Schalter Eigenschaften öffnet die rechts stehende Ansicht. Internetprotokolle aussuchen

Wie richten Sie Ihr Web Paket bei Netpage24 ein

ANLEITUNG NETZEWERK INSTALATION

Einrichtung des WS_FTP95 LE

Thomas Wagner 2009 (im Rahmen der TA) Installation von MySQL 5.0 und Tomcat 5.5

Step by Step VPN unter Windows Server von Christian Bartl

Installationsanleitung unter Windows

Eine Einführung in die Installation und Nutzung von cygwin

Update und Konfiguraton mit dem ANTLOG Konfigurations-Assistenten

Mein eigener Homeserver mit Ubuntu LTS

Installation Linux agorum core Version 6.4.8

1 Voraussetzungen für Einsatz des FRITZ! LAN Assistenten

Einrichtung von VPN-Verbindungen unter Windows NT

Exchange Export. Mailbox Export

Installation und Sicherung von AdmiCash mit airbackup

Anbindung des eibport an das Internet

Switching. Übung 2 System Management. 2.1 Szenario

Installationsanleitung für Magento-Module

WordPress lokal mit Xaamp installieren

S TAND N OVEMBE R 2012 HANDBUCH DUDLE.ELK-WUE.DE T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

Quickstep Server Update

LPT1 Anschluss mit PCMCIA Karte

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Printserver und die Einrichtung von TCP/IP oder LPR Ports

PC-Kaufmann Supportinformation - Proxy Konfiguration für Elster

Installieren Sie den Janaserver auf dem Schulserver oder dem Lehrerrechner.

TimeMachine. Time CGI. Version 1.5. Stand Dokument: time.odt. Berger EDV Service Tulbeckstr München

Ihr IT-Administrator oder unser Support wird Ihnen im Zweifelsfall gerne weiterhelfen.

Windows Server 2012 RC2 konfigurieren

Verwendung des IDS Backup Systems unter Windows 2000

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

EASYINSTALLER Ⅲ SuSE Linux Installation

How-to: Webserver NAT. Securepoint Security System Version 2007nx

So funktioniert die NetWorker 7.5 Eigenschaft zum Sichern umbenannter Verzeichnisse ( Backup renamed Directories )

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Adminer: Installationsanleitung

Wissenswertes über LiveUpdate

Transkript:

Jails unter FreeBSD, v.02/2005 copyright (c) 2004-2005 Axel S. Gruner (asg@encephalon.de) 25.08.2005

Contents 1 Allgemeines 3 1.1 Eigenschaften einer Jail:...................... 3 1.2 Einschränkungen einer Jail..................... 4 1.3 Jails, Solaris Zones, XEN, vmware, alles das gleiche?....... 5 1.3.1 FreeBSD Jails....................... 5 1.3.2 Solaris Zones........................ 5 1.3.3 XEN............................ 5 1.3.4 Vmware........................... 6 1.4 Typische Einsatzszenarien..................... 6 1.4.1 Die Kosten......................... 6 1.4.2 Schulungen......................... 6 1.4.3 Testumgebung....................... 7 1.4.4 Sicherheit.......................... 7 1.5 Bevor es losgeht........................... 7 1.6 Problematische Dienste....................... 9 1.7 Wichtige sysctl MIB........................ 10 1.7.1 Jail spezifiche sysctl im Hostsystem............ 10 1.7.2 Jail spezifische sysctl in der Jail.............. 12 2 Erstellung einer Jail 13 2.1 Der schnelle Weg mit der CD.................... 13 2.2 Den Bau einer Jail aus den Sourcen beschleunigen......... 13 2.3 Bau einer Jail aus den Sourcen................... 15 2.4 Einstellung des Hostsystems.................... 16 2.5 Der erste Start und die Konfiguration................ 17 2.5.1 Beispielkonfiguration einer Jail.............. 18 2.6 Start und Stop der Jail........................ 19 2.6.1 Eintrag in /etc/rc.conf (automatischer Start und Stop)... 20 2.6.1.1 Jail und devfs rules............... 21 2.6.1.2 Automatischer Ster und Stop der Jail /etc/rc.d/jail 22 2.6.2 Manueller Start und Stop der Jail über /etc/rc.d/jail.... 22 2.6.3 Automatischer Start der Jail über /usr/local/etc/rc.d Script 23 1

CONTENTS 2 2.6.4 Stoppen der Jail über ein Script.............. 24 3 Management von Jails 26 3.1 Über das Hostsystems........................ 26 3.2 Prozesse in einer Jail killen..................... 27 3.3 Erstellen von weiteren Jails..................... 28 3.4 Die Installation von Software in der Jail (Prozesse)........ 28 3.5 Installation von ports........................ 29 3.6 Löschen einer jail.......................... 31 3.7 Update einer Jail.......................... 31 3.8 Jail verkleinern (Dateien die man nicht braucht).......... 31 3.8.1 /usr mit dem Hostsystem teilen............... 32 3.8.2 Löschen von nicht benötigten Dateien in der Jail..... 32 4 FAQ 43 4.1 Ich kann keinen ping und kein traceroute ausführen! Warum?... 43 4.2 Kann ich den traffic der Jails auswerten?.............. 43 4.3 Funktioniert BIND in einer Jail?.................. 44 4.4 Ich will portaudit vom hostsystem nutzen, wie?.......... 44

Chapter 1 Allgemeines Dieses Dokument lebt und unterliegt daher einem steten Wandel was den Inhalt angeht. Jeder UNIX Administrator versucht sein System so sicher als möglich zugestalten. Eine der ältesten Sicherheitsmaßnahmen ist sicher chroot (changes root) welches den Zugriff auf eine Subsktion des Dateisystems beschränkt. Chroot ist sicher für kleinere Aufgaben bestens geeignet stösst aber recht bald an seine Grenzen. Stellen Sie sich einen Server vor auf dem mehrere Benutzer Zugriff haben, nun möchten diese Benutzer, das Leben des Administrators ist ja schon leicht genug, root-zugriff auf den Server, wie wenn das noch nicht reicht möchte Benutzer A noch Softwarepaket X, Benutzer C will einen webserver, Benutzer D einen FTP-und Webserver die er noch selbst konfigurieren kann. Unter den meisten UN- IX Systemen wird der Administrator sich die Haare raufen, und je nach Gemütszustand die Benutzer verfluchen oder auch nicht. Es gibt aber eine Ausnahme, FreeBSD Administratoren. Den meisten wird dies nur ein müdes lächeln und das Wort Jail kosten. Im groben ist eine Jail eine virtuelle Umgebung (client) auf einem Dateisystem, welche aber vollkommen vom eigentlichen System, dem Host, isoliert ist, die eine eigene IP Adresse hat, eine eigene Konfiguration (genauso wie eine nromale FreeBSD Konfiguration) und eigene Programme ausführt. Eine Jail teilt sich ausschliesslich die vorhandenen Ressourcen des Servers mit dem Hostsystem. Veränderungen am Host können die Jails beeinflussen, Veränderungen in einer Jail aber das Hostsystem nicht (ausser es wird den Usern einer Jail erlaubt den gesammten Plattenplatz des Dateisystems auf dem die Jail liegt zu nutzen). 1.1 Eigenschaften einer Jail: Benutzer können root-zugriff haben und Programme Ihrer Wahl installieren. Alle Prozesse die in einer Jail aktiv sind, sind auf diese beschränkt. Das Dateisystem einer Jail kennt keine Dateisysteme ausserhalb seiner selbst. Kommt es zu einem Einbruch in eine Jail, so kann der Hacker nicht aus dieser heraus. Das Hostsystem 3

CHAPTER 1. ALLGEMEINES 4 wird nicht beeinträchtigt. In einer Jail können nur Prozesse die innerhalb der Jail selbst aktiv sind angesprochen werden. So ist es für einen User einer Jail oder einen vermeintlichen Hacker nicht möglich Prozesse die auf dem Hostsystem laufen zu manipulieren. Wie in einer normalen Umgebung können Dateien und Ordner angelegt und gelöscht werden. Reservierte TCP und UDP Ports können an die IP der Jails gebunden werden und somit die Dienste anbieten die auf diesem Ports lauschen. So lässt sich sagen das durch Jails das System sicherer wird und Usern eine grösstmögliche Bewegungsfreiheit bis zur Vergabe von root eingeräumt werden kann. 1.2 Einschränkungen einer Jail Jeder Jail kann nur EINE IP-Adresse zugewiesen werden Da das Loopback Interface (127.0.0.1) oft von Prozessen genutzt wird um mit Servern auf dem lokalen Rechner zu kommunizieren, dieses aber, da die jail nur eine IP nutzen kann, nicht vorhanden ist, wird das loopback interface der Jail, vom Prozess, durch die IP der Jail ersetzt. NFS funktioniert nicht in einer Jail (wie Sie /usr/ports dennoch in der Jail zur Verfügung stellen können zeige ich Ihnen später). Eine Jail muss alleinig über die zugewiesene IP verfügen können. So muss darauf geachtet werden, das auf dem Hostsystem laufende Daemons die sich auf jede verfügbare IP stürzen (in diesem Fall kann man von Dämonen sprechen...) das Starten der Jail verhindern würden. Mit Hilfe von sockstat können Sie auf dem Hostsystem herausfinden welcher Daemon auf alle IP Adressen mit einem bestimmten Port lauscht. nummer1# sockstat [...] root sshd 139 4 tcp4 *:22 [...] Für eine bessere und genauere Übersicht empfehle ich: #sockstat grep \*:[0-9] Wie hier zu sehen ist lauscht der Daemon auf allen IP Adressen mit der Portunmmer 22 (*:22). Um die Konflikte mit den Diensten die in einer Jail laufen zu verhinden, müssen die entsprechenden Daemon so konfiguriert werden das diese nur noch auf eine IP lauschen. Wie Sie dies konfigurieren und welche Service noch problematisch sind steht unter 1.6. Das Laden oder entladen von Kernelmodulen wird nicht funktionieren. Den Befehl mount kann man in einer Jail getrost vergessen. Device Nodes können nicht erstellt werden. Das modifizieren der Netzwerkkonfiguration, der Adressen oder auch der Routing Tabellen ist untersagt.

CHAPTER 1. ALLGEMEINES 5 1.3 Jails, Solaris Zones, XEN, vmware, alles das gleiche? Mittlerweile sind Schlagworte wie vmware, XEN und Solaris Zones in Mode und machen es dem User schwer zu unterscheiden was der Unterschied ist und ob eine Jail unter FreeBSD das ist was der User möchte. Da ich das Dokument von technischen Feinheiten frei halten möchte und es sich in erster Linie an den unerfahrenen User einer Jail richtet, fällt der folgende Vergleich zwischen den einzelnen Systemen recht knapp aus und hat keinen Anspruch auf Vollständigkeit. Mehr Informationen findet man unter den angegeben links und google (oder einer andere Suchmaschine Ihrer Wahl). 1.3.1 FreeBSD Jails Kurz gesagt könnte man FreeBSD Jails mit chroot auf steroiden beschreiben. Oder auch Jail ist FreeBSD auf FreeBSD. Erste Beschreibung passt auf die Eigenschaft einer Jail das diese prinzpiell eine chroot Umgebung bietet die aber (steroide) ein komplettes System darstellt. Mit dem zweiten Ausdruck wird deutlich das eine Jail nur unter FreeBSD läuft und in dieser Jail auch immer FreeBSD aktiv ist und kein anderes OS 1. 1.3.2 Solaris Zones 2 Mit dem neuen Solaris 10 wurde Solaris Zones eingeführt welches auf dem Konzept der FreeBSD jails basiert. So sind hier, wie bei FreeBSD, alle virtuellen Umgebung voneinander getrennt und Prozesse können keine Signale in die anderen Umgebung senden. Die CPU Last wird, wie bei FreeBSD und Jails, nicht merklich erhöht. 1.3.3 XEN Xen ist eine virtuelle Maschine für x86 Computer die es erlaubt mehrere virtuelle Maschinen zu starten in denen unterschiedliche OS in nahezu nativer performance laufen. Die Prozessorlast ist dementsprechend ungleich höher als bei Jails oder Zones. Man könnte bei Xen auch sagen Xen ist alles unter Linux/xen (oder NetBSD/xen 3 ). Dies bedeutet das Xen auf einem der genannten Systeme (FreeBSD und Plan9 sind in der Mache 4 5 ) läuft und unter Xen dann wiederum das System seiner Wahl. 1 http://www.freebsd.org/cgi/man.cgi?query=jail&sektion=2&apropos=0&manpath=freebsd+5.3- RELEASE+and+Ports 2 http://www.sun.com/bigadmin/features/articles/solaris_zones.html 3 http://www.netbsd.org/ports/xen/ 4 http://www.cl.cam.ac.uk/research/srg/netos/xen/faq.html 5 http://www.cs.bell-labs.com/plan9dist/

CHAPTER 1. ALLGEMEINES 6 Ausnahme dabei ist (noch) Windows (siehe das FAQ von Xen). Xen emuliert dabei nicht die Hardware sondern nutzt diese so aus wie unter dem Hostsystem diese gegeben ist. 1.3.4 Vmware Vmware ist eine reine virtuelle Maschine mit der man, nicht wie bei Jails, keine erhöhte Sicherheit verschiedener Serverdienste erreichen kann. Vmware emuliert dabei die Hardware, incl. BIOS und CPU. 1.4 Typische Einsatzszenarien Mit den folgenden Szenarien möchte ich Ihnen typische Jail Herausstellungsmerkmale verdeutlichen. 1.4.1 Die Kosten Als Webhoster können die Kosten für Hardware schnell sehr hoch werden, was sich wiederum auf die Preise für die Endkunden ausschlägt. So machen sich viele Webhoster die Jail unter FreeBSD zu nutze und können so auf einem einzigen Server mehrere virtuelle Root-Server zur Verfügung stellen. Die Kosten sinken, der Kunde freut sich über den geringeren Preis und über die Möglichkeit Software wie Webserver, FTP oder Datenbanken nach belieben zu installieren und zu konfigurieren und das bei vollem Root-Zugriff. So muss der Kunde keinen eigenen Server mieten oder kaufen, der Webhoster hat weniger Anschaffungskosten, da es sich nur um einen Server für mehrere Root-Server handelt, und die Wartungskosten fallen deutlich geringer aus. 1.4.2 Schulungen Bei Schulungen ist es üblich das, bevor die neuen Schulungsteilnehmer kommen, die Übungs-PCs mit dem System neu installiert werden. Ein nicht zu verachtender Aufwand. Was spricht nun dagegen den Schulungsteilnehmern einen virtuellen Server, eine Jail, zur Verfügung zu stellen, in der Sie lernen einen Webserver, eine Datenbank, einen Mail- oder FTP-Server aufzusetzen? Dazu würde es ausreichen einen Server unter FreeBSD aufzusetzen, eine Jail zu erstellen, diese mehrfach auf den Server in unterschiedliche Verzeichnisse zu kopieren, unterschiedliche IPs zu vergeben, und den Teilnehmern einen ssh Zugang auf den Server zu ermöglichen. Eine Jail kann als sog. Standby Jail dienen. Sollte ein Teilnehmer seine Jail zerschiessen, oder sollen die alten SchulungsJails gelöscht werden und neue eingerichtet werden, so kann diese Standby Jail in Sekunden kopiert werden, und ist wieder einsatzbereit. Ein komplettes System neu zu installieren würde ungleich länger brauchen bis es Einsatzbereit wäre.

CHAPTER 1. ALLGEMEINES 7 1.4.3 Testumgebung Ohne neue Hardware anzuschaffen kann eine Jail auch als Testumgebung eingesetzt werden. Neue Software, sei diese selbstgeschrieben oder eine neue Version in den Ports, kann so vor dem Produktionseinsatz ausgiebig getestet werden und der jeweilige Tester kann root Rechte in der Jail erhalten ohne bei einer kleinen Änderungen den Systemadministrator zu fragen oder gar das root Passwort für ein gesammtes System zu erlangen. Viele Köche verderben den Brei und am Ende ist es keiner gewesen. Nach einem ausgiebigen Testlauf kann die Jail einfach gelöscht werden und an deren Stelle eine neue Jail erstellt, bzw. kopiert werden. Dies ist innerhalb von Sekunden geschehen. 1.4.4 Sicherheit Die Sicherheit wurde enleitend schon genannt. Dennoch erhöht eine Jail nicht die Sicherheit von Diensten. Ein Apache, postfix oder PureFTPD sind, so diese denn eine Sicherheitsproblem haben, auch in einer Jail unsicher und sollten so schnell als möglich gepatcht werden. Ein vermeintlicher Angreifer kann diese Lücke ausnutzen, auch eine im SSH Daemon, und sich so Zugang auf Ihre Jail verschaffen. Erreicht er evtl. noch root Rechte so ist er Herr über die Jail. Eventuelle rootkits, Verunstaltungen der Internetseite können die Folge sein. Auch das Löschen sämtlicher accounts, mails, webseiten ist dann auch möglich wenn er die zerstörerische Kraft von root walten lässt. Was macht eine Jail dann aber sicher? Dem Angreifer ist es nicht möglich durch ein Sicherheitsloch eines laufenden Serverdienstes auf das Hostsystem zuzugreifen. Das bringt Ihnen auch nicht viel wenn er die Möglichkeit hat die Serverdienste zu beenden, Nachrichten abzufangen oder den Internetauftritt neu zu gestalten. Vollkommen richtig. Haben Sie den Einbruch ersteinmal bemerkt wird es schwierig herauszufinden welche Veränderungen auf dem System gemacht wurden. In diesem Falle wird die Jail gestoppt, bestehende Verbindungen werden damit getrennt, umbenannt, und an deren Stelle eine Backup-Jail kopiert die die gleichen Dienste anbietet, und gestartet. Innerhalb von Sekunden ist wieder ein funktionierendes, sauberes System vorhanden und es kann in Ruhe untersucht werden über welche Schwachstelle der Angreifer in das System eindringen konnte. Das Hostsystem ist von den Angriffen und Folgen nicht betroffen. 1.5 Bevor es losgeht Bevor eine oder mehrere Jails auf einem System erstellt werden sollte man sich über folgende Punkte Gedanken machen: Eine vollinstallierte Jail braucht in et- Ist ausreichend Plattenplatz vorhanden wa 140 MB Plattenplatz.

CHAPTER 1. ALLGEMEINES 8 nummer1# du -sh /jail/ssh/ 142M /jail/ssh/ Wobei überflüssiges im nachhinein gelöscht werden kann, was auch den bevorzugten Weg darstellen sollte, da es besser ist so lange Dateien zu löschen bis die Jail nicht mehr funktioniert, als diese minimalistisch zu installieren und sich dann zu wundern das diese nicht startett. Die Frage nach einer eigenen Partition lässt sich einfach beantworten, es kommt darauf an. Eine eigene Partition hat den Vorteil, das das Hostsystem nicht durch eine immer weiteranwachsende Jail (Userdaten, logs,...) beeinträchtigt wird. Es hat auch gleichzeitig den Nachteil, das die Vorgaben sehr starr sind, und sich eine Vergrösserung des Plattenplatzes als schwierig erweisen könnte. Partitionen sind oft zu gross und mit noch grösserer Wahrscheinlichkeit zu klein gewählt. Ein kleiner webserver braucht meist nicht soviel Platz wie eine Datenbank in einer Jail, oder ein FTP-Server der allerhand zum download anbieten möchte. Sollte keine eigene Partition für die Jail(s) zur Verfügung stehen, oder Sie haben als Webhoster verschiedene Angebote mit variablen Plattenplatz, so würde es sich anbieten ein quota für die Jail(s) einzurichten. Es ist aber nur über Umwege möglich Quotas für eine Jail festzulegen. Die bessere Alternative wäre es den Jails eine eigene Partition zuzuteilen sich bei der Planung Zeit zu lassen und die Partition gross genug zu wählen: nummer1# mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1f on /jail (ufs, NFS exported, local, soft-updates) [...] Und die Grösse der Partition kann ich mit df -m schnell ersehen nummer1# df -m Filesystem 1M-blocks Used Avail Capacity Mounted on /dev/ad0s1a 503 65 398 14% / devfs 0 0 0 100% /dev /dev/ad0s1f 19683 7696 10411 43% /jail [...] Wieviel Jails sollen erstellt werden Wie immer, die einzig gültige Antwort wäre es kommt darauf an. Auf Ihrem Server können Sie Dienste wie HTTPD, FTP und auch SMTPD und POP/IMAP in einer Jail laufen lassen. Genauso gut kann jeder Dienst seine eigene Jail bekommen. Sie sind der Wärter und können frei entscheiden ob die Gefangenen zusammengelegt werden oder in Einzelhaft kommen. Sie haben schon Jails erstellt und der Bau einer solchen dauert Ihnen zu lange? Dies wäre kein Grund nur eine Jail zu nutzen. Mit dem Programm cpdup (in den Ports) können Jails ohne Verlust der File System Flags kopiert werden.

CHAPTER 1. ALLGEMEINES 9 1.6 Problematische Dienste NFS Wie schon angesprochen, werden Sie bei der Aktivierung dieses Dienstes auf Granit beissen, es wird kaum gelingen diesen Dienst in einer Jail zum laufen zu bekommen. Aber Hand aufs Herz, es gibt wirklich nur sehr wenige die NFS über das Internet anbieten möchten (und die Zahl derer die NFS überhaupt verwendet scheint auch zu schrumpfen). sendmail, postfix Diese Dienste können alle so konfiguriert werden, dass sie nur auf eine Adresse hören. Gerade bei sendmail und named wären einige Administratoren ruhiger, wenn diese in einer Jail-Umgebung laufen würden. Es spricht nichts dagegen das Sie sich eine Jail einrichten und diese Dienste dort Ihre Arbeit verrichten lassen. Die Sicherheit die man damit gewinnt kann einen sehr beruhigen. named (BIND) Soll ein Nameserver in einer Jail laufen, bzw. auf dem Hostsystem, so muss auch hier dafür Sorge getragen werden das dieser sich nur auf eine IP bindet. Dazu folgenden Eintrag in der /etc/namedb/named.conf vornehmen (die IP an Ihre IP der Jail anpassen wenn named in einer Jail aktiviert werden soll): listen-on { 192.168.0.201; }; Inetd Auch inetd versucht sich an alle verfügbaren IP Adressen zu heften. Daher sollte inetd eine IP zugewiesen werden. Tragen Sie in die /etc/rc.conf folgende Zeile ein: inetd_flags= -ww -a <IP des Systems auf dem inetd läuft> sshd Um auch ssh eine IP-Adresse zuzweisen auf die der Daemon hören soll sind zwei Möglichkeiten gegeben. Zum einen kann in /etc/ssh/sshd_config ListenAddress <Ip Adresse> eingegeben werden. Die andere Möglichkeit ist dem sshd auf dem System einen Port zuzuweisen, so das Port 22 beispielsweise frei bleibt und via natd auf eine Jail gemappt wird. So können Sie auf dem Hostsystem mit folgenden Eintrag sshd die Portnummer 1022 zuweisen: sshd_flags="-p 1022" Über NAT ist es nun möglich Anfragen auf den Port 22 auf eine interne IP einer jail zu mappen. Dazu muss in der natd.conf einfach ein port redirect vom Port 22 des Hostsystem auf den Port 22 der Jail gemacht werden. Selbstverständlich können Sie dem Hostsystem Port 22 überlassen und dafür dem sshd in der Jail beispielsweise den Port 1022 zuweisen und einen port redirect einrichten.

CHAPTER 1. ALLGEMEINES 10 syslogd In der /etc7rc.conf nehmen Sie dabei folgende Änderung vor das der syslogd nur auf die eigene IP hört: syslogd_flags= -s -s syslogd_flags= -a <IP Adresse> openntpd Dabei ist die Datei /usr/local/etc/ntpd.conf anzupassen: listen on <IP Adresse> 1.7 Wichtige sysctl MIB Für Jails gibt es fünf sysctls die im Hostsystem der Jail(s) gesetzt werden können und zwei weitere die in der User als root in der Jail ändern kann. Die fünf sysctl Variablen des Hostsystems wirken sich noch auf alle Jails aus. In Zukunft soll hierfür eine Möglichkeit gefunden werden mit der gezielt einzelne Jails angesprpchen werden können. Zur permanenten Setzung der sysctl Variablen dient die Datei /etc/sysctl.conf. Diese wird beim booten des Systems ausgelesen und setzt die entsprechenden Werte. Beachten Sie das es in der Jail bisher nur zwei MIBs gibt die über diese Datei, oder die Console in der Jail, verändert werden können. Auf der Console können diese als root mit # sysctl -w $MIB=0 1 geändert werden. 1.7.1 Jail spezifiche sysctl im Hostsystem Die MIB (Management Information Base) security.jail.allow_raw_sockets und security.jail.getfsstatroot_only sind relativ neu und kommen erst ab FreeBSD 5.3 und spätere Versionen vor. security.jail.set_hostname_allowed Die Default Einstellung liegt hierbei bei 1, hiermit wäre es root einer jail möglich den Hostname der jail via hostname, sethostname oder mit der MIB kern.hostname (siehe 1.7.2) zu ändern. Da die Jail den Hostnamen nutzt um mit dem Hostsystem in Verbindung zu stehen, sollte eine Änderung des Hostnamens in der Jail (insbesondere bei untrusted Benutzern) verboten werden. Dazu muss die sysctl Variable auf 0 gesetzt werden.

CHAPTER 1. ALLGEMEINES 11 security.jail.socket_unixiproute_only Per Default kann die Jail nur via IP kommunizieren. Und so sollte es auch bleiben. Die Variable kann auf 0 gesetzt werden, was dem Benutzer Jail die Möglichkeit einräumt UNIX sockets und/oder IPX zu nutzen, nur muss man sich klaren sein, dass man ein Loch in die Jail schlägt, was den Benutzer möglicherweise nichts bringt, trotzdem sollte man keine Einladungen ausschreiben, und eventuellen Hackern erst gar nicht die Möglichkeit bieten diese anzunehmen. Daher sollte die Variable immer auf 1 gesetzt bleiben. security.jail.sysvipc_allowed Mit dieser Variablen kann entschieden werden ob Prozesse in einer Jail Zugang zu System V IPC haben dürfen oder nicht. Prozesse in einer Jail haben bei Aktivierung dieser Variablen die Möglichkeit mit Prozessen ausserhalb der Jail oder Prozessen in anderen Jails zu kommunizieren, bzw. können evtl. in diese eingreifen. Daher liegt der Default-Wert bei 0, was dies nicht erlaubt. Einige Datenbanken benötigen System V IPC, wobei man sich klaren sein muss, dass erfahrene Hacker diese Lücke evtentuell auszunutzen versuchen. security.jail.allow_raw_sockets Mit diesem MIB kann festgelegt werden ob es dem Benutzer root in der Jail erlaubt ist raw sockets zu erstellen. Anders ausgedrückt, darf man aus einer Jail heraus Programme wie ping oder traceroute nutzen. Ja, man darf, wenn im Hostsystem die MIB auf 1 gesetzt wurde. Diese Funktion sollte aber dennoch mit Vorsicht genutzt werden da raw sockets dazu verwendet werden können um mit verschiedenen Netzwerk-Subsystemen zu interagieren oder diese zu konfigurieren. Per default ist diese Option daher ausgeschalten: # sysctl -a security.jail.allow_raw_sockets security.jail.allow_raw_sockets: 0 #ssh 192.168.0.200 -p2222 jail%ping www.encephalon.de ping: socket: Operation not permitted jail%exit # sysctl -w security.jail.allow_raw_sockets=1 security.jail.allow_raw_sockets: 0 -> 1 #ssh 192.168.0.200 -p2222 jail%ping www.encephalon.de PING www.encephalon.de (213.146.112.85): 56 data bytes 64 bytes from 213.146.112.85: icmp_seq=0 ttl=64 time=1.068 ms [...] security.jail.getfsstatroot_only Konnten vor dieser MIB alle mount points des Hostsystems auch von Usern in einer Jail gesehen werden, so kann man die mit dieser MIB unterbinden.

CHAPTER 1. ALLGEMEINES 12 Wird die MIB auf 1 gesetzt (per default voreingestellt) getfsstat (man getfsstat - erzeugt eine Liste aller gemounteten Dateisysteme) gibt nur die Daten des Dateisystems wieder auf dem die Jail installiert wurde: # sysctl -a security.jail.getfsstatroot_only security.jail.getfsstatroot_only: 1 % ssh 192.168.0.200 -p2222 jail%mount /dev/ad0s1g on /usr (ufs, local, soft-updates) jail%exit # sysctl -w security.jail.getfsstatroot_only=0 security.jail.getfsstatroot_only: 1 -> 0 # ssh 192.168.0.200 -p2222 jail%mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1f on /home (ufs, NFS exported, local, soft-updates) /dev/ad0s1e on /tmp (ufs, local, soft-updates) [...] 1.7.2 Jail spezifische sysctl in der Jail kern.hostname Ist im Hostsystem die MIB security.jail.set_hostname_allowed auf 1 gesetzt, so kann root der Jail den hostname der Jail ändern: # sysctl -a security.jail.set_hostname_allowed security.jail.set_hostname_allowed: 1 # shh 192.168.0.200 -p2222 jail% sysctl -w kern.hostname=hallo.encephalon.de kern.hostname: jail.encephalon.de -> hallo.encephalon.de jail%exit # sysctl -a security.jail.set_hostname_allowed=0 security.jail.set_hostname_allowed: 1 -> 0 # ssh 192.168.0.200 -p2222 hallo% sysctl -w kern.hostname=jail.encephalon.de kern.hostname: hallo.encephalon.de sysctl: kern.hostname: Operation not permitted kern.securelevel Wie im Hostsystem auch, so kann die Jail unter verschiedenen Securelevel laufen. Näherese findet man unter man securelevel.

Kapitel 2 Erstellung einer Jail 2.1 Der schnelle Weg mit der CD Viele User wollen ihren alten Rechner als Firewall und/ oder als kleinen Server nutzen und dabei auf die Vorzüge einer Jail nicht verzichten. Dabei kann der Bau einer Jail, schliesslich handelt es sich um ein make world, auf einem 400MHz (oder noch langsamer getakteten Server) zur Qual werden. Sollte man im Besitz des ISO seiner installierten FreeBSD Version sein, oder der CD, so kann man hierüber schnell und einfach eine Jail installieren. Dazu mountet man das ISO oder die CD nach /mnt und findet dann unter /mnt/5.4-release/base die Welt wieder. Mit folgenden Befehlen kann man dann eine Jail installieren: export DESTDIR=/meine/jail/ (oder env DESTDIR=/meine/jail/, je nach Shell)./install.sh Das Script führt unter /mnt/5.4-release/base nichts anderes als cat base.?? tar --unlink -xpzf - -C /meine/jail/ aus. Sie müssen also DESTDIR nicht unbedingt festlegen sondern können statt des Script den Befehl wie oben geschrieben direkt eingeben. Dabei wird jede base Datei unter /meine/jail entpackt. Danach kann mit der Konfiguration wie unter 2.3 fortgefahren werden. 2.2 Den Bau einer Jail aus den Sourcen beschleunigen Wenn Sie einen Blick in die Beispieldatei /usr/share/examples/etc/make.conf werfen, so sehen Sie dort viele Parameter mit NO_*. Wenn Sie die dort angege- 13

KAPITEL 2. ERSTELLUNG EINER JAIL 14 ben Teile nicht bauen wollen, so können Sie diese in die /etc/make.conf des Hostsystems übernehmen. Damit wird auch die Zeit die es braucht eine Jail zu bauen merklich verkürzt, je nachdem was Sie für unnötig erachten. Neben dem Aspekt der schnellen Installation einer Jail, haben Sie danach in der Jail weniger zu löschen so Sie denn einige Teile nicht nutzen, nutzen wollen oder dem User nicht zur Verfügungen stellen wollen (siehe auch Punkt 3.8). Um eine Jail spezifische make.conf zu nutzen (Sie müssen aber keine spezielle make.conf anlegen, Sie können es wenn Sie wollen) und die für das Hostsystem nicht zu verlieren können Sie einfach wie folgt verfahren: #cd /etc #cp make.conf make.conf.host Haben Sie Ihrer make.conf ersteinmal gesichert, so können Sie die diese make.conf für den Bau einer Jail folgendermassen anpassen: #vi /etc/make.conf NO_ACPI= true NO_BOOT= true NO_BLUETOOTH= true NO_FORTRAN= true NO_GDB= true NO_GPIB= true NO_I4B= true NO_IPFILTER= true NO_PF= true NO_AUTHPF= true NO_KERBEROS= true NO_LPR= true NO_MAILWRAPPER=true NO_MODULES= true NO_NETCAT= true NO_NIS= true NO_SENDMAIL= true NO_SHAREDOCS= true NO_USB= true NO_VINUM= true NOATM= true NOCRYPT= true NOGAMES= true NOINFO= true NOMAN= true NOPROFILE= true NO_BIND= true

KAPITEL 2. ERSTELLUNG EINER JAIL 15 NO_BIND_DNSSEC= true NO_BIND_ETC= true NO_BIND_LIBS_LWRES= true NO_BIND_MTREE= true NO_BIND_NAMED= true Die Erklärungen zu den einzelnen Punkten entnehmen Sie bitte der Datei /usr/share/examples/etc/make.conf. Die somit erstellte make.conf dient als Beispiel, kann aber so verwendet werden. Bitte passen Sie diese an Ihre Bedürfnisse entsprechend an und denken Sie daran, das Sie eine Jail spezifische make.conf nicht brauchen, die Installation einer Jail würde auch ohne diese funktionieren. Wenn Sie eine Jail erstellt haben mit einer eigenen make.conf, so kopieren kopieren Sie die make.conf: #cp make.conf make.conf.jail und setzen wieder die für das Hostsystem geltende make.conf ein: #cp make.conf.host make.conf 2.3 Bau einer Jail aus den Sourcen Eine Jail zu erstellen ist ein leichtes. Sie sollten nur wissen wo Sie die Jail erstellen wollen und die Sourcen des Systems installiert haben (/usr/src). Sollten die sourcen nicht installiert sein, so können Sie dies über die CD/ISO oder sysinstall nachholen, was aber nicht Gegenstand dieses Howtos sein sollte. Ich nehme in meinem nachfolgenden Beispiel an das die Jail unter /jail/www eingerichtet werden soll. Wechseln Sie zuerst nach /usr/src, dort führen Sie folgendes Kommando aus: make world DESTDIR=/jail/www Hiermit wird wird eine Kopie des vorhandenen Systems erstellt und unter /jail/www installiert. Wenn Sie vor dem Erstellen einer Jail Ihr System mit den neusten Sourcen und einem make world auf den neusten Stand bringen, so wird auch die Jail auf dem neusten Stand sein. Sollte vor dem Bau der Jail schon ein built der Welt gelaufen sein, beispielsweise durch ein update des Hostsystem, so reicht ein make installworld DESTDIR=/jail/www aus. Im späteren Verlauf dieses Howtos zeige ich Ihnen noch wie Sie eine schon aktive Jail updaten. Ist der make world Lauf beendet wechseln Sie in das Verzeichnis /usr/src/etc und erstellen eine FreeBSD Distribution unter /jail/www: cd /usr/src/etc make distribution DESTDIR=/jail/www

KAPITEL 2. ERSTELLUNG EINER JAIL 16 Jede Jail hat Ihr eigenes /etc Verzeichnis, was aber nicht bedeutet das alles in diesem Verzeichnis auch funktioniert. Die Jail ist ab diesem Punkt schon fast vollständig, es fehlen noch die device nodes in der jail. Um diese für die Jail einzurichten führt man einen der folgenden Befehl aus: oder mount -t devfs devfs /jail/www/dev mount_devfs devfs /jail/www/dev Da nach einem reboot der mount wieder neu manuell gesetzt werden müsste, und das vor dem Start der Jail, empfiehlt es sich diesen in die /etc/fstab einzutragen, oder ein Startskript unter /usr/local/etc/rc.d abzulegen, was den mount vor dem Start der dazugehörigen Jail vornimmt. Auch die Jail kann über ein Startskript gestartet werden, der bevorzugte Weg führt aber über die /etc/rc.conf des Hostsystems. Sind die Device nodes der Jail ersteinmal hinzugefügt worden, sorgen wir mit einem cd /jail/www ln -sf dev/null kernel dafür, dass einige Programme die nach einer Datei mit dem Namen /kernel suchen, diese auch finden. Nicht unbedingt nötig, aber doch sehr praktisch ist die Möglichkeit der Nutzung von sysinstall in der Jail. mkdir /jail/www/stand cp /stand/sysinstall /jail/www/stand Mit sysinstall ist das Anlegen von Benutzern, dem setzen des root-passwortes, die Einstellung der Zeitzone, auswählen der richtigen Tastatur, etc. recht einfach und es soll keinem vorenthalten werden dies hierfür auch zu nutzen. 2.4 Einstellung des Hostsystems Bitte beachten Sie auch die vorigen Kapitel 1.2 und 1.6. Nachdem die Jail in unserem Beispiel unter /jail/www installiert wurde, muss das Hostsystem für den Betrieb einer Jail, und die Jail an sich konfiguriert werden. Standardkonfiguration Hostsystem Achten Sie darauf das sich auf dem Hostsystem kein Daemon an alle verfügbaren IP-Adressen und/oder Ports hängt da diese die gleichen Dienste in der Jail beeinflussen würde. Hierfür eignet sich das Programm sockstat : #sockstat grep \*:[0-9]

KAPITEL 2. ERSTELLUNG EINER JAIL 17 In der manpage zu rc.conf (5) werden die Dienste beschrieben die mit einem speziellen Flag an eine IP gebunden werden können. In der /etc/rc.conf des Hostsystems starten Sie Beispielsweise den inetd mit folgenden Optionen: inetd_flags="-ww -a 192.168.0.254" Wobei 192.168.0.254 die IP des Hostsystems darstellt und alle Dienste die nun über den inetd gestartet werden automatisch nur auf die angegebene IP lauschen. Auch ein sendmail kann auf dem Hostsystem so eingestellt werden das dieser nur noch auf die localhost Adresse hört: sendmail_enable= NO Damit werden die Systemmails, die beispielsweise durch nächtliche cron-jobs (periodic) erstellt werden, weiterhin zugestellt. 2.5 Der erste Start und die Konfiguration Um die Standardonfiguration einer jail zu vervollständigen muss diese das erste mal manuell gestartet werden. Als erstes weisen Sie Ihrer Netwerkkarte auf dem Hostsystem noch eine weitere IP-Adresse, ein alias, für die Jail zu: ifconfig xl0 inet alias 192.168.0.200/32 Ersetzen Sie xl0 durch die Bezeichnung für Ihre Netzwerkkarte. Die Subnetmaske der IP einer Jail muss /32 (255.255.255.255) sein. Denn, wie Sie sich sicher noch erinnern werden, kann einer Jail nur eine einzige IP zugewiesen werden. Um das alias für das Interface xl0 (bzw. dem Device-Namen Ihrer Netzwerkkarte) schon beim booten anlegen zu lassen ist folgender Eintrag in der /etc/rc.conf des Hostsystems nötig (IP-Adressen, Device-Name sind anzupassen): ifconfig_xl0_alias0="inet 192.168.0.200 netmask 255.255.255.255" Für weitere aliases auf einer Netzwerkkarte sind alias1, alias2,... zu wählen. Mehr dazu erfahren Sie in der manpage zu ifconfig. Es gibt im Internet einen hack der es ermöglicht einer Jail mehr als nur eine IP zuzweisen, da dies aber vom Standard abweicht gehe ich nicht weiter darauf ein. Nun kann die Jail das erste mal manuell für die erste Konfiguration gestartet werden: jail /jail/www biko 192.168.0.200 /bin/sh Die jail wird nun mit dem hostname biko, der IP 192.168.0.200 und der Shell /bin/sh gestartet. Konfigurieren Sie die jail nun folgendermaßen:

KAPITEL 2. ERSTELLUNG EINER JAIL 18 1. Erstellen Sie eine leere /etc/fstab so das beim Start der Jail keine Warnung wegen einer fehlenden fstab erscheinen 2. Rufen Sie einmalig newaliases in /etc auf, so dass sendmail keine Warnungen mehr ausgibt 3. Ein oder mehrere Nameserver sollten in die /etc/resolv.conf eingetragen werden 4. Deaktivieren Sie den portmapper in /etc/rc.conf (rpcbind_enable= NO ) 5. Deaktivierung der Netzwerkkonfiguration in /etc/rc.conf (network_interface= ) 6. Vergabe eines hostnames in der /etc/rc.conf 7. Aktivieren Sie den SSH Daemon in /etc/rc.conf 8. Aktivieren Sie sendmail um Systemmails zuzustellen (sendmail_enable= NO ). Mit der Angabe von sendmail_enable= NONE kann sendmail auch komplett augeschaltet werden. Die Systemmails sammeln sich dabei unter /var/spool/clientmqueue. 9. Desweiteren kann mit Hilfe von /stand/sysinstall ein root Passwort vergeben werden 10. Sie können Benutzer anlegen, die richtige Zeitzone und Tastaturbelegung einstellen. Verlassen können Sie die Jail über die Eingabe von exit. 2.5.1 Beispielkonfiguration einer Jail Ich nehme an das die Jail die IP 192.168.0.200 erhält, der sshd auf Port 2222 lauscht und der hostname biko.encephalon.de sein soll. Die /etc/rc.conf rpcbind_enable="no" network_interfaces="" syslogd_enable="yes" syslogd_program="/usr/sbin/syslogd" syslogd_flags="-ss" hostname="biko.encephalon.de" font8x8="iso15-8x8" font8x14="iso15-8x14" font8x16="iso15-8x16" scrnmap="no" keymap="german.iso" sshd_enable="yes"

KAPITEL 2. ERSTELLUNG EINER JAIL 19 sshd_flags="-p 2222" sendmail_enable= NO /etc/ssh/sshd_config ListenAddress 192.168.0.200 /etc/resolv.conf nameserver 192.168.0.201 2.6 Start und Stop der Jail Nachdem die nötigen Konfigurationen abgeschlossen sind, starten Sie die Jail vollständig (ein alias sollte auf Ihrer Netzwerkkarte, wie unter 2.2 angesprochen, bestehen): jail /jail/www biko.encephalon.de 192.168.0.200 /bin/sh /etc/rc Ein Start über /etc/rc.d/jail start wie unter Punkt 2.6.2 beschrieben macht es noch einfacher und sollte der bevorzugte Weg sein eine Jail auch manuell zu starten und /oder zu stoppen. Es werden einige Warnungen ausgegeben, aber alles in allem sollte die Jail nun laufen. Die Warnungen kommen durch sysctl Variablen die in einer Jail nicht gesetzt werden können. Sie können nun mit ssh auf die Jail zugreifen. Die hier angegebene Portnummer 2222 kann von Ihrer abweichen je nachdem welchen Port Sie dem sshd in der /etc/rc.conf der Jail zugewiesen haben: nummer1# ssh 192.168.0.200 -p2222 login: password: Ist die Jail ordentlich gestartet, so wird der Prompt der jail erscheinen. Sollten Sie vergessen haben die Portnummer des sshd der Jail anzugeben, und lauscht der sshd des Hostsystem auf dem Default-Port 22, so wird der login auch erfolgreich sein, nur das Sie sich weiterhin auf dem Hostsystem befinden und nicht in der Jail. Wenn Sie ps ax aufrufen werden Sie folgendes Bild vorfinden:

KAPITEL 2. ERSTELLUNG EINER JAIL 20 %ps ax PID TT STAT TIME COMMAND 71077?? SsJ 0:00.55 /usr/sbin/sshd 71084?? SsJ 0:00.01 sendmail: accepting connections (sendmail) 71090?? IsJ 0:00.01 sendmail: Queue runner@00:30:00 for /var/spool/client 71165?? SJ 0:00.06 sshd: asg [priv] (sshd) 71168?? SJ 0:00.01 sshd: asg@ttyp1 (sshd) 71169 p1 SsJ 0:00.04 -csh (csh) 71172 p1 R+J 0:00.00 ps ax % Es sollte sofort zu sehen sein das man sich in einer Jail befindet. So fehlen neben dem init Prozess auch die kernel daemons. Schaut man sich die Spalte stat genauer an, so ist dort ein J flag zu finden. Dies markiert einen Prozess der in einer Jail läuft. Wie jedes FreeBSD System kann die Jail Ihren Vorstellungen was Konfiguration und installierte Software angeht konfiguriert werden. Es werden auch logs angelegt oder beispielsweise mails versendet, auch ein nicht so schöner Zwischenfall, der Einbruch in das System durch einen Hacker kann einem wiederfahren wenn die Jail nicht ordentlich konfiguriert wurde. 2.6.1 Eintrag in /etc/rc.conf (automatischer Start und Stop) Seit FreeBSD 5.x werden Jails über die /etc/rc.conf des Hostsystems gestartet und es Bedarf daher folgender Einträge in der /etc/rc.conf: (1) jail_enable= YES (2) jail_list= www (3) jail_www_rootdir= /jail/www (3) jail_www_hostname= biko.encephalon.de (3) jail_www_ip= 192.168.0.200 (3) jail_www_exec= /bin/sh /etc/rc (3) jail_www_devfs_enable= YES (4) jail_www_devfs_ruleset="devfsrules_jail" Dies sind nicht alle möglichen Optionen, eine komplette Liste entnehmen Sie bitte der Datei /etc/defaults/rc.conf. Dabei wird Ihnen auch auffallen das Sie bei der Konfiguration von /etc/rc.conf für die Jail einige Variablen setzen können die wir unter 1.7.1 bei den sysctls kennengelernt hatten. Um Jails zu starten muss der Eintrag (1) vorhanden sein. Sollten mehrere Jails auf dem System installiert sein, so müssen diese unter (2) mit deren Namen angegeben werden, wobei diese mit einem Leerzeichen voneinander getrennet sein müsen. Die Angaben unter (3) müssen für alle Jails die auf dem System vorhanden sind individuell erstellt werden. Mit dem Punkt (4) werden devfs rules geladen die

KAPITEL 2. ERSTELLUNG EINER JAIL 21 unter der Datei /etc/devfs.rules definiert wurden. Sie können diesen Punkt auch gerne weglassen wenn Sie keine Rules erstellen wollen oder diese nicht brauchen. Sehen Sie hierzu bitte unter Punkt 2.6.1.1nach. 2.6.1.1 Jail und devfs rules Wenn Sie wie unter 2.6.1 eine devfs ruleset für die Jail angegeben haben, so müssen Sie dieses noch definieren. Unter /etc/defaults/devfs.rules liegt schon eine solche Datei die Sie einfach nach /etc/ kopieren. Folgende rules sind dabei angegeben: [devfsrules_hide_all=1] add hide # Basic devices typically necessary. # Requires: devfsrules_hide_all # [devfsrules_unhide_basic=2] add path null unhide add path zero unhide add path crypto unhide add path random unhide add path urandom unhide # Devices typically needed to support logged-in users. # Requires: devfsrules_hide_all # [devfsrules_unhide_login=3] add path ptyp* unhide add path ptyq* unhide add path ptyr* unhide add path ptys* unhide add path ptyp* unhide add path ptyq* unhide add path ptyr* unhide add path ptys* unhide add path ttyp* unhide add path ttyq* unhide add path ttyr* unhide add path ttys* unhide add path ttyp* unhide add path ttyq* unhide add path ttyr* unhide add path ttys* unhide add path fd unhide add path fd/* unhide add path stdin unhide

KAPITEL 2. ERSTELLUNG EINER JAIL 22 add path stdout unhide add path stderr unhide # Devices usually found in a jail. # [devfsrules_jail=4] add include $devfsrules_hide_all add include $devfsrules_unhide_basic add include $devfsrules_unhide_login 2.6.1.2 Automatischer Ster und Stop der Jail /etc/rc.d/jail Im Normalfall starten und stoppen Jails mit den darin laufenden Diensten beim Systemstart, bzw. beim Herunterfahren des Hostsystems. Dies geschieht über den Eintrag jail_enable="yes" in der /etc/rc.conf (wie unter Punkt 2.6.1 beschrieben). Dabei wird das Script /etc/rc.d/jail mit dem Parameter start ausgeführt. Wollen Sie nicht das die Jail beim Start gestartet wird so lassen Sie bitte die Einträge wie unter 2.6.1 beschrieben weg und starten die Jail nach dem Systemstart des Hostsystem manuell über dievariante wie unter 2.6 beschrieben. 2.6.2 Manueller Start und Stop der Jail über /etc/rc.d/jail Es ist nun auch möglich die Jail komfortabel nach dem Start wieder zu beenden, oder wenn eine neue Jail eingerichtet wurde diese manuell zu starten: nummer1# jls nummer1# Es ist zur Zeit keine Jail aktiv. Die angelegte Jail www soll nun manuell gestartet werden: nummer1# /etc/rc.d/jail start Configuring jails:. Starting jails: biko.encephalon.de. nummer1# jls JID IP Adress Hostname Path 4 192.168.0.200 biko.encephalon.de /jail/mawe Die Jail wurde ordnungsgemäß gestartet und evtl. Dienste in der Jail stehen nun zur Verfügung. Um die Jail zu stoppen reicht ein

KAPITEL 2. ERSTELLUNG EINER JAIL 23 nummer1# /etc/rc.d/jail stop Stopping jails: biko.encephalon.de. nummer1# jls nummer1# Auch ein restart der Jails mit dem Parameter restart ist über dieses Script möglich. Sollten mehrere Jails auf einem Hostsystem laufen, so ist es nicht immer wünschenswert wenn alle Jails heruntergefahren oder wieder aktiviert werden. In diesem Fall kann man den Namen der Jail, wie in der Datei /etc/rc.conf des Hostsystem unter jail_list= definiert, angeben und nur diese Jail starten oder stoppen: nummer1# /etc/rc.d/jail stop biko nummer1# /etc/rc.d/jail start biko Hier würde nur die Jail mit dem Namen biko beendet und wieder gestartet werden. Alle anderen Jails die auf diesem System laufen sind davon nicht betroffen. 2.6.3 Automatischer Start der Jail über /usr/local/etc/rc.d Script Diese Variante ist mittlerweile überholt kann aber dennoch genutzt werden. Besser ist es aber die Variante unter 2.6.1 und 2.6.1.2 zu nutzen. Wie viele andere Prozesse, so kann auch eine Jail über ein Skript in /usr/local/etc/rc.d/ gestartet werden. Zu beachten ist hierbei nur das der mount von /dev über devfs vor dem Start der dazugehörigen Jail ausgeführt wird. Da es mittlerweile über /etc/rc.conf eine weitaus bequemere und sauberere Lösung gibt, sollten die Skripte zum Start einer Jail kaum noch Anwendung finden und werden in späteren Ausgaben dieses Howtos verschwinden. %ls -ls [...] -r-xr-xr-x 1 root wheel 306 Dec 24 16:54 983.www_jail_devfs.sh -r-xr-xr-x 1 root wheel 333 Dec 23 18:33 993.www_jail.sh [...] Ein rc.d Skript für den mount von dev/ könnte so aussehen (alternative kann auch ein Eintrag in die /etc/fstab vorgenommen werden): #!/bin/sh case "$1" in start) [ -x /sbin/mount_devfs ] && /sbin/mount_devfs devfs /jail/www/dev && echo - n DEVFS_WWW_JAIL_MOUNTED ;;

KAPITEL 2. ERSTELLUNG EINER JAIL 24 stop) [ -r /sbin/umount ] && /sbin/umount /jail/www/dev && echo -n DEVFS_WWW_JAIL_UNMOUNTED ;; *) echo "Usage: basename $0 {start stop}" >&2 ;; esac exit 0 Das darauf ausgeführt Skript um die Jail zu starten: #!/bin/sh case "$1" in start) [ -x /usr/sbin/jail ] && /usr/sbin/jail /jail/www www.encephalon.de 192. 168.0.203 /bin/sh /etc/rc && echo -n WWW_JAIL_UP ;; stop) [ -r /usr/sbin/jail ] && /usr/sbin/jail > /dev/null && echo -n jail_sh utdown_not_complete ;; *) echo "Usage: basename $0 {start stop}" >&2 ;; esac exit 0 2.6.4 Stoppen der Jail über ein Script Auch hier gilt, über /etc/rc.d/jail können Sie Jails komfortabel automatisch starten lassen oder diese manuell starten und stoppen (Bitte beachten Sie hierfür die Punkte 2.6.1 und 2.6.1.2). Um eine Jail ebenso komfortabel einfach zu starten und zu stoppen wie über /etc/rc.d/jail braucht es ein kleines selbstgeschriebens Script. Danke hierbei an qfat von bsdforen.de für dieses Script. Das Script muss an die jeweilige Umgebung angepasst und kann nicht einfach mittels copy&paste übernommen werden: #!/bin/sh case "$1" in start) ifconfig xl0 inet alias 192.168.0.200/32

KAPITEL 2. ERSTELLUNG EINER JAIL 25 mount_devfs devfs /jail/www/dev jail /jail/www biko 192.168.0.200 /bin/sh /etc/rc ;; stop) for JID in jls grep -v JID awk { print $1; } ; do killall -j ${JID} echo "Killing JID: ${JID}" done umount /jail/www/dev ifconfig xl0 inet -alias 192.168.0.200 ;; config) ifconfig xl0 inet alias 192.168.0.200/32 mount_devfs devfs /jail/www/dev jail /jail/www biko 192.168.0.200 /bin/csh umount /jail/www/dev ifconfig xl0 inet -alias 192.168.0.200 ;; *) echo "Usage: $0 [start stop config]" ;; esac Das Script sollte selbsterklärend sein. So muss neben dem Netzwerkdevice (xl0) auch die IP angepasst werden, sowie der hostname der Jail und deren Pfade. Danach sollte das Script für das Starten und Stoppen einer Jail fehlerfrei funktionieren.

Kapitel 3 Management von Jails 3.1 Über das Hostsystems Es gibt zwei kleine Tools die zum Jail-System gehören, jls und jexec. jls gibt eine Liste der laufenden Jails aus. %jls JID IP Address Hostname Path 3 192.168.0.202 ssh.encephalon.de /jail/ssh 2 192.168.0.203 biko.encephalon.de /jail/www 1 192.168.0.200 data.encephalon.de /jail/data In jeder Zeile steht eine Jail mit der JID (jail identifier), der IP-Adresse, des Hostnamens und dem Pfad zu der Jail. Insbesondere die JID ist für das andere tool jexec wichtig. jexec führt ein Kommando in einer Jail aus, wobei dieses Kommando vom Hostsystem aus abgesetzt wird. jexec JID $Kommando. Ein kleines Beispiel anhand des webservers boa der in einer Jail aktiv ist (alle Kommandos werden im Hostsystem ausgeführt): Ist boa aktiv? nummer1#ps waux grep boa www 77729 0.0 0.4 1284 788 p0 SJ 4:17PM 0:00.00 /usr/local/sbin/boa -c /usr/local boa in der Jail stoppen # jexec 2 /usr/local/etc/rc.d/boa.sh stop Ist boa noch aktiv? 26

KAPITEL 3. MANAGEMENT VON JAILS 27 nummer1#ps waux grep boa nummer1# boa in der Jail starten nummer1# jexec 2 /usr/local/etc/rc.d/boa.sh start Prüfen ob boa in der Jail gestartet wurde nummer1# ps waux grep boa www 77757 0.0 0.4 1284 788 p0 SJ 4:21PM 0:00.00 /usr/local/sbin/boa -c /usr/local Wie anhand dieses Beispiels zu sehen ist es kein Problem Prozesse innerhalb einer Jail zu beeinflussen. So können Sie auch ein kill Kommando auf diese Art absetzen. Eine weitere Möglichkeit ist es killall mit der -j Option zu nutzen. Dabei ist auch wieder die JID wichtig, die Syntax wäre killall -j JID $Prozeßname. nummer1# killall -j 2 boa nummer1# ps waux grep boa nummer1# nummer1# jexec 2 /usr/local/etc/rc.d/boa start nummer1# ps a grep boa nummer1# 77824 p0 SJ 0:00.00 /usr/local/sbin/boa -c /usr/local/etc/www/boa/ 3.2 Prozesse in einer Jail killen Mit jexec und killall -j sind nun schon zwei Möglichkeiten bekannt Prozesse in einer Jail über das Hostsystem zu beeinflussen. Möchte man aber sämtliche Prozesse in einer Jail beenden, so funktioniert kein shutdown, halt oder reboot in der Jail. Es gibt dennoch 2 Befehle die innerhalt der Jail ausgeführt werden können, oder kill -TERM -1 kill -KILL -1. Hierbei wird ein SIGTERM oder SIGKILL an alle Prozesse der Jail gesendet. Daneben können ist auch die Möglichkeit gegeben /etc/rc.shutdown innerhalb der Jail aufzurufen.

KAPITEL 3. MANAGEMENT VON JAILS 28 3.3 Erstellen von weiteren Jails Sollen mehr als eine jail auf dem System installiert werden, so muss man die doch etwas langwierige, wenn auch einfache, Prozedur nicht für jede weitere jail wiederholen.viel einfacher ist es, die soeben erstellte jail einfach zu kopieren. Um eine jail zu kopieren empfehle ich das Programm cpdup welches in den Ports unter /usr/ports/sysutils/cpdup zu finden ist. Würde eine jail mit cp -Rp kopiert werden, so würde die Ausgabe von du -sk, also die Grösse der jails, unterschiedlich ausfallen. Auch pax -r -w bietet sich prinzipiell an, die Grösse würde diesmal stimmen, sieht man sich aber nun beispielsweise die Datei /bin/rcp in den beiden Jails an, so wird man erkennen das bei der kopierten Jail das schg, system immutable, flag fehlen würde. Beide Varianten funktionieren im Prinzip, sind aber bei weitem nicht perfekt eine exakte Kopie einer Jail anzulegen. Anders bei cpdup, hier wird eine exakte Kopie angelegt. Zeit, Hardlinks, Softlinks, devices, Permissions und flags werden übernommen. nummer1#cpdup /jail/www /jail/data Kopiert die jail /jail/www in das Verzeichnis /jail/data. Da beide Jails nun identisch sind muss die kopierte Jail noch konfiguriert werden (hierbei ist auf Dienste zu achten die auf eine IP und/oder einen bestimmten Port gebunden werden). 3.4 Die Installation von Software in der Jail (Prozesse) Um packages in einer Jail zu installieren kann genauso verfahren werden wie unter jedem normalen FreeBSD System. Die ein Möglichkeit wäre /stand/sysinstall zu nutzen, die andere das tool pkg_add. Das einzige was die Jail braucht ist Zugriff auf das Internet über das Hostsystem, dieses muss also mit dem Internet verbunden sein. ssh# pkg_add -r apache Fetching ftp://ftp.freebsd.org/pub/freebsd/ports/i386/packages-current/latest/apache.tbz.. Der Apache webserver wird vom FTP Server geholt und auf dem System, der Jail, wie auf einem normalen FreeBSD System installiert. Nach der Konfiguration des Apache und dem Start sieht man die Prozesse in der Jail laufen: %ps waux grep httpd root 71393 0.0 0.9 2376 1792?? SsJ 11:27PM 0:00.06 /usr/local/sbin/httpd www 71394 0.0 1.0 2428 1892?? SJ 11:27PM 0:00.01 /usr/local/sbin/httpd www 71395 0.0 1.0 2400 1844?? SJ 11:27PM 0:00.01 /usr/local/sbin/httpd www 71396 0.0 0.9 2376 1796?? IJ 11:27PM 0:00.00 /usr/local/sbin/httpd www 71397 0.0 0.9 2376 1796?? IJ 11:27PM 0:00.00 /usr/local/sbin/httpd

KAPITEL 3. MANAGEMENT VON JAILS 29 www 71398 0.0 0.9 2376 1796?? IJ 11:27PM 0:00.00 /usr/local/sbin/httpd www 71402 0.0 1.0 2392 1828?? IJ 11:28PM 0:00.00 /usr/local/sbin/httpd www 71403 0.0 1.0 2392 1828?? IJ 11:28PM 0:00.00 /usr/local/sbin/httpd www 71404 0.0 1.0 2392 1828?? IJ 11:28PM 0:00.00 /usr/local/sbin/httpd % Der gleiche Aufruf auf dem Hostsystem führt zur gleichen Ausgabe. Sollte auf dem Hostsystem auch ein httpd Prozess laufen, so ist der durch das fehlende J flag dem Hostsystem zuzuordnen. Dies kann man sehr schön am Prozess des sendmal sehen. nummer1# ps waux grep sendmail root 500 0.0 1.0 3124 1924?? Ss 6:47AM 0:02.55 sendmail: accepting connections ( smmsp 503 0.0 0.9 2992 1796?? Is 6:47AM 0:00.06 sendmail: Queue runner@00:30:00 root 909 0.0 0.9 3088 1740?? SsJ 6:47AM 0:02.58 sendmail: accepting connections smmsp 915 0.0 0.9 2992 1652?? IsJ 6:47AM 0:00.06 sendmail: Queue runner@00:30:00 [...] nummer1# 3.5 Installation von ports Bei der Installation von ports in einer Jail stehen zwei Möglichkeiten zu VerFügung. Zum einen kann der gesammte Ports-tree aus dem Hostsystem in die Jail kopiert werden, zum anderen eine der vielen Varianten nutzen um den ports-tree des Hosts auf /usr/ports der Jail zu mounten. Die erste Variante hat einen entscheidenden Vorteil gegenüber der Zweiten. Schalten Sie bitte ihr Gehirn ab, und nutzen Sie den Befehl cp. Mehr muss nicht getan werden, einfach kopieren. Das wars. Loggt man sich nun wieder in die Jail ein, so ist das installieren von Ports möglich. Ich glaube aber nicht das Ihnen diese Variante zu sagt, zum einen bin ich der festen Überzeugung das Ihr Gehirn arbeiten möchte, zum anderen wird es das sicherlich schon getan haben. Denn, stellen Sie sich ein System mit mehreren Jails vor, jede Jail soll nun den kompletten Ports-Tree erhalten und jeder der Root Benutzer einer Jail macht nur für sich ein update der ports. Plattenplatz wird für ein und denselben Inhalt mehrfach verbraucht. Bei jedem cvsup Lauf um die Ports auf dem neuesten Stand zu halten entstehen Kosten für die Nutzung der Leitung, ein unnötiger Traffic. Die Überlegung ist nun also, den Ports-Tree auf dem Hostsystem immer aktuell zu halten, und diesen auch der Jail zur Verfügung zu stellen. Ich möchte Ihnen drei Verfahren zeigen mit denen dies möglich ist. NFS Da NFS in einer Jail nicht funktioniert kann das freigeben des Ports-Tree mit dem sogenannten Loopback-Mount erfolgen. Ein loopback-mount exportiert ein Verzeichnis eines Systems in ein anderes Verzeichniss des gleichen Systems was dann dort gemountet werden kann. Da eine Jail aus der Sicht des Hostsystems