Sandini Bib Linux Security Sandini Bib Open Source Software wird gegenüber kommerziellen Lösungen immer wichtiger. Addison-Wesley trägt dieser Entwicklung Rechnung mit den Büchern der Open Source Library. Administratoren, Entwickler und User erhalten hier professionelles Know-how, um freie Software effizient einzusetzen. Behandelt werden Themen wie Betriebssysteme, Netzwerke und Sicherheit als auch Programmierung. Eine Auswahl aus unserem Programm: Linux für den fortgeschrittenen Systemadministrator, der lernt, wie man Linux bei verteilten Netzumgebungen einsetzt. Die vierte Auflage wurde durchgehend überarbeitet, aktualisiert und erweitert. Wesentliche Neuerungen betreffen Linux-Standards, XML-Tools, Internet-Zugang mit DSL, VPNs, BIND9/dnssec. Linux-Systemadministration Jochen Hein ca. 640 Seiten EUR 49,95 [D], sFr 77,50 ISBN 3-8273-1992-7 Sandini Bib Josef Brunner Linux Security Sicherheit unter Linux mit Open-Source-Tools An imprint of Pearson Education München • Boston • San Francisco • Harlow, England Don Mills, Ontario • Sydney • Mexico City Madrid • Amsterdam Sandini Bib Die Deutsche Bibliothek – CIP-Einheitsaufnahme Ein Titeldatensatz für diese Publikation ist bei Der Deutschen Bibliothek erhältlich. Die Informationen in diesem Produkt werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und Hinweise auf Fehler sind Verlag und Herausgeber dankbar. Alle Rechte vorbehalten, auch die der fotomechanischen Wiedergabe und der Speicherung in elektronischen Medien. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig. Fast alle Hardware- und Softwarebezeichnungen, die in diesem Buch erwähnt werden, sind gleichzeitig auch eingetragene Warenzeichen oder sollten als solche betrachtet werden. Umwelthinweis: Dieses Produkt wurde auf chlorfrei gebleichtem Papier gedruckt. Die Einschrumpffolie – zum Schutz vor Verschmutzung – ist aus umweltverträglichem und recyclingfähigem PE-Material. 05 04 03 02 01 ISBN 3-8273-1999-4 © 2002 by Addison-Wesley Verlag, ein Imprint der Pearson Education Deutschland GmbH Martin-Kollar-Straße 10–12, D-81829 München/Germany Alle Rechte vorbehalten Einbandgestaltung: Marco Lindenbeck (mlindenbeck@webwo.de) Lektorat: Frank Eller, feller@pearson.de Korrektorat: Simone Meißner, Fürstenfeldbruck Herstellung: Elisabeth Egger, eegger@pearson.de CD-Mastering: Gregor Kopietz, gkopietz@pearson.de Satz: reemers publishing services gmbh, Krefeld, www.reemers.de Druck: Bercker, Kevelaer Printed in Germany Sandini Bib Kapitelübersicht Vorwort IX 1 Intrusion Detection Systems 1 2 Netzwerk-Tools 47 3 Systemaudit 149 4 Filesystem Integrity Checker 205 5 Verschlüsselung 231 6 Tools 305 7 Remoteadministration 325 Stichwortverzeichnis 501 Sandini Bib Sandini Bib Inhaltsverzeichnis Vorwort IX 1 Intrusion Detection Systems 1 1.1 Linux Intrusion Detection System (LIDS) 1 1.2 Snort 13 Netzwerk-Tools 47 2.1 Traceroute 47 2.2 IPTraf 52 2.3 NTop 83 2.4 Tcpdump 120 Systemaudit 149 3.1 Nmap 149 3.2 Nessus 161 3.3 VPASS 202 2 3 4 5 6 Filesystem Integrity Checker 205 4.1 Tripwire 205 4.2 MD5Sum 230 Verschlüsselung 231 5.1 Gnu PG (GPG) 231 5.2 OpenSSH 260 Tools 6.1 7 305 Superuser Do (sudo) 305 Remoteadministration 325 7.1 Webmin 325 Stichwortverzeichnis 501 Sandini Bib Sandini Bib Vorwort Worum es in diesem Buch geht Um zu erklären, worum es in diesem Buch geht, sollte ich Ihnen als Erstes sagen, worum es nicht geht. Das Buch beinhaltet keine detaillierte Beschreibung, wie man ein Linuxsystem sicher installiert und konfiguriert. Es vermittelt kein Wissen über die Erstellung dezidierter Sicherheitsrichtlinien oder bestimmter Policies. Es will und kann nicht perfekt sein. Es wird sicherlich nicht 100%ig ohne Fehler sein. Ich denke, es gibt genügend Bücher, die die ersten 300 Seiten damit »verschwenden« dem Leser Wissen zu vermitteln, das er bereits aus vielen anderen Büchern kennt oder das er auf Grund seiner Stellung (Administrator) kennen sollte. Ich habe dieses Buch als eine Art »ganz großes Howto« geschrieben, das die besten (oder zumindest einen kleinen Teil der besten) Sicherheitsprogramme, die unter der GPL stehen, beschreibt. Sie werden lernen, wie Sie bestimmte Tools adäquat zur Problemlösung einsetzen. Auch hier habe ich wieder versucht mich von den Konkurrenzwerken zu distanzieren, indem ich alle verfügbaren Features, Optionen, Argumente und Schlüsselwörter eines Programms aufführe, so dass der mühselige Blick in das Manual vermieden werden kann. Sie müssen aber kein Linuxprofi sein, um dieses Buch zu verstehen. Ich habe mich bemüht die Optionen der einzelnen Programme ausführlich zu besprechen, so dass auch Einsteiger und Neulinge schnell in die Materie eingeführt werden. Die Kapitel dieses Buches sind dabei so geschrieben, dass sie völlig unabhängig voneinander gelesen werden können. Das heißt, die Kapitel bauen nicht aufeinander auf. Dennoch habe ich an zwei oder drei Stellen des Buches einen Querverweis eingefügt, so dass Sie Hintergrundwissen und weitere Informationen im entsprechenden Kapitel nachlesen können. Als Zusammenfassung kann man sagen, dass dieses Buch kein Meisterwerk oder gar ein neues Referenzwerk ist. Es ging einfach nur darum, dem Leser Tools vorzustellen, mit denen er sein Linuxsystem absichern kann. Die Website zum Buch Obwohl ich immer versucht habe ein Programm komplett zu beschreiben, kam es des Öfteren vor, dass ich gerne noch mehr Wissen vermittelt hätte. Auf Grund der eingeschränkten Seitenzahl war mir dies aber leider nicht immer möglich, also habe ich mich dazu entschlossen, ein kleines Portal zum Buch ins Netz zu stellen, welches weiterführende Informationen, Links und Downloads zu den entsprechenden Programmen bieten wird. Sandini Bib X Auf der Webseite finden Sie ein Formular, das es Ihnen ermöglicht, Ihre Kritik oder vielleicht sogar Ihr Lob an mich zu senden. Über beides freue ich mich sehr. Zögern Sie auch nicht, mir Ihre Fragen zu schicken. Ich werde diese so schnell wie möglich beantworten. Sie finden die Seite zum Buch unter der Adresse: www.triblen.de Danksagungen Als Erstes möchte ich Ihnen danken, denn ohne Sie wäre dieses Buch wohl nie zustande gekommen (Warum sollte man ein Buch schreiben, wenn es niemand liest?). Es gibt aber noch einige Personen mehr, ohne die dieses Buch nie hätte realisiert werden können. Als erstes möchte ich daher meiner Lebensgefährtin danken, die mich immer unterstützt und angetrieben hat. Ich hoffe, wir können in der nächsten Zeit mehr Zeit mit einander verbringen. Auch meinen Eltern gebührt großer Dank. Ohne deren Förderung, Engagement und finanzielle Unterstützung hätte ich es nie so weit gebracht. Als Nächstes möchte ich noch meinem Freund Andy (AJ) danken, der, obwohl er ein absoluter Windowsfan ist, mir sehr oft weitergeholfen hat (solange es sich nicht um Linux handelte) und mir immer zur Seite stand. Für die vielen ruhigen Arbeitsstunden möchte ich noch den Eltern meiner Lebensgefährtin danken, die mir ihren Ruheraum, wann immer ich ihn brauchte, zur Verfügung gestellt haben. Es gibt noch so viele Menschen da draußen denen ich für so vieles danken muss. Da ich auf keinen Fall eine Abstufung oder Bewertung vornehmen will, werde ich diese in einer Liste aufzählen: Roland Grassl (für die vielen Linuxabende), Inge (für die vielen Abende), Stefan Grossberger und Roland Russwurm, Markus, Patrick, Martin (für die Abende und die Gespräche über die Sicherheit allgemein), Meik und Christian (für mein neuestes Projekt), Stefan (Für das »Multimediahacking«), allen Bars in München und Augsburg, die mir viel Raum zum Arbeiten, Inspiration und Kraft gaben, allen Programmierern, die Linux und die freien Programme so groß gemacht haben, Geri. Josef Brunner, im Juli 2002 josef.brunner@addison-wesley.de Sandini Bib 1 Intrusion Detection Systems Wie man aus dem Namen schon erkennen kann, handelt es sich bei Intrusion Detection Systemen nicht um Abwehrprogramme, die Hacker davon abhalten sollen in das System einzudringen, sondern um eine Art Last Line of Defense, die erkennen kann, ob ein Systemeinbruch stattgefunden hat, um eventuell darauf zu reagieren. Wir werden in diesem Kapitel zwei Systeme solcher Art besprechen. Zum einen werden wir das LIDS behandeln. Bei diesem Programm handelt es sich um ein hostbasierendes IDS, welches darauf beschränkt ist, alle Vorgänge, die auf dem lokalen System vor sich gehen, zu überwachen. Danach werden wir uns mit Snort beschäftigen. Dieses Tool wird als Sensor auf der Netzwerkebene eingesetzt, um entweder den ganzen Netzwerkverkehr oder Teile davon zu überwachen. 1.1 Linux Intrusion Detection System (LIDS) Wir sind uns sicher alle einig, dass Open Source der beste Weg zur Sicherheit ist. Freunde eines anderen Betriebssystems werden an dieser Stelle anfügen, dass Mailinglisten wie Bugtraq oder ähnliche meistens nur von neuen Sicherheitslücken in Open-Source-Produkten berichten und kaum von Fehlern in kommerziellen Systemen. Natürlich vergessen Vertreter dieser Position nur zu gerne, dass zumeist auch ein Patch neben der Sicherheitslücke veröffentlicht wird und damit gewährleistet wird, dass System die von fleißigen Administratoren überwacht und betreut werden, somit fast immer auf dem neuesten Stand der Sicherheit sind. Doch leider (oder besser Gott sei Dank) sind Administratoren auch nur Menschen und haben Urlaub oder vergessen den Patch aufzuspielen. An sich wäre eine dadurch entstehende verspätete Einspielung der Bugfixes noch kein allzu großes Problem, doch der Umstand, dass auch Hacker in Mailinglisten stehen und somit auch alle sicherheitsrelevanten Meldungen bekommen, macht diese Nachlässigkeit zu einem riskanten Spiel. Falls nun ein Hacker auf seinem Streifzug im Internet ein System entdeckt, das einen Server mit einer bekannten Sicherheitslücke fährt, wird er sich wahrscheinlich an die Entwicklung eines Exploits machen oder – falls er der Atomsprache C nicht mächtig ist – eine der bekannten Seiten für solche Eindringlingsprogramme besuchen und sich dort das nötige Werkzeug beschaffen. Nachdem der Hacker seinen Angriff erfolgreich durchgeführt hat, kann es durchaus sein, dass er sich mit Rootrechten durch das infiltrierte System bewegt und ihm nun alle Möglichkeiten zur Verfügung stehen, um mit dem System zu machen, was immer er will. Um dies zu verhindern, können Sie das LIDS einsetzen. 1.1.1 Was kann ich mit LIDS schützen? Das Filesystem Der Schutz des Filesystems ist wohl der häufigste Grund ein IDS zu installieren. Dabei kommt es aber nicht darauf an, welches Filesystem Sie haben, da das LIDS in den Sandini Bib 2 1 Intrusion Detection Systems VFS (Virtual File System)-Layer des Kernels eingebunden ist und deswegen nahezu alle Dateisysteme unterstützt. Um zu verstehen, wie das LIDS arbeitet, müssen Sie wissen, wie das VFS funktioniert und was hinter einigen Fachbegriffen steckt. Das VFS in Linux Das VFS in Linux ist um eine Reihe von generischen Objekttypen und Methoden, die diese Objekte aufrufen können, aufgebaut. Bei den Grundobjekten handelt es sich um Dateien, Filesystems, Inodes und Namen von Inodes. Im Folgenden werden wir auf drei dieser Objekte eingehen. Dateien Grundsätzlich ist die Eigenschaft von Dateien die, dass man sie lesen und in sie schreiben kann. Weiter können sie in den Speicher gelegt werden oder vom Speicher heraus gelesen werden. Dieses Prinzip arbeitet ähnlich dem file descriptor-Prinzip das Unix benutzt. In Linux werden Dateien durch struct file repräsentiert, welche eine bestimmte Anzahl von Methoden besitzen, die sich in struct file_operations befinden. Inodes Inodes repräsentieren ein Grundobjekt in einem Dateisystem. Diese Objekte können normale Dateien, Verzeichnisse, symbolische Links usw. sein. Das VFS macht keine großen Unterschiede zwischen den verschiedenen Objekten, sondern überlässt es dem aktuellen Dateisystem, diese angemessen zu handhaben. Außerdem liegen über dem VFS noch einige höhere Levels im Kernel, die die unterschiedlichen Objekte verschieden behandeln. Dateisysteme Ein Dateisystem ist eine Sammlung von Inodes, wobei eine davon ganz klar als Root erkennbar ist. Es ist durch einige Charakteristika gekennzeichnet, die im gesamten Dateisystem einheitlich angewandt werden. Sie kennen sicherlich schon einige dieser Merkmale. Wie zum Beispiel das READ-ONLY-Flag oder der blocksize. Jedes Dateisystem wird durch struct super_block repräsentiert und besitzt einige Methoden, die sich im struct super_operations befinden. Interaktion Grob vereinfacht könnte man sagen: Wenn ein Zugriff auf das Dateisystem erfolgt, leitet das System-Call-Interface diese Anfrage nicht direkt an das einzelne Dateisystem sondern zu dem VFS. Sandini Bib 1.1 Linux Intrusion Detection System (LIDS) 3 Es wäre ziemlich unsinnig, jede Datei im Dateisystem zu schützen, da dies nur unnötig Rechenzeit kosten würde. Weiter müssen Sie beachten, dass Sie mit Sicherheit ein System so konfigurieren können, dass es den höchstmöglichen Grad an Sicherheit bietet, aber bedenken Sie, dass man damit auch noch arbeiten muss. Im Groben kann man die Dateien in einem Dateisystem, das von LIDS geschützt wird, in folgende Kategorien unterteilen: Read Only File/Directory: Wie der Name schon sagt, können an diesen Dateien keine Änderungen vorgenommen werden (außer bei einem Update). Append Only File/Directory: Das sind Files, die nur wachsen dürfen. Dies er- scheint bei der ersten Betrachtung sinnlos, man erkennt aber bald die Bedeutung solcher Dateien, wenn man sich zum Beispiel die Datei /var/log ansieht. Exception File/Directory: Es kann durchaus vorkommen, dass Sie in Ihrem Dateisystem einen Ordner haben, den Sie für äußerst wichtig halten, und ihn daher als Read Only definieren. Manchmal kann es aber vorkommen, dass sich in solch einem Directory eine Datei befindet, die auch beschrieben werden muss. Sie haben nun die Möglichkeit, diese Datei als eine Ausnahme für diesen Read-Only-Ordner zu definieren. Protection Mounting/Umouting Dateisystem: Wenn Sie ein Dateisystem schon beim Bootvorgang mounten, können Sie jedem User (inklusive Root) verbieten, einen umount–Befehl auszuführen und damit dieses Dateisystem abzuhängen. Sie können aber auch verhindern, dass durch das Einhängen eines weiteren Dateisystems das ursprüngliche überschnitten bzw. überschrieben wird. Wir werden an dieser Stelle nicht tiefer in die Materie von VFS oder den Sourcecode von LIDS bzw. vom Kernel eingehen, da es in diesem Buch nicht um die Programmierung eines IDS geht, sondern um den Einsatz eines solchen Systems. Im Folgenden werden wir auf die Installation und auf die Konfiguration des LIDS im Detail eingehen und versuchen, Ihnen die Möglichkeiten dieses mächtigen Tools näher zu bringen. 1.1.2 Installation Beschaffung Bevor man ein Programm installieren kann, muss man es sich beschaffen. Dies ist ein wichtiger Punkt, denn wer ein Programm installiert, sollte immer genau wissen, was er installiert. Achten Sie daher bitte immer darauf, Ihre Programme nur von vertrauenswürdigen Quellen (offiziellen Websites etc.) zu beziehen, und überprüfen Sie die (falls angegeben) md5sum. LIDS können Sie entweder von der Buchseite oder von der offiziellen Homepage bzw. der deutschen Mirrorseite downloaden. Deutsche Mirrorseite: http://www.de.lids/org/download Hauptseite: http://www.lids.org/download Sandini Bib 4 1 Intrusion Detection Systems Voraussetzungen Der wichtigste Bestandteil eines Linuxsystems ist der Kernel. LIDS funktioniert am besten mit einem 2.2.X-Kernel, kann aber auch mit der 2.4er Reihe betrieben werden. Ansonsten sind keine größeren Voraussetzungen mehr gegeben und wir können uns an die Installation machen. Installation Laden Sie sich das Programm von einer der oben angegebenen Seiten herunter und entpacken Sie es. Linux:~# wget www.de.lids.org/download/lids-0.10.2.2.19.tar.gz Linux:~# tar zxf lids-0.10.2.2.19.tar.gz Linux:~# cd lids-0.10.2.2.19.tar.gz Nachdem Sie das Paket entpackt haben, müssen Sie noch den Kernel patchen. Linux:~# cp lids-0.10.2.2.19.patch /usr/src/linux Linux:~# cd /usr/src/linux Linux:~# patch –p1 < lids-0.10.2.2.19.patch Bevor Sie Ihren Kernel konfigurieren, müssen Sie darauf achten, dass folgende Punkte ausgewählt sind, da Sie ansonsten die LIDS-Optionen gar nicht erst zur Auswahl erhalten. [*] Prompt for development and/or incomplete code/drivers [*] Sysctl Support Nun können wir unseren Kernel konfigurieren. Welche Möglichkeiten Ihnen dabei offen stehen, werden Sie weiter unten erfahren. Doch zuvor möchte ich Sie bitten noch ein lokales Passwort (nächster Punkt) zu setzen, da ansonsten der nächste Reboot in einer Kernelpanic endet. Hinweis zu Version 0.9.12 Falls Sie vorhaben die Version 0.9.12 einzusetzen, beachten Sie bitte, dass Sie hierbei noch Änderungen vornehmen müssen. Sie müssen die Zeile CFLAGS= noch um den Eintrag –DLIDS_CONFIG ergänzen. Um das Konfigurationsprogramm zu übersetzen geben Sie bitte folgende Befehle ein. Linux:~# cd ~/lids-0.10.2.2.19/lidsadm-0.10 Linux:~ make && make install Sandini Bib 1.1 Linux Intrusion Detection System (LIDS) 5 Vor dem ersten Booten: Bevor Sie das erste Mal booten, müssen Sie unbedingt noch ein LIDS-Passwort setzen, da der Bootvorgang ansonsten mit einer Kernelpanic endet. Sie brauchen dieses Passwort auch zum Deaktivieren des LIDS oder um in das LFS zu wechseln. Für das Setzen des lokalen Passwortes geben Sie bitte den folgenden Befehl ein: Linux~:# lidsadm –P Enter password: Verifying enter password: Wrote password into the files. 1.1.3 Konfiguration des Kernels Nachdem wir ein lokales Passwort gesetzt haben, können wir uns getrost an die Konfiguration des Kernels machen. Falls Sie sich fragen, warum wir das lokale Passwort für diesen Schritt gesetzt haben, sei kurz erwähnt, dass ich früher genauso gedacht und das Passwort erst gesetzt habe, nachdem ich meinen Kernel konfiguriert habe. Aber ein Stromausfall und ein damit verbundener Reboot brachten mir viele Probleme ein. Seit diesem Zeitpunkt besitze ich auch daheim eine USV und setze das Passwort so früh wie möglich. Weiter oben haben wir bereits angesprochen dass man bei der Konfiguration des Kernels unbedingt folgende Optionen aktivieren sollte: [*] Prompt for development and/or incomplete code/drivers [*] Sysctl Support Um den Kernel zu konfigurieren geben Sie bitte folgende Befehle ein: Linux:~# cd /usr/src/linux Linux:~# make mrproper Linux:~# make config Da wir bei der Installation des Kernel gepatcht haben, bekommen wir nun folgende Option bei der Konfiguration angeboten: * * Linux Intrusion Detection System * Linux Intrusion Detection System support (EXPERIMENTAL) (CONFIG_LIDS) [N/y/?] (NEW) Y Kerneloptionen Nun werden Sie einige der Kerneloptionen, die Ihnen bei der Konfiguration zur Verfügung stehen, kennen lernen. Um die folgenden Features zu aktivieren, beantworten Sie die Optionen mit »Y«. Sandini Bib 6 1 Intrusion Detection Systems (CONFIG_LIDS_HANGUP) Terminal wird bei Sicherheitsverstoß geschlossen (CONFIG_LIDS_SA_EXEC_UP) Zeigt beim Bootvorgang alle Dateien an, bevor LIDS startet. Ermöglicht es, eingeschleuste Programme, die LIDS umgehen sollten, zu finden. (CONFIG_LIDS_REMOTE_SWITCH) Erlaubt auch Remote-Zugang, um LIDS zu aktivieren bzw. zu deaktivieren. (CONFIG_LIDS_ALLOW_SWICH) Erlaubt das Ein- bzw. Ausschalten von LIDS–Optionen während des Betriebs mittels eines Passworts. (CONFIG_LIDS_NO_FLOOD_LOG) Verhindert das Überfluten von /var durch wiederholende Logeinträge und gibt die Möglichkeit, die Zeitperiode festzulegen, in der ein Logeintrag nicht wiederholt werden darf. (CONFIG_LIDS_MAX_SACL) Gibt an, wie viele ACL-Subjects maximal durch LIDS ermöglicht werden dürfen. (CONFIG_LIDS_MAX_OACL) Gibt an, wie viele ACL-Objects maximal durch LIDS geschützt werden dürfen. (CONFIG_LIDS_EXEC_UP) Verhindert das Booten des Systems, wenn ein nicht durch LIDS geschütztes Programm ausgeführt wird, bevor LIDS das System gesichert hat. (CONFIG_LIDS_MAX_PROTECTED_PID) Gibt an, wie viele Prozesse maximal durch LIDS geschützt werden dürfen. (CONFIG_LIDS_MAX_INODE) Gibt an, wie viele Objekte maximal durch LIDS geschützt werden dürfen. (CONFIG_LIDS_SA_THROUGH) Meldungen über Verstöße können direkt durch den Kernel an andere Hosts weitergeleitet werden. Sandini Bib 1.1 Linux Intrusion Detection System (LIDS) 7 (CONFIG_LIDS_ALLOW_PROG_SWITCH) Gibt an, ob außer /sbin/lidsadm noch andere Programme die Schutzfunktionen von LIDS modifizieren können. (CONFIG_LIDS_RELOAD_CONF) Gibt an, ob die Konfigurationsdatei /etc/lids.conf im laufenden Betrieb geupdatet werden kann. (CONFIG_LIDS_PORT_SCAN_DETECTION) Integriert einen Portscandetektor direkt in den Kernel, so dass verschiedene Scantechniken erkannt werden können. Funktioniert auch, wenn raw-socket-Operationen unterbunden wurden. (CONFIG_LIDS_DEBUG) Gibt ausführliche Debuginformationen aus Nachdem Sie den Kernel mit diesen Kerneloptionen konfiguriert haben, können Sie ihn kompilieren. Dazu geben Sie bitte folgende Befehle ein: Linux:~# cd /usr/src/linux Linux:~# make dep Linux:~# make clean Linux:~# make bzImage Linux:~# cp arch/i386/boot/bzImage /boot/vmlinux-sec-2.2.19 Wenn Sie den neuen Kernel jetzt noch in den Bootmanager (/etc/lilo.conf) eintragen, werden Sie demnächst – dank LIDS, das Ihr System schützt – hoffentlich besser schlafen können. 1.1.4 Konfiguration von LIDS Jetzt können wir uns endlich daran machen, unser IDS zu konfigurieren. Um neue Regeln hinzuzufügen benutzen wir das Programm lidsadm. Im Folgenden werden die Möglichkeiten, die man mit diesem Tool hat, anhand einer Befehlsübersicht verdeutlicht (Tabelle 1.1 bis Tabelle 1.3). Befehle Beschreibung -A Fügt einen Eintrag hinzu -D Löscht einen Eintrag -Z Löscht alle Einträge Tabelle 1.1 Befehlsübersicht lidsadm Sandini Bib 8 1 Intrusion Detection Systems Befehle Beschreibung -U Updatet dev/inode-Nummern -L Listet alle Einträge -P Setzen des Passwortes, um LISD zu deaktivieren -S Adminoperationen durchführen -I Wie -S, nur ohne Passwort -h Hilfe Tabelle 1.1 Befehlsübersicht lidsadm (Forts.) ACL-Optionen Beschreibung -s Subject Beliebiges Systemprogramm -o Object Verzeichnis, Datei oder Device -o [Capability-Object] –t Alle Capabilities -j target Für Objects: READ, APPEND, WRITE, IGNORE Für Capabilities: INHERIT, NO_INHERIT Tabelle 1.2 Befehlsübersicht lidsadm Admin-Optionen Beschreibung -S – [+|-] LIDS Aktiviert oder deaktiviert LIDS -S – [+|-] Capability Aktiviert oder deaktiviert eine Capability -S -- +RELOAD_CONF Übernimmt Konfigurationsänderung während des Betriebs Tabelle 1.3 Befehlsübersicht lidsadm Welche Dateien soll ich schützen? Im Grunde können nur Sie diese Frage beantworten. Stellen Sie aber lieber eine Datei mehr unter die Fittiche von LIDS als eine zu wenig. Grundsätzlich sollten Sie alle sensitiven Dateien sowie Verzeichnisse schützen. Dateien wie /etc/shadow sollten auf jeden Fall geschützt werden, da ansonsten mit Hilfe eines Crackprogramms schnell Passwörter erraten werden können. Seien Sie bei solchen Aktionen aber vorsichtig, denn wenn Sie diese Datei vor allen Benutzern verstecken, kann sich keiner mehr am System anmelden, da auch dem Loginprogramm /bin/ login der Zugriff verwehrt wird. In diesem Fall regelt das LIDS dieses Problem für Sie, da es dem Loginprogramm die nötigen Rechte verleiht. Doch perfekt ist diese Lösung immer noch nicht, denn jetzt kann kein Benutzer mehr sein Passwort ändern, da das Tool /usr/bin/passwd auch keinen Zugriff mehr auf /etc/shadow hat. Man könnte zwar den ersten Schritt wiederholen und auch diesem Programm die nötigen Rechte geben, aber dann könnte auch Root die Passwörter ändern und Sandini Bib 1.1 Linux Intrusion Detection System (LIDS) 9 wir wären wieder beim alten Problem. In einem solchen Fall müssen Sie ganz klar entscheiden, was für Sie wichtiger ist. Ein Schritt mehr in Richtung Sicherheit oder Komforterhaltung für die Benutzer. Sie könnten – falls Sie sich für die Sicherheit entscheiden – zwar die Passwörter immer noch ändern, indem Sie LIDS dazu beenden, aber bei einem System mit mehr als 100 Usern und gut durchdachten Passwortrichtlinien, die vorschreiben, dass das Passwort alle 4 Wochen geändert wird, gestaltet sich dieses Vorhaben als absolut indiskutabel. Wie Sie sehen, hat auch im Falle von LIDS die Medaille zwei Seiten. Das sollte Sie aber auf keinen Fall davon abhalten, wichtige Dateien oder Verzeichnisse wie zum Beispiel /boot zu schützen. Der hierfür benötigte Befehl lautet: Linux:~# lidsadm –A –o /boot –j READ Beispiele: Linux:~# lidsadm –s /home/jbrunner/ls \ -o /home/jbrunnner \ -j READ Diese Syntax (Ähnlichkeiten zu den IPCHAINS sind nicht zu übersehen) erlaubt meinem ls-Programm den Lesezugriff auf mein Homeverzeichnis. Linux:~# lidsadm –o /home/jbrunner \ -j DENY Diese Syntax macht mein Homeverzeichnis für alle User unlesbar. Dies ist zwar eine ziemlich sinnlose ACL, macht aber die Verwendung der Syntax deutlich. Linux:~# lidsadm –S -- -RELOAD_CONF Diese Syntax lädt während des Betriebs eine veränderte Konfiguration. Linux:~# lidsadm –A –o /var/log –j APPEND Wie wir weiter oben schon gesehen haben, bietet uns die Option APPEND die Möglichkeit eine Datei wachsen zu lassen, schützt dabei aber ihren schon vorhandenen Inhalt. Dieser Befehl ist besonders wichtig, da die meisten (intelligenten) Angreifer ihre Spuren in den Logfiles verwischen wollen. Dabei sollte man aber beachten, dass das Programm logrotate nun auch keinen Schreibzugriff mehr hat und die Rotation somit nicht mehr stattfinden kann. Mit dem folgenden Befehl kann man diesen Missstand wiedergutmachen. Linux:~# lidsadm –A –s /usr/sbin/logrotate –o /var/log –j WRITE Um den geregelten Systemablauf komplett zu gewährleisten, sollten Sie den Systemprogrammen ebenso Schreibzugriff geben. Linux:~# lidsadm -A –s /bin/login –o /var/log –j WRITE Linux:~# lidsadm –A –s /usr/sbin/sendmail –o /var/log/sendmail.st Sandini Bib 10 1 Intrusion Detection Systems –j WRITE Linux:~# lidsadm –A –o /etc/rc.d/init.d –j READ Linux:~# lidsadm –A –s /etc/rc.d/init.d/halt –o /var/log –j WRITE Linux:~# lidsadm -A –s /sbin/halt –o /var/log –j WRITE Linux:~# lidsadm –A –s /sbin/init –o /var/log –j WRITE Linux:~# lidsadm –A –s /bin/passwd –o /var/log j WRITE LIDS beim Bootvorgang starten Sie sind jetzt an einem Punkt angelangt, an dem LIDS einen wirklich wichtigen und guten Part in Ihrer Verteidigung übernehmen kann. Damit es das aber auch nach jedem Bootvorgang macht, müssen wir den Startbefehl lidsadm –I in das Startskript der jeweiligen Distribution einbinden. Im Falle eines RedHat-Systems müssen Sie die Datei /etc/rc.d/rc.local editieren, um LIDS bei jedem Systemstart gleich mitzustarten. Der folgende Befehl erledigt das für Sie: Linux:~# echo lidsadm –I >> /etc/rc.d/rc.local Bei SuSE-Systemen bereitet der nachfolgende Befehl Ihrem Leiden ein Ende: Linux:~# echo lidsadm –I >> /etc/inittab 1.1.5 Capabilities Anfangs haben wir die grundlegende Problematik mit dem Thema »Root« kennen gelernt. Wir haben gesehen, dass ein vergessenes Update einem lesefreudigen Angreifer die Chance gibt, ein Serverprogramm zu kompromittieren und sich danach mit den Rechten des »gehackten« Servers im System zu bewegen. Nun könnten Sie an dieser Stelle natürlich anbringen, dass man bei diesem Problem schnell Abhilfe schaffen kann, indem man dem Server einfach keine Rootrechte gibt. Leider ist die Lösung nicht immer umsetzbar. Zwar könnte man mit etwas Herumbastelei die meisten Privilegien, die ein Programm braucht, auch ohne Rootrechte verfügbar machen, doch mit herkömmlichen Bordmitteln scheitert dieses Vorhaben meistens an der Belegung des Ports. So brauchen Programme, die unter dem Port 1024 laufen müssen, Rootrechte, um dies zu realisieren. Ein Heilmittel gegen die hier erwähnte Krankheit bieten die Capabilities. Mit Hilfe von Capabilities kann man einem Programm die nötigen Privilegien geben, ohne ihm dabei Rootrechte geben zu müssen. Man könnte quasi sagen, man spaltet die Rootrechte auf, wirft sie in einen Topf und gibt jedem Programm die Rechte, die es benötigt, um reibungslos zu funktionieren. Beim oben erwähnten Problem gibt man dem Programm beispielsweise das Recht einen Port unter 1024 zu belegen. Dabei ist zu beachten, dass der Standardlinuxkernel nur laufenden Prozessen Capabilities geben kann. Doch dies tangiert uns eher weniger, da unser Kernel mit den LIDS-Funktionen erweitert wurde. Sandini Bib 1.1 Linux Intrusion Detection System (LIDS) 11 Der folgende Befehl zeigt, wie man einem Programm namens dr.brunner die nötigen Rechte gibt, so dass es auch unter der magischen Portgrenze von 1024 eingesetzt werden kann. Linux:~# lidsadm –s /home/jbrunner/dr.brunner \ -i -1 –o CAP_NET_BIND_SERVICE \ -j GRANT Mit den Capabilities kann man noch viel mehr bewerkstelligen. Eine komplette Liste aller Capabilities finden Sie unter /usr/include/linux/capabilities.h. Natürlich wollen wir diesen Punkt nicht ohne ein Beispiel abschließen. Im folgenden Listing finden Sie den Befehl, der Prozesse in Ihrem System vor Programmen wie ps oder top versteckt. Linux:~# lidsadm –s /home/jbrunner/ls \ -i –1 –o GRANT CAP_HIDDEN \ -j Eine weitere nützliche Konfigurationsdatei für Capabilities ist /etc/lids/lids.cap. In diesem File sind alle Capabilities aufgelistet, die per Default verfügbar sind diejenigen, die hier nicht aufgeführt sind, können nur durch Sonderregelungen in den ACLs vergeben werden. Um Capabilities verfügbar zu machen muss am Anfang der Zeile ein + stehen und für die Deaktivierung ein -. Noch ein Hinweis zum Schluss: Falls einige der Befehle auf Ihrem System nicht funktionieren sollten, liegt das daran, dass sich die Befehlssyntax zwischen den einzelnen LIDS-Versionen unterscheiden kann. Werfen Sie im Zweifelsfall doch einfach einen Blick in die manpages. Im Folgenden finden Sie einige Beispiele zu Capabilities. Die vollständige Liste finden Sie in der Datei /usr/include/linux/capabilities.h. Verfügbare Capabilities Kurzbeschreibung CAP_CHOWN Chown(2), chgrp(2) CAP_DEC_OVERRIDE Dac access CAP_DAC_READ_SEARCH DAC read CAP_FOWNER Owner ID ungleich User ID CAP_FSETID Effective User ID ungleich Owner ID CAP_KILL Reale/Effective ID ungleich Process ID CAP_SETGID Setgid(2) Tabelle 1.4 Beispiele zu Capabilities Sandini Bib 12 1.1.6 1 Intrusion Detection Systems Das System anpassen Wir haben weiter oben schon gesehen, dass es beim Einsatz von LIDS zu Problemen kommen kann, da die meisten Verzeichnisse geschützt sind, so dass einige Programme keine Schreibrechte mehr haben und deswegen eventuell ihren Job nicht mehr verrichten können, was wiederum das System bremsen oder sogar stoppen kann. Um dies zu verhindern muss man sein System genau anpassen. Da das von der Distribution abhängt, können wir an dieser Stelle schlecht auf diese Fehlersuche eingehen. Deshalb bitten wir Sie bei Problemen mit LIDS einen Blick auf die Website des Buchs zu werfen oder schreiben Sie mir einfach eine E-Mail. 1.1.7 LIDS außer Kraft setzen Nachdem nun das LIDS installiert und konfiguriert ist, haben Sie möglichen Angreifern das Leben wirklich erschwert. Doch nicht nur Hacker leiden unter den von Ihnen vorgenommenen Veränderungen, auch Sie werden sie ab und zu zu spüren bekommen. Denn trotz aller Sicherheit, bleibt ein System lebendig und bedarf einer Menge Pflege und Administration. Mit einem LIDS an Bord sind die Zeiten des fröhlichen Administrierens vorbei. Wie ganz am Anfang schon erwähnt ist es das Ziel eines IDS, die Privilegien von Root einzuschränken, um den Schaden an Ihrem System möglichst gering zu halten, falls es tatsächlich einmal zu einem erfolgreichen Einbruch kommen sollte. Aber nicht nur Angreifer werden gehindert bestimmte Dateien zu editieren, auch Sie als Administrator können nicht mehr wie gewohnt agieren. Doch auch hier bietet das LIDS eine Lösung. Sie haben die Möglichkeit mit Hilfe des LIDS-Passwortes einen Terminal von LIDS »zu befreien« und können dort anschließend wie gewohnt arbeiten. Sie befinden sich dann in der LIDS Free Session (LFS). Der Befehl hierfür lautet: Linux:~# lidsadm –S -- -LIDS Für einfachere Administrationsaufgaben ist diese Methode sicherlich am besten geeignet, doch stößt sie bei komplexeren Arbeiten schnell an ihre Grenze. Einige Aufgaben bedingen das Verlassen der aktuellen Shell (z.B. Service neu starten, Reboot … .) und verlassen damit auch das LFS. Um dieses Problem zu lösen bleibt Ihnen nichts anderes übrig als das LIDS zu deaktivieren. Dies erreichen Sie mit dem folgenden Kommando: Linux:~# lidsadm –S -- -LIDS_GLOBAL Jetzt haben Sie die Möglichkeit so zu arbeiten, wie Sie es aus LIDS-losen Zeiten gewohnt sind. Sandini Bib 1.2 Snort 1.1.8 13 Wenn nichts mehr geht Es kann durchaus einmal vorkommen, dass man sich verkonfiguriert. Es soll auch schon Administratoren gegeben haben, die ihr System so sicher gemacht haben, dass nicht mal mehr sie selbst Zugriff darauf hatten. Falls Ihnen das einmal mit LIDS passieren sollte, ist dies noch kein Beinbruch. Natürlich gibt es auch hierfür die passende Syntax. Geben Sie in einem solchen Fall einfach Ihrem Bootmanager (lilo) folgende Parameter: Security=0 Danach sollten Sie ohne Probleme in Ihr System kommen um das Missgeschick wiedergutzumachen. 1.2 Snort Snort ist ein Network Intrusion Detection System (NIDS) und fungiert – wie der Name schon erkennen lässt – im Netzwerk. Die Größe des Netzwerks kann dabei vom kleinen SOHO bis zum mittelgroßen Firmennetzwerk variieren. Wichtiger als die Größe des Netzwerks ist die Positionierung. Grundsätzlich hat man dabei die Wahl, das NIDS vor oder hinter der Firewall zu installieren. Falls Sie jetzt nicht wissen, wo Sie Snort gerne einsetzen würden, wägen Sie doch einfach die Vor- und Nachteile ab. Vor der Firewall bekommt Ihr NIDS alle Angriffe gegen Ihr Netzwerk voll mit. Dies hat aber auch den Nachteil, dass ein Hacker direkt das IDS angreifen kann. Falls Sie Snort hinter der Firewall einrichten, ist es vor direkten Angriffen zwar geschützt, bekommt aber nur die Angriffsversuche mit, die durch die Firewall hindurch kommen. Außerdem können Sie – bei einem internen Einsatz – zusätzlich noch den Netzwerkverkehr überwachen, was immer wichtiger wird, da ca. 80 % aller Angriffe aus dem internen Netz kommen. 1.2.1 Funktionsweise Um zu erklären, wie Snort funktioniert, sollten wir als Erstes einmal einen Blick auf die Möglichkeiten werfen, die wir mit Snort haben. Dieses mächtige Tool vereint mehrere praktische Werkzeuge in sich. Zum einen kann es als Paketsniffer fungieren (ähnlich zu tcpdump). Des Weiteren haben Sie mit diesem NIDS einen Paketlogger zur Verfügung, der Ihnen bei der Analysierung Ihres Netzwerkverkehrs enorm weiterhelfen kann. Natürlich ist Snort aber auch ein hervorragendes Network Intrusion Detection System, das sich bestens eignet, um Angriffe zu erkennen. Sandini Bib 14 1 Intrusion Detection Systems Um solche Angriffe zu erkennen, vergleicht Snort mögliche Angriffe mit einem gespeicherten Muster und schreibt erkannte Angriffe dann in ein Logfile. Dabei bietet Snort eine durchaus sehenswerte Bandbreite an Angriffsarten an, die es erkennen kann. So werden Sie zum Beispiel über mögliche CGI-Angriffe, Bufferoverflow-Attacken oder versteckte Scans durch eine Zeile im Logfile informiert. Wie Sie erkennen können, werden Sie nicht direkt von Snort selbst benachrichtigt, wenn ein Angriff stattgefunden hat. Dies ist ein Missstand den man unbedingt beseitigen sollte, da der Administrator stets über Gefahren, die sein Netzwerk betreffen, informiert werden sollte. Da wir aber alle mit einem vernünftigen Betriebssystem arbeiten (nämlich Linux), sollte dies kein Problem sein. Es gibt für dieses Problem mehrere Lösungen. Den ersten Lösungsansatz bietet uns Snort selbst. Bei der Erstellung des Programms könnten wir zum Beispiel die Option –enable-smbalerts aktivieren und gäben Snort somit die Möglichkeit Nachrichten über SMB zu verschicken Da diese Methode aber sehr unsicher ist, wollen wir an dieser Stelle nicht weiter darauf eingehen. Das Beste ist, Sie basteln sich eine hausgemachte Lösung. Bevor Sie sich aber an die Implementierung einer solchen Lösung machen, müssen Sie sich erst über einen kleinen Nachteil von Snort klar werden. Da bei diesem NIDS der Sensor und die Detection-Routine fest miteinander verbunden sind, muss auf jedem Host, der es betreibt und damit einen Teil des Netzwerks überwacht, ein unabhängiges Snortsystem installiert sein. Womit ein weiteres Problem ins Spiel kommt. Wie wir schon gesehen haben, kann Snort Sie nicht direkt alarmieren, falls ein möglicher Angriff im Gange ist, sondern schreibt diese Nachricht in ein Logfile. Da Sie aber bei größeren Netzwerken (zum Beispiel mit Switches) mehrere Systeme am Laufen haben, haben Sie gleichzeitig auch mehrere Logfiles zu überwachen. Das zweite Problem können Sie lösen, indem Sie einen zentralen Logfileserver anlegen, dem alle NIDS ihre Meldungen erstatten. Nun bleibt aber immer noch das erste Problem der fehlenden Benachrichtigung. Zur Beseitigung dieses Problems stellt uns die Open-Source-Gemeinde einige brauchbare Tools zur Verfügung. So können Sie zum Beispiel mit einem Logfile-Analyseprogramm die gesammelten Nachrichten auswerten und Ihnen dann über ein Pagerprogramm (zum Beispiel yet another pager software) eine SMS mit bestimmten Daten über den Angriff auf Ihr Handy schicken lassen. Sobald Sie dies nach Ihren Bedürfnissen erledigt haben, steht Ihnen mit Snort ein mächtiges NIDS zur Verfügung, das dazu auch noch unglaublich stabil läuft und leicht zu konfigurieren ist. 1.2.2 Installation Im Gegensatz zu LIDS beinhalten die meisten Distributionen Snort. Die einfachste Möglichkeit Ihr System mit einem NIDS auszustatten ist daher, den Installationsassistenten Ihrer Distribution aufzurufen und das Paket snort zu installieren. Der Nachteil hierbei ist, dass es durchaus vorkommen kann, auf diesem Weg eine veraltete Version von Snort zu bekommen, die eventuell einige Sicherheits- Sandini Bib 1.2 Snort 15 lücken aufweist. Es gibt drei Wege, um sicherzustellen, dass Ihr System auf dem neuesten Stand ist. Der erste Weg führt Sie in das Internet, dort besuchen Sie die Seite www.snort.org und erkundigen sich nach der Aktualität Ihrer Version. Der zweite führt Sie auf die Seite www.securityfocus.com. Dort überprüfen Sie, ob für die von Ihnen verwendete Version Bugs bekannt sind und installieren gegebenenfalls den Patch dafür. Die dritte Anlaufstelle ist die offizielle Website Ihrer Distribution, wo Sie sich ebenfalls über die Aktualität und Sicherheit Ihrer Version erkundigen können. Falls aber Ihre Distribution Snort nicht mitführt, dann sollten Sie sich die aktuelle stabile Version von der offiziellen Seite www.snort.org oder von der Buchseite downloaden. Sollten Sie das Pakete über den Installationsassistenten oder über den Paketmanager installieren, können Sie diesen Punkt überspringen. Im Falle des Downloads befolgende Sie bitte folgende Anweisung für die Installation: Da die Macher von Snort Weitblick besitzen, haben sie sich entschlossen, Ihr Sicherheitsprogramm plattformunabhängig zu schreiben. Um dies zu realisieren wurde als Basis für Snort ein systemunabhängiges Interface von der Network Research Group des Lawrence Berkeley National Laboratory namens libpcap benutzt. Damit Snort also auf Ihrem System funktioniert, müssen Sie als Erstes libpcap installieren. Linux:~# wget ftp://ftp.ee.lbl.gov/libpcap.tar.Z Linux:~# tar zxf lip Linux:~# cd li Linux:~# make Linux:~# make install Linux:~# mkdir /usr/local/include Linux:~# mkdir /usr/local/include/net Linux:~# make install-incl Linux:~# wget www.snort.org/releases/snort-1.8.3.tar.gz Linux:~# tar zxf snort-1.8.3.tar.gz Linux:~# cd snort-1.8.3 Linux:~#./configure Linux:~# make Linux:~# make install Optionen Wenn Sie die Seite www.snort.org/releases besuchen, werden Sie feststellen, dass es eine Reihe von Zusatzprogrammen, Zusatzlibs und Zusatzoptionen gibt. Wir werden an dieser Stelle nicht auf diese Programme und Optionen eingehen, da sich die meisten noch nicht bewährt haben oder (wie im Falle der SMB–Benachrichtigung) nicht sicher sind. Falls Sie dennoch einige Optionen bei der Erstellung des Programms aktivieren wollen, so installieren Sie bitte noch die dazugehörige Lib. Die nötigen Informationen dazu finden Sie unter der oben angegebenen Internetadresse. Sandini Bib 16 1.2.3 1 Intrusion Detection Systems Optionen Snort ist ein kommandozeilenorientiertes Programm und ist deswegen sehr leicht zu konfigurieren. Es bietet eine Menge Optionen, die Sie benutzen können, um Ihr System korrekt und nach Ihren Bedürfnissen zu konfigurieren. In Tabelle 1.5 sehen Sie die verschiedenen Befehle für Snort. Option Beschreibung -A [alert mode] Bei Snort stehen insgesamt sechs alert-Modi zur Verfügung. Vier davon kann man über diese Option aktivieren: fast – Dieser Modus erzeugt einen einfachen Eintrag in das spezifizierte Logfile. (der Eintrag besteht aus: timestamp, Alarmnachricht, Quell- und Ziel IP/Ports full – Dies ist der Defaultmodus und schreibt den Paketheader und dessen Beschreibung in das spezifizierte Logfile none – Keine Benachrichtigung unsock – Dieser Modus sendet die Nachricht an einen Unix-Socket, auf den ein anderes Programm »horchen« kann. Die beiden anderen Modi syslog und smb kann man über diese Option nicht aktivieren. -a Hierbei handelt es sich um die Funktion, die auch Address Resolution Protocol-Pakete anzeigt (ARP). -b Diese Option ermöglicht es ohne Probleme auch Netzwerke mit großer Bandbreite (zum Beispiel 100 Mbps) abzuhören, da hierbei die gesammelten Daten nicht mehr von ihrer binären Form in das ASCII-Format umgewandelt werden, sondern ähnlich zu tcpdump gespeichert werden. Diese Option erhört die Performance merkbar. -c [rules] Nach dem Optionsparameter -c muss hier eine Datei folgen, in der Filterregeln angegeben sind. -C Hierbei werden alle Hexadezimalinformationen in einem Paket ignoriert und nur die Textinformationen angezeigt. -d Daten werden auf Applikationsebene gespeichert. -D Verwendet man diese Option, läuft Snort als Daemon im Hintergrund und speichert die Alertmeldungen in der Datei /var/log/snort.alert. -e Zeigt und protokolliert Pakete, die auf der zweiten Schicht agieren (Ethernet-Paket-Header) -F [bpf] Mit dieser Option werden die BPF-Filter aus der Datei, die nach der Option -F angegeben wird, gelesen. -g [gname] Falls Sie Snort keine Rootrechte geben wollen, können Sie es mit dieser Option in eine andere Gruppe verfrachten. Snort läuft dann unter der Gruppe, die Sie nach dem -g angeben. -h [hn] Benutzen Sie diesen Befehl, wenn Sie das interne Netzwerk (hn = home network), in dem Snort laufen soll, angeben wollen. Tabelle 1.5 Befehle Snort Sandini Bib 1.2 Snort 17 Option Beschreibung -i [if] Geben Sie hier das Netzwerkinterface an, das Snort in die Überwachung mit einbeziehen soll. -l [ld] Hier können Sie ein Verzeichnis spezifizieren, das Snort als Logverzeichnis verwenden wird, um dort zukünftig alle Nachrichten für Sie zu hinterlassen. Als Defaultverzeichnis benutzt Snort /var/log/snort. -N Wenn Sie diese Option verwenden, wird Snort nicht mehr protokollieren. Die Alarmnachrichten funktionieren aber weiterhin. -o Um die Reihenfolge, in der Pakete die Regeln durchlaufen, von Alert-PassLog auf irgendeine andere zu ändern, benutzen Sie diesen Befehl. -O Falls Sie die Absicht haben, die IP-Adressen durch xxx.xxx.xxx.xxx zu ersetzen, können Sie das mit dieser Option tun. Falls Sie aber nur die internen Adressen ersetzen wollen, verwenden Sie dazu bitte zusätzlich die Option -h, denn dadurch bleiben die externen IP-Adressen unberührt. -p Promiscuous-mode wird im Sniffer deaktiviert. -q Mit dieser Option erreichen Sie, dass beim Start keine Banner und Statusreports angezeigt werden. -r [tf] Benutzen Sie diese Option um ein tcpdump File einzulesen. -s Nachdem Sie diese Option aktiviert haben, wird Snort alle Alert-Nachrichten in die normalen Systemlogfiles schreiben. -S [n=v] Diese Option wird der Wert von n in den Wert von v verwandelt. -t [chrt] Ändert das Rootverzeichnis von Snort in das angegebene Verzeichnis. -u [uname] Ähnlich zu der Option -g wird auch hier Snort der Rootstatus nicht vergönnt. Mit dieser Option können Sie die User ID ändern, unter der Snort in Zukunft laufen soll. -v Man sollte diese Option nur zu Testzwecken verwenden, da hierbei alle Pakete auf die Standardausgabe (zumeist der Monitor) ausgegeben werden und dies führt zu enormen Performanceeinbußen, die wiederum verursachen können, dass einige Pakete verloren gehen. -V Gibt die Versionsnummer an -? Ruft die Hilfefunktion auf -M [smb] Falls man bei der Erstellung des Programms die Option –enable-smbalerts aktiviert hat, so kann man mit dieser Option eine Datei übergeben, aus der alle Rechnernamen gelesen werden, die über WinPopup über eventuelle Zwischenfälle informiert werden sollen. -n [count] Sobald die Zahl, die Sie hinter dieser Option angeben, erreicht wird, sprich sobald n Pakete angekommen sind, wird Snort deaktiviert. Tabelle 1.5 Befehle Snort (Forts.) Sandini Bib 18 1 Intrusion Detection Systems Beispiele: Linux:~# snort –c snort.conf –l ./log –s –h 192.168.1.0/24 Mit dieser Option schreibt Snort die gesammelten Daten in die Defaulteinstellung und schickt Alarmnachrichten zu den regulären Systemlogdateien. Linux:~# snort –b –A fast –c snort.conf Dies ist ein möglicher Snortaufruf, wenn Sie ein sehr schnelles Netz (100 Mbps) überwachen wollen. Die gesammelten Daten werden hierbei einem Format ähnlich zu tcpdump gespeichert. Linux:~# snort –d –h 192.168.1.0/24 –l ./log –c snort.conf –o Mit dieser Option erreichen Sie, dass sich die Reihenfolge, in der Pakete die Regeln durchlaufen, von Alert-Pass-Log auf Pass-Alert-Log ändert. 1.2.4 Regeln entwerfen Wie ist eine Regel formatiert? Wie wir wissen, ist Snort kommandozeilenorientiert. Das beinhaltet auch, dass die Regeln über die Konsole eingegeben werden. Natürlich muss man dafür ein bestimmtes Format einhalten, da Snort sonst die Regeln nicht anerkennt und sie verwirft. Achten Sie also immer darauf, dass die Formatierung stimmt. Grundsätzlich sollte man eine Regel in einer Zeile verfassen, da ansonsten die Gefahr besteht, dass man sich durch die Zeilenumbrüche mit der Formatierung »vertut« und somit die Regel nicht anerkannt wird. Falls man eine Regel über mehrere Zeilen eingeben will, so muss man am Ende einer Zeile einen Backslash anbringen. Aber seien Sie vorsichtig, Sie können Regeln nur über mehrere Zeilen eingeben, wenn Sie eine Version von Snort besitzen, die jünger als 1.8 ist. Falls Sie einen Version benutzen wollen (aus welchen Gründen auch immer), die vor 1.8 erschienen ist, so müssen Sie die Regeln in einer Zeile abgehandelt haben. Welche Bestandteile besitzt eine Regel? Zuerst einmal sollten wir an dieser Stelle erklären, wofür eine Regel gebraucht wird. Eingangs haben wir festgestellt, dass Snort mögliche Angriffe anhand eines Mustervergleichs erkennt. Das heißt, Snort vergleicht alle einkommenden Pakete mit den Filterregeln in seiner Datenbank und sucht nach Übereinstimmungen. Falls es eine solche Übereinstimmung gefunden hat, kann man davon ausgehen, dass ein Angriff stattfindet. Sie können nun mit der Eingabe neuer Regeln erreichen, dass Snort mit jeder neuen Regel, die Sie eingeben, klüger wird und immer mehr Angriffsarten erkennen kann. Dabei entscheiden Sie, was Sie als Spielerei einiger Jugendlicher sehen und was als ernsthaften Angriff. Snort trifft dann diese Unterscheidung anhand Ihrer Filterregeln. Sandini Bib 1.2 Snort 19 Um die Bestandteile einer solchen Regel herauszufinden, schauen wir uns am besten eine von Martin Roesch erstellte Beispielregel an und zerlegen diese in Einzelteile: alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg:"mountd access";) An dieser Beispielregel lassen sich zwei essentielle Bestandteile einer Filterregel erkennen. Der Teil alert tcp any any -> 192.168.1.0/24 111 entspricht dem Header und der Teil (content_"|00 01 86 a5|"; msg:"mountd access";) stellt den Optionsbereich dar. Dabei sollte man beachten, dass man den Optionsbereich nicht unbedingt braucht, damit eine Regel konform ist und von Snort akzeptiert wird. Genaueres dazu werden wir später noch erfahren. Im Folgenden werden Sie alle möglichen Bestandteile einer Regel inklusive einer kurzen Beschreibung kennen lernen. Dabei bedienen wir uns der Beispiele und Ausführungen von Martin Roesch, dem ich hiermit danken möchte. Der Header Der erste Bestandteil eines Headers ist die Regelaktion. Insgesamt hat man dabei fünf davon zur Auswahl: alert: Generiert einen Alarm nach der vordefinierten Warnmeldung und schreibt das Paket dann schließlich in das entsprechende Logfile log – Loggt das Paket pass – Ignoriert das Paket activate – Schlägt Alarm und aktiviert danach eine andere dynamische Regel dynamic – Bleibt untätig, bis es von einer aktivierten Regel aktiviert wird, und fungiert dann als Logregel Mit Snort haben Sie aber auch die Möglichkeit Ihre eigenen Regeltypen zu definieren und diese dann mit einem oder mehreren Outputplugins zu verbinden. Danach können Sie diese als Regelaktionen in Snortregeln verwenden. Hierzu einige Beispiele von Martin Roesch: Das erste Beispiel wird einen Typ definieren, der nur in tcpdump loggt. ruletype suspicious { type log output log_tcpdump: suspicious.log } Sandini Bib 20 1 Intrusion Detection Systems Das zweite Beispiel wird einen Typ definieren, welcher in die regulären Systemlogdateien und in eine MySql-Datenbank loggen wird. rulytype redalert { type alert output alert_syslog: LOG_AUTH LOG_ALERT output database: log, mysql, user=snort dbname=snort host=localhost } Das Protokoll Das nächste Feld beschreibt das Protokoll. Zurzeit stehen uns für dieses Feld vier Protokolle zur Verfügung: tcp, udp, icmp, ip. Aber schon bald werden Sie auch Protokolle wie: ARP, IGRP, GRE, OSPF, RIP, IPX in dieses Feld mit aufnehmen können. IP-Adressen und Ports Im darauf folgenden Feld werden die IP-Adressen und Ports beschrieben, man kann hier für die Gesamtheit aller IP-Adressen das Schlüsselwort any setzen. Bitte geben Sie immer eine IP-Adresse an und niemals den dazugehörigen Hostnamen, da Snort einen CDIR-Block benutzt, um die Netmask zu beschreiben. Verwenden Sie also für Klasse C Netzwerke /24, für Klasse B Netzwerke /16 und für einzelne Hosts /32. Snort verfügt außerdem noch über einen !-Operator, der es Ihnen ermöglicht, bestimmte IP-Adressen von der Überwachung auszuschließen. Im vorangegangenen Abschnitt haben wir gesehen, dass die Formatierung der Snortregeln Wildcards zulässt. So können Sie zum Beispiel any angeben, wenn Sie alle IP-Adressen oder Ports einbinden wollen. Falls Sie eine bestimmte Range angeben wollen, benutzen Sie bitte den :-Operator (Formatierung x : y). Der Richtungsoperator gibt die Richtung des jeweiligen Netzwerkes an, so bedeutet ->, dass auf der linken Seite die Quellinformationen (IP-Adressen und Ports) und auf der gegenüberliegenden Seite die Zielinformationen zu finden sind. Man kann auch beide Richtungen mit einbinden, indem man den <> Operator verwendet. Optionsbereich Ein weiterer Bestandteil (vielleicht sogar der mächtigste) ist der Optionsbereich. Im Folgenden werden wir dieses Schmuckstück von Snort kennen, und verstehen lernen. Zuvor sei an dieser Stelle aber noch kurz die Formatierung des Optionsbereichs erklärt. Alle unten aufgeführten Optionen werden durch ein Semikolon voneinander getrennt. Wenn Sie die Optionen von ihren zugehörigen Argumenten trennen wollen, benutzen Sie bitte einen Doppelpunkt. Die verfügbaren Optionen finden Sie in Tabelle 1.6. Sandini Bib 1.2 Snort 21 Optionen Beschreibung Msg Schreibt eine Nachricht in die Alarm- und Paketlogdateien Logto Loggt das Paket in eine vom User spezifizierte Datei anstatt ins Standardoutputfile. Ttl Testet den TTL-Wert des IP-Headers Tos Testet den TOS-Wert des IP-Headers Id Hierbei wird die Fragment-ID des IP-Headers auf einen bestimmten Wert hin überprüft. Ipoption Sucht in den IP-Optionsfeldern nach einem bestimmten Code. Fragbits Überprüft die Fragmentations-Bits des IP-Headers Dsize Testet die Größe eines Pakets anhand eines bestimmten Werts Flags Testet die TCP-Flags auf bestimmte Werte Seq Testet die TCP-Sequenznummer auf einen bestimmten Wert Ack Testet das TCP-ACK-Feld auf einen bestimmten Wert Itype Testet das ICMP-Typefeld anhand eines bestimmten Werts Icode Testet das ICMP-Codefeld anhand eines bestimmten Werts Icmp_ip Testet das ICMP_ECHO_ID-Feld anhand eines bestimmten Werts Icmp_seq Testet die ICMP_ECHO-Sequenznummer anhand eines bestimmten Werts Content Durchsucht den Inhalt eines Pakets nach einem bestimmten Muster Content_list Sucht nach einer bestimmten Musterfolge im Inhalt eines Pakets Offset Eine Modifikation der content-Option in Hinblick auf den Beginn der Suche Depth Eine Modifikation der content-Option in Hinblick auf das vorzeitige Ende der Suche Nocase Deaktiviert case-sensitiv und unterscheidet daher keine Groß- und Kleinschreibung mehr Session Schreibt aus einem gegebenen Grund bestimmte Eingaben im Application Layer mit Rpc Überwacht RPC-Dienste auf bestimmte Application/Precedure-Calls Resp Aktive Antwort (zum Beispiel: Verbindung beenden) React Aktive Antwort (zum Beispiel: Webseiten blocken) Reference Externe Angriffsreferenz Sid Snort Regel-ID Rev Regelkorrekturnummer Classtype Identifiziert die Klassifikation der Regel Priority Identifiziert die Strenge der Regel Tabelle 1.6 Verfügbare Optionen Sandini Bib 22 1 Intrusion Detection Systems Optionen Beschreibung Uricontent Sucht nach einem Muster in einem Teil einer URL Tag Fortgeschrittene Loggingaktionen für Regeln Ip_proto IP-Header Protokollwert Sameip Überprüft, ob die Quell-IP-Adresse mit der Ziel-IP-Adresse übereinstimmt Stateless Gültig, egal was der Streamstatus sagt Regex Wildcard für Mustererkennung Tabelle 1.6 Verfügbare Optionen (Forts.) Nachdem Sie die möglichen Optionen kurz anhand einer Tabelle einsehen konnten, werden wir uns jetzt an die Beschreibung der einzelnen Optionen machen und einige Beispiele dazu sehen. Mit der msg-Option können Sie den String ändern, den Snort bei Nachrichten in die Logfiles schreibt. msg: "<Nachrichtentext>"; Mit der Logto-Option kann man für jede betreffende Regel ein eigenes Logfile angeben. Diese Option funktioniert nicht, wenn Snort im Binarymodus loggt. logto: "<Logingdatei>"; Anhand der ttl-Option kann man einen bestimmten Time-To-Live-Wert setzen, auf den dann die Pakete überprüft werden. Diese Option ist nur erfolgreich, wenn der TTL-Wert exakt mit dem aus dem Paket übereinstimmt. ttl: "<Time-To-Live-Wert>"; Mit der tto-Option kann man den IP-Header auf einen bestimmten TOS-Wert überprüfen, der wiederum nur bei exakter Übereinstimmung anschlägt. tos: "<TOS-Wert>"; Die id-Option einen Test bezüglich des Fragment-ID-Feldes im IP-Header durchzuführen. Da viele »Hacker« Standardtools verwenden, die frei im Internet erhältlich sind, wird diese Option – wenn sie zum Beispiel auf einen bekannten Wert wie 31337 gesetzt wird – oft anschlagen. id: "<Wert>"; Sandini Bib 1.2 Snort 23 Falls in einem Paket IP-Optionen gesetzt sind, kann man mit dieser Option nach bestimmten Argumenten suchen. Eine lohnende Option ist zum Beispiel »Loose source routing«. Einige dieser Argumente sind im Folgenden aufgeführt. Ipoption: <IP-Option>; rr – Recorded Route eol – End of List nop – No Op ts – Time Stamp sec – IP security Option lsrr – Loose source routing ssrr – Strict source routing satid – Stream identifier Die fragbits-Option untersucht die fragment bits und die reserved bits im IPHeader. Dabei kann man zum Beispiel nach einem reserved bit (RB), more fragment bit (MF) oder nach einem don`t fragment bit (DF) suchen. Um diese Bits anzuzeigen benutzen Sie bitte die folgenden Größen: *R – Reserved bit *D – Don’t fragment bit *M – More fragment bit Für diese Option stehen Ihnen zusätzlich noch einige Operatoren zur Verfügung: *+ – All Flag – Schlägt an, wenn das angegebene und mehr Bits gesetzt sind. ** – Any Flag – Trifft zu, wenn irgendeines der angegebenen Bits gesetzt ist. *! – No Flag – Schlägt an, wenn keines der angegebenen Bits gesetzt ist. fragbits: "<Bit-Größen>"; Da diese Option etwas komplexer zu handhaben ist, werden wir uns die Syntax anhand einer Beispielregel verdeutlichen. alert tcp !$HOME_NET any -> $HOME_NET any (fragbits: R+; msg: "Reserved Bit ist gesetzt";) Die dsize-Option erlaubt es einem, die Größe eines Pakets zu prüfen. Auch hier kann man – zum Beispiel um bestimmte Bereiche und Grenzen zu setzen – bestimmte Operatoren wie < und > setzen. Diese Option kann sehr nützlich sein, wenn Sie Bufferoverflow-Attacken erkennen wollen. Dazu müssen Sie lediglich die Puffergröße des anfälligen Programms kennen und können nun die Option auf diesen Wert setzen, um rechtzeitig einen Angriff zu erkennen. Zwar könnte Sandini Bib 24 1 Intrusion Detection Systems man dies auch mit der content-Option erreichen, doch bietet die dsize-Option eine wesentlich höhere Performance. dsize: "[<|>] <Wert>"; Die content-Option stellt eine der wichtigeren Optionen von Snort dar. Mit ihrer Hilfe kann man den Inhalt eines Paketes nach bestimmten – vom User angegebenen – Werten durchsuchen. Snort antwortet dann aufgrund dieser Daten. Wenn die Suche erfolgreich ist – das heißt, wenn der vom User angegebene String irgendwo im Paket zu finden war, dann wird der Rest der Suche gestartet. Dabei müssen Sie unbedingt auf Groß- und Kleinschreibung achten, wobei das zu suchende Muster Textstrings oder aber auch binäre Daten sein können. Falls Sie nach binären Daten suchen wollen, müssen Sie diese in Byteform angeben und zwischen zwei Pipes einschließen. Auch hier ist wieder eine Negierung durch den !-Operator möglich. Versuchen Sie sich die Syntax dieser Option anhand des folgenden Beispiels zu verdeutlichen. content: [!] "<contentstring>"; alert tcp any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh"; msg: "IMAP Bufferoverflow";) Ein weiteres Beispiel soll Ihnen den Negierungsfaktor näher bringen. alert tcp any any -> 192.168.1.0/24 21 (content: !"|GET"; depth: 3; nocase; dsize: > 100; msg: "Long Non-FTP-GET Befehl";) Die offset-Option ist eine Modifikation, die Sie bei Regeln benutzen können, in denen Sie die content-Option nutzen. Sie können diese Möglichkeit sinnvoll nutzen, wenn Sie zum Beispiel CGI-scans erkennen wollen, da sich diese Angriffe niemals in den 4 Bytes erkennen lassen. Daher ist es sinnvoll, dass Sie die offset-Option benutzen, um der content-Option beizubringen, dass sie diesen Bereich nicht scannen soll. offset: "<Wert>"; Die nächste Erweiterung der content-Option stellt depth dar. Bei der offsetOption haben wir gesehen, dass Sie den Startpunkt verändern können, depth bietet Ihnen nun die Möglichkeit den vorzeitigen Endpunkt der Suche anzugeben. Dies erscheint besonders sinnvoll, wenn Sie ein Paket nach dem String »cgi-bin/phf« durchsuchen, da es bei einer solchen Suche nicht nötig ist selbige nach den ersten 20 Bytes fortzusetzen. Wieder werden wir diese Option anhand eines Beispiels illustriert sehen. depth: "<Wert>"; alert tcp any any -> 192.168.1.0/24 8080 (content: "cgi-bin/phf"; offset: 3; depth: 22; msg "CGI-PHP Angriff";) Sandini Bib 1.2 Snort 25 Die nocase-Option ermöglicht Ihnen das Abschalten des case-sensitiv in der content-Option. Das heißt, dass nicht mehr zwischen Groß- und Kleinschreibung unterschieden wird. nocase; Die flag-Option erlaubt es Ihnen, die TCP-Flags zu testen. Zurzeit können Sie diesen Test anhand von neun Flags mit Snort starten. F – FIN (LSB in TCP Flag Byte) S – Syn R – RST P – PSH A – ACK U – URG 2 – Reserved bit 2 1 – Reserved bit 1 (MSB in TCP Flag Byte) 0 – No TCP Flags set Auch hier haben Sie wieder die Möglichkeit Ihre Suche mit Operatoren zu verfeinern. + – All-Flag, trifft auf alle Flags und andere zu * – Any-Flag, trifft auf irgendeine der spezifizierten Flags zu ! – Not-Flag, trifft zu, wenn keine der spezifizierten Flags gesetzt ist Die reserved Bits können genutzt werden um ungewöhnliches Verhalten, wie zum Beispiel IP Stack Fingerprints oder Ähnliche zu entdecken. flags: <flags>; Natürlich führen wir auch hier ein Beispiel an. alert any any -> 192.168.1.0/24 any (flags: SF; msg: "Moeglicher SYN FIN Scan";) Die seq-Option ist dafür da, um die TCP-Sequenznummer mit einem vorgegebenen Wert zu vergleichen (Spoofing-erfahrene Menschen wissen, dass man diese Flag manchmal gut gebrauchen kann). seq: <Wert>; Die ack-Option ist für die Überprüfung des Acknowledge-Feld im TCP-Header implementiert worden. Um ein praxisnahes Beispiel aufzuführen, bedienen wir uns des Nmap-Ping-Beispiels. Bei einem Nmap-TCP-Scan wird dieses Feld auf Null gesetzt. ack: <Wert>; alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "Nmap TCP Ping";) Sandini Bib 26 1 Intrusion Detection Systems Mit der itype-Option können Sie den Wert des ICMP-Type-Feldes testen. Um dies zu erreichen wird der numerische Wert dieses Feldes gesetzt. Falls Sie eine vollständige Liste aller möglichen Werte einsehen wollen, werfen Sie einen Blick in die Datei decode.h, die bei Snort geliefert wird. Um Denial-of-Service-Attacken oder Floodings zu erkennen, kann man diesen Wert auch außerhalb der üblichen Spezifikationen ansetzen. itype: <Wert>; Die icode-Option ist der itype-Option sehr ähnlich, nur dass hierbei der Code des ICMP-Pakets überprüft wird. Natürlich kann für die Angriffserkennung auch hier der Wert außerhalb der Spezifikationen liegen. icode: <Wert>; Die session-Option kann dazu benutzt werden, um vom User eingegebene Daten einer TCP-Verbindung (Telnet, FTP, rlogin oder Web) abzufangen und auszuwerten. Dabei kann man zwei Modi verwenden: printable und all. Beim ersten Modus (printable) werden nur die Daten aufgezeichnet, die der User auch wirklich eingeben oder sehen kann. Der all-Modus arbeitet anders. Er zeichnet alles auf, auch die Daten, die der User nicht sehen kann. Man sollte hierbei aber sehr vorsichtig sein, da dieser Modus sehr an der Performance nagt. Außerdem sollte man hierbei die log-Dateien im tcpdump-Format beschreiben lassen, da die Daten in hexadezimaler Form geschrieben werden. Session: [printable|all]; Das folgende Beispiel zeigt einen Filter, der alle Eingaben einer FTP-Verbindung mitloggt. log tcp any any <> 192.168.1.0/24 21 (session: printable;) Mit der icmp_id-Option kann man die ICMP_ID eines ICMP-Echo-Pakets auf einen bestimmten Wert hin überprüfen. Dies kann äußerst hilfreich sein um dDistributed-Denial-of-Service-Attacken zu erkennen. icmp_id: <Wert>; Im Grunde ist die icmp_seq-Option identisch mit der icmp_id-Option, ich werde daher nicht näher auf sie eingehen. icmp_seq: <Wert>; Die rcp-Option überwacht RPC-Anwendungen. Die Überwachung kann durch drei Variablen stattfinden (application, procedure, version), und wenn diese Variablen anschlagen, zeigt uns Snort dies an. Wildcards sind für procedure und version möglich und werden mit einem »*« dargestellt. rpc: <Wert, [Wert|*], [Wert|*]>; Sandini Bib 1.2 Snort 27 Wir werden die Syntax noch anhand einiger Beispiele besser verstehen lernen. alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg: "RPC getport (TCP)";) alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg: "RPC getport (UDP)";) alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg: "RPC ttdb";) alert udp any any -> 192.168.1.0/24 111 (rpc: 100232,*,*; msg: "RPC sadmin";) Mit resp können Sie gezielte Aktionen ausführen, falls eine Ihrer Filterregeln zutraf. Sie können diese Argumente auch kombinieren, dazu müssen Sie diese lediglich mit einem Komma trennen. Beachten Sie aber bitte dabei, dass Sie diese Möglichkeit nur nutzen können, wenn Sie bereits bei der Installation von Snort das Argument –enable-flexresp übergeben. Nachfolgend werden Sie die möglichen Argumente, die Sie dabei übergeben, kennen lernen. resp: <resp_modifier[, resp_modifier …]> ; rst_snd – sendet TCP-RST-Pakete zum sendenden Socket rst_rcv – sendet TCP-RST-Pakete an den Empfängersocket rst_all – sendet TCP-RST-Pakete zum Empfänger- und Sendersocket icmp_net – sendet ein ICMP-NET-UNREACH-Paket an den Sender icmp_host – sendet ein ICMP-HOST_UNREACH-Paket an den Sender icmp_port – sendet ein ICMP-PORT-UNREACH-Paket an den Sender icmp_all – sendet alle ICMP-UNREACH-Pakete an den Sender Doch seien Sie mit dem Umgang und der Verwendung dieser Methode äußerst vorsichtig. Wir werden anhand einiger Beispiele sehen, wozu es führen kann, wenn man sich bei dieser Option verkonfiguriert. alert tcp any any -> 192.168.1.0/24 any (msg: "aiee!"; resp: rst_all;) Sollten Sie diese Regel verwenden, definieren Sie damit eine Endlosschleife. Also Vorsicht! Die Option content-list erlaubt es nach mehreren Strings im Inhalt eines Pakets zu suchen. Es ist wichtig, dass Sie im Content-File jedem String eine einzelne Zeile widmen. Im Folgenden sehen Sie ein Beispiel für eine solche Datei: "hacking" "cracking" "session hijacking" . Sandini Bib 28 1 Intrusion Detection Systems . . content-list: [!] "<Content-File>"; Sie können auch bei dieser Option den »!«-Operator benutzen, um die Regel zutreffen zu lassen, falls die Suche auf kein angegebenes Suchmuster passt. Die react-Option basiert auf Flex Resp. Eine der Hauptfunktionen dabei ist das Blocken einiger Websites, die von Usern angefordert werden. Dabei erlaubt der Flex-Resp-Code Snort, aktiv Verbindungen zu beenden und/oder eine sichtbare Nachricht an den Browser zu schicken (bald wird Snort auch die Möglichkeit bieten Warnmeldungen zu verschicken). Die dabei verschickten Nachrichten können auch Kommentare von Ihnen enthalten. Die folgenden Argumente können für diese Option benutzt werden. block – Verbindung beenden und sichtbare Nachricht verschicken warn – versendet sichtbare Warnnachricht (bald verfügbar) Diese Argumente kann man zusätzlich noch mit den folgenden verknüpfen (die jetzt aufgeführten können aber nicht alleine stehen, sondern brauchen die Grundargumente, die wir zuvor kennen gelernt haben). msg – enthält die Nachricht, die Sie verschicken möchten proxy: <Portnummer> – Diese Option verwendet den Proxyport um die Nachricht zu versenden (noch nicht verfügbar, wird aber bald implementiert sein) Falls Sie dabei wieder mehrere Argumente in einer Regel aufführen möchten, trennen Sie diese bitte mit einem Komma. Diese Option sollte am Ende einer Regel stehen. react: <Grundargument [, Zusatzargumente …]>; alert tcp any any <> 192.168.1.0/24 80 (content-list: "hacking"; msg: "You should not hurt my network!!!"; react: block,msg); Mit der references-Option kann man externe attack-identification-Systeme in Snortregeln mit einbinden. Neben speziellen Systemen kann man auch eigene URLs einbinden. Folgende Systeme werden zurzeit unterstützt. System Adresse Bugtraq www.securityfocus.com/bid CVE http://cve.mitre.org/cgi-bin/cvename.cgi?name= Arachnids http://www.whitehats.com/info/IDS McAfee http://vil.nai.com/vil/dispVirus.asp?virus_k= URL http:// Tabelle 1.7 Unterstützte Systeme Sandini Bib 1.2 Snort 29 reference:<id system>,<id>; [reference: <id system>,<id>;] alert TCP any any -> any 7070 (msg: "IDS411/dos-realaudio"; flags: AP; content: "|fff4 fffd 06|"; reference: arachNIDS,IDS411;) alert TCP any any -> any 21 (msg: "IDS287/ftp-wuftp260-venglinlinux"; flags: AP; content: "|31c031db 31c9b046 cd80 31c031db|"; reference: arachNIDS,IDS287; reference: bugtraq,1387; reference: cve,CAN-2000-1574; ) Die sid-Option erlaubt es, einzigartige Snortregeln zu erkennen. Die Bereiche, die dabei benutzt werden, sehen so aus: <100, Die Regeln, die in diesem Bereich liegen, sind reserviert. 100 – 1.000.000, Hier finden Sie die Regeln, die Snort schon mitbringt. >1.000.000, Dieser Bereich wird für lokale Regeln verwendet. sid: <snort rules id>; alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-IIS File permission canonicalization"; uricontent:"/scripts/..%c1%9c../"; flags: A+; nocase; sid:983; rev:1;) Die classtype-Option kategorisiert alerts zu Angriffsklassen. Dabei kann der User angeben, welche Priorität eine Regelklassifikation hat. Regeln, die eine Klassifikation haben, besitzen eine Default-Priorität. Classtype: <Klassenname>; Die Regelklassifikationen stehen in der Datei classification.config und können mit der folgenden Syntax editiert werden. config classification: <class name>,<class description>,<default priority> In der folgenden Tabelle können Sie alle Standardklassifikationen einsehen. Klassenname Beschreibung DefaultPriorität Not-suspicious Kein ungewöhnlicher Traffic 0 Unknown Unbekannter Traffic 1 Bad-unknown Potentiell bösartiger Traffic 2 Attempted-recon Versuch Informationsloch auszunützen 3 Successful-recon-limited Informationsloch ausgenützt 4 Tabelle 1.8 Standardklassifikationen Sandini Bib 30 1 Intrusion Detection Systems Klassenname Beschreibung DefaultPriorität Successful-recon-largescale Sehr großes Informationsloch ausgenützt 5 Attempted-dos DOS Versuch 6 Successful-dos Denial of Service gelungen 7 Attempted-user Versuch Userinformationen zu ergattern 8 Unsuccessful-user Userinformationen nicht bekommen 7 Successful-user Userinformationen bekommen 9 Attempted-admin Versuch Rootinformationen zu bekommen 10 Successful-admin Rootinformationen bekommen 11 Tabelle 1.8 Standardklassifikationen (Forts.) Hierzu noch einige Beispiele: alert TCP any any -> any 80 (msg: "EXPLOIT ntpdx overflow"; dsize: > 128; classtype:attempted-admin; priority:10 ); alert TCP any any -> any 25 (msg:"SMTP expn root"; flags:A+; content:"expn root"; nocase; classtype:attempted-recon;) Das priority–Tag stellt einen Sicherheitslevel für Regeln dar. Mit Hilfe dieses Tags kann man die Default-Priorität der Klassentypen überschreiben. Anhand der Syntax und eines Beispiels werden wir dies verdeutlichen. priority: <priority integer>; alert TCP any any -> any 80 (msg: "WEB-MISC phf attempt"; flags:A+; content: "/cgi-bin/bash"; priority:10;) Mit Hilfe der uricontent-Option kann man Regeln so gestalten, dass sie allein aufgrund dieser Option zutreffen. Somit ist es möglich, nur den request-Teil eines Angriffs zu durchsuchen. uricontent: [!] "<content string>"; Man kann die tag-Option dazu nutzen, um mehr zu loggen, als nur das Paket, das eine Regel betrifft. Sobald ein Paket auf eine Regel zutrifft, wird der komplette Netzwerkverkehr des Quellhosts »angehängt«. Dieser »angehängte« Traffic wird mitgeloggt. Das kann äußerst praktisch sein, wenn man Angriffe, die nach dem ursprünglichen (ersten) Angriff stattfinden, erkennen und analysieren will. Wie wir jetzt sehen werden, ist bei dieser Option die Syntax sehr umfangreich. tag: <type>, <count>, <metric>, [direction] type Sandini Bib 1.2 Snort 31 session Loggt die Pakete in der session, die die Regel an die Regel angehängt. host Dieses Argument veranlasst das Loggen des Pakets, das den tag aktiviert hat. count Count gibt die Anzahl der units an, welche im metric-Feld spezifiziert werden. metric packets Wie viele Pakete sollen zusätzlich mitgeloggt werden? seconds Wie viele Sekunden soll zusätzlich geloggt werden? direction Die Verwendung dieses Arguments ist nur sinnvoll im Zusammenhang mit dem host-tag. Benutzen Sie src und dst um festzulegen, welche IP-Adresse des Pakets das Anhängen des Alarms verursacht hat. Zum besseren Verständnis werfen Sie einen Blick auf die folgenden Beispiele. alert tcp !$HOME_NET any -> $HOME_NET 143 (flags: A+; content: "|e8 c0ff ffff|/bin/sh"; tag: host, 300, packets, src; msg: "IMAP Buffer overflow, tagging!";) alert tcp !$HOME_NET any -> $HOME_NET 23 (flags: S; tag: session, 10, seconds; msg: "incoming telnet session";) Die ip_proto-Option erlaubt es, Pakete bezüglich ihres Protokolls zu überprüfen. Um eine vollständige Liste aller Protokolle zu bekommen, können Sie die Datei /etc/protocols zu Rate ziehen. Wie immer werden wir auch hier ein Beispiel und die korrekte Syntax aufführen. ip_proto: [!] <Name oder Wert>; alert ip !$HOME_NET any -> $HOME_NET any (msg: "IGMP traffic detected"; ip_proto: igmp; ) Mit der sameip-Option können Sie überprüfen, ob die Quell-IP der Ziel-IP entspricht. Zur Verwendung benutzen Sie bitte diese Syntax: sameip; alert ip $HOME_NET any -> $HOME_NET any (msg: "SRC IP == DST IP"; sameip;) Sandini Bib 32 1 Intrusion Detection Systems Das stateless-Argument erlaubt – in Verbindung mit dem Stream4 Preprozessor – das Zutreffen einer Regel unabhängig vom Status der Verbindung. stateless; alert tcp !$HOME_NET 0 -> $HOME_NET 0 (msg: "Port 0 TCP traffic"; stateless;) Die regex-Option erlaubt content-Optionen Wildcardoptionen zu definieren. Mögliche Wildcards sind dabei »*« und »?«. Auch hier können Sie sich die Verwendung anhand der Syntax und eines Beispieles verdeutlichen. regex; alert tcp any any -> $HOME_NET any (flags: A+; content: "|c08f e4ff ffff|/bin/*sh"; regex; msg: "buffer overflow!"; sid: 2341239; rev: 1;) 1.2.5 Preprocessors Seit der Version 1.5 haben Programmierer und User die Möglichkeit Snort mit neuen Funktionen auszustatten. Diese neuen Module oder Plugins werden gestartet, nachdem die Pakete dekodiert sind, jedoch bevor die Detection-Routine von Snort ihre Arbeit beginnt. Damit kann man vor der eigentlichen Auswertung der Pakete noch andere Funktionen vorschalten. Zur Konfiguration und Aktivierung benutzt man das Schlüsselwort preprocessor. preprocessor <Name>: <Optionen> Nachdem Sie nun die allgemeine Syntax des Preprocessors beherrschen, werden wir im Folgenden alle erhältlichen Module dafür besprechen. Minfrag Wir werden dieses Modul an dieser Stelle nicht ansprechen, da es ab der Version 1.8 von dem Stream4 Modul abgelöst wurde. HTTP Decode HTTP Decode verarbeitet HTTP-URI-Zeichenketten und konvertiert diese Daten in besser verständlichen ACSII-Code. Sie können diese Methode zum Beispiel zur Abwehr von Netz-URL-Scannern oder Angreifern einsetzen, die ansonsten den Contentanalysestrings, die den HTTP-Verkehr nach feindseligen Aktivitäten durchsuchen, ausweichen könnten. Wie das folgende Beispiel zeigt, übergibt man dazu die HTTP-Portnummer (getrennt durch ein Leerzeichen) an das Modul. http_decode: <port list> [ -unicode ] [ -cginull ] preprocessor http_decode: 80 8080 -unicode -cginull Sandini Bib 1.2 Snort 33 Portscan Detector Der Portscan Detector von Patrick Mullen erledigt folgende Aufgaben: Er schreibt den Start und das Ende eines von einer einzelnen IP-Adresse ausgehenden Portscans in die dafür vorgesehene Standardlogdatei. Falls man dafür eine spezielle Logdatei vorsieht, loggt er auch die Ziel-IP, den Zielport und die Art des Scans. Dabei kann dieses Modul eine ganze Reihe von Portscans entdecken (Stealth, XMas usw.). Zu diesem Zwecke kann man folgende Argumente übergeben: Das zu überwachende Netzwerk Die Anzahl der Ports, auf denen innerhalb einer bestimmten Zeit Verbindungsversuche erfolgen müssen, damit es als Portscan erkannt wird Den Zeitraum, in dem Verbindungsversuche auf einen bestimmten Port auf einen Portscan deuten lassen Die Logdatei, in der die Daten über Portscans festgehalten werden sollen Als Nächstes werden wir uns kurz die Syntax und ein Beispiel dazu ansehen: portscan: <monitor network> <number of ports> <detection period> <file path> preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log Portscan Ignorehosts Wie man aus dem Namen schon schließen kann, bietet dieses Modul die Möglichkeit einige Hosts (NTP, NFS und DNS) aus der Überwachung (auf Portscans) auszuschließen. Die Syntax dazu lautet wie folgt: portscan-ignorehosts: <host list> preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24 Defrag Dieses Modul ermöglicht eine komplette IP-Defragmention, die es Hackern erschwert, die Sicherheitsmaßnahmen eines Systems zu umgehen. Wie wir gleich sehen werden, ist der Gebrauch dieses Moduls sehr einfach. Dazu muss man nur die Preprozessordirektive in der Configdatei angeben. defrag preprocessor defrag Frag2 Frag2 stellt die Ablöse für Defrag dar, wobei dieses Modul wesentlich ressourcenfreundlicher ist. So bietet es zum Beispiel die Möglichkeit an den Speichergebrauch zu konfigurieren und »fragment timeouts« zu setzen. Falls man dem Modul keine Argumente übergibt, verwendet es das Defaultspeicherlimit von 4194304 Bytes (4 MB) und einen Timeout von 60 Sekunden. Sandini Bib 34 1 Intrusion Detection Systems preprocessor frag2: [Speicherkapazität <xxx>], [timeout <xx>] preprocessor frag2: 16777216, 30 Stream Auch hier muss ich Ihnen mitteilen, dass wir dieses Modul nicht besprechen werden, da es – ebenso wie minfrag – von der Zeit eingeholt wurde und in den neueren Versionen von Snort nicht mehr implementiert ist. Stream4 Mit diesem Modul haben die Schöpfer von Snort den Administratoren im Kampf gegen einige böswillige Hacker eine mächtige Waffe an die Hand gegeben. Die Systemverantwortlichen haben damit die Möglichkeit TCP-Streams wieder zusammenzuführen und genauestens zu analysieren. Sie können damit 256 TCPStreams aufzeichnen und mit bis zu 65.000 TCP-Verbindungen fertig werden. Stream4 bietet dabei zwei konfigurierbare Module: den stream4 preprocessor und das damit verbundene stream4 reassembly Plugin. Die damit verfügbaren Optionen finden Sie unter der jetzt aufgeführten Syntax. Stream4: preprocessor stream4: [noinspect], [keepstats], [timeout <seconds>], [memcap <bytes>], [detect_scans], [detect state_problems] noinspect »stateful inspection« deaktivieren keepstats schreibt Zusammenfassung der Sitzung in <Logverzeichnis>/session.log timeout <Sekunden> Gibt an, wie lange ein inaktiver Stream im »state table« gehalten werden soll. Sessions, die schon gelöscht wurden, werden automatisch wieder aufgenommen, falls mehr Aktivität zu sehen ist. Der Defaultwert liegt dabei bei 30 Sekunden. memcap <Bytes> Gibt an, wo die Speicherkapazität anzusetzen ist. Wenn das Limit erreicht ist, werden inaktive Sessions gewaltsam hinausgeschmissen. Der Defaultwert liegt bei 8 MB. detect_scans Aktiviert Alarm für Portscan-Events Sandini Bib 1.2 Snort 35 detect_state_problems Aktiviert Alarm für stream-Events (zum Beispiel ausweichende RST-Pakete, Daten in einem SYN-Paket und Sequenznummern, die außerhalb eines Bereichs liegen). Stream4_Reassembly: preprocessor stream4_reassemble: [clientonly], [serveronly], [noalerts], [ports <portlist>] clientonly Ermöglicht Reassembly nur für die Clientseite einer Verbindung. serveronly Ermöglicht Reassembly nur für die Serverseite einer Verbindung. noalerts Deaktiviert Alarm für Events, die möglicherweise »insertion« oder »evasion attacks« sind. ports <portlist> – Die Portliste gibt an, für welche Ports Reassembly aktiviert werden soll. Für diese Funktion stehen zwei vordefinierte Variablen zur Verfügung: »All« aktiviert Reassembly für alle Ports und »default« für die Ports 21 23 25 53 80 110 111 143 und 513. Die Ports sind mit einem Leerzeichen zu trennen. Bemerkungen zu diesem Modul: Falls man die beiden Optionen (stream4 und stream4_Reassembly) ohne Argumente in der Konfigurationsdatei snort.conf aktiviert, werden sie mit folgenden Defaultwerten gestartet. Argument Defaultwert Session Timeout 30 Sekunden Speicherkapazität einer Session 8388608 Bytes Stateful Inspection Aktiviert Stream Stats Nicht aktiviert State Problem Alerts Nicht aktiviert Portscan Alerts Nicht aktiviert Tabelle 1.9 Stream4-Defaultwerte Sandini Bib 36 1 Intrusion Detection Systems Argument Defaultwert Reassembly Client Aktiviert Reassembly Server Nicht aktiviert Reassembly Ports 21 23 25 53 80 143 110 111 513 Reassembly Alerts Aktiviert Tabelle 1.10 Stream4_Reassembly-Defaultwerte Mit stream4 führt Snort einen neuen Kommandozeilenswitch ein: -z. Dieser Switch kann mit zwei Argumenten aufgerufen werden: est und all, wobei all den Defaultwert darstellt und Snort übergibt, das es normal alarmieren soll. Das Argument est hingegen bewirkt, dass Snort nur bei TCP-Streams, die durch einen Drei-Wege-Handshake etabliert wurden, und bei Streams, bei denen eine bidirektionale Aktivität beobachtet werden konnte (wie zum Beispiel auf ein Paket, das als Antwort kein RST oder FIN zurückschickt), Alarm schlägt. Falls man den -z-Switch benutzt, ignoriert Snort TCP-basierende stick/snot-Angriffe. Man hat diesen Switch aus wohlüberlegten Gründen eingeführt. Stellen Sie sich vor, Sie haben ein Subnetwork oder ein Network, wo einige IP-Pakete mit einer ungültigen Checksumme »umherschwirren«. Unter Umständen werden diese den Switch oder den Router niemals passieren. Falls man Snort jetzt die Aufgabe stellt, diese Pakete auch zu untersuchen, verschenkt man wertvolle Rechenzeit (diese Aufgabe erledigt ein Subsystem in Snort). Deshalb hat man den Administratoren mit dem -zSwitch die Möglichkeit gegeben das für die Überprüfung zuständige Subsystem abzuschalten (oder es zu modifizieren) ohne dafür eigenen Code schreiben zu müssen. Diese Neuerung ist aber nicht die einzige. Mit dem -k-Switch hat man die Möglichkeit das im vorherigen Abschnitt erwähnte Problem mit den Checksummer auf eine elegantere Art zu lösen. Anstatt das komplette Subsystem (das für die Überprüfung zuständig ist) abzuschalten, kann man es mit diesem Switch für seine Zwecke modifizieren. Folgende Optionen sind für den -k-Switch verfügbar: Optionen Beschreibung Noip Schaltet IP-Checksummenüberprüfung ab Notcp Schaltet TCP-Checksummenüberprüfung ab Noupd Schaltet UDP-Checksummenüberprüfung ab Noicmp Schaltet ICMP-Checksummenüberprüfung ab None Schaltet alle Checksummenüberprüfungen ab Tabelle 1.11 Verfügbare Optionen für den »-k«-Switch Sandini Bib 1.2 Snort 1.2.6 37 Output-Module Seit der Version 1.6 hat man auch unter Snort die Möglichkeit, die Formatierung und die Präsentation des Outputs wesentlich flexibler zu gestalten. Die Outputmodule von Snort starten, wenn die Alarm- und Loggingsubsysteme aufgerufen werden, aber nach dem Preprozessor und nach der Detectionengine. Dabei ist das Format im Regelfile sehr ähnlich dem des Preprozessors. Man kann für diesen Zweck mehrere Output-Plugins in der Konfigurationsdatei spezifizieren. Falls dabei mehrere Plugins desselben Typs aufgeführt werden (alert, log), werden diese in Reihe ausgeführt, falls ein Event auftritt. Genauso wie die Standard-Logging- und Alarmsysteme senden Output-Plugins ihre Daten in die Standardlogdatei /var/log/snort oder in ein vom User angegebenes File (zu spezifizieren mit der -l-Option). Output-Module werden durch die Spezifizierung der Output-Option im Regelfile zur runtime geladen. output <name>: <options> output alert_syslog: LOG_AUTH LOG_ALERT In den folgenden Abschnitten werden wir die zurzeit verfügbaren Module kennen lernen. Alert_syslog Dieses Modul schreibt Alarmbenachrichtigungen in die vom System vorgegebene Logdatei (ähnlich zum -s-Switch). Man kann aber auch selbst das Logfile (Facilities) angeben, außerdem ist es möglich, Prioritäten innerhalb der Regeldatei zu vergeben. In der folgenden Auflistung finden Sie eine Aufstellung der verfügbaren Argumente für dieses Modul. Options LOG_CONS LOG_NDELAY LOG_PERROR LOG_PID Facilities LOG_AUTH LOG_AUTHPRIV LOG_DAEMON LOG_LOCAL0 LOG_LOCAL1 Sandini Bib 38 1 Intrusion Detection Systems LOG_LOCAL2 LOG_LOCAL3 LOG_LOCAL4 LOG_LOCAL5 LOG_LOCAL6 LOG_LOCAL7 LOG_USER Priorities LOG_EMERG LOG_ALERT LOG_CRIT LOG_ERR LOG_WARNING LOG_NOTICE LOG_INFO LOG_DEBUG Die dazu passende Syntax sieht folgendermaßen aus: alert_syslog: <facility> <priority> <options> Alert_fast Dieses Modul schreibt die Alarmnachrichten innerhalb einer Zeile in das Outputfile. Diese Methode ist schneller als das Alert_full-Modul, da es nicht den kompletten Header in die Output-Datei schreibt. Wie immer werden Sie hier die Syntax und ein dazu passendes Beispiel kennen lernen. alert_fast: <output filename> output alert_fast: alert.fast Alert_full Wie wir bei der Erklärung des Alert_fast-Moduls schon gesehen haben, schreibt Snort bei dieser Methode den gesamten Header in die Loggingdatei (/var/ log/snort oder in die vom User spezifizierte Datei). Da Snort bei dieser Option noch einige Dateien für die Dekodierung der Pakete, die den Alarm ausgelöst haben, anlegt, sollte man diese Option nur verwenden, wenn man eine genaue Analyse seines Netzwerkverkehrs braucht und/oder ein sehr langsames Netz hat. alert_full: <output filename> output alert_full: alert.full Sandini Bib 1.2 Snort 39 Alert_smb Wir haben am Anfang gesehen, dass Snort nicht die Möglichkeit besitzt den Administrator zu benachrichtigen. Dieses Problem haben wir gefixt, indem wir ein Pagerprogramm wie YAPS eingesetzt haben. Dabei haben wir aber gesehen, dass es die Möglichkeit der SMB-Benachrichtigung gibt, aber wir diese aufgrund der Sicherheitsbedenken nicht einsetzen wollen. Außerdem handelt dieses Buch von Linux-Security und in einem solchem Werk sollten NETBIOS Tools und Ähnliches meiner Meinung nach nicht beschrieben werden. Ich bitte Sie also an dieser Stelle, diese Möglichkeit nicht zu nutzen, und werde sie auch nicht näher beschreiben (wie gesagt dürfte es die meisten Leser sowieso nicht betreffen, da diese ein Serversystem ohne Windows fahren). Falls es aber aus irgendwelchen Gründen für Sie doch notwendig sein sollte, dieses Modul zu starten, können Sie dies anhand folgender Syntax bewerkstelligen. alert_smb: <alert workstation filename> output alert_smb: workstation.list Alert_unisock Obwohl dieses Modul noch in der Experimentalphase steckt, wollen wir es an dieser Stelle aufführen, da es eine gute Alternative zu SMB ist und im Allgemeinen eine gewisse Möglichkeit der Benachrichtigung in einem Netzwerk darstellt. Man hat hierbei die Möglichkeit Alarmbenachrichtigungen auf einen Unixdomainsocket zu schicken. Andere Programme können nun auf diesen Socket »horchen« und diese Nachrichten oder auch Paketdaten in Echtzeit empfangen. alert_unixsock output alert_unixsock Log_tcpdump Obwohl wir schon andere Möglichkeiten kennen gelernt haben, um die Loggingdaten im tcpdump-Format zu erhalten, wollen wir auch einen Blick auf das Output-Modul werfen, das uns dies ermöglicht. Um eine unnötige Wiederholung zu vermeiden, werde ich an dieser Stelle die Vorteile dieses Formats nicht noch einmal besprechen und gleich zur Syntax übergehen. log_tcpdump: <output filename> output log_tcpdump: snort.log XML XML dürfte mittlerweile für jeden, der in der IT-Branche progressiv arbeitet, ein Begriff sein. Auch Snort führt nun ein XML-Plugin mit, welches es ermöglicht, in SNML (simple network markup language alias snort markup language) in eine Datei oder über das Netzwerk zu loggen. Wir haben bei der allgemeinen Besprechung von Snort schon gesehen, dass es manchmal notwendig und sinnvoll ist, in eine zentrale Logdatei zu schreiben. Mit diesem Plugin ist es nun möglich, einen Sandini Bib 40 1 Intrusion Detection Systems oder mehrere Sensoren im Netzwerk dazu zu bringen, in eine solche zentrale Datenbank zu loggen. Außerdem erlaubt es dieses Modul, automatisch Alarmbenachrichtigungen an das CERT Coordination Center zu senden. Selbstverständlich ist diese Erweiterung von Snort ein phantastisches Hilfsmittel bei der Administration, aber Sie sollten dennoch bedenken, dass sich dieses Modul noch in der Entwicklungsphase befindet und daher noch nicht voll einsatzfähig ist. Den aktuellen Stand dieses Projekts können Sie (und sollten Sie) stets unter der Adresse http://www.cert.org/DTD/snml-1.0.dtd erfragen. Die dazugehörige Syntax und die verfügbaren Parameter werden Sie im nächsten Abschnitt erfahren. output xml: [log | alert], [Parameterliste] Verfügbare Parameter: [log | alert] Spezifiziert log oder alert, um den XML-Plugin mit der log- oder alertFacility zu verbinden. Parameterliste Die Parameterliste enthält key/value-Paare, welche jeweils mit einem Leerzeichen zu trennen sind (Format: key=value). file: Falls dies der einzige Parameter ist, wird in eine Datei auf dem lokalen System geloggt. Ansonsten (falls http oder https eingebunden ist) stellt file das Script dar, das auf einem Remotesystem ausgeführt werden soll. protocol: Die möglichen Werte (values) für dieses Feld können Sie Tabelle 1.12 entnehmen. Werte (values) Beschreibung http Sendet einen POST über http zu einem Webserver (benötigt einen [file]-Parameter) https Ähnlich zu http, mit dem Unterschied der SSL-Verschlüsselung (benötigt einen [file]-, [cert]- oder [key]-Parameter) tcp Eine einfach TCP-Verbindung. Dazu benötigen Sie ein Programm, das auf einen bestimmten Port horcht. (benötigt einen [port]-Parameter) iap Dies stellt eine (noch nicht funktionierende) Implementierung eines Intrusion Alert Protocols dar. Tabelle 1.12 Values für Protocol host: Gibt den Port auf dem Remoterechner an, zu dem die Logs gesendet werden. Die Defaultwerte können Sie Tabelle 1.13 entnehmen. Sandini Bib 1.2 Snort 41 Protokoll Defaultports http 80 https 443 Icp 9000 Iap 9000 Tabelle 1.13 Defaulports für host cert: Nur jemand, der https einsetzt, muss diese Aufgabe bewältigen. Wir könnten über die Option seitenweise diskutieren und damit sicherlich auch einiges lernen. Doch dies soll eine Kurzbesprechung einiger Optionen werden. Zuerst sollten Sie die Option kennen lernen, die es Ihnen ermöglicht, einen Schlüssel (mit dem X.509 Zertifikat) zu erstellen: % openssl x509 -subject -in <server certificate> Der folgende Abschnitt soll Ihnen die Konfiguration innerhalb eines Snortsenors anhand des sanatize-Arguments näher bringen. Ein wichtiges Argument innerhalb eines Snortsensors ist sanatize. Dieses Argument ist eine Kombination aus dem Netzwerk und der Netzwerkmaske. Jede IPAdresse innerhalb eines Bereichs, den Sie durch dieses Argument spezifizieren, wird durch xxx.xxx.xxx.xxx repräsentiert. Sie können auch Alarme mit diesem Argument definieren, dann wird kein Anhang eines Pakets mitgeloggt. Sie können dieses Argument mehrfach nutzen, um mehrere IP-Bereich anzugeben. Sie können die Logdaten leider nur in binärer Form aufzeichnen, da es zurzeit keinen Standardweg gibt, um diese in ASCII umzuwandeln. Welche binäre Form für Sie am besten geeignet ist, können Sie aus den folgenden Punkten entnehmen. hex: Sie können die binären Daten als HEX anzeigen lassen (Dies stellt die Defaulteinstellung dar). Die für Sie verfügbaren Optionen hierbei finden Sie in Tabelle 1.14. Option Kommentar storage requirements 2x Größe von binären Daten Searchability Empfehlenswert human readability Sehr schwer zu lesen, benötigt post processing Tabelle 1.14 Optionen zu hex base64: Daten werden in base64 Strings dargestellt. Hier wird Ihnen die dazugehörige Tabelle 1.15 weiterhelfen. Sandini Bib 42 1 Intrusion Detection Systems Option Kommentar storage requirements 1.3x Größe von binären Daten Searchability Ohne post processing unmöglich Human readability Sehr schwer zu lesen, benötigt post processing Tabelle 1.15 Optionen zu base64 ascii: Hierbei werden die Daten im ASCII-Format dargestellt. Seien Sie aber sehr vorsichtig damit, denn dies ist die einzige Option, bei der Sie tatsächlich Daten verlieren. Nicht-ASCII-Zeichen werden als ».« dargestellt. Falls Sie sich für diese Option entscheiden, sollten Sie wissen, dass es keinen Sinn macht, Daten für IP- und TCP-Daten in ASCII darzustellen, deshalb werden sie auch in HEX dargestellt. Wie bei den beiden vorhergegangenen Punkten werden Sie zum besseren Verständnis auch hier eine Tabelle mit den Optionen und Martin-Roesch-Kommentaren dazu finden (Tabelle 1.16). Option Kommentar Storage requirements Nur ein bisschen größer als binäre Daten, da einige Charakter mit Sonderzeichen versehen sind. Searchability Sehr brauchbar, falls Sie nach Textstrings suchen, die Suche nach binären Stings stellt sich als unmöglich dar. Human readability Sehr gut Tabelle 1.16 Optionen zu ascii detail: Diese Option erweist sich als sehr brauchbar, wenn Sie sehr viele Daten von Snort bekommen. Hierbei können Sie angeben, wie viele Details Sie gerne gespeichert hätten. Optionen Beschreibung Fast Bei dieser Option speichern Sie nur ein Minimum der Daten, dies kann die Analyse zwar sehr einschränken, bietet sich aber dennoch als beste Lösung für einige Applikationen an. Die folgenden Felder werden geloggt. Timestamp Signature Quell-IP-Adresse Ziel-IP-Adresse Zielport Quellport TCP Flags Protokoll Full Loggt die gesamten Daten des Pakets, welches den Alarm ausgelöst hat Tabelle 1.17 Optionen zu detail Sandini Bib 1.2 Snort 43 Sollten Sie diesen Abschnitt nicht sofort verstanden haben, ist dies nicht weiter schlimm. Wir haben es hier mit einer durchaus komplexen und sehr umfangreichen Option zu tun, die man unmöglich bis ins kleinste Detail beschreiben kann, wenn man den Rahmen des Kapitels in einem vernünftigen Maße halten will. Die hier aufgeführten Daten beruhen zum Großteil auf den Schriften von Martin Roesch und sollten Ihnen (mit Hilfe der Manpages) einen kompletten Eindruck über die Funktionsmöglichkeiten von Snort geben. Zum Abschluss dieses Abschnittes werden wir einen Blick auf die Syntax werfen, welche die besprochene Theorie etwas verdeutlichen sollte. xml: <output facility> output xml: log, file=output output xml: log, protocol=https host=air.cert.org file=alert.snort cert=mycert.crt key=mykey.pem ca=ca.crt server=srv_list.lst Database Dieses Output-Modul von Jed Pickel ermöglicht es, Daten an eine SQL-Datenbank zu schicken. Die zu übergebenden Argumente dafür sind die Datenbank, in die geloggt werden soll, und die Parameterliste (Format: Parameter = Argument). Werfen Sie dazu einen Blick auf die Syntax, gefolgt von der Beschreibung der verfügbaren Parameter. database: <log | alert>, <database type>, <parameter list> Verfügbare Parameter: host: Dieser Parameter gibt den Host an, mit dem eine Verbindung initialisiert werden soll. Falls Sie keinen Hostnamen übergeben, wird sich Snort mit Hilfe eines lokalen Unix Domain Sockets verbinden port: Spezifiziert den Port auf dem Serversystem, auf dem die Verbindung zu Stande kommen soll. Kann aber auch die Socket Filename Extension der Unix Domain Verbindungen angeben. dbname: Datenbankname und Username für die Datenbank password: Gibt das Passwort für die Datenbank an, falls die Datenbank danach verlangen sollte. sensor_name: Mit diesem Parameter können Sie Ihrem Snortsenor einen eigenen Namen geben. Falls Sie aber keinen Namen angeben, wird Snort automatisch einen Namen dafür generieren. Auch hierbei müssen wir wieder ein Wort zur Kodierung verlieren. Da Snort keinen Standard vorgibt, können Sie wieder auswählen, welcher für Sie der geeignete ist. Betrachten Sie dazu Tabelle 1.14 bis Tabelle 1.16. detail: Die Beschreibung zu Detail ist identisch mit der Detailbeschreibung des XML-Moduls. Sandini Bib 44 1 Intrusion Detection Systems Bitte beachten Sie bei diesem Modul die Option »log«. Denn zurzeit unterstützt Snort vier Datenbanken, die Sie mit dieser Option definieren. 1. MySQL 2. PostgreSQL 3. Oracle 4. Unix-ODBC-kompatible Datenbanken 5. Die genaue Syntax dazu lautet: output database: log, mysql, dbname=snort user=snort host=localhost password=snort CSV Dieses Modul erlaubt es, Alarmnachrichten in einem Format zu loggen, welches leicht in Datenbanken importiert werden kann. Dieses Plugin benötigt zwei Argumente: die Pfadangaben für die Logdatei und das Format. In der folgenden Auflistung können Sie erkennen, welche Formatierungen Ihnen hierbei zur Verfügung stehen: timestamp msg proto src srcport dst dsport ethsrc ethdst ethlen tcpflags tcpseq tcpack tcplen tcpwindow ttl tos id dgmlen Sandini Bib 1.2 Snort 45 iplen icmptype icmpcode icmpid icmpseq Um dieses Plugin nutzen zu können, verwenden Sie bitte folgende Syntax: output CSV: <filename> <format> output CSV: /var/log/alert.csv default output CSV: /var/log/alert.csv timestamp, msg Unified Dieses Plugin stellt den schnellstmöglichen Weg dar, um in Snort Daten zu loggen. Dabei loggt es in ein Alarmfile und in ein Paketlogfile. Das Alarmfile enthält dabei die High-Level-Details eines Events (ips, protocol, port, message id), das Paketlogfile hingegen enthält detaillierte Informationen über ein Paket und die entsprechende message-id. Beide Dateien enthalten binäre Daten. Die Beschreibung zum Format dieser Daten können Sie der Datei spo_unified.h entnehmen. Auch hier haben Sie die Möglichkeit die Verwendung dieses Moduls anhand der Syntax und eines Beispiels zu erlernen. output alert_unified: <file name> output log_unified: <file name> output alert_unified: snort.alert output log_unified: snort.log SNMP Trap Mit Hilfe dieses Moduls können Sie Alarmnachrichten an eine Network-Management-Station schicken. Zur Verwendung benutzen Sie bitte folgende Syntax. trap_snmp: : alert, <sensorID>, {trap | inform}, [SnmpOptions] , <snmptrapdAddress>, <community> Verfügbare Optionen: alert: Gibt an, welche Alarmtypen an die NMS weitergeleitet werden sollen senorID: Bezeichnet die Sensor-ID, um verschiedene Systeme zu unterscheiden trap: Bei Angabe dieser Option wird SNMP v2 traps verwendet inform: Verwendet SNMP v2 informs SNMPOptions: Die verfügbaren Optionen finden Sie in Tabelle 1.18. Sandini Bib 46 1 Intrusion Detection Systems Option Beschreibung -v 2c SNMP v2 c community -p Remoteportnummer für Empfänger Tabelle 1.18 Verfügbare Optionen zu SNMPOptions snmptrapdAddress: Netzwerkadresse für SNMP-Empfänger community: SNMP community String Ein passendes Beispiel dazu könnte folgendermaßen aussehen: trap_snmp: alert, internal, trap, 192.168.1.10, private Log Null Es kann durchaus in einigen Fällen nützlich sein, über einen Alarm informiert zu werden, ohne dass dies gleich einen Logfileeintrag zur Folge hat. Das können Sie mit diesem Plugin (und dem »-n« Kommando) bewerkstelligen. output log_null Sie können damit aber auch einen eigenen Regeltypen erstellen (wir haben dies ja bereits kennen gelernt): ruletype info { type alert output alert_fast: info.alert output log_null } Dies ist ein Regeltyp, der zwar über einen Alarm informiert, aber keinen Logfileeintrag hervorruft. 1.2.7 Fazit Wie Sie gesehen haben, ist Snort ein unglaublich mächtiges Werkzeug und bietet eine Vielzahl von Optionen. Wenn Sie dieses Kapitel gründlich gelesen und die aufgeführten Beispiele ausprobiert haben, sollten Sie fit genug sein, um Ihr eigenes sicheres Snortsystem aufzuziehen, und damit wieder etwas an Boden gegenüber Angreifern gewonnen haben. An dieser Stelle möchte ich mich aber noch kurz entschuldigen, dass einige Optionen, Argumente, Module oder Parameter etwas zu kurz kamen. Aber es ist einfach nicht möglich, alle Informationen ausführlich aufzuführen, da dies mit Sicherheit den Rahmen des Buchs sprengen würde. Sandini Bib 2 Netzwerk-Tools Ich muss gestehen, ich war mir nicht sicher, ob ich dieses Kapitel ins Buch mit aufnehmen sollte, da es vielleicht auf den ersten Blick keinen direkten Bezug zur ITSecurity unter Linux aufweisen kann. Doch das ist ein reines Definierungsproblem. Wer ein sicheres Linuxsystem auf die Beine stellen will, der wird sein Ziel nicht erreichen, wenn er nur so genannte »reinrassige« Security-Tools verwendet. Denn es werden Situationen aufkommen, in denen ein Administrator bestimmte Vorgänge in seinem Netzwerk nicht versteht und ein ihm noch nicht bekanntes Problem lösen muss. Es wäre möglich, dass die Lösung eines solchen Problems in einem Sicherheitstool zu finden ist. Aber welches Programm man für die Beseitigung des Missstandes einsetzen muss, das ist bei der Problementdeckung natürlich noch nicht klar. Um nun einer solchen Situation Herr zu werden, muss man das Problem zerlegen. Man muss Schritt für Schritt analysieren, an welchem Punkt sich (zum Beispiel) Pakete abnorm verhalten oder an welcher Stelle ein Signal verloren geht. Damit man eine solche Fehlersuche durchführen kann, benötigt man wiederum Programme, die einem dabei helfen. Und genau diese Tools möchte ich Ihnen in diesem Kapitel näher bringen. 2.1 Traceroute Obwohl ich mir sicher bin, dass bereits die meisten Leser dieses Utility kennen, werde ich es an dieser Stelle trotzdem ansprechen, da es einfach ein unverzichtbares Programm in der Bekämpfung der Netzwerkgeräte ist, die Pakete verwerfen. Wir alle wissen, dass das Internet alles andere ist als ein perfekt geplantes und gut strukturiertes Netzwerk. Es ist ein riesengroßes, ständig wachsendes Gebilde an Rechnern, Routern und ähnlichen Netzwerkgeräten, die weltweit miteinander verbunden sind und versuchen Daten auszutauschen. Jetzt hat man bereits versucht den anhaltenden Paketverlusten im Internet mit der Implementierung der TCP/IP-Protokollsuite entgegenzuwirken, doch leider müssen geplagte Admins wie wir täglich feststellen, dass auch das beste verbindungsorientierte Protokoll nichts gegen den Paketverlust anrichten kann, den wir täglich erleiden müssen. Richtig schlimm ist es jedoch, wenn man merkt, dass sich jetzt auch ein solcher Bug in das hauseigene Netzwerk eingeschlichen hat und auf mysteriöse Weise einige Pakete nie ihr Ziel erreichen. Oftmals haben wir nur ein kleines Netz und es stehen keine Ausweichrouten wie im Internet zur Verfügung und falls doch, geht unser Durchsatz merklich in den Keller. Was bleibt uns also anderes übrig als Pakete bis zu ihrem Verschwinden zu verfolgen und somit den Übeltäter, der unsere Daten verschlingt, zu entlarven und dem ein jähes Ende zu bereiten. Genau dafür hat man uns Administratoren Traceroute geschenkt. Dieses Tool erlaubt es, unseren Plan der Paketverfolgung bis zum Verschwinden durchzuführen, und gibt uns somit die Möglichkeit schnell an die Wurzel des Problems zu gelangen. Sandini Bib 48 2 Netzwerk-Tools An sich ist es ein sehr einfach gehaltenes Programm, das eigentlich nur ein Argument braucht, um zu funktionieren und seinen Dienst zu tun (die IP-Adresse oder den Hostnamen). Nachdem man das Programm installiert hat (sollte bei jeder Distribution mitgeliefert werden und falls nicht, ist es überall im Internet erhältlich), kann man sofort damit beginnen, die Paketwege nachzeichnen zu lassen. Dazu ruft man das Programm auf und übergibt die IP-Adresse oder den Rechnernamen, der das Paket erhalten soll, es aber leider nie bekommt, da es irgendwo auf dem Weg dorthin verloren geht. Die Syntax dafür sieht logischerweise so aus: Traceroute 10.209.100.1 Das folgende Listing zeigt Ihnen eine Beispiel-Paketverfolgung mit Traceroute: traceroute to 62.54.19.249 (62.54.19.249), 30 hops max, 40 byte packets 1 cishelios2.helios.de (193.141.98.1) 3 ms 2 ms 2 ms 2 pop9.pop-hannover.de (193.98.1.212) 5 ms 5 ms 5 ms 3 popcore.pop-hannover.de (193.98.1.213) 4 ms 4 ms 4 ms 4 ffmcore.pop-hannover.net (62.48.66.58) 43 ms 24 ms 24 ms 5 62.67.32.137 (62.67.32.137) 24 ms 24 ms 24 ms 6 unknown.Level3.net (195.122.136.45) 24 ms 24 ms 24 ms 7 rdcx-frnk-de01.mediaways.net (194.31.232.89) 24 ms 24 ms 24 ms 8 rmws-frnk-de01-ln5-6-0.nw.mediaways.net (213.20.255.237) 25 ms 25 ms 25 ms 9 rmws-stgt-de01-pp3-3-3.nw.mediaways.net (195.71.254.126) 29 ms 29 ms 29 ms 10 rmws-mnch-de01-pp3-5-0-0.nw.mediaways.net (195.71.254.78) 48 ms 41 ms 33 ms 11 srv48.mnc2.mediaWays.net (62.53.207.94) 33 ms 35 ms 33 ms 12 mnc2-3e3613f9.pool.mediaWays.net (62.54.19.249) 288 ms 260 ms 258 ms So sieht eine Tracerouteausgabe aus, wenn Sie keine weiteren Parameter angeben. Um die Ausgabe zu verändern oder andere Schwerpunkte zu legen, können Sie einen der folgenden Parameter zur Spezifizierung nutzen. 2.1.1 Optionen Optionen Beschreibung -l Zeigt den TTL-Wert des Antwortpaketes an. Dies kann sehr nützlich sein, falls Sie asymmetrisches Routing überprüfen wollen. -m max_ttl Diese Option gibt an, wie hoch der maximale time-to-live-Wert in ausgehenden Paketen sein darf. Der Defaultwert hierbei liegt bei 30 Hops. Tabelle 2.1 Verfügbare Argumente für Traceroute Sandini Bib 2.1 Traceroute 49 Optionen Beschreibung -n Diese Option verändert die Ausgabe Ihres Testlaufes ein wenig. Hierbei wird anstatt des Hostnamens die IP-Adresse des Gateways ausgegeben. -p port Damit können Sie den UDP-Port, der in den Tests verwendet wird, angeben (der Defaultwert liegt bei 33434). Sie müssen diesen Parameter eigentlich nicht ändern, außer Sie wissen, dass ein bestimmtes Programm auf einem Gateway auf diesem Port »horcht«. -q nqueries Diese Option gibt an, wie viele Pakete losgeschickt werden sollen. Der Defaultwert liegt bei drei. -r Mit dieser Option umgehen Sie die Routingtabellen und sprechen den Host direkt an. -s src_addr Hiermit können Sie die IP-Adresse der ausgehenden Pakete setzen (bitte beachten Sie aber dabei, dass Sie eine IP-Adresse und keinen Hostname angeben müssen). Dies ist nützlich, falls Ihr Rechner mehrere IP-Adressen belegt. -t tos Um den type-of-service-Wert in ausgehenden Paketen auf einen anderen Wert zu setzen (der Defaultwert liegt bei Null), können Sie diese Option benutzen. Sie können diese Option nutzen, um zu sehen, ob das Paket einen anderen Weg einschlägt, falls Sie den tos-Wert ändern. -v Falls Sie dieses Argument übergeben, werden alle erhaltenen ICMPPakete angezeigt (außer TIME_EXCEEDED und UNREACHABLE) -w Hiermit können Sie angeben, wie lange auf ein Antwortpaket gewartet wird. (Der Defaultwert liegt bei drei Sekunden). Tabelle 2.1 Verfügbare Argumente für Traceroute (Forts.) 2.1.2 Funktionsweise Bevor wir auf die technische Seite von Traceroute eingehen, werden wir vorher noch kurz erörtern, wobei einem dieses Werkzeug behilflich sein kann. Wie wir in der Einführung schon gesehen haben, ist Traceroute ein sehr nützliches Programm um defekte Gateways in einem Netzwerk zu finden. Dies ist aber nicht die einzige Hilfestellung, die man von diesem Netzwerktool angeboten bekommt. Im Folgenden werden Sie eine Auflistung einsehen können, die Ihnen einige Situationen näher bringt, in denen Ihnen Traceroute behilflich sein kann. Einsatzmöglichkeiten Providertest Das Internet wächst und gedeiht. Es bringt neue Arbeitsplätze und schafft eine gute Basis für Neugründungen. Unter diesen Firmenneugründungen befinden sich auch sehr viele Internet Service Provider, die durch ihren Preis bestechen. Doch nicht nur der Preis ist bei der Providerwahl entscheidend. Neben dem Finanziellen stellt auch die zur Verfügung gestellte Bandbreite eine entscheidende Richtlinie zur Auswahl Sandini Bib 50 2 Netzwerk-Tools dar. Wer sich nicht auf die providereigenen Angaben über die Geschwindigkeit ins Internet verlassen will, kann diese mit Traceroute testen und entscheiden. Nachdem Sie das Preis/Leistungsverhältnis dank Traceroute einsehen konnten, stellt sich noch die Frage, ob wirklich jeder Provider sein eigener Chef ist und sein eigenes Rechenzentrum besitzt. In der Praxis ist dies nicht immer der Fall. Ein eigenes Rechenzentrum kostet enorm viel Geld, Fachwissen und Administrationsaufwand. Viele Neueinsteiger wollen anfangs natürlich die Kosten gering halten und fragen daher an, ob Sie sich vielleicht in ein anderes Rechenzentrum einmieten können. Mit Traceroute haben Sie die Möglichkeit genau festzustellen, wo dieses Rechenzentrum ist und wie schnell es erreichbar ist. Wie und ob Sie diese Information nutzen, bleibt Ihnen überlassen. Aber es ist immer besser, etwas mehr zu wissen. Erreichbarkeit Es kann durchaus von Vorteil sein, die Erreichbarkeit eines bestimmten Rechners oder Netzwerkes von mehreren Stellen aus zu testen oder auch zu bestimmen Tageszeiten (zum Beispiel merken es einige Internetsurfer extrem, wie ihr Datendurchsatz an Feiertagen dank der Telekom-XXL-User sinkt). Erstellung eines Netzwerkplans Dokumentation ist ein wichtiger Bestandteil der Aufgaben eines Administrators. Traceroute kann dabei sehr hilfreich sein, indem es zum Beispiel fast die komplette Routenplanerstellung übernimmt. Datenversand im Internet Nachdem wir nun wissen, wozu man dieses Programm nutzen kann, sollten wir uns daran machen, seine Funktionsweise zu verstehen. Um diese vollkommen zu verstehen, müssen wir als Erstes wissen, wie man im Internet Daten verschickt. Nehmen wir dazu an, dass Sie eine Datei auf einen FTP-Server schieben wollen. Das Einzige, was Sie vom Datenversand mitbekommen, ist Ihre Befehlseingabe und das Feedback des FTP-Servers: ftp www.server.de put datei quit Das sind die einzigen Befehle (außer der Authentifizierung), die Sie angeben müssen. Den Rest erledigen das File Transport Protocol und die aufgerufene Applikation für Sie. (Dabei ist es egal, ob Sie nun eine Datei auf einen FTP-Server schieben oder eine Internetseite öffnen wollen. Das Prinzip ist immer dasselbe). Als Erstes wird Ihre Datei in kleine Stücke zerlegt, die sich alle einzeln auf den Weg zum Ziel machen. Um dieses Ziel zu erreichen müssen diese Pakete bestimmte Gateways passieren, welche die Pakete an den nächsten weiterreichen. Dieser Prozess wird so lange durchgeführt, bis das Paket am Zielort angekommen ist. Dort wird es wieder zusammengebaut und auf Fehler überprüft. Außerdem erhält der Absender eine Antwort, Sandini Bib 2.1 Traceroute 51 dass alles gut geklappt hat. Dies war im Groben das Prinzip der Datenübertragung im Internet. Damit Sie die Funktionsweise von Traceroute aber verstehen können, müssen wir noch etwas tiefer in die Materie einsteigen. Wie Sie gesehen haben, passieren die versendeten Pakete Vermittlungsstellen (so genannte Gateways), welche die Pakete dann weiterleiten. Falls nun auf dem Weg zum Ziel ein Problem auftaucht (es könnte zum Beispiel ein Gateway nicht erreichbar sein), so wird das Paket zurückgeschickt und über einen anderen Weg weitergeleitet. Aus diesem Zurückschicken und Umleiten kann aber sehr schnell ein großes Problem mutieren. Es könnte nämlich durchaus vorkommen, dass ein Gateway (zum Beispiel ein Router) fehlerhaft arbeitet und die Pakete immer wieder zu seinem »Vordermann« zurückschickt, was wiederum zu einer Endlosschleife führen könnte. Um dies zu verhindern, hat man eine Begrenzung eingeführt, die besagt, dass maximal 255 Vermittlungsstellen passiert werden dürfen. Dies wird dadurch erreicht, dass Pakete einen bestimmten (8 Bit großen) Wert zugewiesen bekommen, der zwischen 0 und 255 liegen muss. Jeder Gateway, der passiert wird, hat nun die Aufgabe diesen Wert um 1 zu verringern. Erreicht diese Zahl den Wert 0, so wird das Paket gelöscht und der Gateway versendet eine Time exceeded in transit-Nachricht (über das Internet Control Message Protocol) an die Absendermaschine, was Ihnen diese über die Ausgabe eines time out auf Ihrem Bildschirm mitteilt. Sie brauchen sich jetzt aber keine Sorgen zu machen, dass Pakete, die einen langen Weg bis zum Ziel vor sich haben, nicht ankommen könnten, da zu viele Gateways passiert werden müssten. Das ist ausgeschlossen, da die meisten Rechner im Internet über 15 Hops (so nennt man den Sprung über einen Gateway) zu erreichen sind. Die Begrenzung für das Passieren der Gateways nennt man time-to-live-Wert (TTL) und genau hier setzt Traceroute an. Wie funktioniert Traceroute? Traceroute nutzt diesen time-to-live-Wert, um Ihnen alle passierten Hops mitzuteilen. Im Grunde ist die Funktionsweise einfach. Machen Sie sich das gerade eben verdeutlichte Modell der Datenübertragung im Internet noch einmal klar, denn genauso funktioniert Traceroute. Nachdem Sie Traceroute gestartet haben, generiert das Programm drei Pakete und setzt den time-to-live-Wert dieser Pakete auf 1. Natürlich werden diese Pakete nie beim Zielrechner ankommen (außer es liegt nur ein Gateway zwischen Sender und Empfänger), da der erste Gateway den Wert um eins verringert und die Pakete somit gelöscht werden und der Absender eine Fehlermeldung bekommt. Anhand dieser Fehlermeldung weiß Traceroute, dass das Paket angekommen ist, und erfährt gleichzeitig die IP des Gateways. Jetzt schickt das Programm wieder drei Pakete auf die Reise zum Zielrechner, doch diesmal setzt es den TTL-Wert auf 2, so dass auch der zweite Gateway erreicht wird. Dieses Spiel wird so lange wiederholt, bis die Pakete verloren gehen oder an ihrem Bestimmungsort angekommen sind. Sandini Bib 52 2 Netzwerk-Tools 2.2 IPTraf 2.2.1 Allgemeines Dieses von Gerard Paul Java geschriebene Programm ist eines der besten Network Statistics Utilities, die es auf dem Markt gibt. Wie Sie in der folgenden Auflistung sehen werden, erlaubt Ihnen dieses ncurses-basierende Program verschiedenste Statistiken anfertigen zu lassen. Im Laufe des Kapitels werden Sie mehr über diese Statistiken und die dazugehörigen Module erfahren. Dafür nehmen wir das offizielle Howto von Gerard Paul Java zur Hand. TCP Info UDP Counts ICMP und OSPF Informations Ethernet Load Info Node Stats IP Checksum Errors Und so weiter Bevor wir uns an die genaue Beschreibung dieses Netzwerk-Monitors machen, werde ich Ihnen ein kurzes Summary über dieses Programm vorstellen, damit Sie einen Überblick bekommen, was dieses Programm für Sie leisten kann. Funktionsumfang Dieses Programm enthält einen IP-Traffic-Monitor, der Ihnen ein Bild über den IP-Datenverkehr, der sich über Ihr Netzwerk bewegt, verschafft. Dazu gehören Informationen über die TCP-Flags, Paket- und Byte-Counts. Außerdem noch Details über ICMP- und OSPF-Pakettypen. Zeigt allgemeine und detaillierte Interfacestatistiken über IP, TCP, UDP, ICMP, non-IP und andere IP-Pakete, IP-Checksummenfehler, Interfaceaktivitäten und Statistiken über die Größe der passierenden Pakete. Einen TCP- und UPD-Service-Monitor, der Ihnen anzeigt, wie viele eingehende und ausgehende Pakete gezählt wurden. Ein LAN-Statistik-Modul, das aktive Hosts sucht und deren Datentransferaktivität aufzeigt. TCP-, UDP- und andere Displayfilter, die es Ihnen ermöglichen, nur die Daten anzeigen zu lassen, die Sie auch sehen wollen. Eine Loggingfunktion Unterstützt Ethernet, FDDI, ISDN, SLIP, PPP und loopback Interfacetypen Sandini Bib 2.2 IPTraf 53 Macht sich das build-in-raw-Interface des Linuxkernels zu Nutzen, um über eine enorm große Anzahl von verschiedenen Netzwerkkarten verfügbar zu sein. Menügesteuert Unterstützte Protokolle IP TCP UDP ICMP IGMP IGP IGRP OSPF ARP RARP Nicht-IP-Packete werden einfach als »non-IP« deklariert und – in Ethernet LANS – mit der passenden Ethernetadresse versorgt. Unterstützte Schnittstellen Local loopback All Linux-supported Ethernet interfaces All Linux-supported FDDI interfaces SLIP Asynchronous PPP Synchronous PPP over ISDN ISDN with Raw IP encapsulation ISDN with Cisco HDLC encapsulation Parallel Line IP Nun sollten Sie oberflächlich über IPTraf Bescheid wissen und wir können uns an die Installation machen. 2.2.2 Installation Bevor wir das Paket installieren können, müssen wir es aus einer sicheren Quelle beziehen. Da die meisten Distributionen IPTraf mitliefern, können Sie sich den Download sparen. Falls Sie aber die aktuellste Version haben wollen, werden Sie daran nicht vorbeikommen. Eine mögliche Bezugsadresse wäre: ftp://iptraf.seul.org/pub/ iptraf. Sandini Bib 54 2 Netzwerk-Tools Falls Sie das Paket über den Installationsmanager Ihrer Distribution installieren, können Sie diesen Punkt überspringen, falls nicht, folgen Sie bitte den Anweisungen um das Programm korrekt in Ihr System mit einzubinden. Als Erstes müssen Sie das Paket entpacken. Dazu geben Sie bitte folgende Befehle ein: Linux:~# tar zxvf iptraf-version.i386.bin.tar.gz Linux:~# cd iptraf-version Linux:~# ./Setup Damit werden alle benötigten Ordner und Dateien erzeugt und Sie können IPTraf starten. 2.2.3 Start IPTraf bietet Ihnen für die Arbeit ein sehr gutes Menü an. Dieses können Sie von der Konsole mit folgendem Befehl aufrufen: Linux:~# iptraf Nachdem Sie den Befehl ausgeführt haben, erscheint das in Abbildung 2.1 gezeigte Menü. Abbildung 2.1 Hauptmenü Sie können IPTraf aber auch mit einigen Argumenten starten. Was diese bewirken wird Ihnen Tabelle 2.2 zeigen. Sandini Bib 2.2 IPTraf 55 Argumente Beschreibung -i iface Wenn Sie dieses Argument übergeben, zeigt Ihnen IPTraf sofort das gewünschte Interface, falls Sie -i all übergeben, werden Ihnen alle Interfaces gezeigt. -g Startet die allgemeinen Interface-Statistiken -d iface Zeigt detaillierte Statistiken für das spezifizierte Interface -s iface Startet den TCP/UDP Traffic-Monitor für das angegebene Interface -z iface Startet den Packet Size Breakdown für das angegebene Interface -l iface Startet den LAN Station Manager für das aufgeführte Interface. Auch hier hat man die Möglichkeit mit -l all alle Interfaces aufzeigen zu lassen. -t timeout Diesen Parameter finden Sie nur in der Kommandozeile; im Menümodus wird er ignoriert. Falls Sie dieses Argument zusätzlich mit einem anderen übergeben, wird die aufgerufene Option für timeout Minuten aktiv sein. Falls Sie diesen Parameter nicht angeben, wird die Option so lange laufen, bis Sie den Exitbutton betätigen. -B Diese Option leitet alle Ausgaben nach /dev/null (ins Nirwana), schließt die Standardeingabe und stellt das Programm in den Hintergrund. Dieses Argument kann nur zusammen mit den Optionen: -i, -g, -d, -s, -z oder -l übergeben werden. -L Dateiname Mit dieser Option können Sie ein eigenes Logfile spezifizieren, falls Sie keinen absoluten Pfadnamen angeben, wird ein neuer Ordner im Standardlogverzeichnis erstellt. -q Diesen Parameter benötigen Sie nicht mehr. -f Seien Sie bei der Benutzung dieses Parameters sehr vorsichtig, er bewirkt, dass IPTraf alle Einstellungen auf Null zurücksetzt und somit »denkt«, es wäre sein erster Aufruf. -h Ruft die Hilfefunktion auf Tabelle 2.2 Parameter für IPTraf 2.2.4 IPTraf Basics Bevor wir auf die einzelnen Möglichkeiten, die dieses Programm bietet, eingehen, werden wir einige Basics darüber erfahren. Zahlensystem IPTraf kann Bytes und Pakete als Wert (Counts) ausgeben. Wenn diese größer werden, passt es das Programm an und stellt Ihnen eine andere Werteeinheit vor. Eine Zahl, die alleine – ohne einen Anhang – ausgegeben wird, stellt einen exakten Wert dar. In Tabelle 2.3 sehen Sie alle möglichen Einheiten, die einer Zahl vorgestellt werden können, und die passende Erklärung dazu. Sandini Bib 56 2 Netzwerk-Tools Anhang Bedeutung K K steht für Kilo und bedeutet tausend M M steht für Mega und bedeutet eine Million G G steht für Giga und bedeutet eine Milliarde T T steht für Tera und bedeutet eine Billion Tabelle 2.3 Mögliche Zahlenwerte Tabelle 2.4 enthält einige Beispiele zu diesen Zahlenwerten Beispiel Bedeutung 18827937 18827937 1882K Ungefähr 1882000 1882M Ungefähr 1882000000 1882G Ungefähr 1882000000000 1882T Ungefähr 1882000000000000 Tabelle 2.4 Beispiele zu den Zahlenwerten Instanzen und Logging Seit Version 2.4 ist es möglich, mehrere Instanzen eines Moduls zur selben Zeit in unterschiedlichen Prozessen laufen zu lassen (so können Sie jetzt zum Beispiel mehre IP Traffic-Monitore laufen lassen), obwohl Sie dabei unbedingt beachten müssen, dass jeweils nur eine Instanz auf ein bestimmtes Interface »lauschen« kann (oder auf alle). Wie jede Regel hat auch diese eine Ausnahme. So können Sie dieses neue Feature für alle Module anwenden bis auf das General Interface Statistics Modul, welches immer noch auf eine Instanz beschränkt ist. Diese Neuerung hat zur Folge, dass nun jede Instanz eigene Logfiles mit dem jeweiligen Instanznamen abhängig von ihrer Instanz oder vom Interface, auf dem sie lauschen generiert. Falls Sie die Loggingoption aktiviert haben, wird IPTraf Sie nach einem Dateinamen dafür fragen und Ihnen dabei auch einen Defaultnamen vorschlagen. Sie können diesen Defaultwert oder den von Ihnen spezifizierten Dateinamen mit Drücken der Eingabetaste (Enter) annehmen oder Logging mit der Tastenkombination (STRG) + (X) abschalten. Abbildung 2.2 zeigt das dazugehörige Menüfenster. Sandini Bib 2.2 IPTraf 57 Abbildung 2.2 Dateiname für Logfile Unterstütze Netzwerkinterfaces Tabelle 2.5 zeigt die derzeit unterstützten Netzwerkinterfacetypen. Interfacetyp Beschreibung Lo lo bezeichnet das Loopbackinterface (IP-Adresse ist 127.0.0.1) eth n Eth bezeichnet ein Ethernetinterface, n beginnt bei 0 und erhöht sich für jedes weitere Interface um den Wert eins. So lautet das erste Ethernetinterface eines Rechners eth0, das zweite eth1 und so weiter. Fddi n Bezeichnet ein FDDI Interface, wobei auch hier n bei 0 beginnt. Ppp n Bezeichnet ein PPP Interface, auch hier startet n bei 0 und erhöht für jedes weitere Interface den Wert um 1. sli n Bezeichnet ein SLIP Interface, auch hier beginnt n bei 0. ippp n Bezeichnet ein synchrones PPP Interface, welches ISDN benützt, n startet auch hier bei 0. isnd n Obwohl man ISDN Interfaces willkürliche Namen geben kann, sollte man diese isdn n (n steht hier wieder für einen Wert beginnend bei 0, so dass das erste Interface den Namen isdn0, das zweite isdn1 … trägt), nennen, da nur so gewährleistet ist, dass IPTraf mit Ihren ISDN Interfaces arbeiten kann. IPTraf unterstützt neben dem oben erwähnten synchronen ISDN auch raw IP und Cisco HDLC encapsulation. plip n Bezeichnet plip-Interfaces, das sind Point–to–Point-Verbindungen, die über den Parallelport laufen. Tabelle 2.5 Unterstützte Netzwerkinterfacetypen Bitte benutzen Sie die in Tabelle 2.5 aufgeführten Namen für Ihre Interfaces, da IPTraf ansonsten nicht korrekt funktionieren wird. Sandini Bib 58 2.2.5 2 Netzwerk-Tools IP Traffic-Monitor Falls Sie IPTraf mit der Option –i starten oder den ersten Punkt im Menü ausführen, gelangen Sie zu dem IP Traffic-Monitor. Der IP Traffic-Monitor ist ein Echtzeit-Überwachungssystem, das alle Pakete auf den erkannten Interfaces abfängt und die Informationen darin dekodiert und anzeigt. Zusätzlich wird auch das dazugehörige Protokoll dazu ausgegeben. Der IP Traffic-Monitor besteht aus zwei Fenstern. Beide können durch den Up- und Down-Button durchgescrolled werden. Abbildung 2.3 zeigt den IP Traffic-Monitor. Abbildung 2.3 IP Traffic Monitor Im Folgenden werden wir sehen, welche Informationen die beiden Fenster beinhalten und wie man sie steuern kann. Das obere Fenster Dieses Fenster zeigt die aktuell erkannten TCP-Verbindungen und Informationen über die TCP-Pakete. Man kann es in folgende Unterpunkte aufteilen: Quelladresse und Quellport Packet count Byte count Quell Mac-Adresse Packetgröße Window-Größe TCP Flag-Status Closed/Idle/Timed Out Connections Sortieren der TCP-Einträge Sandini Bib 2.2 IPTraf 59 Quelladresse und Quellport Wie der Name schon sagt, kann man hier die Quelladresse und den Quellport eines Pakets – dargestellt durch address:port – ersehen. Packet count Zeigt die Anzahl der bei dieser TCP-Verbindungen angekommenen Pakete. Byte count Dieses Feld zeigt die Anzahl, der Bytes, die bei dieser TCP-Verbindung angekommen sind. Die Summe dabei errechnet sich aus dem kompletten IP bzw. TCP Header und den aktuellen Daten, Data Link Header werden dabei nicht mit eingerechnet. Quell Mac-Adresse Gibt die Mac-Adresse des Host in Ihrem LAN an, der das Paket übergeben hat. Dies kann man durch Drücken der M-Taste ersehen, falls man Source MAC addrs in traffic monitor im Configure…- Menü aktiviert hat. Paketgröße Dieses Feld gibt die Größe des zuletzt angekommenen Pakets an, wobei auch hier der Data Link Header nicht mit eingerechnet ist. Wie auch schon das Feld zuvor können Sie dieses durch Drücken der M-Taste für mehr TCP-Informationen einsehen. Window-Größe Durch Drücken der M-Taste können Sie bei diesem Feld die Window-Größe des zuletzt angekommenen Paketes einsehen. TCP Flag-Status Dieses Feld zeigt Ihnen die Flags des zuletzt angekommenen Pakets an. Mögliche Optionen hierbei könnten sein: Flag Erklärung S Beschreibt ein SYN Flag. Um eine Verbindung vorzubereiten, wird hierbei eine Synchronisation vorgenommen. Falls nur ein S (S--) vorhanden ist, will der Quellhost eine Verbindung initialisieren. Falls auch ein A vorhanden ist (S-A-), handelt es sich um ein Acknowledgement als Antwort auf eine bereits gestellte Verbindungsanfrage. A ACK. Hierbei handelt es sich wie bereits beschrieben um ein Acknowledgement auf ein empfangenes Paket. P PSH beschreibt eine Anfrage alle Daten an die Spitze der Warteschlange zu stellen. U URG besagt, dass das Paket wichtige Daten enthält. RESET Ein RST Flag besagt, dass der Quellhost die Verbindung beendet. DONE Alle Daten der Verbindung und ein FIN-Paket wurden gesendet, um die Verbindung zu beenden. Der andere beteiligte Host hat dem aber noch nicht zugestimmt. Tabelle 2.6 Mögliche Optionen für Flag-Status Sandini Bib 60 2 Netzwerk-Tools Flag Erklärung CLOSED Hierbei wurde das FIN-Paket durch den anderen Host mit einem angenommen und zugestimmt (acknowledged). - Es ist kein Flag gesetzt. Tabelle 2.6 Mögliche Optionen für Flag-Status (Forts.) Closed/Idle/Timed Out Connections Ein TCP-Verbindungseintrag, der geschlossen wird, wird zurückgesetzt oder bleibt untätig, bis er durch neue Verbindungen ersetzt wird. Falls diese aber zu häufig vorkommen, kann es zu Fehlern kommen. IPTraf kann auch hier Abhilfe schaffen. Es kann so konfiguriert werden, dass es automatisch alle geschlossenen, zurückgesetzten oder untätigen Verbindungen löscht (dies erreichen Sie durch die TCP closed/idle persistence-Konfigurationsoption oder durch Drücken der Taste (F)). Sortieren der TCP-Einträge IPTraf bietet die Möglichkeit TCP-Einträge mit Hilfe von einigen setzbaren Kriterien zu sortieren. Das Fenster mit den verfügbaren Sortierungskriterien erreichen Sie durch Drücken der Taste (S). Falls Sie die Einträge nach packet counts sortieren wollen, benützen Sie die Taste (P), für ein Sortieren nach byte counts die Taste B. Falls Sie eine andere Taste betätigen, wird das Fenster geschlossen und die Aktion abgebrochen. Abbildung 2.4 TCP-Einträge nach bestimmten Kriterien sortieren Sandini Bib 2.2 IPTraf 61 Das untere Fenster Dieses Fenster bringt Ihnen ebenfalls einige Informationen über den Datenverkehr in Ihrem Netzwerk näher. Im Folgenden sehen Sie eine Auflistung der hier erkannten Protokolle: User Datagram Protocol (UDP) Internet Control Message Protocol (ICMP) Open Shortest-Path First (OSPF) Interior Gateway Routing Protocol (IGRP) Interior Gateway Protocol (IGP) Internet Group Management Protocol (IGMP) General Routing Encapsulation (GRE) Address Resolution Protocol (ARP) Reverse Address Resolution Protocol (RARP) Von allen Paketen werden Sie hier nur das erste IP-Fragment aufgezeigt finden. Damit Sie die Protokolle leichter erkennen können, hat man sich dazu entschlossen, jedem einen bestimmten Farbcode zuzuteilen. Tabelle 2.7 zeigt zu jedem Protokoll die dazugehörigen Farben. Protokoll Farbschema UDP Rot auf Weiß ICMP Gelb auf Blau OSPF Schwarz auf Zyan IGRP Helles Weiß auf Zyan IGP Rot auf Zyan IGMP Hellgrün auf Blau GRE Blau auf Weiß ARP Helles Weiß auf Rot RARP Helles Weiß auf Rot Anderes IP Gelb auf Rot Non IP Gelb auf Rot Tabelle 2.7 Farbschemata zu den dazugehörigen Protokollen Sie können auch hier durch die möglichen 512 Einträge mit den Up- und DownTasten scrollen. Außerdem scrollt IPTraf automatisch jedes Mal, wenn ein neuer Eintrag hinzukommt. Falls mehr als 512 Einträge in der Liste sind und neue dazukommen, werden die alten gelöscht. Sandini Bib 62 2 Netzwerk-Tools Bei Paketen, die von einem Host im LAN geschickt wurden, wird zusätzlich noch die MAC-Adresse des Absenders angezeigt (Sie können dies durch das Aktivieren der Source MAC addrs in traffic monitor-Option im Konfigurationsmenü erreichen). Grundsätzlich enthält ein Eintrag im unteren Fenster das Protokoll des Pakets, die IP Datagrammgröße, die Quell- und Zieladresse und das Interface, an dem das Paket angekommen ist. Bei bestimmten Protokollen ist es jedoch der Fall, dass mehr Informationen angezeigt werden. Für welche Protokolle dies gilt und welche zusätzlichen Informationen angezeigt werden, können Sie im Folgenden ersehen. ICMP ICMP-Einträge haben folgendes Format: ICMP type (subtype) (size bytes) from source to destination [(src HWaddr srcMACaddress)] on interface Tabelle 2.8 zeigt mögliche Werte für das Argument type. Werte Beschreibung echo req, echo rply ICMP echo request und reply. Normalerweise von Ping und anderen Netzwerkdiagnoseprogrammen genutzt. dest unrch ICMP destination unreachable. Ein Fehler ist aufgetreten, so dass das Ziel nicht erreicht werden konnte. redirect ICMP redirect. Normalerweise werden diese Nachrichten von einem Router generiert, um den Host mitzuteilen, dass ein besserer Gateway zur Verfügung steht. src qnch Das ICMP source quench ist eine Art von Flowcontrole-Mechanismus, der dem Host dazu bringt, nichts mehr zu übermitteln. time excd Zeigt TTL-Werte derjenigen Pakete an, die ihr Ziel nicht erreicht haben. Meistens liegt das daran, dass das Ziel zu weit entfernt oder nicht erreichbar ist. router adv ICMP router advertisement router sol ICMP router solicitation timestmp req ICMP timestamp request timestmp rep ICMP timestamp reply info req ICMP information request info rep ICMP information reply addr mask req ICMP address mask request addr mask rep ICMP address mask reply param prob ICMP parameter problem bad/unknown Ein nicht bekanntes oder beschädigtes ICMP-Paket wurde empfangen. Tabelle 2.8 Mögliche Wert für type Sandini Bib 2.2 IPTraf 63 Auch Destination Unreachable enthält weiterführende Informationen. Die möglichen Argumente hierfür finden Sie in Tabelle 2.9. Argumente Erklärung ntwk Netzwerk nicht erreichbar host Host nicht erreichbar proto Protokoll nicht erreichbar port Port nicht erreichbar pkt fltrd Paket gefiltert (normalerweise bei einer ACL auf einer Firewall oder auf einem Router) DF set Das Paket muss an irgendeiner Stelle geteilt werden, doch das don’t fragment bit ist gesetzt. src rte fail Quellroute ist fehlgeschlagen src isltd Quelle ist isoliert (nicht mehr in Gebrauch) net comm denied Network communication denied nost comm denied Host communication denied net unrch for TOS Das Netzwerk ist für den spezifizierten type-of-service-Wert nicht erreichbar. host unrch for TOS Der Host ist für den spezifizierten type-of-service-Wert nicht erreichbar. prec violtn Precedence violation (Verletzung der Priorität) prec cutoff Precedence cutoff dest net unkn Zielnetzwerk nicht bekannt dest hots unkn Zielhost nicht bekannt Tabelle 2.9 Argumente für Destination Unreachable OSPF Auch das OSPF-Protokoll schenkt uns mehr Informationen. Das Format hierfür sieht folgendermaßen aus: OSPF type (a=area r=router) (size bytes) from source to destination [(src HWaddr srcMACaddress)] on interface Tabelle 2.10 zeigt mögliche Werte für das Argument type. Wert Beschreibung hlo OSPF hello. Diese Nachrichten bauen OSPF-Verbindungen auf und halten Router über die Verfügbarkeit auf dem Laufenden. DB desc OSPF Database Description LSR OSPF Link State Request Tabelle 2.10 Mögliche Werte für type Sandini Bib 64 2 Netzwerk-Tools Wert Beschreibung LSU OSPF Link State Update. Diese Nachrichten zeigen den Status eines Netzwerklinks. LSA OSPF Link State Acknowledgement Tabelle 2.10 Mögliche Werte für type (Forts.) 2.2.6 General Interface Statistics Die zweite Menüoption, die uns IPTraf bietet, gibt uns die Möglichkeit eine Auflistung aller verbundenen Netzwerkschnittstellen und einige allgemeine Informationen über Paket Counts zu erhalten. Wie Sie aus Abbildung 2.5 ersehen können, werden ein- und ausgehende Pakete gezählt und in drei Bereiche aufgeteilt: 1. IP 2. Non IP 3. Bad IP (für IP Checksummenfehler) 4. Außerdem enthält dieses Menüfenster ein Activityfeld, welches uns über den Netzwerkverkehr auf dem Interface unterrichtet (Sie können zwischen kbits/ s und k/bytes im Activity Mode im Konfigurationsmenü wechseln). Abbildung 2.5 General Interface Statistics Falls Sie direkt von der Konsole in dieses Menüfenster gelangen wollen, geben Sie bitte folgenden Befehl ein: Linux:~# iptraf –g Um von diesem Menüpunkt wieder zurück ins Hauptmenü zu kommen, drücken Sie bitte die Tasten (X) oder (Q). Sandini Bib 2.2 IPTraf 2.2.7 65 Detailed Interface Statistics Dieser dritte Menüpunkt ist dem General Interface Statistics Menüpunkt sehr ähnlich, gibt uns aber – wie Sie der nächsten Auflistung entnehmen können – wesentlich mehr Informationen aus: IP packet und byte counts TCP packet und byte counts UDP packet und byte count ICMP packet und byte counts Andere IP-Typen packet und byte counts Non-IP packet und byte counts Checksummenfehler count Interface-Aktivität Wie Sie anhand von Abbildung 2.6 sehen können, beinhaltet der obere Teil des Menüfensters byte und packet counts für abgefangenen IP- und Non-IP-Pakete. Den unteren Teil bildet die Gesamtheit alle eingehenden und ausgehenden Datenraten. Auch hier können Sie im Konfigurationsmenü wieder bestimmen, in welcher Einheit (kbits/s oder kbytes/s) die Raten angezeigt werden sollen. Falls Sie diesen Menüpunkt direkt von der Konsole aus aufrufen wollen, geben Sie bitte folgenden Befehl ein: Linux:~# iptraf –d eth0 Diese Syntax wird das Menü aufrufen und es veranlassen auf dem Interface eth0 zu lauschen. Welches Interface Sie bei diesem Befehl übergeben, bleibt Ihnen überlassen, Sie sollten jedoch darauf achten, dass Sie eines angeben, da IPTraf ansonsten nicht starten wird. Abbildung 2.6 Detailed Interface Statistics Sandini Bib 66 2.2.8 2 Netzwerk-Tools Statistical Breakdowns Statistical Breakdown: Packet Sizes Falls Sie IPTraf schon länger benutzen, werden Sie sich vielleicht daran erinnern, dass dieses Modul früher in detailed interface statistics eingebettet war. Doch nun hat man sich entschlossen daraus einen eigenen Menüpunkt zu machen, der die Aufgabe hat, die Maximum Transmission Unit (MTU) der Schnittstelle in 20 Teile aufzusplittern, wobei jeder Teil einen bestimmten Bereich umfasst. In Abbildung 2.7 können Sie diesen Menüpunkt betrachten. Abbildung 2.7 Statistical Breakdown: Packet Sizes Natürlich können Sie auch diesen Punkt direkt von der Konsole aufrufen. Geben Sie dazu folgenden Befehl ein: Linux:~# iptraf –z interface Beachten Sie dabei, dass Sie ein Interface (zum Beispiel eth0) angeben, da IPTraf ansonsten nicht starten wird. Falls Sie Logging aktiviert haben, so finden Sie die Logdateien für diesen Punkt unter folgendem Namen: packet_size-interface.log Statistical Breakdown: TCP and UDP Traffic Statistics Dieser Menüpunkt generiert TCP- und UDP-Statistiken und zeigt Ihnen dabei alle Counts an, die als Ziel oder als Quelle einen Port haben, der unter 1024 liegt (well-known Ports). Natürlich gibt es aber auch Applikationen, die Ports über dieser Grenze benutzen. Falls diese für Sie interessant sind, können, Sie sie über Sandini Bib 2.2 IPTraf 67 den Menüpunkt Configure/Additional port... ebenfalls der Überwachung durch IPTraf unterstellen. Wie Sie anhand von Abbildung 2.8 sehen können enthält dieses Fenster folgende Informationen: Protokoll (TCP oder UDP) Portnummer Die Anzahl der Counts (Pakete und Bytes), die diese spezielle Port/Protokoll Kombination aufweisen Die Anzahl der Counts, die für eine bestimmte Port/Protokoll-Kombination bestimmt waren Die Anzahl der Counts, die von dieser Port/Protokoll Kombination kommen Beachten Sie dabei bitte, dass auch hierbei der Data Link Header nicht zu den Bytes dazugerechnet wird. Abbildung 2.8 Statistical Breakdown: TCP and UDP Traffic Statistics Wie Sie weiter aus Abbildung 2.8 ersehen können, sind Einträge, die das UDP betreffen, grün unterlegt und TCP-Einträge gelb. Die Standardlogdatei finden Sie unter folgendem Namen: tcp_udp_services-interface.log TCP/UDP Einträge sortieren Auch hier haben wir wieder die Möglichkeit unsere Einträge nach bestimmten Kriterien sortieren zu lassen. Um das Fenster mit den möglichen Optionen dazu zu öffnen drücken Sie bitte die (S)-Taste und es wird das in Abbildung 2.9 gezeigte Fenster erscheinen, welches Ihnen einige Optionen für das Sortieren zur Auswahl stellt. Sandini Bib 68 2 Netzwerk-Tools Abbildung 2.9 Sortierungsfunktion Um diesen Menüpunkt direkt von der Shell aufzurufen benötigen Sie folgenden Befehl: Linux:~# iptraf –s interface 2.2.9 LAN Station Statistics Wie Sie aus Abbildung 2.10 erkennen können, steht vor jeder Statistikzeile eine gelbe Zeile, die die Mac-Adresse und den LAN Type (Ethernet, PLIP, FDDI) aufzeigt. Die darunter liegende Zeile beinhaltet dahingegen sehr viel mehr Informationen. Welche das genau sind, erfahren Sie im Folgenden: Gesamtsumme aller eingehenden Pakete Gesamtsumme aller eingehenden IP-Pakete Gesamtsumme der eingehenden Bytes Eingangsrate Gesamtsumme aller ausgehenden Pakete Gesamtsumme aller ausgehenden IP-Pakete Gesamtsumme der ausgehenden Bytes Ausgangsrate (Sie können auch hier die Raten im Activity mode des Konfigurationsmenüs – kbits/s oder kbytes/s – ändern) Bitte beachten Sie dabei, dass bei der Data Link Header diesmal in den Bytes eingerechnet ist. Die Standardloggingdatei für dieses Modul heißt lan_ statistics-n.log, wobei n für die jeweilige Instanz steht. Sandini Bib 2.2 IPTraf 69 Abbildung 2.10 LAN Station-Monitor Sortieren der Einträge An dieser Stelle des Kapitels werden Sie sicherlich nicht mehr überrascht sein, dass uns die Option zur Verfügung steht, und Sie werden inzwischen auch eine gewisse Intuition für deren Bedienung entwickelt haben. Nichtsdestotrotz wollen wir auch jetzt wieder auf die Sortierungsoption eingehen und werfen dazu einen Blick auf Abbildung 2.11, wo wir erkennen können, dass diese Option mit der Taste (S) aufgerufen wird. Die weiteren Tastenkombinationen werde ich nicht mehr ansprechen, da Sie sie ja aus der Abbildung ablesen können. Abbildung 2.11 Sortierungsfunktion des LAN Station-Monitors Sandini Bib 70 2 Netzwerk-Tools 2.2.10 Anzeigefilter Dieses Modul ist kein Überwachungsmonitor oder Ähnliches, es gibt uns vielmehr die Möglichkeit die von IPTraf angezeigten Informationen so zu filtern, dass aus dieser unglaublich großen Menge an Daten die für uns wichtigen auf dem Monitor sichtbar werden. Solche Filter wirken sich auch auf die Logeinträge aus. Abbildung 2.12 zeigt Ihnen, wie Sie diesen Menüpunkt erreichen. Abbildung 2.12 Anzeigefilter Wie Sie dort erkennen können, erreichen Sie das Managementsystem der Anzeigefilter durch das Submenü FILTERS... . Dort haben wir die Auswahl zwischen folgenden Filtern, die wir sogleich genauer besprechen werden: TCP UDP Other IP ARP RARP Non IP TCP-Filter Aus Abbildung 2.13 können Sie erkennen, dass – falls Sie die TCP-Filter-Option ausgewählt haben – ein neues Popupfenster aufspringt, welches Ihnen einige Optionen bietet, um die Ausgabe bestimmter TCP-Verbindungen zu unterbinden oder zu verändern. Sandini Bib 2.2 IPTraf 71 Abbildung 2.13 TCP-Filter-Option Define new filter… Die erste Option, die uns vom Popupfenster zur Verfügung gestellt wird, ist nach einer Neuinstallation von IPTraf sicherlich die interessanteste, da IPTraf an dieser Stelle noch keine Filter kennt. Wenn Sie diesen Punkt ausführen, wird das in Abbildung 2.14 gezeigte Fenster aufgehen und Sie nach einer Beschreibung für den neuen Filter fragen. Geben Sie dort bitte einen passenden Namen ein und bestätigen Sie Ihre Eingabe. Abbildung 2.14 Define new filter Sandini Bib 72 2 Netzwerk-Tools Wenn Sie eine Beschreibung für Ihren neuen Filter angegeben haben, wird das in Abbildung 2.15 gezeigte Fenster aufspringen und Sie wieder nach einigen Informationen fragen. Abbildung 2.15 Informationen für TCP-Filter Füllen Sie als Erstes das Feld HOST NAME / IP ADDRESS aus. Um in das nächste Feld zu hüpfen, benutzen Sie bitte die Tab–Taste. Falls Sie sich fragen, warum Sie an dieser Stelle zwei Felder für die Angabe einer IP-Adresse finden, müssen Sie sich nur kurz ins Gedächtnis rufen, dass eine TCP-Verbindung einen End- und einen Startpunkt hat, und genau diese beiden Punkte geben Sie in den Feldern an. Dabei ist es egal, in welcher Reihenfolge Sie die Punkte angeben (ob zuerst Startoder Endpunkt). Danach kommen Sie in das Feld WILDCARD MASK. Diese Maske ist der Subnetmask sehr ähnlich, aber auf keinen Fall dasselbe. Sie benutzen diese Option, um bestimmte Bits zu ignorieren. Setzen Sie eine 1 unter ein Bit, das Sie erkennen wollen, und eine 0 unter diejenigen, die ignoriert werden sollen. Im Folgenden sind einige Beispiele aufgeführt, die Ihnen helfen die Wildcard mask zu verstehen. Um den Host 207.0.115.44 zu erkennen Enter IP address:207.0.115.44 Wildcard mask: 255.255.255.255 Um alle Host, die zum Netzwerk 202.47.132.x gehören, zu erkennen Enter IP address: 202.47.132.0 Wildcard mask: 255.255.255.0 Um jeden Host mit egal welcher IP-Adresse zu erkennen Sandini Bib 2.2 IPTraf 73 Enter IP address: Wildcard mask 0.0.0.0 0.0.0.0 Das nächste auszufüllende Feld ist das PORT–Feld. Über dieses Feld gibt es nicht viel zu sagen, nur dass Sie mit der Angabe einer 0 den Filter dazu bringen, dieses Feld zu ignorieren. Außerdem sei noch gesagt, dass Sie ein größeres Augenmerk auf den Zielport legen sollten, da die Quellports nach Belieben verändert werden können. Das letzte Feld ist das INCLUDE/EXCLUDE-Feld, das es Ihnen erlaubt, Pakete, die dem Filter entsprechen, entweder ein (I)- oder auszuschließen (E). Nachdem Sie alle Angaben nochmals überprüft haben, können Sie diese mit der Eingabetaste bestätigen und Sie werden eine weitere Maske erhalten. Sie können so viele Masken ausfüllen, wie Sie wollen. Falls Sie mit Ihrer Filterdefinition jedoch fertig sind, so können Sie mit (STRG)+(X) diesen Menüpunkt verlassen. Im Folgenden sehen Sie einige Beispiele, die Sie mit der oben beschriebenen Filteroption realisieren können. Benutzen Sie dieses Beispiel, um den gesamten Netzwerkverkehr von Host 202.47.132.1 nach 207.0.115.44 zu sehen ohne dabei den TCP Port zu beachten. Host name/IP address 202.47.132.2 Wildcard mask 255.255.255.255 Port 0 Include/Exclude I 207.0.115.44 255.255.255.255 0 Falls Sie die Werte dieses Beispiels übernehmen, so werden Sie den gesamten Netzwerkverkehr von 207.0.115.44 zum Netzwerk 202.47.32.0 sehen. Host name/IP address 207.0.115.44 Wildcard mask 255.255.255.255 Port 0 Include/Exclude I 202.47.132.0 255.255.255.0 0 Um den gesamten Webverkehr zu sehen, ohne dabei auf den Ziel- oder Quellhost einzugehen, müssen Sie diese Einstellungen vornehmen. Host name/IP address 0.0.0.0 Wildcard mask 0.0.0.0 Port 80 Include/Exclude I 0.0.0.0 0.0.0.0 0 Um den Mailverkehr von irgendwoher zu einem bestimmten Host (202.47.132.2) zu sehen, sind diese Einstellungen zu gebrauchen. Host name/IP address 202.47.132.2 Wildcard mask 255.255.255.255 Port 25 Include/Exclude I 0.0.0.0 0.0.0.0 0 Sandini Bib 74 2 Netzwerk-Tools Um den gesamten Traffic von Host triblen.de zu books.triblen.de zu sehen, können Sie das folgende Beispiel benutzen. Host name/IP address triblen.de Wildcard mask 255.255.255.255 Port 0 0 Include/Exclude I books.triblen.de 255.255.255.255 Um den Netzwerkverkehr von 140.66.5.x nach irgendwo zu ignorieren, ist dieses Listing für Sie geeignet. Host name/IP address Wildcard mask Port Include/Exclude 140.66.5.x 255.255.255.0 0 E 0.0.0.0 0.0.0.0 0 Das nächste Beispiel wird Ihnen zeigen, wie Sie den gesamten Netzwerkverkehr mit einigen Ausnahmen (SMTP, Web und Netzwerkverkehr von/nach 207.0.115.44) betrachten können. Das ist wichtig, da Filter normalerweise nur das anzeigen, was auch genau einem Filter entspricht. Host name/IP address Wildcard mask Port Include/Exclude 0.0.0.0 0.0.0.0 25 E 0.0.0.0 0.0.0.0 0 Host name/IP address Wildcard mask Port Include/Exclude 0.0.0.0 0.0.0.0 80 E 0.0.0.0 0.0.0.0 0 Host name/IP address Wildcard mask Port Include/Exclude 207.0.115.44 255.255.255.255 0 E 0.0.0.0 0.0.0.0 0 Host name/IP address Wildcard mask Port Include/Exclude 0.0.0.0 0.0.0.0 0 I 0.0.0.0 0.0.0.0 0 Wie Sie sehen können, ist der Mailverkehr (Port 25), der Webverkehr (Port 80) und der gesamte Verkehr von Host 207.0.115.44 mit einem E (ausschließen) gekennzeichnet, wohingegen der gesamte Restverkehr durch ein I (einschließen) vertreten ist. Apply-Filter Der zweite Punkt in der Liste für TCP Filter-Optionen erlaubt es Ihnen, die Filter, die Sie im Menüpunkt DEFINE NEW FILTER ... erstellt haben, anzuwenden. Diese Filter bleiben so lange aktiv, bis Sie sie wieder deaktivieren. Sandini Bib 2.2 IPTraf 75 Detach-Filter Dieser Punkt deaktiviert von Ihnen ausgewählte Filter wieder. Edit-Filter Um einen Filter zu verändern brauchen Sie diese Option. Wenn Sie sie aktiviert haben, wird das in Abbildung 2.16 gezeigte Fenster mit allen von Ihnen spezifizierten Filtern erscheinen, durch das Sie mit den Pfeiltasten scrollen können, um dann mit der Eingabetaste den gewünschten Filter zu aktivieren und im darauf folgenden Dialogfeld zu editieren. Beachten Sie dabei bitte, dass Sie den editierten Filter wieder neu aufnehmen müssen (APPLY FILTER-Punkt). Abbildung 2.16 Edit-Filter Delete-Filter Diese Option gibt Ihnen die Möglichkeit bestimmte Filter zu löschen. UDP-Filter Um Wiederholungen zu vermeiden werden wir an dieser Stelle nicht weiter auf die Erstellung/Änderung etc. eingehen, da die Handhabung sehr der von den TCP-Filtern ähnelt. Weitere IP Protokoll-Filter Seit Version 2.5 haben Sie die Möglichkeit über den Menüpunkt FILTERS.../OTHER IP Filter für nicht TCP und nicht UDP zu definieren. Wie aus Abbildung 2.17 hervorgeht, ist der Anfangsdialog, den man erhält, wenn man die Option DEFINE NEW FILTER wählt, derselbe, den man auch bei Filtern für TCP bzw. UDP erhält. Wir können daraus schließen, dass auch die restliche Bedienung annähernd gleich ist. Alle Abweichungen hierfür werden wir im Folgenden genauestens besprechen. Sandini Bib 76 2 Netzwerk-Tools Abbildung 2.17 Verschiedene Protokoll-Filter Wenn Sie Ihre Beschreibung mit der Eingabetaste bestätigen, kommen Sie zum nächsten Dialog, der, wie Sie der Abbildung 2.18 entnehmen können, mehr Optionen als üblich enthält. Abbildung 2.18 Netzwerkdialog Dieses Fenster sollte Ihnen bereits bekannt sein (siehe TCP- bzw. UDP-Filter) und die Handhabung kein Problem mehr darstellen. Die einzige Neuerung hierbei stellt das PROTOCOLS TO MATCH-Feld dar. Unter dieser Rubrik finden Sie weitere Protokollarten, auf die Ihr Filter ausgerichtet werden kann. Um ein bestimmtes Sandini Bib 2.2 IPTraf 77 Protokoll für den Filter zu aktivieren, schreiben Sie in das weiße Feld hinter dem Protokollnamen ein Y, falls Sie wollen, dass der Filter Pakete eines Protokolls ignoriert, lassen Sie es einfach leer (Sie können auch irgendeinen anderen Buchstaben in das Feld setzen, das würde dasselbe bewirken). Wahrscheinlich werden Sie noch einen weiteren kleinen, aber feinen und wichtigen Unterschied zwischen den beiden Dialogboxen bemerkt haben. So war die Adressbezeichnung bei TCP- bzw. UDP-Dialogen first und last, hier jedoch source und destination. Dies hat zu bedeuten, dass – im Gegensatz zu den TCP- und UDP-Filtern – die Richtung der Pakete genau angegeben werden muss. Ein Paket, das von 10.207.100.1 nach 10.209.100.2 geht, wird hierbei also ignoriert, falls es von 10.207.100.2 nach 10.207.100.1 geht, bei TCP-Filtern würde es auch auf den Filter zutreffen. Der Vollständigkeit halber werden wir auch hier einige Beispiele aufführen. Um alle OSPF-, IGP- und IGRP-Packete von egal woher nach egal wohin anzuzeigen, wählen Sie bitte folgendes Beispiel: Address: Wildcard mask: Protocols to match: Include/Exclude: 0.0.0.0 0.0.0.0 OSPF: Y IGP: Y 0.0.0.0 0.0.0.0 IGRP: Y I Um alle ICMP Pakete außer denjenigen, die für 207.0.115.45 bestimmt sind, anzuzeigen, hilft Ihnen das nächste Listing weiter. Erster Eintrag: Address: Wildcard mask: Protocols to match: Include/Exclude: 0.0.0.0 0.0.0.0 ICMP: Y 207.0.115.45 255.255.255.255 E Zweiter Eintrag: Address: Wildcard mask: Protocols to match: Include/Exclude: 0.0.0.0 0.0.0.0 ICMP: Y 0.0.0.0 0.0.0.0 I Um das Buch bzw. dieses Kapitel nicht unnötig in die Länge zu ziehen, werden wir die nächsten Optionen nicht genauer besprechen, da Sie diese bereits von den TCP- und UDP-Filtern kennen. Es werden mit Sicherheit einige kleine Unterschiede in der Handhabung auftreten, die Sie aber ohne Probleme intuitiv lösen können. Sandini Bib 78 2 Netzwerk-Tools 2.2.11 IPTraf konfigurieren IPTraf ist ein leicht zu konfigurierendes Programm, das seine Settings in die Datei /var/local/iptraf/iptraf.cfg schreibt. Falls diese Datei nicht gefunden wird, benutzt IPTraf die Defaulteinstellungen. Abbildung 2.19 zeigt das Konfigurationsmenü. Abbildung 2.19 Konfigurationsmenü Reverse DNS Lookups Falls man diese Option aktiviert, wird IPTraf den passenden Host zu den Adressen in den IP-Paketen finden. Dabei startet der IP Traffic-Monitor den rvnamed dns lookup Server, der im Background die Namensauflösung übernimmt, während IPTraf weiter Pakete erfasst. Diese Option ist per Default nicht aktiviert. Sie sollten dabei beachten, dass diese Option die Performance verringern kann. TCP/UDP Service Names Diese Option gibt einem die Möglichkeit IPTraf die Servicenamen anstatt der dazugehörigen Portnummern anzeigen zu lassen (zum Beispiel: pop3 statt 110 usw.). Die Servicenamen liest IPTraf dabei aus der Datei /etc/services, falls dort für einen bestimmten Port kein Servicename aufgeführt ist, wird die Portnummer angezeigt. Diese Option ist per Default nicht aktiviert. Sie sollten dabei beachten, dass auch diese Option die Performance verringern kann. Sandini Bib 2.2 IPTraf 79 Force promiscuous mode Mit dieser Option können Sie alle TCP-Verbindungen, die Ihr LAN-Segment passieren, sehen, auch wenn diese nicht von Ihrer Maschine kommen bzw. für Ihren Computer bestimmt sind. Falls Sie mehrere LAN-Schnittstellen haben, wird diese Neuerung für alle aktiv (zum Beispiel Ethernet und FDDI). Color Wie Sie sicher schon erahnt haben, können Sie mit dieser Option festlegen, ob IPTraf Farben benutzen soll oder nicht. Wie wir bereits gesehen haben, sind die Farbunterlegungen von bestimmten Protokollarten usw. sehr hilfreich. Sie sollten deshalb diese Option aktiviert lassen. Logging Sie erinnern sich bestimmt noch an den Anfangsdialog, nachdem wir IPTraf das erste Mal gestartet haben. Dieser Dialog hat uns nach einem Namen für das Logfile, in das es loggen soll, gefragt. Um das Logging in dieser Datei (oder in die Dateien der einzelnen Module) aber zu starten müssen Sie zuerst diese Option aktivieren. Dabei wird jeder Eintrag mit Datum und Zeit versehen. Welche Einträge der IP Traffic-Monitor genau in die Datei schreibt, werden Sie im Folgenden erfahren: Start des IP Traffic-Monitors Empfang des ersten TCP-Paketes einer Verbindung. Falls es sich hierbei um ein SYN-Paket handelt, wird dies ebenfalls in die Datei geschrieben (Das erste empfangene Paket einer Verbindung muss nicht immer ein SYN sein, da es durchaus vorkommen kann, dass Sie IPTraf starten und schon eine Verbindung besteht, dann wird das erste Paket, das der IP Traffic-Monitor empfängt, kein SYN sein). Empfang eines FIN Das ACK eines FIN Timouts von TCP-Einträgen Alles was im unteren Fenster des IP Traffic-Monitors erscheint Beenden des IP Traffic-Monitors Falls Sie eine Logdatei sichern oder löschen wollen, sollten Sie dies auf keinen Fall machen, wenn IPTraf noch in diese Datei loggt. Sie sollten als Erstes die Logdatei umbenennen (zum Beispiel XXX.log.sav) und danach ein USR1-Signal an den laufenden IPTraf-Prozess schicken (mit dem kill-Befehl). Das wird IPTraf dazu veranlassen, das Logging zu stoppen und eine Datei mit dem ursprünglichen Namen zu erstellen und das Logging in dieser Datei wieder aufzunehmen. Jetzt können Sie die umbenannte Datei ohne Probleme löschen oder sichern. Logging ist per Default nicht aktiviert. Sandini Bib 80 2 Netzwerk-Tools Activity mode Sie können mit Hilfe dieser Option bestimmte Module veranlassen zwischen kilobits per second (kbits/s) und kilobytes per second (kbytes/s) umzuschalten. Der Defaultwert liegt bei kilobits per second. Source MAC addrs in traffic monitor Wenn Sie diese Option aktivieren, wird IPTraf die Quell-MAC-Adresse für NonIP-Pakete im unteren Fenster anzeigen, falls diese auf einem Ethernet, FDDI oder PLIP Interface ankommen. Bei TCP-Verbindungen reicht es, die M-Taste zu drücken, um die MAC-Adresse zu sehen. Für Pakete, die auf Schnittstellen, die keine MAC-Adressen benutzen, (zum Beispiel PPP) ankommen, werden auch keine Informationen angezeigt. Diese Option ist per Default deaktiviert. (Falls Sie sie aktivieren, wird die MACAdresse auch in den Logfiles auftauchen). Timers… Das Timers… -Submenü erlaubt es Ihnen, die in Abbildung 2.20 aufgeführten Optionen zu verändern. Abbildung 2.20 Timers-Submenü TCP timeout… Mit dieser Option können Sie das Zeitintervall angeben, nach dem leere (idle) Verbindungen durch neue ersetzt werden. Sie können dies auf LANs reduzieren, die nicht mit dem Internet verbunden sind oder die sehr schnelle Verbindungen ins Internet haben. Der Defaultwert liegt bei 15 Minuten. Sandini Bib 2.2 IPTraf 81 Logging interval… Dieser Menüpunkt bestimmt den Intervall zwischen dem Loggen von InterfaceStatistiken, TCP/UDP-Modulen und LAN Host-Statistiken. Der Defaultwert liegt bei 60 Minuten. Falls Sie Logging nicht aktiviert haben, ist dieser Punkt offensichtlich bedeutungslos. Screen Update Interval Dieser Punkt betrifft das Updaten des Bildschirms und wirkt sich auf alle Module von IPTraf aus. Der Defaultwert liegt bei 0, was bedeutet, dass der Bildschirm so schnell wie möglich aktualisiert wird. Sie können diesen Wert auch höher setzen und damit die Aktualisierungen hinauszögern. Sie sollten diese Option unbedingt in Erwägung ziehen, falls Sie IPTraf remote laufen haben (zum Beispiel über eine Telnetsitzung), da ansonsten eine enorm hohe Netzwerkbelastung entstehen könnte. TCP closed/idle persistence Sie können mit dieser Option den Zeitabstand (in Minuten) angeben, zwischen dem IPTraf das TCP-Fenster von leeren (idle), geschlossenen (closed) und timed out-Einträgen klärt. Wenn Sie dieser Option den Parameter 0 angeben, werden diese Verbindungen so lange angezeigt, bis sie durch neue ersetzt werden. Additional port Wir haben weiter oben gesehen, dass die TCP/UDP Service-Statistik-Module nur privilegierte Services (Portnummern unter 1024) in die Statistiken aufnimmt. Falls Sie einen zu überwachenden Service haben, der über dieser Grenze liegt (zum Beispiel http-proxy auf 8080), müssen Sie dies hier angeben. Sie werden dann ein Dialogfeld mit zwei Feldern sehen. Falls Sie nur einen speziellen Port (8080) in die Überwachung mit einschließen wollen, füllen Sie nur das erste aus. Falls Sie aber einen bestimmten Bereich überwachen lassen wollen, füllen Sie bitte auch das zweite Feld aus. Der Bereich geht dann vom Port im ersten Feld bis zu dem im zweiten. Sie können auf diese Weise auch mehrere Bereiche definieren. Delete port/range Falls Sie die oben spezifizierten Portbereiche wieder löschen wollen, benutzen Sie bitte diesen Menüpunkt. Ethernet/PLIP host descriptions und FDDI host descriptions Die Stations der LAN Station Statistics Monitor-Module basieren auf den dazugehörigen MAC-Adressen, da man sich diese sehr schlecht merken kann, hat man diese beiden Module hinzugefügt, die einem durch Beschreibungen helfen sollen, welche Station welche ist. Falls Sie nun eine der beiden Optionen wählen, wird sich ein neues Fenster öffnen, das Sie fragen wird, ob Sie Beschreibungen verändern, löschen oder hinzufügen wollen. Sandini Bib 82 2 Netzwerk-Tools Um eine neue Beschreibung hinzuzufügen wählen Sie bitte die Option Add description. Es wird sich dann ein neues Dialogfenster öffnen, das Sie nach der MAC-Adresse und der dazugehörigen Beschreibung fragen wird. Beachten Sie bei der Eingabe der MAC-Adresse unbedingt die Groß- und Kleinschreibung! Nachdem Sie Ihre Eingabe bestätigt haben, werden Sie die eingegebene Beschreibung neben der MAC-Adresse zusammen mit dem Frametypen (Ethernet, PLIP oder FDDI) im LAN Station-Monitor finden. Sie können so eingegebene bereits existierende Beschreibungen durch die Option Edit description... aber auch wieder ändern. Falls Sie diesen Punkt aktivieren, werden Sie ein Listing mit allen bereits verfassten Beschreibungen erhalten, von denen Sie dann eine bestimmte auswählen. Danach können Sie die ausgefüllten Felder nach Belieben ändern. Natürlich können Sie die gemachten Einträge auch komplett löschen. Sie müssen dafür lediglich die Option Delete description... wählen. 2.2.12 Background-Operation Nachdem Sie IPTraf nach Ihren Wünschen konfiguriert haben, können Sie das Programm so einstellen, dass es im Hintergrund läuft und nur loggt. Es wird dann aber keine Eingaben von der Tastatur erkennen oder Ausgaben auf den Bildschirm werfen. Um dies zu bewerkstelligen, müssen Sie IPTraf von der Konsole mit der Option –B aufrufen (Damit es als Daemon läuft). Das folgende Listing zeigt ein Beispiel, das Sie benutzen können, falls Sie das Programm für alle Interfaces im Hintergrund laufen lassen wollen. Linux:~# iptraf –i all –B Um das Modul Detailed Interface Statistics für das Interface eth0 für fünf Minuten im Hintergrund laufen zu lassen, geben Sie bitte folgenden Befehl ein: Linux: ~# iptraf –d eth0 –t 5 –B Falls Sie das Argument –t nicht übergeben, läuft IPTraf ohne Zeitbeschränkung im Hintergrund. Um es zu beenden, müssen Sie ein USR2 Signal an die Prozess ID des Programms schicken, dazu müssen Sie aber zuerst mit folgendem Befehl die pid (process id) finden: Linux:~# ps ax | egrep iptraf Linux:~# kill –USR2 pid Wenn IPTraf im Hintergrund läuft, werden alle Fehlermeldungen in die Datei daemon.log geschrieben. Sandini Bib 2.3 NTop 2.3 83 NTop Nach IPTraf ist NTop das zweite hervorragende Tool, das uns Informationen über unser Netzwerk liefern kann. Die Vorteile von NTop liegen klar in der Darstellung des Traffics, der das Netzwerk durchquert. Dabei bekommt man nach dem Start eine Liste von Rechnern, die zurzeit Traffic (IP und non-IP) auf dem spezifizierten Netzwerk verursachen. NTop kann dabei in zwei verschiedenen Modi ablaufen: 1. Konsolenmodus 2. Webmodus 2.3.1 Konsolenmodus Der erste Modus, den wir besprechen werden, ist der Konsolenmodus, da dieser einige Vorteile mit sich bringt: Braucht weniger Ressourcen Kann auf einem System ohne X-Server laufen Ausgaben können leichter weiterverarbeitet werden NTop im Konsolenmodus lässt sich in Skripte einbauen Syntax Die Syntax von NTop ist wieder einmal denkbar einfach gehalten: Linux:~# ntop [Optionen] Optionen Da wir nun den allgemeinen Aufruf von NTop kennen, sollten wir uns daran machen, die verfügbaren Optionen dazu kennen zu lernen. Tabelle 2.11 enthält alle verfügbaren Optionen und gibt zu jedem aufgeführten Punkt eine kurze Beschreibung. Option Beschreibung -I Diese Option erlaubt es Ihnen, NTop im interaktiven Modus zu starten. Dieses Flag ist veraltet und sollte nicht mehr benutzt werden, da sie durch das zusätzliche Netzwerk-Browser-Programm »intop« ersetzt wurde (wir werden dieses Programm im Laufe dieses Kapitels noch besprechen). -R Spezifiziert die Filterregeln, die von NTop genutzt werden um Alarmmeldungen oder Warnungen auszugeben, falls ein Paket (oder eine Paketfolge) dem angegebenen Filter entspricht. Wir werden, die Filterregeln von NTop weiter unten in diesem Kapitel noch ausführlicher besprechen. Tabelle 2.11 Verfügbare Optionen für NTop Sandini Bib 84 2 Netzwerk-Tools Option Beschreibung -r Hiermit können Sie das Intervall (in Sekunden) angeben, das zwischen den einzelnen Updates der Bildschirmausgabe liegt. Seien Sie bei dieser Option aber sehr vorsichtig, da (ähnlich zu IPTraf) ein zu häufiges Update der Bildschirmausgabe dazu führen kann, dass NTop nicht den gesamten Netzwerkverkehr abfangen und bearbeiten kann. Der Defaultwert liegt bei 3 Sekunden. Falls hierzu zusätzlich das Flag »-l« benutzt wird, gibt diese Option an, wie oft Einträge in das Logfile geschrieben werden. -f Mit dieser Option können Sie eine Datei angeben, die Aufzeichnungen über einen Netzwerkverkehr, der von Tcpdump abgefangen wurde, enthält. NTop wird den dort aufgezeichneten Verkehr benutzen. Beachten Sie aber dabei, dass NTop kein Paket in Ihrem Netzwerk mehr abfangen wird, nachdem Sie diese Flag gesetzt haben. Wie man mit Tcpdump Netzwerkverkehr abfängt, werden wir im Laufe dieses Kapitels noch erfahren. -N Hiermit geben Sie an, dass NTop den Netzwerkscanner nmap nicht benutzen darf. -M Nachdem Sie diese Option übergeben haben, wird NTop keine Netzwerkschnittstellen mehr mischen. Das bedeutet, dass NTop für jedes einzelne Interface eine Statistik aufstellen wird. -n Falls Sie anstelle der gezeigten symbolischen Namen lieber IP-Adressen ausgegeben haben wollen, können Sie das mit dieser Option erreichen. Sie sollten diese Option benutzen, wenn Sie keinen DNS zur Verfügung haben oder dieser sehr ausgelastet ist. Sie können zwischen den beiden Formaten (IP-Adressen und symbolische Namen) durch das Drücken der N-Taste umschalten, während NTop läuft. -p Mit dieser Option geben Sie das IP-Protokoll bzw. die IP-Protokolle an, die NTop überwachen soll. Das hierbei zu verwendende Format sieht folgendermaßen aus: <Label>=<Protokollliste> [, <Label>=<Protokollliste> …]. Der Platzhalter »Label« kann von Ihnen zur Identifizierung der verschiedenen Protokolllisten dienen. Das Format des Platzhalters »Protokollliste« lautet: <Protokoll 1>[|Protokoll 2] Wobei das angegebene Protokoll entweder ein Protokollname aus der Datei /etc/ services oder eine numerische Portliste sein kann (zum Beispiel: 80 oder 2000-2090). Falls Sie diese Option nicht spezifizieren, wird folgender Defaultwert verwendet: FTP=ftp|ftp-data, HTTP=http|www|https, DNS=name|domain, Telnet=telnet,login, NBios-IP=netbios-ns|netbios-dgm|netbios-ssn, Mail=pop-2|pop-3|kpop|smtp|imap|imap2, Tabelle 2.11 Verfügbare Optionen für NTop (Forts.) Sandini Bib 2.3 NTop Option 85 Beschreibung SNMP=snmp|snmp-trap, NEWS=nntp, NFS=mount|pcnfs|bwnfs|nfs|nfsd-status, X11=6000-6010, SSH=ssh" Falls Sie aber zum Beispiel alle Loginprogramme, die auf Ihren Rechnern laufen, überprüfen wollen und diese Liste sehr lang würde, können Sie auch eine Datei übergeben, die die Protokolllistenspezifikationen enthält. Dazu müssen Sie beim Aufruf folgenden Befehl übergeben: Linux:~# ntop -p Datei -i Diese Option gibt an, welches Netzwerkinterface NTop benutzen soll. Falls Sie mehrere Schnittstellen angeben wollen, müssen Sie diese mit Kommas voneinander trennen. Zum Beispiel: Linux:~# ntop -i "eth0,eth1,eth2,ipsec0" Beachten Sie dabei aber, dass (außer Sie verwenden die Option -M) die Daten dieser Schnittstellen zusammengemischt werden. -e Dieses Flag macht nur Sinn, falls Sie NTop im Webmodus betreiben, da Sie die maximale Anzahl von HTML-Tabellenreihen angibt, die NTop anzeigen soll. -w Das ist die Option, die den NTop-Webserver startet und NTop somit in den Webmodus übergehen lässt. Wir werden diese Option im Laufe dieses Kapitels noch genauer besprechen. -W Auch diese Option bezieht sich auf den Webmodus und wird daher später im Kapitel genauer besprochen (Diese Option ermöglicht HTTPS). -d Wenn Sie diese Option übergeben, wird NTop zum Daemon und arbeitet im Hintergrund. -S Diese Option bewirkt, dass NTop Informationen über den Netzwerkverkehr bei einem Shutdown speichern wird, so dass keine schon gewonnenen Daten während den verschiedenen NTop-Sitzungen verloren gehen. Beachten Sie dabei aber, dass Informationen über TCP-Sitzungen verloren gehen. -P Mit dieser Option können Sie bestimmen, wo Datenbankdateien (db-files) gesucht oder erstellt werden. Der Defaultwert ist ».« Zusätzlich wird die Variable DBPATH/html zu der Suchliste für Web-Dateien hinzugefügt. -m Mit diesem Flag können Sie Subnetze angeben, deren Traffic lokal betrachtet wird. Das Format hierzu ist: <Netzwerkadresse>/<# Subnetzmasken – Bits> [Netzwerkadresse>/ <# Subnetzmasken – Bits>…] Zum Beispiel: 140.140.19.0/24, 10.0.0.0/255.0.0.0 Tabelle 2.11 Verfügbare Optionen für NTop (Forts.) Sandini Bib 86 2 Netzwerk-Tools Option Beschreibung -l Diese Option gibt an, dass in periodischen Abständen (spezifiziert mit der -r Flag) Informationen über die Netzwerkdaten in die Datei ntop.log geschrieben werden. -a Per Default loggt NTop HTTP-Zugriffe in die Datei ntop.access.log im aktuellen Verzeichnis. Sie können aber den Pfad dieser Datei (und somit die Datei selbst) auch selbst übergeben. -u Durch diese Option können Sie den User, unter dem NTop nach dem Start laufen wird, angeben. Dieser Username muss dabei ein gültiger Username aus der Passwortdatei /etc/passwd sein oder eine gültige numerische User ID. -t Dieses Flag gibt an, welches Level NTop bei der Verfolgung des Programmverlaufs auf die Standardausgabe ausgeben soll. Sie müssen dieser Option einen Integerwert von 0 (keine Verfolgung) bis 5 (volle Verfolgung zu Debugzwecken) zuweisen. Der Defaultwert liegt bei 3. Je höher der Level wird, desto mehr Informationen erhalten Sie. -F Ähnlich wie NeTraMet spezifiziert diese Option die Netzwerk »Flows«. Ein »Flow« ist eine Folge von abgefangenen Paketen, die auf eine bestimmte Regel passen. Das Format hierzu lautet: <Flowlabel>=’<Regelausdruck>’ [,<Flowlabel>=’<Regelausdruck>’] Der Platzhalter »Flowlabel« wird wieder dazu genützt, um den Flow zu spezifizieren. Das Format der Regelausdrücke werden Sie im Laufe dieses Kapitels noch kennen lernen (Regeln). Für Webuser sei gesagt, dass Sie diese Statistik über den Link »List NetFlows« erreichen. Tabelle 2.11 Verfügbare Optionen für NTop (Forts.) 2.3.2 Regeln Mit diesen Filterregeln können Sie bestimmen, welchen Traffic Sie abfangen wollen. So können Sie Pakete von einem bestimmten Host abfangen oder die Regel auf ein Protokoll anwenden. Die Möglichkeiten hierbei sind wirklich sehr groß. Falls Sie bereits fit im Umgang mit Tcpdump sind, brauchen Sie diesen Abschnitt über die Erstellung von NTop-Regeln nicht zu lesen. Ansonsten können Sie entweder diesen Abschnitt oder den Abschnitt über Tcpdump lesen, um in der Lage zu sein, solche Filterregeln erstellen zu können. Wir werden dieses Kapitel nicht so ausführlich besprechen wie den Abschnitt über Regeln bei Tcpdump, Sie sind aber nach der Lektüre dieses Abschnittes in der Lage, alle Möglichkeiten und Features von NTop-Regeln voll auszuschöpfen. Syntax Die Syntax einer NTop-Regel ist recht simpel gehalten und hat folgendes Format: Protokoll Regel-Label Regel-Optionen Sandini Bib 2.3 NTop 87 Wir werden nun im Laufe dieses Abschnittes jedes dieser drei Felder einer Regel ausführlich besprechen, so dass Sie nach der Lektüre des Regelabschnittes in der Lage sind, effektiv und sauber NTop-Regeln zu erstellen. Protokoll NTop bietet Ihnen die Möglichkeit, die abzufangenden Pakete nach drei verschiedenen Protokollarten auszuwählen: 1. TCP 2. UDP 3. ICMP 4. Das heißt also, dass eine dieser drei aufgeführten Protokollarten das erste Feld einer Regel darstellt. Regel-Label Wie Sie das von NTop schon gewohnt sind, können Sie mit einem Label ein bestimmtes Feld oder ähnlich eindeutig identifizieren. Genauso verhält sich die Sache auch mit den Regeln bei NTop. Wählen Sie als Label ein Wort, das die betreffende Regel genau beschreibt und eindeutig zu identifizieren ist. Regel-Optionen Die Regel-Optionen unterscheiden sich von Protokoll zu Protokoll, beachten Sie dabei also bitte, dass die gewählte Option auch zu dem gewählten Protokoll passt. Es wäre ziemlich nutzlos, eine Regel zu definieren, die nach TCP-Paketen suchen soll und als Regel-Option ICMP Echo Replies spezifiziert hat. Sie werden sich sehr schwer tun, ein solches Paket in einem normalen Netzwerk zu finden. Tabelle 2.12 stellt uns die verfügbaren Regel-Optionen kurz vor und gibt uns zu jedem aufgeführten Punkt eine kurze Beschreibung. Option Beschreibung shost/sport dhost/ dport Diese Option wird benutzt, um festzulegen, woher das Paket kommt bzw. wohin es geht. Bei ICMP-Paketen wird nur shost/dhost benutzt. Mögliche Werte für shost und dhost sind: any (trifft auf jeden Host zu) broadcast (eine Broadcastadresse) multicast (eine Multicastadresse) gateway (ein Rechner, den NTop als Gateway identifiziert hat, da er von anderen Rechnern für das Routen von Paketen benutzt wurde) dns (ein Rechner, den NTop als DNS identifiziert hat, da er von anderen Rechnern für Address-Mapping genutzt wurde) Tabelle 2.12 Verfügbare Regel-Optionen Sandini Bib 88 Option 2 Netzwerk-Tools Beschreibung Sie können diese Angaben durch den Operator "!" auch negieren (zum Beispiel !dns). Beachten Sie dabei aber, dass eine Negierung von "any" (!any) nicht zulässig ist. Zulässige Werte für sport/dport sind: any (trifft auf jeden Port) !any (trifft auf jeden Port des Zielrechners zu, egal ob der Port auch in der letzen Regel benutzt wurde) usedport (trifft auf einen Port zu, bei dem NTop Netzwerkverkehr bemerkt hat) !usedport (trifft auf einen Port zu, bei dem NTop keinen Netzwerkverkehr bemerkt hat) flags TCP-Pakete haben im 13. Oktett die so genannten Codebits. Dies sind 8 Flags, die das Ziel einen Pakets beschreiben. Unter NTop haben Sie die Möglichkeit Pakete nach vier verschiedenen Flags zu sortieren: F (FIN) P (PUSH) A (ACK) R (RESET). Ein Fragment aus einer Beispielregel könnte daher folgendermaßen aussehen: flags AP ICMP Type Hiermit können Sie den ICMP-Pakettypen einer Regel spezifizieren. Verfügbare Werte hierfür sind: ICMP_ECHOREPLY ICMP_ECHO ICMP_UNREACH ICMP_REDIRECT ICMP_ROUTERADVERT ICMP_TIMXCEED ICMP_PARAMPROB ICMP_MASKREPLY ICMP_MASKREQ ICMP_INFO_REQUEST ICMP_INFO_REPLY ICMP_TIMESTAMP ICMP_TIMESTAMPREPLY ICMP_SOURCE_QUENCH Tabelle 2.12 Verfügbare Regel-Optionen (Forts.) Sandini Bib 2.3 NTop 89 Option Beschreibung type packet/fragment Hiermit geben Sie an, ob die Regeln auf Pakete oder auf Fragmente zutreffen sollen. Falls Sie keinen Wert übergeben, wird angenommen, dass die Regeln auf Pakete zutreffen sollen. pktsize/pktcount Operator Integerwert Sie können mit dieser Option die Regel noch weiter einschränken. Mit dem Schlüsselwort »pktsize« können Sie die Größe des betreffenden Paketes spezifizieren. Mit »pktcount« können Sie angeben, das wievielte Paket für diese Regel zutrifft. Die Werte, die Sie dabei übergeben, müssen Integerwerte sein, welche Sie mit Hilfe der folgenden Operatoren noch weiter einschränken können: < > = unit Sekunden Mit dieser Option können Sie die zuletzt vorgestellte Option »pktcount« weiter einschränken. Sie können hiermit bestimmen, in welchem Zeitraum die von Ihnen angegebene Zahl von Paketen auf diese Regel zutreffen soll. Zum Beispiel: pktcount > 100 unit 60 Gibt an, dass innerhalb 1 Minute (60 Sekunden) 100 Pakete auf diese Regel zutreffen müssen. action Hiermit geben Sie an, was NTop machen soll, wenn ein Paket auf eine Regel zutrifft. Mögliche Werte hierfür sind: alarm (Sendet einen Alarm aus) mark (Paket wird für weitere Verarbeitung markiert) cleans Regelname Diese Option kann benutzt werden, um Pakete, die durch die Regel, die Sie durch das Argument »Regelname« übergeben, markiert wurde, zu reinigen. Falls Sie alle Pakete reinigen wollen, können Sie die Wildcard »all« nach dem Regelnamen benutzen. rearm Sekunden Hiermit können Sie angeben, für wie lange (Sekunden) eine Regel außer Kraft gesetzt sein soll. Tabelle 2.12 Verfügbare Regel-Optionen (Forts.) Beispiele Wie Sie gesehen haben, sind die Möglichkeiten mit NTop durchaus begrenzt. Doch ich denke, dass dieses Programm für Administratoren, die sich nicht lange einarbeiten können, durchaus interessant sein kann. Außerdem bietet es eine Reihe nützlicher Features und Zusatzprogramme (Webinterface und Netzwerkbrowser). Damit Sie das eben erlangte theoretische Wissen auch praktisch umsetzen können, werden wir uns im Folgenden einige Beispiele zu den Optionen der aufgeführten Regeloptionen anschauen. Sandini Bib 90 2 Netzwerk-Tools Beispiel 1: Wenn ein Host ein ICMP Route Redirect-Paket von einem Rechner, der kein Gateway ist, bekommt, so wird mit der unten aufgeführten Syntax ein Alarm generiert. icmp route-advertisement alarm ICMP_ROUTERADVERT !gateway/any action Beispiel 2: Hierbei wird Alarm geschlagen, wenn sich der Superuser in einen FTP-Server einloggt. tcp root-ftp any/ftp any/any contains Beispiel 3: Wenn Sie Scans durch nmap entdecken wollen, können Sie folgende Syntax verwenden. tcp tcp-nmap-scan any/!any any/!any flags SF action alarm 2.3.3 Netzwerk-Browser (Intop) Der Netzwerk-Browser von NTop stellt ein Netzwerkinterface dar, das Ihnen die Arbeit mit diesem Tool erheblich erleichtern kann. Befehlszeile und Initialisierung Der Netzwerk-Browser InTop stellt Ihnen eine eigene Befehlszeile zur Verfügung, die es Ihnen zum Beispiel erlaubt, Netzwerkschnittstellen zu öffnen oder Pakete abzufangen. Programm starten Um die Shell (bzw. den Netzwerk-Browser) zu starten, benutzen Sie bitte folgenden Befehl: Linux:~# intop Danach sollten Sie folgende Bildschirmausgabe erhalten: Linux:~# intop -- intop 0.0.1 (Sep. 21 2001) -- The first interactive ntop program. (C) Copyright 2000 L. Deri and R. Carbone. All rights reserved. It allows you to control the power of ntop using fingers rather than mouse! This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by Sandini Bib 2.3 NTop 91 the Free Software Foundation; either version 2 of the Licence, or (at your opinion) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR PARTICULAR PURPOSE. See the GNU General Public Licence for more details. Initializing ntop engine.... Please wait. Type ? for help. intop> Netzwerkinterface öffnen Nachdem Sie nun die InTop-Shell gestartet haben, ist es an der Zeit, ein Netzwerkinterface zu öffnen. Dies können Sie mit folgendem Befehl erreichen (Sie erhalten im Laufe dieses Kapitels eine vollständige Befehlsreferenz): intop> open -i <Netzwerkinterface> Wenn Sie dem Programm eine zu öffnende Schnittstelle übergeben haben, sollte sich die Shell ändern. Lassen Sie uns dies anhand eines kleinen Beispieles weiter erklären. Mit folgendem Befehl öffnen Sie das Netzwerkinterface eth0: intop> open -i eth0 intop@eth0> Wie Sie sehen können, ändert sich der Befehlsprompt und gibt nun das zu überwachende Interface wieder. Netzwerkschnittstellen auflisten Falls Sie nicht mehr genau wissen, welche Netzwerkschnittstelle Sie zur Verfügung haben (normalerweise sollten Sie dies aber wissen!), können Sie sich mit folgendem Befehl alle zur Verfügung stehenden Schnittstellen auflisten lassen: intop> lsdev Danach erhalten Sie eine Liste mit allen verfügbaren Schnittstellen: intop> lsdev Warning: this function could not work on systems where struct ifreq has the sa_len field. Warning: I will try to fix it asap. Sorry for the inconvenience. 5 interface(s) were found on this system. The list of those suitable for using with intop is: 1. lo 2. eth0 Sandini Bib 92 2 Netzwerk-Tools 3. eth1 4. eth2 5. ipsec0 iptop> Befehlsreferenz Da Sie nun wissen, wie Sie der InTop-Kommandozeile Befehle übergeben können, werden Sie in diesem Kapitel eine Befehlsreferenz dafür erhalten. Tabelle 2.13 stellt Ihnen alle zurzeit zur Verfügung stehenden Befehle auf und gibt zu jedem Punkt eine kurze Beschreibung. Befehl Beschreibung help Nach der Übergabe dieses Befehls erhalten Sie eine kleine Übersicht aller verfügbaren Befehle. Alle Befehle, die in spitzen Klammern (< und >) eingeschlossen sind, stehen zurzeit noch nicht zur Verfügung, werden aber bald implementiert. Um eine extra Hilfefunktion für einen speziellen Befehl zu erhalten, können Sie folgendes Format verwenden: intop> help "Befehl" zum Beispiel: intop> help arp Hiermit erhalten Sie eine genauere Beschreibung des angegebenen Befehls (in unserem Beispiel über den Befehl: »arp«). ? Dieser Befehl bewirkt exakt dasselbe wie der eben vorgestellte Befehl »help«. arp Zeigt den NTop ARP Cache auf und gibt Informationen über die Filter einen Benutzers aus close Schließt ein Netzwerkinterface exit Beendet das Programm filter Setzt den BPF-Filter verbunden mit dem Netzwerkinterface history Zeigt die History der Kommandozeile hosts Zeigt den NTop HOST Cache und gibt Hostinformationen betreffend der benutzerdefinierten Filter aus info Gibt detaillierte Informationen über den aktuellen Status einer Netzwerkschnittstelle aus. lsdev Dieser Befehl zeigt Ihnen alle Netzwerkschnittstellen, die Sie für dieses Programm benutzen können. nbt Gibt den NTop (Netbios over TCP/IP) Cache aus und zeigt detaillierte Hostinformationen betreffend der benutzerdefinierten Filter open Öffnet eine Netzwerkschnittstelle prompt Hiermit können Sie die Farben für den prompt ändern. quit Beendet das Programm Tabelle 2.13 Befehlsreferenz für InTop Sandini Bib 2.3 NTop 93 Befehl Beschreibung sniff Damit können Sie die zwei zuletzt genutzten Netzwerkschnittstellen tauschen (falls diese existieren). top Zeigt Netzwerkverwendung ähnlich zum UNIX-Befehl »top«. uptime Gibt allgemeine Informationen über alle aktivierten Netzwerkschnittstellen aus und teilt Ihnen mit, wie lange das Programm schon läuft Tabelle 2.13 Befehlsreferenz für InTop (Forts.) Wie Sie aus den Inhalten der eben gezeigten Tabelle 2.13 entnehmen können, kann Ihnen der Netzwerk-Browser InTop einige Arbeit ersparen und ist relativ leicht und intuitiv zu handhaben. Im Folgenden werden wir aber eine noch komfortablere Möglichkeit kennen lernen, die die Überwachung Ihres Netzwerkverkehrs zum Kinderspiel macht. 2.3.4 Webmodus Wie bereits erwähnt haben Sie die Möglichkeit NTop im Webmodus laufen zu lassen, dies bringt einige unschlagbare Vorteile mit sich: Netzwerkstatistiken können von jedem Rechner im Netz betrachtet werden Komfortable Menüführung Darstellung ist sehr übersichtlich gehalten Sichere Datenübertragung durch SSL Mehrere User haben Zugriff auf die Netzwerkstatistiken und vieles mehr Aufteilung der Webseite Am oberen Rand der Webseite stehen Ihnen folgende sieben Obermenüpunkte zur Auswahl: About Data Rcvd Data Sent Stats IP Traffic IP Protos Admin Nachdem Sie einen dieser Punkte ausgewählt haben, erhalten Sie auf der linken Seite (linker Frame) eine Auswahl an weiteren Menüpunkten. Sandini Bib 94 2 Netzwerk-Tools Start Wenn Sie einen Blick in Tabelle 2.11 werfen, werden Sie feststellen, dass Sie zum Start von NTop im Webmodus zwei Optionen benutzen können: 1. -w (HTTP) 2. -W (HTTPS) 3. Nachdem wir dies nun wissen, wollen wir uns daran machen, den Webmodus (HTTP) zu starten. Dafür übergeben wir folgenden Befehl: Linux:~# ntop -w 90 4. Dies bewirkt, dass wir NTop nun über den Webbrowser auf Port 90 unserer Maschine (ntop.secure.de) erreichen können. 5. Sie sollten nach der Übergabe dieses Befehls folgende Bildschirmausgabe erhalten: Linux:~# ntop -w 90 26/Jul/2001:23:30:30 SSL is present but https is disabled: use -W <https port> for enabling it 26/Jul/2001:23:30:31 ntop v.1.3.2 MT (SSL) [i686-suse-linux] (09/24/01 02:43:10 AM build) 26/Jul/2001:23:30:31 Listening on [eth0] 26/Jul/2001:23:30:31 Copyright 1998-2000 by Luca Deri <deri@ntop.org> 26/Jul/2001:23:30:31 Get the freshest ntop from http:// www.ntop.org/ 26/Jul/2001:23:30:31 Initialising... 26/Jul/2001:23:30:31 Loading plugins (if any)... 26/Jul/2001:23:30:31 Searching plugins in /usr/lib/ntop/plugins 26/Jul/2001:23:30:31 Welcome to arpWatchPlugin. (C) 1999 by Luca Deri. 26/Jul/2001:23:30:31 Welcome to icmpWatchPlugin. (C) 1999 by Luca Deri. 26/Jul/2001:23:30:31 Welcome to LastSeenWatchPlugin. (C) 1999 by Andrea Marangoni. 26/Jul/2001:23:30:31 Welcome to nfsWatchPlugin. (C) 1999 by Luca Deri. 26/Jul/2001:23:30:31 Welcome to ntop Remote Interface 26/Jul/2001:23:30:31 Loading plugin '/usr/lib/ntop/plugins/ rmonPlugin.so' [/usr/lib/ntop/plugins/rmonPlugin.so: undefined symbol: debugmsgtoken] 26/Jul/2001:23:30:31 Welcome to WAPPlugin. (C) 2000 by Luca Deri. 26/Jul/2001:23:30:31 WARNING: For security reasons it is STRONGLY recommended to 26/Jul/2001:23:30:31 run ntop as unprivileged user by using the -u option! Sandini Bib 2.3 NTop 95 26/Jul/2001:23:30:31 Resetting traffic statistics... 26/Jul/2001:23:30:32 Thread 1026 for LSOF support started. 26/Jul/2001:23:30:32 Thread 2051 for Network Packet Capturing started (_main_ thread). 26/Jul/2001:23:30:32 Thread 3076 for Host Traffic Statistics started. 26/Jul/2001:23:30:32 Thread 4101 for Throughput Update started. 26/Jul/2001:23:30:32 Thread 5126 for Scan Idle Host started. 26/Jul/2001:23:30:32 Thread 6151 for DNS Address Resolution started. 26/Jul/2001:23:30:32 Starting plugin threads (if any)... 26/Jul/2001:23:30:32 Remote Interface started [port 92][/var/ run/ntop.sock] 26/Jul/2001:23:30:32 Waiting for HTTP connections on port 90... 26/Jul/2001:23:30:32 Sniffying... 26/Jul/2001:23:30:32 Thread 9226 for Network Packet Sniffing started (_main_ thread). Zugriff über Webbrowser Ab jetzt können wir von jedem Client, der auf dieses Netzwerk zugreifen darf, Netzwerkstatistiken abfragen. Wir wollen im Laufe dieses Kapitels mit einem Windowsrechner auf einen Linuxserver zugreifen, auf dem NTop auf Port 90 läuft. Um eine ausführliche und detailgetreue Darstellung zu bekommen, werden wir für die Erklärung und Navigation viele Screenshots verwenden. Startseite (What’s ntop) Sie haben nun die Möglichkeit Ihre NTop-Statistiken via Web von jedem Rechner aus abzufragen. Dafür benutzen Sie als URL die IP-Adresse des Servers, auf dem NTop läuft, gefolgt vom Port, auf dem das Programm lauscht. In unserem Fall lautet die einzugebende URL also: http://10.209.100.3:90 Danach erhalten Sie die in Abbildung 2.21 gezeigte Startseite. Wie Sie sehen können ist diese Seite dieselbe, die Sie auch unter dem Menüpunkt »What’s ntop?« aus der »About« – Sparte erreichen würden. In dieser Seite bekommen Sie allgemeine Informationen über NTop (welche Protokolle werden abgefangen etc.). Für den weiteren Gebrauch wird diese Seite daher nicht sehr nützlich sein. Configuration Als Nächstes wollen wir uns den Menüpunkt »Configuration« aus demselben Oberpunkt (»About«) ansehen. Dazu werfen wir einen Blick auf Abbildung 2.22. Sandini Bib 96 2 Netzwerk-Tools Abbildung 2.21 Startseite Abbildung 2.22 Config Sandini Bib 2.3 NTop 97 Wie Sie erkennen können, bietet Ihnen diese Seite einige Informationen über den Host, auf dem das Programm, läuft an. Auch diese Seite werden Sie bei der Überwachung Ihres Netzwerkverkehrs nicht allzu oft aufrufen. Credits Hier erfahren Sie mehr über den Entwickler von NTop (Luca Deri). Außerdem werden Sie über Verbesserungen der installierten Version und weitere nützliche Fakten aufgeklärt. Abbildung 2.23 Credits Man Page Die letzte Seite aus dem Menüpunkt »About« bietet die erste nützliche und hilfreiche Information für einen Administrator, welcher über diesen Punkt Zugriff auf die Man Page von NTop bekommt. Dies kann in vielen Situationen sehr nützlich sein (Abbildung 2.24). Data Rcvd Nachdem wir nun alle Unterpunkte des Menüpunktes »About« ausführlich besprochen haben, werden wir uns mit dem nächsten Punkt »Data Rcvd« beschäftigen. Dieser Punkt kann Ihnen nützliche und hilfreiche Informationen über die empfangenen Daten aus Ihrem Netzwerk (die von NTop abgefangen werden konnten) ausgeben. Sandini Bib 98 2 Netzwerk-Tools Abbildung 2.24 Man Page All Protocols Wie Sie aus Abbildung 2.25 ersehen können, erhalten Sie in diesem Menüpunkt nützliche Informationen darüber, welche Hosts mit welchem Protokoll wie viele Daten empfangen haben. Es werden Statistiken über folgende Protokolle zur Verfügung gestellt. TCP UDP ICMP DLC IPX DECNET (R)ARP Apple Talk OSPF NetBios IGMP OSI Sandini Bib 2.3 NTop 99 QNX Other Falls Sie detaillierte Auflistungen über einen einzelnen Host wollen, klicken Sie auf die IP-Adresse des gewünschten Hosts. Für Informationen über die dargestellten Protokolle klicken Sie auf das betreffende Protokoll. Um die vorhandenen Einträge zu sortieren, können Sie den Pfeilbutton neben dem Punkt »Received« benutzen. Grundsätzlich gilt, dass ein Klick auf einen Link weitergehende nützliche Informationen über den dargestellten Punkt bringt. Scheuen Sie sich also nicht davor, dieses Feature zu nutzen. Abbildung 2.25 All Protocols IP Ähnlich zum Menüpunkt »All Protocols« erhalten Sie hier Informationen über die verfügbaren IP-Protokolle, den betreffenden Host und die dazugehörige Domain (Abbildung 2.26) Aufgelistete Protokolle sind: FTP HTTP Sandini Bib 100 2 Netzwerk-Tools DNS Telnet NetBios-IP MAIL SNMP NEWS NFS X11 SSH andere IP-Protokolle. Abbildung 2.26 IP Throughput Dieser Menüpunkt gibt Ihnen Aufschluss über den erreichten Durchsatz beim Empfangen Ihrer Daten. So erhalten Sie hier zum Beispiel Informationen über den: aktuellen Durchsatz in bps (Actual Thpt) durchschnittlichen Durchsatz in kbs (Avg Thpt) maximal erreichten Durchsatz in kbs (Peak Thpt) Sandini Bib 2.3 NTop 101 aktuellen Paketdurchsatz in Paketen pro Sekunde (Actual Pkt Thpt) durchschnittlichen Paketdurchsatz pro Sekunde (Avg Pkt Thpt) maximal erreichten Paketdurchsatz pro Sekunde (Peak Pkt Thpt) Für weitere Informationen werfen Sie einen Blick auf Abbildung 2.27. Abbildung 2.27 Throughput Host Activity Abbildung 2.28 zeigt die Seite, die Sie erhalten, wenn Sie den Menüpunkt »Host Activity« wählen. Dort erhalten Sie Informationen darüber, wann welcher Host wie stark aktiv war. NetFlows Abbildung 2.29 zeigt Ihnen den Menüpunkt »NetFlows«, der Sie über Paket- und Trafficfluss in Ihrem Netzwerk informiert. Data Sent Nachdem wir nun den Oberpunkt »Data Rcvd« abgeschlossen haben, wollen wir uns mit dem dazugehörigen Gegenstück beschäftigen – »Data Sent«. Wie der Name schon erkennen lässt, erhalten Sie durch diesen Punkt ein Menü, welches Ihnen detaillierte Statistiken über die in Ihrem Netzwerk gesendeten Daten liefern kann. Sandini Bib 102 2 Netzwerk-Tools Abbildung 2.28 Host Activity Abbildung 2.29 NetFlows Sandini Bib 2.3 NTop 103 All Protocols Der erste Menüpunkt von »Data Sent« informiert darüber, wie viele Daten über welches Protokoll verschickt wurden. Dabei werden folgende Protokolle aufgelistet: TCP UDP ICMP DLC IPX Decnet (R)ARP Apple Talk OSPF NetBios IGMP OSI QNX und andere Protokolle Falls Sie weitere Informationen dazu wünschen, können Sie einen Blick auf Abbildung 2.30 werfen. Abbildung 2.30 All Protocols Sandini Bib 104 2 Netzwerk-Tools IP Abbildung 2.31 zeigt diesen Menüpunkt, der Ihnen Aufschluss über die gesendeten IP-Pakete gibt. Es werden für folgende Protokolle Statistiken erstellt: FTP HTTP DNS Telnet NetBIOS IP MAIL SNMP NEWS NFS X11 SSH andere IP-Protokolle Abbildung 2.31 IP Sandini Bib 2.3 NTop 105 Throughput Auch der Überbegriff »Data Sent« informiert Sie über den erreichten Durchsatz beim Senden von Daten. Dabei werden folgende Statistiken angefertigt: Aktueller Durchsatz in bps (Actual Thpt) Durchschnittlicher Durchsatz in kbs (Avg Thpt) Maximal erreichter Durchsatz in kbs (Peak Thpt) Aktueller Paketdurchsatz in Paketen pro Sekunde (Actual Pkt Thpt) Durchschnittlicher Paketdurchsatz pro Sekunde (Avg Pkt Thpt) Maximal erreichter Paketdurchsatz pro Sekunde (Peak Pkt Thpt) Abbildung 2.32 zeigt diese Seite. Abbildung 2.32 Throughput Host Activity Auch im Feld »Data Sent« ist eine Statistik verfügbar, die Ihnen Aufschluss über die zeitlichen Aktivitäten Ihrer Hosts gibt. Die hier gezeigten Daten werden grafisch in einer Tabelle dargestellt, wobei jedes Tabellenfeld genau eine Stunde repräsentiert. Wenn dieses Feld leer ist, so war der Host in dieser Zeit nicht aktiv. Sandini Bib 106 2 Netzwerk-Tools Dies kann sehr nützlich sein, wenn Sie die Verfügbarkeit Ihrer Serversysteme feststellen müssen. Abbildung 2.33 zeigt diese Seite. Abbildung 2.33 Host Activity Stats Der vierte Überpunkt des Webinterfaces von NTop bietet allgemeine Statistiken an, die sich nicht auf gesendete oder empfangene Daten, sondern auf die Gesamtheit beziehen, an. Multicast Dieser Menüpunkt informiert Sie über die aktuellen Multicaststatistiken. Traffic Unter diesem Punkt finden Sie enorm viele hilfreichen Informationen über den entstandenen Netzwerkverkehr in Ihrem Netzwerk. So werden Sie hier zu Beginn über allgemeine Daten informiert: Danach bekommen Sie eine Auflistung des gesendeten und empfangenen Pakete, des Durchsatzes und der dabei verwendeten Protokolle (Abbildung 2.34). Sandini Bib 2.3 NTop 107 Abbildung 2.34 Traffic Hosts Hier finden Sie Informationen über die von den verschiedenen Hosts verwendete IP- und MAC-Adresse, die durchschnittliche Bandbreite, den Rechnernamen (und gegebenenfalls die Arbeitsgruppe) und noch vieles mehr. Abbildung 2.35 zeigt diese Seite. Die weiterführenden Links werden in diesem Rahmen aber nicht abgebildet, da dies definitiv den Rahmen dieses Buches sprengen würde und außerdem nicht von großem Nutzen für Sie wäre. Auch hier gilt, dass jeder zur Verfügung gestellte Link benutzt werden sollte, da die dahinter liegenden Daten durchaus interessant und nützlich sein können. Throughput Wie Sie in Abbildung 2.36 erkennen können, erhalten Sie unter diesem Punkt eine Seite, die Ihnen die durchschnittliche Bandbreite eines Tages bzw. einer Stunde mitteilt. Wenn Sie dabei auf die verschiedenen Spitzen der Grafik klicken, erhalten Sie nützliche weiterführende Informationen über den dabei entstandenen Traffic (beteiligte Rechner und so weiter). Sandini Bib 108 2 Netzwerk-Tools Abbildung 2.35 Hosts Abbildung 2.36 Throughput Sandini Bib 2.3 NTop 109 Domain Unter diesem Menüpunkt erhalten Sie Informationen und Statistiken über den aktuellen Status Ihrer Internetdomain. Plugins Wie aus Abbildung 2.37 hervorgeht, erhalten Sie unter diesem Menüpunkt Daten über die verfügbaren Plugins. Abbildung 2.37 Plugins Falls ein Plugin nicht aktiviert ist, hat es den Status »No«. Sie können dieses Plugin durch einen Klick auf den Link »No« aktivieren. Es erhält danach den Status »yes«. Um weiterführende Informationen über das betreffende Plugin zu bekommen, klicken Sie auf den entsprechenden Link. Abbildung 2.38 und Abbildung 2.39 zeigen zwei Seiten, die die entsprechenden Plugins beschreiben. Sandini Bib 110 2 Netzwerk-Tools Abbildung 2.38 arpWatch Plugin Abbildung 2.39 ICMP Statistics Plugins Sandini Bib 2.3 NTop 111 IP Traffic Im fünften Oberpunkt finden Sie Informationen über den entstandenen IP Traffic. Dabei können Sie zwischen drei Statistiken wählen: 1. Remote zu lokal 2. Lokal zu remote 3. Lokal zu lokal 4. Ein Klick auf die einzelnen IP-Adressen gibt weiterführende Informationen aus. So erhalten Sie dadurch zum Beispiel folgende Daten: Allgemeine Informationen über den betreffenden Host Statistiken über den Netzwerkverkehr (zeitlich eingeteilt) TCP-Paketstatistiken IP-Protokollaufteilung TCP UDP (R)ARP NetBIOS Zuletzt kontaktierte Rechner IP-Sitzungshistory Aktive TCP-Sitzungen und einiges mehr R>L Die Seite, die sich hinter diesem Link verbirgt, gibt Aufschluss über den Netzwerkverkehr, der vom externen Netz ins lokale Netz angefallen ist. L>R Dieser Punkt beschreibt den Netzwerkverkehr, der vom internen Netzwerk ins Internet ging. L <> L Wie Sie aus Abbildung 2.40 erkennen können, behandelt dieser Punkt die Statistiken über den Netzwerkverkehr, der in Ihrem internen Netz angefallen ist. Matrix Unter diesem Punkt erhalten Sie die IP Subnet-Matrix. Dabei können Sie durch eine farbliche Kennung genau erkennen, welcher Host wie viel gesendet bzw. empfangen hat (Abbildung 2.41). Sandini Bib 112 2 Netzwerk-Tools Abbildung 2.40 L <> L Abbildung 2.41 Matrix Sandini Bib 2.3 NTop 113 Local Usage Dieser Menüpunkt gibt Ihnen Aufschluss über den entstandenen lokalen Netzwerkverkehr. Dabei erhalten Sie eine Aufteilung in die folgenden zwei Kategorien (Abbildung 2.42): 1. Netzwerkverkehr versucht durch einen Prozess 2. Netzwerkverkehr bezogen auf die verschiedenen Ports 3. Ein Klick auf den entsprechenden Prozess oder Port öffnet eine neue Seite (Abbildung 2.43), welche Daten über den Prozess bzw. den Port enthält (zum Beispiel: empfangene Daten, gesendete Daten, geöffnete Ports, Prozess ID, Username) Abbildung 2.42 Local Usage IP Protos Der vorletzte Oberpunkt enthält Informationen über die zur Verfügung stehenden und genutzten IP-Protokolle, über die verwendeten Router und die Subnetmaske. Sandini Bib 114 2 Netzwerk-Tools Abbildung 2.43 Local Usage proftpd Distribution Dieser Menüpunkt zeigt Ihnen den gesamten Netzwerkverkehr aufgeteilt in folgende drei Bereiche: Lokaler Netzwerkverkehr Remote zu lokal Lokal zu remote Diese drei Bereiche enthalten wiederum Grafiken, die Ihnen anschaulich den Anteil bestimmter Protokolle am entstandenen Netzwerkverkehr illustrieren. Abbildung 2.44 zeigt diese Seite. Usage Diese Seite enthält Informationen über die IP Subnet-Verwendung und zeigt die dabei beteiligten Protokolle und die dazugehörigen Portnummern. Ein Klick auf die angezeigten IP-Adressen liefert weitere interessante Daten. Abbildung 2.45 zeigt diese Seite. Sandini Bib 2.3 NTop 115 Abbildung 2.44 Distribution Abbildung 2.45 Usage Sandini Bib 116 2 Netzwerk-Tools Sessions Unter diesem Punkt finden Sie die zurzeit aktiven TCP-Sitzungen. Dabei werden die Einträge für jede Sitzung in folgende Felder unterteilt: Client IP Adresse/Dienst Server IP Adresse/Dienst Gesendete Daten Empfangene Daten Aktiv seit Zuletzt beobachtet Dauer Abbildung 2.46 zeigt einen Screenshot, der den Inhalt dieser Seite darstellt. Abbildung 2.46 Session Routers Wie Sie sich sicherlich bereits gedacht haben, enthält der letzte Link des »IP Protos« Oberpunkts eine Statistik und eine dazu passende Beschreibung für die verwendeten Router. Sandini Bib 2.3 NTop 117 Admin Diesem Bereich sollten Sie als Erstes Ihre Aufmerksamkeit schenken, da Sie damit NTop steuern und administrieren können. Switch NIC Falls Sie mehrere Netzwerkkarten in Ihrem Server haben, können Sie mit diesem Link die aktuelle Karte gegen eine andere austauschen (im Sinne der Überwachung, natürlich nicht physikalisch). Reset Stats Hiermit können Sie alle Statistiken zurück auf Null stellen. Users Um diesen Bereich betreten zu können, brauchen Sie ein Passwort und einen gültigen Benutzernamen. Falls Sie NTop zum ersten Mal benutzen, sind die Defaultwerte gesetzt. Sie können sich somit mit dem Usernamen »admin« und dem dazugehörigen Passwort »admin« einloggen. Selbstredend sollten Sie diese Werte sofort nach der Initialisierung von NTop ändern. Nachdem Sie sich erfolgreich eingeloggt haben, sollten Sie zu der in Abbildung 2.47 dargestellten Seite gelangen. Abbildung 2.47 Users Sandini Bib 118 2 Netzwerk-Tools Um neue User anzulegen folgen Sie dem Link »Add User«. Sie sollten danach zu der in Abbildung 2.48 gezeigten Seite weitergeleitet werden. Falls Sie jedoch einen bereits existierenden Benutzer ändern wollen, können Sie dies tun, indem Sie auf den gezeigten Stift im »Actions«-Feld klicken. Abbildung 2.48 Add User Wenn Sie einen Benutzer löschen wollen, klicken Sie auf das durchgestrichene Gesicht im »Actions« Feld (nicht in der gezeigten Abbildung zu sehen). URLs Wie Sie in Abbildung 2.49 gut erkennen können, erlaubt Ihnen diese Seite die vordefinierten URLs zu ändern oder neue zu erstellen. Um eine neue URL hinzuzufügen, müssen Sie auf das Feld »Add URL« klicken. Die dabei aufgerufene Seite ist in Abbildung 2.50 zu sehen. Shutdown Wenn Sie Ihren NTop Webserver herunterfahren wollen, können Sie das mit diesem Link erledigen. Nachdem der Server erfolgreich heruntergefahren wurde, erhalten Sie die in Abbildung 2.51 gezeigte Meldung. Sandini Bib 2.3 NTop 119 Abbildung 2.49 URL Abbildung 2.50 Add URL Sandini Bib 120 2 Netzwerk-Tools Abbildung 2.51 Shutdown 2.4 Tcpdump Beim nächsten Tool, mit dem wir uns beschäftigen, handelt es sich um ein PaketCapture-Programm, das Ihnen die Möglichkeit gibt, bestimmte Pakete aus dem Netzwerk auszulesen und anzuzeigen. Auch dieses Tool kann einem Administrator, der auf Fehlersuche ist, eine enorme Hilfe sein. Laienhaft könnte man sagen, dass dieses Tool Ihnen die Möglichkeit bietet die Pakete, die sich in Ihrem Netzwerk befinden, mit Hilfe verschiedenster Filter darzustellen und Ihnen damit eine Basis für die Kontrolle bestimmter Netzwerkgeräte wie Firewalls, Router, Switches … zu bieten. 2.4.1 Installation Sie können sich dieses Tool wie immer von der Buchpage downloaden oder es aus der Paketdatenbank Ihrer Distribution beziehen. Bedenken Sie bitte, dass das Programm Rootrechte braucht, um korrekt zu laufen. Sandini Bib 2.4 Tcpdump 2.4.2 121 Lauschangriff Bevor Sie den großen Lauschangriff auf Ihr Netzwerk starten können, sollten Sie wissen, welche Möglichkeiten Ihnen dabei zur Verfügung stehen. Im Grunde ist die Bedienung und Handhabung dieses Tools unkompliziert, da es sich komplett über die Konsole steuern lässt. Es handelt sich dabei jedoch um ein äußerst umfangreiches Tool, was zur Folge hat, dass Sie einer Vielzahl von Optionen und Argumenten gegenüberstehen. Welche Ihnen dabei genau zur Verfügung stehen und welchen Nutzen sie für Sie haben, werden Sie in den folgenden Abschnitten dieses Kapitels erfahren. Am Ende der Besprechung von Tcpdump werden wir einige sinnvolle Beispiele aufführen, die Ihnen hoffentlich helfen, dieses Tool zielstrebig und effektiv einzusetzen. Allgemeine Syntax Die allgemeine Syntax für dieses Programm kann man nicht gerade als kurz bezeichnen, deshalb werden wir auf jedes Feld des Befehlsaufrufes genau eingehen, um Ihnen einen kompletten Einblick in die Funktionsweise von Tcpdump geben zu können. Bevor wir aber auf bestimmte Felder eingehen können, sollten wir uns den Befehl mit allen Optionen und Argumenten genauer anschauen. Linux:~# tcpdump [Optionen] [ -c count ] [ -C file_size ] [ -F file ] [ -i interface ] [ -m module ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -E algo:secret ] [ expression ] Optionen Optionen bieten Ihnen den grundlegendsten und gröbsten Filter, um den Verkehr auf Ihrem Netzwerk zu überwachen. Welche Filter (Optionen) Sie benutzen können und was Sie bewirken, werden Sie in Tabelle 2.14 erfahren. Optionen Beschreibung -a Versucht Netzwerk- und Broadcastadressen in Namen umzuwandeln -c count Bricht ab, nachdem ein count-Paket empfangen wurde (benötigt Angabe des Pakets) -C file-size Bevor ein RAW-Paket in ein »safefile« geschrieben wird, wird überprüft, ob diese Datei größer als die angegebene Dateigröße (file-size) ist. Falls dies der Fall ist, wird eine neue Datei erstellt. -dd Zeigt den Code des Paket Matching als C fragment. Bsp: { 0x6, 0, 0, 0x00000060 }, Tabelle 2.14 Tcpdump Optionen Sandini Bib 122 2 Netzwerk-Tools Optionen Beschreibung -ddd Zeigt den Code des Paket Matching in Dezimalzahlen. Bsp: 1 6 0 0 96 -e Zeigt den Link Level Header in jeder Zeile -E algo:secret Benutzen Sie diese Option, um IPsec ESP-Pakete zu entschlüsseln. Folgende Algorithmen stehen Ihnen dabei zur Verfügung: des-cbc (Defaultwert) 3des-cbc blowfish-cbc rc3-cbc cast128-cbc none Sie können diese Option nur nutzen, falls tcpdump mit der Option crytographie kompiliert wurde. Den Platzhalter secret füllen Sie bitte mit dem ESP Secret key (ASCII-Format, binär ist noch nicht möglich). Weiter funktioniert diese Option nur mit RFC2406 ESP, nicht mit RFC1827 ESP. -f Zeigt nicht lokale Internetadressen numerisch anstatt symbolisch an. Wurde speziell für Suns yp Server entwickelt. -F file Sie können Ihre Filter in der in File angegebenen Datei speichern und Tcpdump wird sie daraus lesen. Alle Filter aus der Kommandozeile werden ignoriert. -i interface Gibt das abzuhörende Interface an. Falls Sie kein Interface angeben, sucht Tcpdump in der Systeminterfaceliste nach dem ersten Eintrag und benutzt dieses Interface. Loopback Devices werden ignoriert. Sie können auch den Pattern any übergeben und es werden alle Interfaces abgehört. -l Standartausgabezeilen werden gepuffert -m modul Lädt SMI MIB-Moduldefinitionen aus der angegebenen Datei -n Keine Adressumwandlung zu Namen -N Zeigt nicht den vollen Domainnamen des Hosts an. Zum Beispiel: joey.triblen.de wird als joey angezeigt. -O Verhindert, dass der Paket Matching Code Optimizer läuft. (Nur sinnvoll, wenn Sie denken, dass dieser buggy ist.) -p Das Interface wird nicht in promiscuous mode versetzt. Es kann sich aber durchaus aus anderen Gründen in diesem Modus befinden. -q Es werden weniger Protokollinformationen ausgegeben, die Zeilen werden somit kürzer. -R Gibt Tcpdump die Anweisung, dass ESP/AH-Pakete noch auf alten Spezifikationen beruhen (von RFC1825 bis zu RFC1829). Falls Sie diese Option verwenden, wird das relay prevention-Feld nicht angezeigt. -r file Liest Pakete aus der angegebenen Datei (die mit der w-Option erstellt wurde). Tabelle 2.14 Tcpdump Optionen (Forts.) Sandini Bib 2.4 Tcpdump 123 Optionen Beschreibung -S Zeigt absolute anstatt relative TCP-Sequenznummern an. -T Pakete werden nach den angegebenen ‚expressions« selektiert und nach dem spezifizierten type interpretiert. Die zurzeit verfügbaren Typen sind: cnfg (Cisco NetFlow Protocol) rpc (Remote Precedure Call) rtp (Real Time Applications Protocol) rtcp (Real Time Applications Control Protocol) snmp (Simple Network Management Protocol) vat (Visual Audio Tool) wb (distributed White Board) -t Zeigt nicht an jeder Zeile den timestamp an -tt Zeigt einen unformatierten timestamp in jeder Zeile an -ttt Zeigt ein Delta zwischen aktueller und vorhergehender Zeile an (in Mikrosekunden) -tttt Zeigt den timestamp im Defaultformat gefolgt vom Datum in jeder Zeile an. Mit der u-Option können Sie zusätzlich noch nicht dekodierte NFS Handles anzeigen lassen. -v Verbose-Modus. Es werden zusätzliche Informationen wie: time to live-Wert identification-Wert total length-Wert Optionen in einem IP-Paket angezeigt. Außerdem werden zusätzliche Checks wie die Berechnung der Quersumme von IP und ICMP Headern ausgegeben. -vv Gibt noch mehr Output als der normale Verbose-Modus. So werden hier zum Beispiel zusätzliche Felder von NFS Replypaketen dargestellt. SMBPakete werden sogar vollständig dekodiert. -vvv Gibt wiederum noch mehr Output. Hier werden zum Beispiel Telnet SB … SE-Optionen voll dargestellt. -w file Schreibt RAW-Pakete in die angegebene Datei, anstatt sie auszugeben. Sie können später mit der -r-Option wieder ausgegeben werden. -x Stellt jedes Paket hexadezimal dar (ohne den Link Level Header). -X Falls die Option –X gesetzt ist, werden Pakete zusätzlich auch noch in ASCII ausgegeben. Tabelle 2.14 Tcpdump Optionen (Forts.) Expressions So, da Sie nun alle verfügbaren Optionen kennen, können wir uns mit dem Feld expression beschäftigen, das Ihnen die Möglichkeit gibt, zu bestimmen, welche Pakete im Netzwerk angezeigt werden sollen. Sandini Bib 124 2 Netzwerk-Tools Expressions bestehen normalerweise aus einem oder mehreren primitives, die sich in der Regel aus einer ID (Name oder Zahl) gefolgt von einem oder mehreren Qualifiers zusammensetzen. Wir werden uns mit jedem einzelnen Bestandteil genau befassen. Qualifiers Wir werden mit der Beschreibung der Qualifiers beginnen. Tabelle 2.15 enthält die drei verfügbaren Qualifiers. Qualifier Beschreibung type Dieser Qualifier gibt an, worauf sich die ID (Name oder Zahl) bezieht. Mögliche Typen sind: host (Defaultwert) (z.B. Host Joey) net (z.B. net 130.9) port (z.B. port 8080) dir Gibt die Transferrichtung zu und/oder von einer bestimmten ID an. Mögliche Werte sind: src dst src or dst (Defaultwert) src and dst Beispiele hierfür können zum Beispiel sein: src Joey dst net 130.9 src or dst port ssh Für Null Link Layers wie SLIP können die Qualifier inbound und outbound zur Richtungsbestimmung benutzt werden. proto Dieser Qualifier reduziert die Treffer auf bestimmte Protokolle, wie zum Beispiel: ether fddi tr ip ip6 arp rarp decnet tcp udp Tabelle 2.15 Verfügbare Qualifiers Sandini Bib 2.4 Tcpdump Qualifier 125 Beschreibung Mögliche Beispiele hierfür: ether src Joey arp net 130.9 tcp port 8080 Falls Sie diesen Qualifier nicht explizit angeben, treffen alle Protokolle, die auf den Typ zutreffen könnten, zu. Tabelle 2.15 Verfügbare Qualifiers (Forts.) Bevor wir uns mit dem Feld primitives auseinander setzen, sollten wir uns einige Besonderheiten zu dem Qualifier proto ansehen: Beachten Sie bei der Verwendung dieses Qualifiers bitte, dass das Feld fddi eigentlich ein Synonym für ether ist, da Tcpdump die beiden gleich behandelt. Dies liegt daran, dass FDDI Header Ethernet-ähnliche Quell- und Zieladressen und oftmals Ethernet-ähnliche Pakettypen haben, die den Feldern von Ethernetpaketen sehr ähnlich oder manchmal sogar damit identisch sind. Ähnlich verhalten sich auch tr-Pakete, da auch dieses Feld ein Synonym für ether darstellt. Primitives Nachdem Sie nun wissen, was es mit den Qualifiern auf sich hat, können wir uns den primitives widmen. Vorab möchte ich Sie darauf hinweisen, dass Sie mit den Schlüsselwörtern and, or und not diese primitives kombinieren können. Tabelle 2.16 enthält alle verfügbaren primitives und gibt Ihnen zu jedem aufgezählten Punkt eine kurze Beschreibung. Primitive Beschreibung dst host host Wahr, wenn das IPv4- oder IPv6-Zieladressenfeld dem Argument host entspricht. Dieses Argument kann eine Adresse oder ein Name sein. src host host Wahr, wenn das IPv4- oder IPv6-Quelladressenfeld dem Argument host entspricht. Dieses Argument kann eine Adresse oder ein Name sein. host host Wahr, wenn das IPv4- oder IPv6-Quell- oder Zieladressenfeld des Pakets dem Argument host entspricht. Sie können jeden der genannten Hostausdrücke mit folgenden Keywörtern kombinieren (Sie müssen dabei das Keywort vorstellen): ip arp rarp ip6 Tabelle 2.16 Verfügbare primitives Sandini Bib 126 Primitive 2 Netzwerk-Tools Beschreibung Zum Beispiel ist der Ausdruck ip host host äquivalent zu ether proto \ip and host host (Beispiel aus Manpage) ether dst ehost Wahr, wenn die Ethernet-Zieladresse dem Argument ehost entspricht. Dieses Argument kann entweder ein Name aus der Datei /etc/ethers oder eine Zahl sein. ether src ehost Wahr, wenn die Ethernet-Quelladresse dem Argument ehost entspricht. Dieses Argument kann auch hier entweder ein Name aus der Datei /etc/ethers oder eine Zahl sein. ether host ehost Wahr, wenn die Ethernet-Quell- oder Zieladresse dem Argument ehost entspricht. gateway host Wahr, wenn das Paket den Host, den Sie mit dem Argument host übergeben, als Gateway benutzt hat. dst net net Wahr, wenn die IPv4- oder IPv6-Zieladresse eine Netzwerknummer hat, die Sie mit dem Argument net übergeben. Das Argument kann entweder ein Name aus /etc/networks oder eine Zahl sein. src net net Wahr, wenn die IPv4- oder IPv6-Quelladresse eine Netzwerknummer hat, die Sie mit dem Argument net übergeben. Das Argument kann entweder ein Name aus /etc/networks oder eine Zahl sein. net net Wahr, wenn die IPv4 oder IPv6 Quell- oder Zieladresse eine Netzwerknummer hat, die Sie mit dem Argument net übergeben. Das Argument kann entweder eine Name aus /etc/networks oder eine Zahl sein. net net mask mask Wahr, wenn das Netzwerk, das Sie mit dem Argument net übergeben, mit der Netzwerkmaske, die Sie mit dem Argument mask übergeben, übereinstimmt. Kann mit src und dst verfeinert und eingeschränkt werden. net net/len Wahr, wenn die IPv4- oder IPv6- angegebene Adresse net, einer Netzwerkmaske mit len bits Größe entspricht. dst port port Wahr, wenn es sich bei dem Paket um ein IPv4/TCP-, IPv4/UDP-, IPv6/ UDP- oder IPv6/TCP-Paket handelt und dessen Zielport dem Wert entspricht, den Sie mit dem Argument port übergeben. Dieses Argument kann entweder eine Zahl oder ein Name aus der Datei /etc/services sein. Wenn Sie einen Namen verwenden, werden die Portnummer und das Protokoll überprüft. Wenn Sie eine Zahl verwenden, wird nur die Portnummer überprüft. src port port Wahr, wenn es sich beim dem Paket um ein IPv4/TCP-, IPv4/UDP-, IPv6/ UDP- oder IPv6/TCP-Paket handelt und dessen Quellport dem Wert entspricht, den Sie mit dem Argument port übergeben. Dieses Argument kann entweder eine Zahl oder ein Name aus der Datei /etc/services sein. Wenn Sie einen Namen verwenden, werden die Portnummer und das Protokoll überprüft. Wenn Sie eine Zahl verwenden, wird nur die Portnummer überprüft. Tabelle 2.16 Verfügbare primitives (Forts.) Sandini Bib 2.4 Tcpdump 127 Primitive Beschreibung port port Wahr, wenn es sich beim dem Paket um ein IPv4/TCP-, IPv4/UDP-, IPv6/ UDP- oder IPv6/TCP-Paket handelt und dessen Ziel- oder Quellport dem Wert entspricht, den Sie mit dem Argument port übergeben. Dieses Argument kann entweder eine Zahl oder ein Name aus der Datei /etc/services sein. Wenn Sie einen Namen verwenden, werden die Portnummer und das Protokoll überprüft. Wenn Sie eine Zahl verwenden, wird nur die Portnummer überprüft. Alle der aufgeführten Portausführungen können mit folgenden Schlüsselwörtern kombiniert werden: tcp udp So trifft zum Beispiel folgende Syntax nur auf TCP-Pakete zu, deren Quellport 23 ist. tcp src port 23 less length Wahr, wenn das Paket kleiner oder genauso groß ist wie der Wert, den Sie mit dem Argument length übergeben. Äquivalent zu: len <= length greater length Wahr, wenn das Paket größer oder genauso groß ist wie der Wert, den Sie mit dem Argument length übergeben. Äquivalent zu: len >=length ip porto protocol Wahr, wenn das Paket ein IP-Paket ist. Das Argument protocol kann eine Zahl oder einer der folgenden Namen sein: icmp icmp6 igmp igrp pim ah esp udp tcp Beachten Sie dabei, dass die Protokollnamen tcp, udp und icmp ebenfalls Schlüsselwörter sind und dass Sie diese daher mit einem Backslash (\) davor aufführen müssen (C-Shell: \\). ip6 proto protocol Wahr, wenn das Paket ein IPv6-Paket vom Protokolltyp, den Sie mit dem Argument protocol übergeben, ist. Tabelle 2.16 Verfügbare primitives (Forts.) Sandini Bib 128 2 Netzwerk-Tools Primitive Beschreibung ip6 protochain protocol Wahr, wenn das Paket ein IPv6-Paket ist und einen Protokollheader mit dem Protokolltypen, den Sie mit dem Argument protocol angeben, in der Protokollheader chain enthält. Ein Beispiel hierfür kann man aus den Manpages entnehmen: ip6 protochain 6 Diese Syntax trifft auf irgendein IPv6 Paket zu, dessen Protokollheader chain einen TCP Protokollheader enthält. ip protochain protocol Wahr, wenn das Paket ein IPv4-Paket ist und einen Protokollheader mit dem Protokolltypen, den Sie mit dem Argument protocol angeben, in der Protokollheader chain enthält. ether broadcast Wahr, wenn das Paket ein Ethernet Broadcast-Paket ist. Das Schlüsselwort ether ist optional. ip broadcast Wahr, wenn das Paket ein IP Broadcast-Paket ist. Überprüft all-zeroes und all-ones Broadcastroutinen. ether multicast Wahr, wenn das Paket ein Ethernet Multicast-Paket ist. Auch hier ist das Schlüsselwort ether optional. ip multicast Wahr, wenn das Paket ein IPv4 Multicast-Paket ist. ip6 multicast Wahr, wenn das Paket ein IPv6 Multicast-Paket ist. ether proto protocol Wahr, wenn das Paket den Ehernet Protokolltypen hat, den Sie mit dem Argument protocol übergeben. Auch hier können Sie den Typ entweder durch eine Zahl oder einen Namen repräsentieren. Mögliche Namen hierfür sind: ip ip6 arp rarp atalk aarp decnet sca lat mopdl moprc iso Bitte beachten Sie auch hierbei, dass es sich um Schlüsselwörter handelt und Sie diese daher mit einem vorhergehenden Backslash angeben müssen. decnet src host Wahr, wenn die DECNET-Quelladresse dem Wert, den Sie mit dem Argument host übergeben, entspricht. decnet dst host Wahr, wenn die DECNET-Zieladresse dem Wert, den Sie mit dem Argument host übergeben, entspricht. Tabelle 2.16 Verfügbare primitives (Forts.) Sandini Bib 2.4 Tcpdump 129 Primitive Beschreibung decnet host host Wahr, wenn die DECNET-Ziel- oder Quelladresse dem Wert, den Sie mit dem Argument host übergeben, entspricht. ip, ip6, arp, rarp, atalk, aarp, decnet, iso Abkürzungen für: lat, moprc, mopdl Abkürzungen für: vlan [vlan_id] Wahr, wenn das Paket ein IEEE 802.1Q VLAN-Paket ist. Wenn das Argument vlan_id angegeben wird, trifft die Syntax logischerweise nur dann zu, wenn das Paket die spezifizierte VLAN_ID hat. tcp, udp, icmp Abkürzungen für: ether proto protocol, wobei protocol eine der aufgeführten Protokollarten ist. ether proto protocol, wobei protocol eine der aufgeführten Protokollarten ist. Beachten Sie dabei, dass tcpdump nicht weiß, wie es diese Protokolle zerlegen und bestimmen soll. ip proto protocol oder für: ip6 proto protocol Wobei das Argument protocol eines der aufgeführten Protokolle darstellen muss. iso proto protocol Wahr, wenn das Paket ein OSI-Paket mit dem Protokolltypen, den Sie mit dem Argument protocol angegeben haben, ist. Sie können dieses Argument dabei entweder durch Zahlen oder durch einen der folgenden Namen darstellen: clnp esis isis clnp, esis, isis Abkürzungen für: iso proto protocol, wobei protocol eines der angegebenen Protokolle darstellen muss. Beachten Sie, dass Tcpdump momentan noch nicht weiß, wie es diese Pakte zerlegen und bestimmen kann. expr relop expr Wahr, wenn die Bedingung zutrifft, wobei relop eines der folgenden Zeichen sein muss: > < >= <= = != Tabelle 2.16 Verfügbare primitives (Forts.) Sandini Bib 130 Primitive 2 Netzwerk-Tools Beschreibung und expr ein arithmetischer Ausdruck aus integer Konstanten (in Standard C-Syntax ausgedrückt) ist. Binäroperatoren wie + * / & | sind erlaubt. Um Daten in einem Paket anzusprechen, benutzen Sie bitte die Syntax, die wir Ihnen als Nächstes vorstellen. proto [ expr : size ] Diese Syntax können Sie benutzen, um Zugriff auf die Daten innerhalb eines Pakets zu bekommen. Wobei das Argument proto den Protokolllayer für die Indexoperation anzeigt und einen der folgenden Wert annehmen muss: ether fddi tr ip arp rarp tcp udp icmp ip6 Zurzeit befindet sich in dieser Funktion noch ein kleiner Bug, der verursacht, dass die Protokolle aus den oberen Protokollschichten (tcp, udp ...) nur für IPv4 funktionieren. Das Argument expr gibt das Byteoffset relativ zu dem angezeigten Protokolllayer an. Das Argument size ist optional und zeigt die Anzahl der Bytes in einem Feld an. Sie können weiter das Schlüsselwort len einführen, welches dann die Länge des Pakets anzeigt. Hierzu vorab einige Beispiele aus der Manpage: ether[0] & 1 !=0 Dieses Beispiel fängt den ganzen Multicastverkehr ab. ip[0] & 0xf != 5 Dieses Beispiel fängt alle IP-Pakete mit Optionen ab. Weitere Beispiele sind in einem der nächsten Abschnitte zu sehen. Tabelle 2.16 Verfügbare primitives (Forts.) Sandini Bib 2.4 Tcpdump 131 Die in Tabelle 2.16 kennen gelernten primitives können Sie aber natürlich auch verknüpfen. Welche Verknüpfungsarten (Operatoren) Sie dabei benutzen können und welche die höchste Priorität hat, werden Sie in Tabelle 2.17erfahren. Operator Beschreibung Priorität ! oder not Verneinung Dieser Operator hat die höchste Prioritätsstufe. && oder and Verkettung Niedrigere Priorität als der Verneinungsoperator, doch dieselbe wie der Oder-Operator. || oder or Oder-Verknüpfung Niedrigere Priorität als der Verneinungsoperator, doch dieselbe wie der Verkettungsoperator. Tabelle 2.17 Verfügbare Kombinationsoperatoren Beispiele Nachdem wir nun ausführlich die Syntax von Tcpdump besprochen haben, sollten wir uns einige Beispiele ansehen, damit wir auch wissen, wie wir unser neu erlangtes Know-how geschickt und effektiv einsetzen können. Wir werden diese Beispiele zum Teil aus den Manpages, aber zum Großteil aus Alltagssituationen beziehen. Das erste Beispiel soll Tcpdump dazu bringen, alle Pakete, die den Host Joey am Interface eth0 erreichen bzw. die ihn auf diesem Interface verlassen, anzuzeigen. Während unserer Überwachungszeit wird ein Ping auf diesen Host gerichtet und des Weiteren wird ein Linux FTP Client versuchen, sich mit dem FTP-Server auf diesen Host zu verbinden. Linux:~# tcpdump host Joey –i eth0 Das nächste Beispiel zeigt den kompletten Netzwerkverkehr zwischen dem Host Joey und entweder dem Host Aga oder dem Host Aj (Vergessen Sie nicht den Backslash vor den Sonderzeichen!). Linux:~# tcpdump host Joey and \{ Aga or Aj \} Um den gesamten FTP Traffic, der durch den Internet Gateway Grassl geht, anzuzeigen, müssen Sie diese Syntax verwenden. Die Anführungszeichen wurden verwendet, damit die Shell diesen Befehl nicht falsch interpretiert. Linux:~# tcpdump ‚gateway Grassl and (port 20 or 21)’ Sie können diese Syntax auch so formulieren: Linux:~# tcpdump ‚gateway Grassl and (port ftp or ftp-data)’ Um alle IP-Pakete, die größer als 500 Byte sind und durch den Gateway Grassl gehen, anzuzeigen, können Sie diesen Aufruf verwenden: Linux:~# tcpdump ‚gateway Grassl and ip[2:2] > 500’ Sandini Bib 132 2 Netzwerk-Tools Falls Sie alle ICMP-Pakete außer den Pings anzeigen wollen, verwenden Sie diesen Befehl: Linux:~# tcpdump ‚icmp[0] != 8 and icmp[0] !=0’ Sie können diese Syntax aber auch anders darstellen: Linux:~# tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' 2.4.3 Ausgabeformat Wie das Manual von Tcpdump werden auch wir uns ausgiebig mit dem Ausgabeformat der Meldungen und »dumps« beschäftigen, denn was hilft Ihnen die größte und beste Auswahl und Ausgabe an Paketen, wenn Sie sie nicht verstehen? Zuerst einmal muss man natürlich darauf hinweisen, dass es nicht ein Ausgabeformat gibt, das für alle »dumps« gültig ist. TCMPdump ist so ausgelegt, dass die Anzeigen, die Sie erhalten, je nach Protokoll- und Paketart variieren. Wir werden uns damit an verschiedenen Punkten auseinander setzen und diese anhand einer ausführlichen Beschreibung vorstellen. Link Level Headers Ethernet Wenn Sie einen Blick auf Tabelle 2.11 werfen, werden Sie sehen, dass Sie mit Hilfe der Option -e den Link Level Header in jeder Zeile ausgeben können. Bei Ethernetnetzwerken hat dies zur Folge, dass folgende Felder ausgegeben werden: Quelladresse Zieladresse Protokoll Paketlänge FDDI Anders verhält sich diese Option bei FDDI-Netzwerken. Hier werden folgende Felder ausgegeben: Frame Control Quelladresse Zieladresse Paketlänge Normale Pakete sind async-Pakete mit einer Priorität von 0 bis 7 (zum Beispiel async7). Diese Pakete beinhalten ein Logical Link Control Paket, welches dargestellt wird, falls es sich dabei nicht um ein ISO-Datagramm oder ein so genanntes SNAP (Subnetwork Access Protocol)-Paket handelt. Falls Sie sich genauer für das SNAP- Sandini Bib 2.4 Tcpdump 133 Protokoll interessieren, können Sie weitere Informationen unter der Adresse http:// www.isi.edu/in-notes/rfc1700.txt erhalten. Token Ring In Token Ring-Netzwerken werden – falls Sie diese Option verwenden – folgende Felder angezeigt: Access Control Frame Control Quelladresse Zieladresse Paketlänge Ähnlich zu FDDI-Netzwerken beinhalten auch Pakete in einem Token Ring-Netzwerk LLC-Pakete. SLIP Bei SLIP Links werden wiederum folgende Felder angezeigt: Direction Indicator ( I = inbound und O = outbound) Pakettyp Kompressionsinformationen Es gibt dabei drei Arten von Pakettypen: 1. ip 2. utcp 3. ctcp Für IP-Pakete werden keine weiteren Informationen angezeigt. Wohingegen bei TCP-Paketen der connection identifier gefolgt vom Typen aufgeführt wird. Wenn das Paket gepackt (komprimiert) ist, wird auch der Header angezeigt. Spezialfälle werden durch ein *S+n und ein *SA+n repräsentiert, wobei das n für den Wert steht, an dem sich die Sequenznummer geändert hat. Falls kein Spezialfall vorliegt, werden meistens keine Veränderungen angezeigt. Eine solche Veränderung wird durch ein U (Urgent Pointer), W (Window), A (ACK), S (Sequenznummer) und ein I (Paket ID), gefolgt von einem Delta (+n oder –n) oder einer neuen Zeile (=n) angezeigt. Danach werden die Daten im Paket und die Länge des komprimierten Headers angezeigt. Damit Sie diese Theorie besser verstehen können, sollten Sie sich das folgende Beispiel anschauen. Es zeigt ein outbound-komprimiertes TCP-Paket mit einem connection identifier. Der Wert des ACK hat sich bei 6 geändert, die Sequenznummer bei 49 und die Paket ID bei 6. Das Paket beinhaltet drei Bytes Daten und 6 Bytes komprimierten Header (Beispiel aus Manual): Sandini Bib 134 2 Netzwerk-Tools O ctcp * A+6 S+49 I+6 3 (6) TCP Pakete Das allgemeine Format einer TCP-Protokollzeile lautet wie folgt. src > dst: flags data-sequenznummer ack window urgent options Um die Bedeutung der einzelnen Felder dieser Protokollzeile zu erfahren, werfen Sie einen Blick auf Tabelle 2.15. Feld Bedeutung src Quelladresse dst Zieladresse flags Das Feld flags wird zumeist aus mehreren Flags gebildet. Mögliche Flags sind dabei: S (SYN) F (FIN) P (PUSH) R (RST) Es kann aber auch vorkommen, dass ein Paket keine Flag gesetzt hat, dann wird dies durch einen einzelnen Punkt dargestellt. data-sequenznummer Dieses Feld beschreibt den Anteil des Sequenzraumes, den die Daten in einem Feld einnehmen. ack Teilt dem Sender mit, wie viele Daten der Empfänger erhalten hat und wie viele er noch verarbeiten kann. Die ACK-Nummer (Bestätigungsnummer) ist die Sequenznummer des nächsten Bytes, auf das der Empfänger wartet. Sie ist eine positive Bestätigung aller bis zu dieser Zahl empfangenen Bytes. Wenn das erste gesendete Byte mit der Nummer 1 gekennzeichnet war und die nächsten 5000 Bytes erfolgreich empfangen wurden, hätte die Bestätigungsnummer den Wert 5001. window Dieses Feld gibt an, wie viele Bytes noch empfangen werden können. Kann der Empfänger zum Beispiel weitere 5000 Bytes verarbeiten, würde das Feld den Wert 5000 enthalten. Das Feld teilt dem Sender mit, dass er weitere Segmente so lange senden kann, bis die Anzahl der gesendeten Bytes nicht mehr kleiner ist als das vom Empfänger angegebene Fenster (Window). Der Empfänger kann somit den Bytefluss regulieren und steuern, indem er die Größe dieses Feldes verändert. Ist der Wert im Fenster Null, so wird die Übertragung eingestellt. urg Besagt, dass die Daten, die das Paket enthält, dringend sind. options Beschreibt die TCP-Optionen. Tabelle 2.18 Felder der TCP-Protokollzeile Sandini Bib 2.4 Tcpdump 135 2 Abbildung 2.52: TCP Header zeigt Ihnen die in Tabelle 2.18 illustrierten Felder in einer Grafik über den TCP Header. Abbildung 2.52 TCP Header Die Felder Src, dst und flags werden Sie in jeder Protokollzeile finden, die anderen hingegen sind optional und hängen vom Inhalt des Pakets ab. Beispielausgabe Ich denke, wir haben uns jetzt lange genug mit der Theorie beschäftigt und sollten zur Praxis übergehen. Für diese Zwecke werden wir uns folgendes Beispiel anschauen: In unserem Übungsszenario startet der Host Joey seinen FTP Client, um mit dem FTP-Server Aj eine Verbindung aufzubauen (Dieses Szenario behandelt nur den Verbindungsaufbau, nicht die Authentifizierung oder den Datenaustausch). Als Erstes starten wir tcpdump auf dem Rechner Aj und übergeben folgenden Befehl, der bewirkt, dass ab jetzt das (im Netzwerk nur zu Testzwecken benutze Interface) eth2 überwacht wird. Andy@Aj:/home/andy> tcpdump –i eth2 tcpdump: listening on eth2 Jetzt starten wir auf dem Host Joey den FTP Client, um die Verbindung herzustellen. Aga@Joey:/home/aga> ftp Aj Connected to Aj.testdomain.de 220 ProFTPD 1.2.2 Server (ProFTPD) [Aj.testdomain.de] ... Sandini Bib 136 2 Netzwerk-Tools An dieser Stelle brechen wir mit (STRG) + (C) ab und widmen uns dem Protokoll, das uns Tcpdump ausgegeben hat (Ich lasse die Uhrzeiten, timestamps, nop-Befehle etc. weg, um ein übersichtlicheres Bild zu erhalten). Joey.testdomain.de.1039 > Aj.testdomain.de.ftp : S 1721778674:1721778674(0) win 32767 <mss 16396> Aj.testdomain.de.ftp > Joey.testdomain.de.1039 : S 1715865645:1715865645(0) ack 1721778675 win 32767 <mss 16396> Joey.testdomain.de.1039 > Aj.testdomain.de.ftp : . ack 1 win 16383 Aj.testdomain.de.ftp > Joey.testdomain.de.1039 : P 1:54(53) ack 1 win 32767 Joey.testdomain.de.1039 > Aj.testdomain.de.ftp : . ack 54 win 16383 Joey.testdomain.de.1039 > Aj.testdomain.de.ftp: F 1:1(0) ack 54 win 16383 Aj.testdomain.de.ftp > Joey.testdomain.de.1039 : F 54:54(0) ack 2 win 32767 Joey.testdomain.de.1039 > Aj.testdomain.de.ftp : . ack 55 win 16383 Lassen Sie uns nun dieses Beispiel Schritt für Schritt durchgehen, damit Sie auch wirklich die Funktionsweise von Tcpdump verstehen lernen. In Zeile eins sehen Sie, wie der Rechner Joey.testdomain.de über den Port 1039 einen Verbindungsaufbau zu dem FTP-Server auf dem Rechner AJ startet. Sie sehen an dem S nach dem Doppelpunkt, dass die SYN Flag gesetzt war. Die Sequenznummer des Pakets können Sie gleich nach dem S erkennen (in diesem Fall 1715865645). Der Wert in den Klammern zeigt die Anzahl der Bytes an, die Daten des Users sind. In unserem Fall sind dies 0 Byte. Es sind also keine Userdaten enthalten. Das Windowfeld (win) hat den Wert 32767, das heißt, es können noch 32767 Bytes empfangen werden. Außerdem beinhaltet die erste Zeile noch eine Option <mss 16396>. Die mss-Option ist eine sehr häufig aufgeführte Option und gibt an, dass eine maximale Segment-Größe (max segment size) von 16396 Bytes erbeten wird. In der zweiten Zeile erkennen wir, dass der FTP-Server (Aj.testdomain.de.ftp) mit einem ACK-Paket auf das zuvor erhaltene SYN-Paket antwortet. Das restliche Paket ist identisch mit dem zuvor erhaltenen. Auch auf dieses Paket antwortet Joey mit einem ACK. Der Punkt in Zeile drei bedeutet, dass keine Flags gesetzt sind, und da das Paket keine Daten enthält, gibt es auch keine Datensequenznummer. Wohingegen die Bestätigungssequenznummer einen Integerwert von 1 hat (ack 1). Aus Zeile drei erhalten wir die Information, dass Aj.testdomain.de.ftp 53 Bytes Daten zu Joey schickt (Der Wert in den Klammern verrät uns dies). Außerdem ist das PUSH-Flag gesetzt (P). Von daher sollte der Rest der Bildschirmausgabe nun klar und verständlich sein. Da Sie nun das ganze Listing durchgegangen sind, werden Sie feststellen, dass die ersten drei Zeilen keine Data-Sequenznummer enthalten (die Data-Sequenznummer ist die Zahl vor dem ack), dies liegt daran, dass diese Pakete keine Daten enthielten (Kein Wert steht in Klammern). Sandini Bib 2.4 Tcpdump 137 Fehler- und Sonderfälle Nicht jede Ausgabe läuft so glatt ab wie die eben vorgestellte. Es kann durchaus einmal vorkommen, dass tcpdump nicht in der Lage ist, den kompletten TCP Header abzufangen und auszuwerten. Falls dies einmal der Fall sein sollte, wird Ihnen Tcpdump die Teile des Pakets, die es abfangen konnte, darstellen und Ihnen danach ein [|tcp] anzeigen, das Ihnen sagt, dass es Teile des Headers gibt, die nicht in der Protokollzeile enthalten sind. Falls der Header komplett abgefangen wurde, ist dies noch lange kein Garant dafür, dass alles glatt gegangen ist. Eine häufige Fehlerquelle sind falsche Optionen, die entweder zu kurz sind oder sich hinter dem Ende des Headers befinden. Diese Fälle markiert Tcpdump mit [bad opt]. Eine weitere Fehlerquelle im Zusammenhang mit Optionen kommt dadurch zustande, dass die Länge des Headers vermuten lässt, dass er Optionen beinhaltet, die IP-Datagrammlänge jedoch zu klein dafür ist. In solchen Fällen macht Tcpdump Sie mit folgender Meldung darauf aufmerksam: [bad hdr length]. Pakete mit bestimmten Flagkombinationen abfangen Ich habe erst gestern mit einem Kollegen über den Sinn und die Wirkung dieser Möglichkeit ausführlich gesprochen. Um Ihnen jene Vorteile (aus der Sicht eines Sicherheitsbeauftragten) näher zu bringen, werde ich Ihnen ein kurzes Summary unseres Gespräches geben. Stellen Sie sich vor, Sie haben einen neuen Router installiert. Sie sind zwar kein absoluter Sicherheitsexperte, wollen aber dennoch, dass Ihr Netzwerk sicher gestaltet ist. Sie entscheiden sich daher dafür, ein Feature des Routers zu nutzen (die Marke werde ich an dieser Stelle nicht bekannt geben, aber ich bin mir ziemlich sicher, dass sie die meisten Leser kennen), welches es Ihnen erlaubt – laut Beschreibung – sicherzugehen, dass nur angeforderte Verbindungen in Ihr Netz gelangen. Alle anderen werden geblockt. Jetzt fragen Sie sich sicher, welchen genialen Einfall die Entwickler dieses Hardwaregerätes hatten, um dieses Feature in die Welt zu setzen. Leider muss ich Sie enttäuschen, sie waren auch nicht viel einfallsreicher, als wir es sind. Der Router lässt nämlich nur bestätigte Pakete durch. Er nimmt also einfach eine schlichte Überprüfung vor, ob das ACK-Flag gesetzt ist. Das ist alles. Aus Sicht eines Sicherheitsexperten oder zumindest eines Menschen mit Sicherheitsverlangen kommt man natürlich sofort zu dem Schluss, dass dieses Feature kein wirkliches Hindernis darstellt. Wir haben unser Tcpdump nun so konfiguriert, dass es alle Pakete, die die Flags SYN und ACK gesetzt haben, anzeigt, und hatten innerhalb kürzester Zeit eine ständig wiederkehrende Routine entdeckt, die es uns schließlich ermöglicht hat, die Pakete so zu simulieren, dass wir durch den Router hindurch gekommen sind. Dieses Ereignis lehrt uns zwei Dinge: 1. Überprüfe stets jedes Sicherheitsfeature. 2. Router sind keine Firewalls. Sandini Bib 138 2 Netzwerk-Tools 3. Wenn Sie sich jetzt fragen, warum ich Ihnen diese – für Sie belanglose – Geschichte erzählt habe, möchte ich mich damit verteidigen, dass ich Ihnen auf diese Weise ein wirklich praktisches Feature von Tcpdump näher bringen wollte. 4. Sie haben – wie Sie aus der Erzählung bereits entnehmen konnten – mit Tcpdump die Möglichkeit nur Pakete anzeigen zu lassen, die bestimmte Flags oder bestimmte Flagkombinationen gesetzt haben. Um dieses Feature voll zu nutzen, sollten wir uns als Erstes einmal anschauen, welche Flags es denn überhaupt gibt (bei TCP-Paketen wohlgemerkt): SYN ACK PSH RST URG FIN CWR ECE Aus meiner kleinen Geschichte konnte Sie entnehmen, dass der Router nur Pakete durchlassen wollte, die eine Verbindungsanfrage seinerseits mit einem ACK bestätigten. Ich möchte weiterhin bei diesem Beispiel bleiben, da Szenarien wie diese oftmals in Sicherheitspapieren und Ähnlichem auftauchen. Dafür sollten wir uns als Erstes mit dem dort stattfindenden three way handshake beschäftigen. Um eine TCP-Verbindung aufzubauen und somit eine Datenverbindung zu etablieren, braucht man den so genannten three way handshake. Man hat diese Prozedur so benannt, da die zwei beteiligten Rechner drei Segmente austauschen. Abbildung 2.53 zeigt Ihnen eine sehr einfach gehaltene Form des three way handshakes. Wie Sie sehen können, beginnt Host Joey damit, dem Rechner Patrick ein Paket (Segment Nummer eins) zu schicken, bei dem das SYN-Bit (Synchronize Sequence Numbers) gesetzt ist. Nachdem Patrick dieses Paket erhalten hat, kann er daraus entnehmen, dass Joey eine Verbindung aufbauen möchte und welche Sequenznummer er als Startnummer seiner Segmente verwenden möchte (Wir haben ja bereits gelernt, dass man Sequenznummern unbedingt braucht, um die Daten in der richtigen Reihenfolge zu halten). Jetzt schickt der Rechner Patrick seinerseits ein Antwortpaket zu Joey (Segment Nummer zwei), bei dem die Bits SYN und ACK gesetzt sind. Sobald das Paket erhalten wurde, weiß Joey, dass Patrick das erste Segment erhalten hat und mit welcher Sequenznummer Patrick beginnen möchte. Jetzt schickt Joey das letzte Paket des three way handshakes zu Patrick (Segment Nummer drei), das Patrick mitteilt, dass das zweite Segment erhalten wurde. In diesem letzten Paket ist das ACK Bit gesetzt und es werden bereits die ersten Daten übermittelt. Sandini Bib 2.4 Tcpdump 139 J o e y P a tr ic k S Y N S Y N , A C K A C K , D a te n Abbildung 2.53 three way handshake Nachdem wir nun wissen, was ein three way handshake ist und wie er zustande kommt, können wir wieder zurück auf unser Szenario kommen. Für einen potentiellen Angreifer ist es äußerst wichtig, durch den Router mit den genannten »Sicherheitsoptionen« durchzukommen, damit er die Server dahinter angreifen kann. Logischerweise ist es also auch für uns wichtig, dass wir uns durch den Router »hacken«, denn nur so können wir diese Lücke schließen. (Es ist immer besser, selbst das Netz zu testen, bevor es die bösen Jungs für Sie tun!). Ein Hacker muss herausfinden, wie er die Sicherheitsoptionen des Routers umgeht oder Sie austrickst. Er wird also schauen, welche Pakete durch den Router gelangen. Bald wird er feststellen, dass alle Verbindungsanfragen (Paket bei denen nur das SYN-Bit gesetzt ist) abgewiesen werden. Danach wird er bemerken, dass alle bestätigten Verbindungsanfragen durchgelassen werden (Paket bei denen das ACK-Bit gesetzt ist). Er wird sich also daran machen, die Pakete, die vom Router hinaus ins Netz gehen und das SYN-Bit gesetzt haben, abzufangen, um diese analysieren zu können. Und genau das wollen wir auch machen. Leider gibt es keine einfach gehaltene Funktion bei Tcpdump, die uns dies ermöglicht. Wir (und auch der Hacker) müssen dabei schon etwas herumrechnen. Aber wie immer werden wir auch dieses Problem vom Anfang bis zum Ende genau durchsprechen. Wir wollen also Pakete, bei denen nur das SYN-Bit gesetzt ist. Dazu sollten wir uns den TCP-Header nochmals ins Gedächtnis rufen. Diesmal aber ohne Daten und Optionen. Abbildung 2.54 zeigt einen solchen Header. Betrachten wir die mit dem X markierte Zeile der Abbildung 2.54 genauer und zerlegen sie in ihre Bestandteile. Dazu müssen wir uns daran erinnern, dass ein TCP-Header ohne Optionen 20 Oktett Daten beinhaltet. Ein Oktett besteht dabei wiederum aus 8 Bit. Das erste Oktett findet sich also im Quellportfeld (Genauer gesagt befinden sich dort zwei Oktette, da das Feld aus 16 Bit besteht). Da das erste Oktett die Ziffer 0 zugewiesen bekommt, sind die für uns interessanten Code Bits (darin befinden sich die Flags) in Oktett Nummer 13 zu finden. Wie Sie ja wissen, benötigen wir um ein vollständiges Oktett zu bekommen 8 Bit. Bis zum Sandini Bib 140 2 Netzwerk-Tools Feld mit der Acknowledgementnummer ist dies auch kein Problem. Doch danach stoßen wir auf Felder mit weniger als 8 Bit. Um auch hier ein Oktett zu bekommen, leiht sich ein Feld, das zu klein ist, ein paar Bit vom nächsten Feld aus, bis es auch auf 8 Bit kommt. So besteht das 12. Oktett aus 4 Bit Header Länge und 4 Bit aus dem Feld für Reservierungen. Das 13. Oktett wiederum besteht nur aus den Codebits. Dies war nicht immer so. Als das Buch entstand, war die Manpage von Tcpdump noch nicht auf den neuesten Stand gebracht und das Code Bits Feld im TCP-Header wurde noch mit 6 Bit angegeben. Beachten Sie bitte diese Neuerung. B it 0 B it 1 5 B it 1 6 B it 3 1 Q u e llp o rt (1 6 ) Z ie lp o rt (1 6 ) S e q u e n z n u m m e r (3 2 ) A c k n o w le d g e m e n tn u m m e r (3 2 ) H e a d e r L ä n g e (4 ) R e s e r v ie r t (6 ) W in d o w G rö ß e (1 6 ) C o d e B its (6 ) C h e c k su m m e (1 6 ) U rg e n t P o in te r (1 6 ) Abbildung 2.54 TCP-Header Nachdem wir nun wissen, welche Bestandteile das für uns interessante Oktett 13 beinhaltet, sollten wir uns an die Analyse und Besprechung dieses Feldes machen. Damit wir uns ein besseres Bild machen können, sollten wir Abbildung 2.55 zu Rate ziehen. 7 6 5 4 3 2 1 0 C W R E C E U R G A C K P S H R S T S Y N F IN 1 3 . O k te tt Abbildung 2.55 Oktett Nummer 13 Wie Sie in der Abbildung erkennen können, sind die verschiedenen Flags (Code Bits) von rechts nach links mit 0 beginnend und 7 endend durchnummeriert. Als Sandini Bib 2.4 Tcpdump 141 Erstes sollten wir uns um die zwei ersten Bits (CWR und ECE) kümmern, welche vor einiger Zeit noch nicht implementiert waren. Stattdessen hat man dort 2 reserved Bits gefunden. Zu dieser Zeit hatten diese Bits stets den Wert 0. Dies wurde in der RFC 793 festgelegt, da die Bits – wie der Name bereits erahnen lässt – für zukünftigen Gebrauch reserviert wurden. Zum heutigen Zeitpunkt können aber alle Bits den Wert 0 oder 1 annehmen. Wird ein Bit bzw. ein Flag gesetzt, bekommt es den Wert 1 zugewiesen. Falls es nicht gesetzt ist, den Wert 0. Da wir (genauso wie der Angreifer) nur Pakete angezeigt bekommen wollen, bei denen das SYN-Bit gesetzt ist, muss dieses Bit den Wert 1 annehmen. Alle anderen Bits dürfen nicht gesetzt sein (Abbildung 2.56). 7 6 5 4 3 2 1 0 C W R E C E U R G A C K P S H R S T S Y N F IN 0 0 0 0 0 0 1 0 1 3 . O k te tt Abbildung 2.56 Nur SYN Flag gesetzt Aus Abbildung 2.56 können Sie den Binärwert des 13. Oktetts entnehmen, der entsteht, wenn nur das SYN-Bit bzw. das SYN-Flag gesetzt ist. Dieser Wert lautet: 00000010 Da wir Tcpdump aber leider keine Binärwerte übergeben können, müssen wir diesen Wert in einen Dezimalwert umrechnen. Dies ist im Grunde nur schwer, wenn man nicht weiß, wie das funktioniert. Falls Sie also nicht wissen sollten, wie dies vonstatten geht, können Sie Ihr Wissen im folgenden Exkurs auffrischen. Binär zu Dezimal Eine Binärzahl besteht aus 8 Bits. Dabei kann ein Bit gesetzt oder nicht gesetzt sein. Wenn ein Bit gesetzt ist, wird es mit dem Wert 1 belegt, ist es aber nicht gesetzt, so weist man diesem Bit den Wert 0 zu. Daraus ergibt sich, dass Binärwerte nur aus Nullen und Einsen bestehen können. Um diesen Wert in einen dezimalen Wert umzurechnen, muss man sich vor Augen führen, dass jede Stelle in einem Binärwert für eine bestimmte Dezimalzahl steht. Die Dezimalwerte verdoppeln sich dafür für jedes weitere Bit (man liest dabei von rechts nach links). Das heißt, dass das erste Bit die Dezimalzahl 1 wiedergibt, das zweite die Dezimalzahl 2, das dritte die 4, das Fünfte die 8, dann 16, 32, 64 und Sandini Bib 142 2 Netzwerk-Tools schließlich 128. Daraus ergibt sich, dass die größtmögliche Binärzahl einen Dezimalwert von 255 repräsentiert. Um den Dezimalwert einer Binärzahl zu bestimmen geht man folgendermaßen vor: Man stellt sich eine Tabelle vor, die für jedes Bit die dazugehörige Dezimalzahl enthält. Wenn ein Bit gesetzt ist (es also mit dem Wert 1 belegt ist), zählt man den dazugehörigen Dezimalwert zu der bereits ermittelten Summe hinzu. Dies macht man so lange, bis man am Ende der Binärzahl angekommen ist. Abbildung 2.57 zeigt eine solche Umrechnung: 1 2 8 6 4 3 2 1 6 1 1 1 1 0 1 2 8 6 4 3 2 1 6 0 1 . Z e ile : re p rä s e n ta tie rte D e z im a lz a h le n 2 . Z e ile : B in ä rw e rt 3 . Z e ile : z u a d d ie re n d e B e trä g e 8 1 4 2 0 0 1 0 2 d a z u g e h ö r ig e r D e z im a lw e r t 0 2 4 2 Abbildung 2.57 Umrechnungsbeispiel Wie Sie aus Abbildung 2.57 erkennen können, lautet der Dezimalwert für die Binärzahl 11110010 242. Dies ergibt sich, wenn Sie die zu den gesetzten Bits gehörenden Dezimalzahlen addieren. Der Dezimalwert für die Binärzahl 00000010 lautet 2. Jetzt können wir ohne Probleme die Syntax bilden, die es uns erlaubt, Pakete, bei denen nur das SYN-Bit gesetzt ist, anzeigen zu lassen. Linux: tcpdump –i xl0 tcp[13] == 2 Da unser Angreifer nun genug Pakete, die nur das SYN-Flag gesetzt haben, analysiert hat, möchte er sich nun daran machen, auch die Pakete anzeigen zu lassen, die zusätzlich das ACK-Flag gesetzt haben. Dazu wirft er einen Blick in Abbildung 2.25 und weiß nun, dass er zusätzlich nur Bit 4 setzen muss (Bit 1 bleibt weiterhin gesetzt). Die Binärzahl für sein Vorhaben lautet nun also: 00010010 Auch diese Zahl rechnet er um (dazu addiert er die Zahlen 2 und 16) und erhält als Ergebnis 18. Falls er nur diejenigen Pakete abfangen wollte, die SYN- und ACK-Flags gesetzt haben, wäre er jetzt fast am Ziel. Er müsste lediglich die ausgerechnete Dezimalzahl noch in seine tcpdump-Syntax einbauen: Linux:~# tcpdump –i xl0 tcp[13] == 18 Sandini Bib 2.4 Tcpdump 143 Da er aber alle Pakete, die entweder nur das SYN-Bit oder das SYN- und ACK-Bit gesetzt haben, anzeigen lassen will, muss er die erste Syntax (nur SYN Bit gesetzt) und die zweite Syntax (SYN und ACK Bit gesetzt) logisch verknüpfen. Dazu benutzt er die Oderverknüpfung, die wir ja bereits kennen gelernt haben: Linux:~# tcpdump –i xl0 ‚tcp[13] == 2 or tcp[13] == 18’ Jetzt ist er in der Lage Pakete, die nur das SYN-Flag, und Pakete, die das SYNund das ACK-Flag gesetzt haben, anzeigen zu lassen. UDP-Pakete Jetzt haben wir ausführlich den Output eines TCP-Pakets besprochen und es wird Zeit, dass wir uns auch um die verbindungslosen Protokolle wie UDP und deren Pakete kümmern. Ich denke, dass wir uns auch hier eine Beispielprotokollzeile anschauen sollten. Joey.testdomain.de.1111 > Aj.testdomain.de.1111 : udp 90 Wie Sie auf den ersten Blick schon erkennen können, sind UDP-Outputs um ein Vielfaches leichter zu lesen und zu interpretieren als TCP-Ausgaben. Dies liegt daran, dass UDP selbst um einiges einfacher gestrickt ist als TCP. Wir können in unserer ersten Beispielzeile sehen, dass ein UDP-Paket mit 90 Byte Userdaten über den Port 1111 den Rechner Joey.testdomain.de in Richtung des Hosts Aj.testdomain.de verlässt und dort ebenfalls auf Port 1111 ankommt. UDP Name Server Requests Das allgemeine Format einer solchen Protokollzeile sieht folgendermaßen aus: src > dst: id op? flags qtype qclass name (len) Auch hierbei steigen wir sofort mit einem Beispiel ein (Beispiel wurde dem Manual entnommen): h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37) Wie wir aus dem Beispiel entnehmen können, bittet der Host h2opolo den Domainserver um einen »address record« (qtype=A) verbunden mit dem Namen ucbvax.berkeley.edu und der Query ID 3 zu bekommen. Das "+" gibt an, dass die Flag "recursion desired" gesetzt war. Ohne IP und UDP Header war die Query 37 Bytes groß. Da wir keinen Eintrag zwischen dem »+« und der »3« finden können, stellen wir fest, dass es ein normaler Query war. Da auch die »qclass« normal war, wurde sie nicht aufgeführt. Falls es eine andere Klasse gewesen wäre, hätten wir diese hinter dem »A« gefunden. NFS Requests und Replies Auch hier werden wir uns als Erstes das allgemeine Format ansehen: src.xid > dst.nfs: len op args src.nfs > dst.xid: reply stat len op results Sandini Bib 144 2 Netzwerk-Tools Sehen wir uns hierzu gleich einige Beispiele an: Joey.testdomain.de.6909 > Aj.testdomain.de.nfs: 100 readlink fh 21,24/10.731657119 Aj.testdomain.de.nfs > Joey.testdomain.de.6909: reply ok 40 readlinke"../joey" Joey.testdomain.de.2019 > Aj.testdomain.de.nfs: 144 lookup fh 9,74/4096.6878 "bunny" Aj.testdomain.de.nfs > Joey.testdomain.de.2019: reply ok 128 lookup fh 9,74/4134.3150 Lassen Sie uns diese Beispiele nun kurz besprechen. In Zeile 1 sehen Sie, wie der Host Joey.testdomain.de eine Transaktion zum Rechner Aj.testdomain.de schickt. Beachten Sie dabei, dass in diesem Fall die Zahl hinter dem Rechnername (6909) nicht der Quellport, sondern die Transaktionsnummer ist. Die nächste Stelle sagt uns, dass die Anfrage 100 Byte groß ist (ohne UDP- und IP-Header). Die Aktion ist ein readlink (read symbolic link) mit dem File Handle (fh) 21,24/10.731657119. Die zweite Zeile besteht aus der Antwort des Rechners Aj.testdomain.de auf die gestellte Anfrage und beinhaltet den Inhalt des Links. Das Paket ist 40 Byte groß. Zeile drei zeigt ein Beispiel für einen lookup. In einem 144 Byte großen Paket stellt Joey.testdomain.de mit der Transaktionsnummer 2019 eine lookup-Anfrage für den Name bunny im Verzeichnis (bzw. seinem File Handle) 9,74/4096.6878. Die Antwort darauf finden wir in dem 128 Byte großen Paket in Zeile 4. Mit Hilfe der Verbose-Funktion, die Sie über den Optionspunkt -v aufrufen, können Sie noch mehr Informationen über das abgefangene Paket erhalten. Welche zusätzlichen Daten Sie hierbei erhalten können, zeigt die folgende Auflistung: TTL ID Fragmentation-Felder Dateityp Dateiattribute Dateimodus UID GIU Dateigröße Auch hier sollten wir uns ein Beispiel dazu ansehen. Dabei sollten Sie aber bedenken, dass diese Protokollzeile nur ein kleiner Auszug des originalen Outputs ist, da das Listing und die dazugehörige Beschreibung ansonsten über einige Seiten gegangen wäre. Sandini Bib 2.4 Tcpdump 145 Joey.testdomain.de.378b > Aj.testdomain.de.nfs: 198 read fh 21,24/ 736358298 8167 @ 30900 Aj.testdomain.de.nfs > Joey.testdomain.de.378b: reply ok 1472 read REG 90061 ids 389/0 58100 Die erste Zeile zeigt wieder eine Transaktionsanfrage an den Rechner Aj.test domain.de.nfs mit einem 198 Byte großen Paket. Dabei wird darum gebeten, dass dieser 8167 Bytes aus der Datei 21,24/736358298 ab Offset 30900 liest. In der zweiten Zeile sehen Sie die Antwort darauf (ist erst das erste Antwortpaket, es werden mehrere folgen). Dieses Paket ist 1472 Byte groß. Es handelt sich bei der Datei um ein reguläres File (Dateityp wird als REG angegeben). Die Dateigröße beläuft sich auf 58100 Bytes. Dazwischen sehen Sie den Dateimodus und die USER ID / GROUP ID. Um NFS-Verkehr abzuhören, können Sie die Option -s 192 benutzen. AFS Requests und Replies Natürlich werfen wir auch hier einen Blick auf die allgemeine Ausgabe der Protokollzeile: src.sport > dst.dport: rx packet-type src.sport > dst.dport: rx packet-type service call call-name args src.sport > dst.dport: rx packet-type service reply call-name args Die Beispiele dazu könnten folgendermaßen aussehen: Joey.testdomain.de.9000 > Aj.testdomain.de.afsfs: rx data fs call rename old fid 23742974/1/1 ".test.test" new fid 23874234/1/1 ".test" Aj.testdomain.de.afsfs > Joey.testdomain.de.9000: rx data fs reply rename In der ersten Zeile schickt der Rechner Joey.testdomain.de über den Port 9000 ein RX Paket an den Host Aj.testdomain.de. Wie man erkennen kann war, dies ein RX Daten-Paket (rx data) und war für den Dateiserver (afsfs = Adrew File System File Server) gedacht und initialisiert damit einen RPC Call. Bei diesem RPC Call handelt es sich um einen Rename (rename) mit einer alten Datei (old) mit der ID (fid) 23742974/1/1 und einem alten Dateinamen (old filename) sowie einer neuen Datei und einem neuen Dateinamen. Die Antwort darauf erfolgt in der zweiten Zeile. Die gewünschten Calls waren erfolgreich, ansonsten wäre statt eines Datenpackes ein Abordpaket angekommen. Falls Sie sich der Verbose-Option (einfach oder doppelt) bedienen, bekommen Sie zusätzlich folgende Informationen ausgegeben: ACK-Pakete Zusätzliche Header-Informationen Sandini Bib 146 2 Netzwerk-Tools RX call ID Call Nummer Sequenznummer Seriennummer RX Flags im Paket MTU negotiation Information Falls Sie die Verbose-Option dreifach initialisieren (-vvv), erhalten Sie noch mehr Informationen: Error Codes für Abordpakete Um AFS-Verkehr anzeigen zu lassen, benutzen Sie die -s 256-Option. KIP Appletalk (DDP in UDP) Appletalk DDP-Pakete, die in UDP-Datagramme eingekapselt sind, werden aus dieser Kapsel befreit und als DDP-Pakete angezeigt, dabei werden die Informationen aus dem UDP-Header komplett verworfen. Hierbei bedient sich Tcpdump der Datei /etc/atalk.names um die Felder appletalk net und node numbers zu übersetzen. Zeilen in einer solchen Datei haben folgendes Format: number name 1.254 ether 16.1 testnetz 1.254.110 Joey Die ersten beiden Zeilen geben die Namen der Appletalknetzwerke wieder. Die dritte Zeile steht für den speziellen Host. Sie können Leerzeilen und Kommentare in diese Datei einfügen (einen Kommentar müssen Sie dabei mit dem #-Zeichen einleiten). Appletalkadressen sollten folgendermaßen angeführt werden: net.host.port Dazu einen Auszug aus einer Beispieldatei: 150.6.200.2 > testnetz.100.200 munich.2 > testnetz.100.200 testnetz2.150.250 > testnetz.2 Falls die Datei /etc/atalk.names nicht existiert oder kein Eintrag für einen bestimmten Appletalkhost oder ein bestimmtes Appletalknetzwerk besteht, werden die Adressen numerisch ausgegeben. Sandini Bib 2.4 Tcpdump 147 Die erste Zeile dieses Auszuges bedeutet, dass der Host 209 im Netz 150.1 über DDP Port 2 etwas an den Port 200 des Hosts 100 im testnetz sendet. Die zweite Zeile bedeutet im Grunde dasselbe wie die erste, mit dem kleinen Unterschied, dass der Name des Quellhosts bekannt ist (munich). In der dritten Zeile sendet der Host 150 aus dem Netz testnetz2 über den Port 250 einen Broadcast an das Netz testnetz auf den Port 2 (NBP Port). Sie können erkennen, dass es sich hierbei um einen Broadcast handelt, da kein Rechnername beziehungsweise keine Rechneradresse angegeben wurde. NBP-Pakete Ich denke, wir können gleich mit einem Beispiel und einer darauf folgenden Besprechungen starten: testnetz.100.200 > testnetz2.2 : nbp-lkup 190: "=:Drucker@*" 250 testnetz2.150.2 > testnetz.100.200 : nbp-reply 190: "HPLaserJet:Drucker@*" 310 Joey.2 > testnetz.100.200 : nbp-reply 190: "HPFarbLaser:Drucker@*" 178 Die erste Zeile ist eine Anfrage für einen name lookup für Drucker, welche vom Host 100 aus dem Netz testnetz an die Broadcastadresse des Netzes testnetz2 geschickt wurde. Die NBP ID für den lookup ist 190. Die Antwort auf diese Antwort finden wir in Zeile zwei (da die ID dieselbe ist). Darin weist der Host 150 aus dem Netz testnetz2 darauf hin, dass er einen Drucker namens »HPLaserJet« hat, welcher auf Port 310 registriert ist. Die dritte Zeile stellt ebenfalls eine Antwort auf die erste Anfrage dar. In diesem Paket berichtet der Host Joey, dass er auch einen Drucker besitzt, welcher auf Port 178 sitzt. Der Drucker hat den Namen HPFarbLaser. ATP Pakete Auch hier, denke ich, können wir gleich mit einem Beispiel beginnen. testnetz.200.100 > Joey.150: atp-req 11298<0-7> 0xae300001 Joey.150 > testnetz.200.100: atp-resp 11298:0 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp 11298:1 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp 11298:2 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp 11298:3 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp 11298:4 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp 11298:5 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp 11298:6 (512) 0xae040000 Joey.150 > testnetz.200.100: atp-resp*11298:7 (512) 0xae040000 testnetz.200.100 > Joey.150: atp-req 11298<3,5> 0xae0300001 Joey.150 > testnetz.200.100 atp-resp 11298:3 (512) 0xae040000 Joey.150 > testnetz.200.100 atp-resp 11298:5 (512) 0xae040000 testnetz.200.100 > Joey.150: atp-rel 11298<0-7> 0xae0300001 testnetz.200.110 > Joey.150: atp-req*11299<0-7> 0xae0300002 Sandini Bib 148 2 Netzwerk-Tools Wie wir aus Zeile 1 erfahren, initiiert testnetz.200 eine Transaktion mit der ID 11298 mit dem Host Joey und erbittet dabei bis zu 8 Pakete (von 0 bis 7). Die Anzahl der Userdaten ist in hexadezimaler Form am Ende der Zeile angegeben. Danach sehen wir, dass der Host Joey mit 8 Paketen mit jeweils einer Größe von 512 Bytes (ohne ATP Header) antwortet. An der Transaktionsnummer erkennen wir, dass es sich um Antwortpakete auf den ersten Request handelt. Die Zahl hinter der Transaktionsnummer stellt die Paketsequenznummer in der Transaktion dar. Das Sternchen (*) in Zeile 9 signalisiert, dass das EOM Bit gesetzt wurde. In Zeile 10 bittet testnetz.200 den Host Joey die Pakete Nummer 3 und Nummer 5 nochmals zu senden. Nachdem diese wieder gesendet wurden, signalisiert testnetz.200 den release für diese Verbindung (atp-rel). In der letzten Zeile wird bereits die nächste Anfrage gestartet. Das Sternchen hierbei gibt an, dass XO (exactly one) nicht gesetzt war. Sandini Bib 3 Systemaudit In diesem Buch finden Sie sehr viele Tools, mit denen Sie den Stand der Sicherheit in Ihrem System verbessern können. Doch woher sollen Sie wissen, wann Sie »sicher genug« sind (ich weiß, dass man nie sicher genug sein kann, aber ...) oder wann die Sicherheit zu Lasten der Performance oder der Benutzbarkeit des Systems geht. In diesem Kapitel werden wir einige Tools besprechen, die Ihnen bei der Beantwortung dieser Fragen helfen werden. 3.1 Nmap Nmap ist wohl der bekannteste Netzwerk- und Securityscanner, den es zurzeit auf dem freien Markt gibt, und dies nicht ohne Grund. Er bietet eine Vielzahl von Scanmöglichkeiten und unterstützt Features wie OS-Detection. Falls Sie sich fragen, was ein Scanner in einem Securitybuch zu suchen hat, kann ich nur darauf hinweisen, dass nur derjenige sein System sicherer gestalten kann, der die Schwächen seines Netzwerkes kennt. Und um dies zu erreichen, kommt man um die Benutzung und Zuhilfenahme der »Waffen des Feindes« nicht herum. 3.1.1 Installation Da die meisten Distributionen dieses Tool mitliefern, kann man sich eigentlich das Herunterladen sparen. Doch wer stets sicher und up-to-date sein will, kommt um einen Download nicht herum. Wie immer können Sie sich dieses Tool von der Buch-Website oder direkt von der offiziellen Website downloaden (www.insecure.org/Nmap). Nachdem Sie sich das aktuelle Paket von einer der angegebenen Webseiten gezogen haben, führen Sie noch folgenden Befehl aus und Ihr System ist um ein Sicherheitstool reicher. Linux:~# rpm –i Nmap-version.rpm 3.1.2 Verwendung Da es bei diesem Programm nicht viel zu konfigurieren gibt, können wir uns gleich mit den Einsatzmöglichkeiten beschäftigen. Der Programmaufruf erfolgt über den aufgeführten Befehl: Linux:~# Nmap [Scanmodus] [Optionen] Hostname / IP Sandini Bib 150 3 Systemaudit Scanmodi Im Folgenden werden Sie eine Auflistung aller zurzeit verfügbaren Scanmodi mit der entsprechenden Syntax erhalten und erfahren, was die einzelnen Modi bewirken. TCP connect()-Scan Dies ist die einfachste Form des Scannens, da es den connect()-Systemaufruf von Linux benutzt, um eine Verbindung zu einem interessanten Port zu öffnen. Falls dieser Verbindungsversuch gelingt – der Port also »lauscht« –so wird der Systemaufruf erfolgreich sein, ansonsten ist der Port nicht erreichbar. Diese Methode hat den enorm großen Vorteil, dass keine speziellen Privilegien erforderlich sind (wie zum Beispiel bei Raw Sockets… ) und somit jeder User des Systems einen Scan mit dieser Methode durchführen kann. Der Aufruf lautet wie folgt: Linux:~# Nmap –sT [Optionen] Hostname / IP TCP SYN-Scan Man bezeichnet diese sehr beliebte Scanmethode auch oftmals als »halb offenen« Scan, da eigentlich keine volle TCP-Verbindung aufgebaut wird, sondern nur ein SYN Paket zu einem bestimmten Port geschickt wird. Falls auf diese Anfrage als Antwort ein SYN oder ein ACK zurückgeschickt wird, lässt dies darauf schließen, dass der Port geöffnet ist. Es kann jedoch auch vorkommen, dass als Antwort ein RST geschickt wird, was bedeutet, dass der Port geschlossen ist. Im Falle eines ACK- oder SYN-Antwortpakets wird sofort ein RST zurückgeschickt, um die Verbindung zu beenden. Leider benötigt man für diese Option Rootrechte. Linux:~# Nmap –sS [Optionen] Hostname / IP Stealth FIN-Scan Die eben kennen gelernte TCP-SYN-Scan-Methode mag auf den ersten Blick das A und O eines Scans sein, aber es gibt Gott sei Dank auch Möglichkeiten solche Scans leicht zu entdecken. Deshalb hat man sich entschlossen eine Reihe von Scanmodi in Nmap einzubauen, die es ermöglichen, diejenigen Mechanismen zu umgehen, die SYN-Scanattacken ausfindig machen können. Dabei hat man sich der RFC 793 bemächtigt, welche besagt, dass geschlossene Ports auf ein »Probepaket« mit einem RST reagieren müssen, während offene Ports diese zu ignorieren haben. (Natürlich gibt es wieder einige Hersteller, die sich nicht an den Standard halten können: Microsoft, Cisco, HP/UX, BSDI, MVS und IRIX). Ein Stealth FIN-Scan sendet als »Probepaket« ein leeres FIN-Paket und wartet die Antwort ab. Beachten Sie dabei bitte, dass die Scans nicht bei Windows-Rechnern funktionieren werden. Linux:~# Nmap –sF [Optionen] Hostname / IP Sandini Bib 3.1 Nmap 151 Xmas Tree-Scan Auch diese Scanmethode macht sich die in der RFC 793 vorgeschriebene Arbeitsweise für Ports zu Nutze und wird somit nicht bei Windows-Rechnern funktionieren. Anders als Stealth FIN-Scans benutzt diese Scanart keine FIN-Pakete, sondern schickt Pakete, bei denen die FIN-, URG- und PUSH-Flags gesetzt sind. Linux:~# Nmap –sX [Optionen] Hostname / IP Null-Scan Diese Scanmethode ist die letzte, die auf den Vorgehensweisen der RFC 793 beruht. Falls Sie diesen Scan benutzen, wird ein »Probepaket« geschickt, das keine Flags gesetzt hat. Linux:~# Nmap –sN [Optionen] Hostname / IP Ping-Scanning Bei einem Ping-Scan wird kein Port-Scan durchgeführt, sondern nach aktiven Hosts im Netzwerk gesucht. Dafür werden ICMP-Echo-Reply-Pakete an die interessanten Rechner geschickt. Falls einer dieser Hosts antwortet, ist er aktiv. Sie können Ihre Firewall oder Ihren Router aber so konfigurieren, dass auf diese Pakete nicht geantwortet wird und Ihr Rechner somit als inaktiv erkannt wird. Dies schützt Sie aber noch lange nicht vor solchen Pingdurchläufen, da – falls die erste Methode misslingt – ein TCP-ACK-Paket auf einen bestimmten Port (Standardport ist 80) geschickt wird. Falls Ihr Rechner auf dieses Paket mit einem RST-Paket antwortet, weiß Nmap, dass er aktiv ist. Zur Absicherung hat man auch noch eine dritte Scanmethode eingebaut. Hierbei wird ein SYN-Paket losgeschickt und auf ein ACK/SYN-Antwortpaket gewartet. (Dieser Scan wird bei jedem Portscan automatisch durchgeführt, um zu sehen, ob der Rechner aktiv ist.) Linux:~# Nmap –sP [Optionen] Hostname / IP UDP Scan Es ist wesentlich schwieriger, einen UDP-Scan durchzuführen, als offene TCPPorts zu erkennen. Fakt ist, dass es keine 100%ig sichere Methode für das Erkennen von offenen UDP-Ports gibt, da – wie wir ja wissen – dieses Protokoll nicht verbindungsorientiert arbeitet. Um offene UDP-Ports zu erkennen, behilft man sich daher mit einem kleinen Trick. Man schickt zu jeder UDP-Portadresse ein leeres UDP-Paket und wartet auf eine ICMP port-unreachable-Nachricht, die uns bestätigt, dass der Port geschlossen ist. Falls wir diese Nachricht aber nicht bekommen, können wir annehmen, dass der Port geöffnet ist. Man sollte dabei aber nicht den Nachteil dieses Tricks vergessen. Da die meisten Betriebssysteme von sehr intelligenten Menschen entwickelt wurden, hat man dem Vorschlag der RFC 1812 Folge geleistet und die ICMP-destination-unreachable-Nachrichten pro Sekunde limitiert. Dies hat zur Folge, dass solche Scans enorm lange dauern können. Natürlich war Microsoft auch hier wieder klüger Sandini Bib 152 3 Systemaudit und hat in seinen OS-Kernel kein Limit für solche Nachrichten eingebaut, was zur Folge hat, dass UDP-Scans, die auf Windows-Rechner zielen, enorm schnell sind. Linux:~# Nmap –sU [Optionen] Hostname / IP IP-Protocol-Scans Auch diese Scanoption nutzt eine ICMP-Fehlermeldung um herauszufinden, ob bestimmte Protokolle auf dem Zielrechner unterstützt werden. Dabei wird ein RAW-IP-Paket ohne weiteren Protokollheader zu jedem spezifizierten Protokoll am Zielrechner geschickt. Falls Nmap eine ICMP protocol unreachable-Fehlermeldung bekommt, weiß es, dass das spezifizierte Protokoll unterstützt wird. Falls diese Meldung nicht zurückgeschickt wird, so nimmt Nmap an, dass das Protokoll »offen« ist. Beachten Sie dabei, dass Hosts, die AIX, HP-UX oder digital Unix als Betriebssystem fahren, keine Fehlermeldung zurückschicken und somit alle Protokolle als »offen« gekennzeichnet werden. Linux:~# Nmap –sO [Optionen] Hostname / IP ACK-Scans Diese Scanmethode wird des Öfteren benutzt, um Firewallregeln auszulesen oder den Typ der vorgeschalteten Firewall zu bestimmen. Um dies zu erreichen, schickt Nmap ACK-Pakete mit unterschiedlich aussehenden Acknowledgement/ Sequenznummern zum angegebenen Port bzw. Ports. Falls Nmap ein RST-Paket als Antwort empfängt, so wird der Port als nicht gefiltert klassifiziert, falls nichts oder eine ICMP-Fehlermeldung zurückkommt, wird die Klassifizierung auf gefiltert gesetzt. Normalerweise werden die nicht gefilterten Ports nicht gezeigt. Linux:~# Nmap –sA [Optionen] Hostname / IP Window-Scans Dieser Scan ist dem ACK-Scan sehr ähnlich. Es kann aber vorkommen, dass dieser Scan offene genauso wie gefilterte oder ungefilterte Ports anzeigt. Dies wird durch eine Anomalie in der TCP-Windowgröße ermöglicht. Um zu erfahren, welche Betriebssysteme dieser Scanmethode auf den Leim gehen, besuchen Sie bitte die offizielle Homepage. Linux:~# Nmap –sW [Optionen] Hostname / IP RPC-Scans Sie können diese Scanart mit den verschiedenen anderen Scantechniken kombinieren, um herauszufinden, ob bestimmte, als offen gekennzeichnete Ports RPC(remote procedure call) Ports sind. Falls dies zutrifft, erhalten Sie außerdem die Versionsnummer und den Programmnamen. Um das zu erreichen überflutet Nmap die ausgesuchten Ports mit SunRPC Null-Befehlen. Linux:~# Nmap –sR [Optionen] Hostname / IP Sandini Bib 3.1 Nmap 153 FTP-Bounce-Attack Ich werde diese Option nur kurz ansprechen, da es in diesem Buch nicht darum geht, wie man sich in bestimmte Systeme einhackt, sondern wie man sein eigenes Netzwerk vor Crackern schützt. Kurz gesagt macht sich dieser »Scantyp« einen Bug im FTP-Protokoll zu Nutze, der es einem erlaubt, sich von einem bestimmten Host zu einem FTP-Server zu verbinden und diesem dann mitzuteilen, dass er Daten zu irgendeinem Punkt im Internet schicken soll. Diese Daten könnten natürlich auch Scans sein. Linux:~# Nmap –b [Optionen] Username:Passwort@Server:Port Zielhost Optionen Die folgenden Optionen sind optional und müssen daher nicht angegeben werden. Sie bieten aber sehr nützliche Einstellungsmöglichkeiten und sollten deshalb auf jeden Fall genutzt werden. Host nicht pingen Diese Option teilt Nmap mit, dass es auf keinen Fall einen Host pingen soll, bevor er gescannt wurde, da bestimmte Firewalls ICMP echo requests blocken. Falls Sie diese »normal« scannen, werden Ihre Scans nicht erfolgreich sein und die Pakete an der Firewall abblocken. Linux:~# Nmap –P0 Hostname / IP Testen, welcher Host online ist Ähnlich zum Ping können Sie mit dieser Option testen, ob bestimmte Hosts online sind. Dabei verwendet Nmap aber keine ICMP-echo-request-Pakete und wartet auf eine Antwort, sondern wirft TCP-ACK-Pakete ins Netzwerk und wartet, dass der Host diese mit einem RST beantwortet. Falls er dies tut, weiß Nmap, dass er online ist. Diese Option erlaubt es also auch Hosts zu testen, die ICMP-Pakete blocken. Welchen Port Sie bei diesem Szenario ansprechen, liegt bei Ihnen. Der Defaultport ist 80. Linux:~# Nmap –PT <Portnummer> Hostname / IP Sie können diese Option auch durchführen, indem Sie SYN- anstatt ACK-Pakete in das Netzwerk werfen. Auch hier sollten aktive Hosts mit einem RST oder SYN|ACK antworten. Linux:~# Nmap –PS Hostname / IP Die dritte Option im Bunde nutzt einen wirklichen Ping, um herauszufinden, ob ein Host aktiv ist oder nicht. Zusätzlich können Sie mit dieser Option noch subnet-directed broadcast-Adressen ausgeben lassen. Da diese IP-Adressen von außen erreichbar sind und oftmals beliebte Ziele für Denial-of-Service-Attacken sind, sollten Sie diese auf jeden Fall deaktivieren oder schützen. Linux:~# Nmap –PI Hostname / IP Sandini Bib 154 3 Systemaudit Ping auf zwei Arten Diese Option stellt den Default Pingtypen dar und benutzt dabei ACK (-PT) und ICMP (-PI). Linux:~# Nmap –PB Hostname / IP Betriebssystem feststellen Um herauszufinden, ob Angreifer das Betriebssystem auf einem von außen erreichbaren Host erkennen können, nutzen Sie diese Option. Nmap geht dabei folgendermaßen vor: Als Erstes wird ein TCP/IP-Fingerprint des zu scannenden Hosts erstellt, welcher dann mit einer Liste schon vorhandener Fingerprints verglichen wird. (Diesen Fingerprint könnte man als eine Sammlung winziger Eigenheiten einiger Betriebssysteme beschreiben.) Falls Nmap eine Übereinstimmung findet, wird das potentielle Betriebssystem ausgegeben und dem Angreifer damit viel Arbeit genommen. Diese Option bietet Ihnen (oder einem potentiellen Angreifer) aber ebenfalls die Möglichkeit einen TCP Sequence Predictability Classification-Test durchzuführen. Damit können Sie bestimmen, wie schwer es ist eine gefälschte TCP-Verbindung zu dem gescannten Host aufzubauen. Linux:~# Nmap –O Hostname / IP TCP Reverse Ident Scanning Dies betrifft Sie nur, falls Sie identd als Superserver betreiben. Falls dies der Fall ist, ist es für einen entfernten Angreifer möglich, den Usernamen, unter dem ein bestimmter Prozess läuft, der via TCP verbunden ist, herauszufinden. Als Beispiel können Sie sich zu Ihrem FTP-Server verbinden und identd benutzen, um den Usernamen herauszufinden, unter dem der Dienst läuft. Diese Option kann nur durchgeführt werden, wenn eine vollständige Verbindung mit dem Zielport aufgebaut wurde (zum Beispiel mit der Option –sT). Linux:~# Nmap –I Hostname / IP Paketheader aufsplitten Ein Angreifer kann mit dieser Option SYN-, FIN-, XMAS- und NULL-Scans in kleine IP-Pakete zerlegen. Somit wird der IP-Header über mehrere Pakete verteilt, was es für Firewalls (Paket-Filter) und Intrusion-Detection-Systeme schwieriger macht, auch wirklich zu entdecken, was gerade vorgeht. Ein Scan kann auf diese Weise unbemerkt durchgeführt werden. Sie sollten diese Option benutzen, um zu testen, ob auch Sie dafür anfällig sind. Linux:~# Nmap –f Hostname / IP Sandini Bib 3.1 Nmap 155 Verbose Mode Der Verbose Mode gibt Ihnen die Möglichkeit mehr Ausgaben auf die Standardausgabe zu verlangen. Dies ist oftmals sehr praktisch, wenn Sie zum Beispiel sehen wollen, was ein Programm in diesem Moment genau macht (zum Beispiel bei der Fehlersuche sehr hilfreich). Linux:~# Nmap –v Hostname / IP Hilfefunktion Eine sehr praktische Funktion, die in keinem Programm fehlen darf. Beim Aufruf der Hilfefunktion bekommen Sie eine kleine Übersicht einiger Befehle und jeweils eine kurze Beschreibung dazu. Linux:~# Nmap –h Hostname / IP Logfile (lesbar) Sie können diese Option nutzen, um von Ihrem Scan ein Logfile anlegen zu lassen, welches Sie gut lesen können. Die Verwendung dieses Befehls bewirkt dasselbe wie der >-Operator. Linux:~# Nmap –oN <Dateiname> Hostname / IP Logfile (XML) In letzter Zeit haben sich die meisten Programmierer bemüht, irgendein XMLPlugin oder Ähnliches in ihre Programme zu integrieren. Nmap stellt hierbei keine Ausnahme dar, sondern bietet Ihnen mit dieser Funktion die Möglichkeit ein Logfile im XML-Format anlegen zu lassen, welches dann schnell durch andere Programme weiterverarbeitet werden kann. Linux:~# Nmap –oX <Dateiname> Hostname / IP Logfile (grepable) Diese Funktion stammt noch aus den Zeiten, als man XML noch nicht so gut kannte. Sie legt ebenfalls ein Logfile an, doch schreibt sie dabei alle Informationen in eine Zeile, so dass Sie mit Programmen wie grep leicht an die gewünschten Daten kommen (Ports, IP-Adressen etc.). Linux:~# Nmap –oG <Dateiname> Hostname / IP Logfile (Skript Kiddie) Ich erwähne diese Funktion (so wie manch andere ebenfalls) nur zum Zweck der Vollständigkeit. Sie erlaubt es Ihnen, ein Logfile über einen Scan in einem SkriptKiddie-Format anzulegen (Ein Skript Kiddie ist ein Möchtegernhacker, der sich bestimmter Tools in Internet bedient, um damit Schaden anzurichten. Er hat an sich keine Ahnung von einem System und strebt auch nicht danach, diese Kenntnisse zu erlangen. Für uns ist diese Funktion definitiv nicht von Nutzen.) Linux:~# Nmap –oS <Dateiname> Hostname / IP Sandini Bib 156 3 Systemaudit Abgebrochenen Scan wieder aufnehmen Falls Sie einen Scan mit (STRG)+(C) abgebrochen haben und ein Logfile dazu existiert, haben Sie die Möglichkeit, diesen Scan mit exakt denselben Argumenten (Sie brauchen und dürfen keine neuen oder schon verwendeten Argumente angeben) wieder aufzunehmen. Linux:~# Nmap –-resume <Dateiname> Hostname / IP Zielinformationen aus Datei Nmap bietet Ihnen die Möglichkeit die für einen Scan notwendigen Zielinformationen aus einer Datei zu beziehen. Diese sollte dabei eine Liste von Hosts oder Netzwerken getrennt durch Leerzeichen, tabs oder neue Zeilen enthalten. Falls Sie die Datei – nennen, liest Nmap die Zielinformationen von STDIN. Linux:~# Nmap –iL <Dateiname> Zufallsscan Auch diese Option ist für uns (da wir nur unser System testen wollen) eher nebensächlich, denn sie erlaubt es Ihnen, Nmap die Hosts, die zu scannen sind, selbst genieren zu lassen. Dabei werden natürlich nicht die Hosts selber generiert, sondern ein Zufallsscan initiiert. Linux:~# Nmap –iR Portbereiche angeben Falls Sie nur bestimmte Ports scannen wollen, können Sie das mit dieser Option angeben. Um nur einen einzelnen Port zu scannen, geben Sie bitte -p <Portnummer> an; um einen Bereich zu spezifizieren ist die Angabe -p <erster Port><letzter Port> nötig. Sie können diese Angaben auch verknüpfen. Linux:~# Nmap –p <Portbereich> Hostname / IP Sehr schnelle Scans Sie können diese Option nutzen, falls Sie nur die Port, die in der services-Datei von Nmap aufgelistet sind, scannen wollen. Linux:~# Nmap –F Hostname / IP Ablenkungsmanöver Nmap bietet eine für einen Angreifer sehr praktische Methode, um von sich abzulenken. Normalerweise würde ich diese Option nicht erwähnen, da sie aber eine große Gefahr für uns Netzwerkadministratoren darstellt, komme ich nicht um die Vorstellung herum. Diese Funktion ermöglicht es einem Angreifer, bestimmte Hosts anzugeben, die ebenfalls Ihr Netzwerk scannen. Im Regelfall berichtet uns unser IDS dann, dass wir zehn Mal von unterschiedlichen IP-Adressen gescannt wurden. Wir wissen aber nicht, welche IP-Adresse der Angreifer hat. Falls Sie diese Option testen wollen, um zu sehen, ob Ihr Scan-Detektor anfällig für diesen Sandini Bib 3.1 Nmap 157 Angriff ist (was sehr wahrscheinlich ist), müssen Sie jede gefälschte IP-Adresse mit Kommas trennen und an der Stelle, an der Ihre wirkliche IP-Adresse auftauchen soll, ein ME setzen. Falls Sie ME nicht setzen, wird Nmap Ihre IP-Adresse an eine zufällig gewählte Stelle setzen. Es ist aber zu empfehlen, Ihre IP-Adresse nach der sechsten Stelle zu platzieren, da die meisten Scan-Detektoren diese Stellen erst gar nicht mehr anzeigen. Linux:~# Nmap –D <falscher Host1, falscher Host2 … ME> Hostname / IP IP-Adresse spoofen Wie wir im vorhergehenden Abschnitt gesehen haben, bietet Nmap eine sehr gute Option, um IP-Adressen zu verstecken. Als ob uns dies das Leben noch nicht schwer genug machen würde, haben Angreifer eine weitere – durchaus mächtigere – Option zur Verfügung, die es ihnen erlaubt, ihre IP-Adresse zu spoofen. Dabei müssen sie lediglich die unten aufgeführte Syntax eingeben und schon werden wir uns sehr schwer tun, den Absender der Scanpakete zu finden. (Obwohl es dabei sehr fraglich ist, ob der ISP des Angreifers überhaupt gespoofte Pakete weiter routet oder ob der Angreifer das nötige Wissen besitzt, um die Antwortpakete zu empfangen). Linux:~# Nmap –S <IP-Adresse> Interface angeben Sie haben auch die Möglichkeit, Nmap das Interface, an dem Pakete gesendet und empfangen werden, zu übergeben. Linux:~# Nmap –e <Interface> Quellport für Scans angeben Nachdem Sie Ihre Firewall aufgesetzt haben, können Sie sie unter anderem mit dieser Option testen. Hierbei können Sie den Quellport, von dem die Scans ausgehen, setzen. Manchmal ist eine Firewall so schlecht konfiguriert, dass sie Scans von bestimmten Ports (TCP 20) durchlässt. Überprüfen Sie mit Nmap, ob Sie Änderungen an der Konfiguration vornehmen müssen. Linux:~# Nmap –g <Portnummer> Namensauflösung unterdrücken Um die Scans zu beschleunigen, können Sie Nmap dazu bringen, niemals reverse DNS Resolution zu betreiben. Linux:~# Nmap –n Namensauflösung erzwingen Sie können aber auch die reverse DNS Resolution erzwingen, so dass Nmap bei jeder IP-Adresse den Namen auflöst. Linux:~# Nmap –R Sandini Bib 158 3 Systemaudit Ports der Reihe nach scannen Für uns Administratoren ist diese Option sehr praktisch. Sie gibt an, dass Nmap die Ports der Reihe nach scannt. Linux:~# Nmap –r Hosts nicht der Reihe nach scannen Mit dieser Option können Sie testen, ob Sie bzw. Ihr Netzwerküberwachungssystem eine Scanattacke immer noch erkennt, wenn die einzelnen Hosts nicht der Reihe nach gescannt werden. Nmap erlaubt es, bis zu 2048 Hosts zu mischen. Linux:~# Nmap –-randomize_hosts Maximale Socketbenutzung regeln Sie haben die Möglichkeit, die Anzahl der parallel genutzten Sockets für einen TCP-connect()-Scan zu bestimmen. Sie sollten diese Option unbedingt nutzen, da es ansonsten vorkommen kann, dass eine gescannte Maschine abstürzt. Linux:~# Nmap -M <Maximum an Sockets> Zeitoptionen Sie können die Zeitoptionen von Nmap verändern. Bedenken Sie aber dabei, dass diese normalerweise sehr zuverlässig und gut sind. Sie sollten sie daher nur zu Testzwecken oder bei Versagen ändern. Sehr langsam und sicher scannen Jeder Angreifer möchte logischerweise unentdeckt bleiben. Dafür nimmt er sich auch gerne etwas Zeit. Sie sollten diese Option unbedingt testen und überprüfen, ob Ihr Alarmsystem trotz dieser Vorsichtsmaßnahme immer noch anschlägt. Wenn dies nicht der Fall ist, sollten Sie etwas dagegen unternehmen. Die Funktionsweise dieser Scanstufe ist denkbar einfach und stupide. Die verschiedenen Scandurchläufe werden nicht mehr parallel ausgeführt, sondern schön der Reihe nach. Ein Scan nach dem anderen. Des Weiteren wartet Nmap mindestens fünf Minuten, bis es ein weiteres Paket losschickt. Linux:~# Nmap –T Paranoid Schneller sicherer Scan Die folgende Option arbeitet nach demselben Prinzip wie die zuvor erwähnte. Mit dem Unterschied, dass das Intervall zwischen dem Senden von Paketen nicht bei fünf Minuten, sondern bei 15 Sekunden liegt. Linux:~# Nmap –T Sneaky Kaum belastender Scan Weniger vorsichtig als die zwei zuletzt vorgestellten Zeitoptionen, aber immer noch sehr netzwerkfreundlich, ist diese Option. Sie bedient sich auch des seriellen Sandini Bib 3.1 Nmap 159 Scannens, schaltet die verschiedenen Scandurchläufe also in Reihe und führt sie nicht parallel aus. Zwischen dem Paketversand vergehen in der Regel mindestens 0.4 Sekunden. Linux:~# Nmap –T Polite Normaler Scan Diese Option stellt den Defaultwert dar. Nmap versucht den Scan so schnell wie möglich über die Bühne zu bringen, ohne dabei das Netzwerk zu überlassen oder bestimmte Ports oder gar Rechner zu vergessen. Linux:~# Nmap –T Normal Aggressiver Scan Hierbei wird für jeden Host ein Timeout von fünf Minuten eingerichtet und Nmap wartet nie mehr als 1.25 Sekunden auf Antworten auf bestimmte Pakete. Linux:~# Nmap –T Aggressive Unglaublich schneller Scan Dieser Scanmodus bietet sich für Testumgebungen an, in denen das Netzwerk sehr schnell und kaum belastet ist. Jeder Host wird nach 75 Sekunden ausgezählt (timeout) und auf Paketantworten wird nur 0.3 Sekunden gewartet. Linux:~# Nmap –T Insane Timeout für Hosts setzen Falls Sie einen Timeout setzen wollen, der angibt, wie lange Nmap einen einzelnen Host scannen darf, können Sie diese Option nutzen. Es gibt hierbei keinen Defaultwert, das heißt, dass normalerweise ein Host so lange gescannt wird, bis der Scan komplett ist. Der Timeoutwert wird in Millisekunden übergeben. Linux:~# Nmap –host_timeout <Timeoutwert> Timeout für Antwortpakete setzen Sie können nicht nur bestimmte Hosts mit einem Timeout belegen, sondern auch die Antwortpakete. Das bedeutet, dass Sie einen bestimmten Wert (in Millisekunden) angeben, der die Zeit wiedergibt, in der Nmap auf eine Antwort auf ein gesendetes Paket wartet. Falls dieser Wert überschritten wird, sendet Nmap ein neues Paket oder bricht den Test ab. Der Defaultwert liegt bei 9000. Linux:~# Nmap –max_rtt_timeout <Timeoutwert> Minimum Zeitraum für Scans bewahren Falls ein Host sehr schnell antwortet, wird Nmap den Scan beschleunigen. Dies kann aber dazu führen, dass bestimmte Pakete und wichtige Informationen dabei verloren gehen. Mit dieser Option können Sie einen Zeitraum dafür angeben, wie Sandini Bib 160 3 Systemaudit lange Nmap mindestens warten soll, bis es das Warten auf eine Antwort aufgibt. Auch diesen Timeout übergeben Sie in Millisekunden. Linux:~# Nmap -–min_rtt_timeout <Timeoutwert> Anfangstimeoutwert setzen Normalerweise rechnet sich Nmap den Timeoutwert für Probes (Pakete und Antworten) sehr gut selber aus. Falls Sie dennoch kein Vertrauen in diesen Wert setzen können, steht es Ihnen frei, ihn selbst zu bestimmen. Linux:~# Nmap --initial_rtt_timeout <Timeoutwert> Maximum für Parallelscans Es ist Ihnen überlassen, das Maximum für parallel durchgeführte Scans zu bestimmen. Falls Sie diesen Wert auf 1 setzen, wird Nmap nie mehr als einen Port zur gleichen Zeit scannen. Linux:~# Nmap –-max_parallelism <Wert> Intervall zwischen Paketversand Hier können Sie angeben, wie viel Zeit zwischen dem Versenden von Paketen vergehen soll. Praktisch um Überwachungssysteme zu testen. Der Wert ist in Millisekunden anzugeben. Linux:~# Nmap –-scan_delay <Wert> Beispiele Nachdem wir nun alle Optionen zu Nmap gesehen haben, sollten wir uns an die Umsetzung unseres Wissens machen. Der beste Weg ist der, sich ein paar Beispiele anzuschauen. Ich werde hierbei eine Beschreibung zu jedem Beispiel gefolgt von der Syntax dafür aufführen. Das erste Beispiel ist äußerst stupide und simpel und sollte auf jeden Fall einen Alarm in Ihren Überwachungssystemen verursachen, denn es verursacht einen Scan auf alle TCP Ports, die sich auf dem Rechner Joey.testdomain.de befinden. Da es sich um das erste Beispiel handelt, werden wir auch die Bildschirmausgabe dazu sehen (Falls Ihr Output genauso aussieht, sollten Sie sich wirklich Gedanken machen!!!). Linux:~# Nmap Joey.testdomain.de Starting Nmap V. 2.54BETA22 ( www.insecure.org/Nmap / ) Interesting ports on Joey.testdomain.de (10.209.100.1): (The 1533 ports scanned but not shown below are in state: closed) Port State Service 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 37/tcp open time Sandini Bib 3.2 Nessus 79/tcp 111/tcp 513/tcp 515/tcp 6000/tcp 161 open open open open open finger sunrpc login printer X11 Nmap run completed -- 1 IP address (1 host up) scanned in 4 seconds Ich möchte nochmals darauf hinweisen, dass Ihr Output auf keinen Fall so aussehen sollte. Es handelt sich bei dem gescannten Rechner um einen absolut unsicheren Testrechner. Ich gehe davon aus, dass Ihr System die veralteten Dienste nicht laufen hat und Sie weiter auch einige Vorkehrungen getroffen haben, dass ein solch stupider Scanversuch im Sand verläuft. Das nächste Beispiel führt denselben Scan durch, jedoch für das gesamte Klasse B Netzwerk 192.168 (privates Netz): Linux:~# Nmap 192.168.*.* oder Linux:~# Nmap 192.168.0-255.0-255 Der nächste Aufruf versucht einen Xmax-Tree-Scan durchzuführen und zusätzlich das Betriebssystem zu erraten. Linux:~# Nmap -sX -0 Joey.testdomain.de Ich denke, es wäre sinnlos, weitere Beispiele aufzuführen, da Sie das Prinzip mittlerweile verstanden haben sollten. 3.2 Nessus Ich bin mir ziemlich sicher, dass ein Großteil der Leser dieses Programm zumindest vom Hören her kennt und weiß, wie gewaltig und mächtig dieses Tool ist. Man könnte es als Netzwerkscanner bezeichnen, doch täte man ihm damit Unrecht. Denn es ist viel mehr als das. Nur zu gerne würde ich alle Möglichkeiten und Optionen, die einem mit diesem Tool zur Verfügung stehen, besprechen, doch dies ist – dank des ungeheueren Umfangs und der extrem hohen Komplexität – leider völlig unmöglich. Es besteht aus weit mehr als 780 Plugins und lässt sich mit einer eigenen Programmiersprache programmieren (NASL). Dieses Feature wird auch den Hauptteil dieses Abschnittes ausmachen und Ihnen zeigen, wie Sie mit Hilfe dieser Skriptsprache dezidierte Tests durchführen und daran ersehen können, ob und wie sicher das geprüfte System tatsächlich ist. Weiter werden wir aber noch einige weitere Features dieser großen »Toolbox« besprechen und Ihnen zeigen, wie Sie damit sinnvolle Tests durchführen können. Sandini Bib 162 3 Systemaudit 3.2.1 Installation Bevor wir mit dem System arbeiten können, müssen wir es natürlich installieren. Dafür laden Sie sich bitte das Programm und alle nötigen Bibliotheken und die von Ihnen gewünschten Plugins (die wir hier beim besten Willen nicht alle besprechen können) von einer sicheren Quelle herunter (entweder von der BuchWebsite oder von der offiziellen Nessus-Website). Voraussetzungen Da Nessus ein sehr komplexes Programm ist, kann man nicht genau sagen, welche Voraussetzungen man für die Installation genau benötigt. Dies hängt viel mehr davon ab, welche Funktionen Sie genau nutzen wollen und welche Plugins Sie dafür benötigen. Im Folgenden werden wir aber einige Programme und Bibliotheken ansprechen, die bei einer Standardinstallation gebraucht werden. Sie benötigen die Pakete bison und flex. Bitte überprüfen Sie, ob diese bereits installiert sind. Falls nicht, holen Sie dies bitte vor der Installation von Nessus nach. Sie sollten auf Ihrem System eine aktuelle Version von Nmap installiert haben (siehe Abschnitt 3.1), da Nessus dieses Programm für Portscans etc. benötigt. SuSE-Systeme benötigen zusätzlich die Pakete gtk-devel und glib-devel. Falls Sie Experimental-Versionen von Nessus installieren wollen, brauchen Sie das Paket openssl-devel. Die Programme wget und lynx sollten bei der Erstellung des Programms installiert sein, da man dann die Möglichkeit hat Updates mit den nötigen Update-Plugins zu fahren. Weiter benötigt man folgende Bibliotheken und Pakete (bitte kompilieren Sie die Pakete in der Reihenfolge, in der sie aufgeführt sind): nessus-libraries-.version.tar.gz libnasl-version.tar.gz nessus-core.version.tar.gz nessus-plugins.version.tar.gz Um diese Pakete zu installieren geben Sie bitte folgende Befehle ein (ist für jedes Paket gleich): Linux:~# tar –xzf Paket Linux:~# cd Paket Linux:~# ./configure Linux:~# make Linux:~# su Linux:~# make install Nachdem Sie diese Schritte mit allen Paketen durchgeführt haben, sollte Nessus auf Ihrem System installiert sein und Sie können es benutzen. Sandini Bib 3.2 Nessus 3.2.2 163 Nessus-Server starten Benutzer anlegen Nessus wird mit einem Client und mit einem Server geliefert. Als Erstes werden wir den Server installieren. Der erste Schritt dazu ist das Anlegen eines Benutzers für Nessus. Dazu befolgen Sie bitte die nachfolgend aufgeführten Anweisungen: Das Testsystem läuft auf einem Rechner mit SuSE 7.3. Es ist daher möglich, dass die Pfadnamen, die hierbei benutzt werden, bei Ihnen nicht funktionieren werden, falls Sie ein anderes Betriebssystem fahren. Linux:~# cd /etc/init.d Linux:~# ./nessusd Starting nessusd Please create user accounts with nessus-adduser Linux:~# nessus-adduser Generating primes: ...............q..............pg Using /var/tmp as a temporary file holder Add a new nessusd user Login: <Bitte geben Sie hier den gewünschten Usernamen für Nessus ein> Als Nächstes werden Sie gefragt welche Authentication method Sie benutzen möchten. Ich empfehle Ihnen aber die cipher-Methode zu nehmen – schließlich handelt es sich hierbei um ein Buch über Linuxsicherheit. Authentication method (cipher/plaintext) [cipher] : <Wählen Sie die gewünschte Methode> . . Nachdem Sie die Methode gewählt haben, werden Sie aufgefordert den Host oder das Netzwerk anzugeben, von dem aus dieser Account benutzt werden darf. Falls Sie keine Angaben machen – das Feld also leer lassen –, darf man sich von jedem Rechner zu Ihrem Nessus-Server verbinden. Ich empfehle Ihnen aber einen bestimmten Host oder zumindest ein Subnet anzugeben. Nessus unterstützt leider noch keine Namensauflösung, das heißt Sie müssen die Adresse des Hosts in Form einer IP-Adresse eingeben. Beispiele: 10.209.100.1 10.209.100.1/24 10.209.100.1/255.255.255.0 Source host or network [anywhere] : <Geben Sie einen Wert ein> One time password: <Geben Sie ein Passwort ein> Sandini Bib 164 3 Systemaudit Im nächsten Dialog werden Sie nach einem rule set gefragt. Um diesen Punkt genauer zu erklären, werde ich etwas weiter ausholen und einige Beispiele anbringen. Wie Sie wissen, können Sie mit dem nessus-adduser-Befehl mehrere User anlegen. Es wäre ziemlich schwachsinnig, wenn alle angelegten User dieselben Rechte hätten. Deshalb hat man sich entschlossen, das rule set einzubauen. Das gibt Ihnen die Möglichkeit bestimmte Regeln für einen bestimmten Benutzer festzulegen. So könnte eine Regel dem User »aj« nur das Scannen seines eigenen Rechners erlauben. Bevor wir dazu einige Beispiele aufführen, werden wir die Syntax einer Regel ansprechen. Jede Regel wird in einer Zeile definiert. Die nächste Zeile definiert die nächste Regel und so weiter. Falls Sie keine Regeln angeben, hat der User alle Rechte. Die letzte Regel in einem Regelset stellt die Standardregel dar und definiert die Policy eines Users. Die Syntax hierzu sieht folgendermaßen aus: accept | deny IP-Adresse / IP-Maske default accept | deny Das folgende Regelwerk erlaubt es dem User, folgende Hosts zu testen, alle anderen Rechner und Netzwerke darf er nicht überprüfen: 10.209.100.0/24 10.209.101.0/24 accept 10.209.100.0/24 accept 10.209.101.0/24 default deny Ein anderes Beispiel zeigt eine Regelkombination, die es dem betreffenden User erlaubt, alle Rechner, bis auf diejenigen, die sich im Servernetzwerk befinden, (10.209.100.0/24) zu testen: deny 10.209.100.0/24 default accept Nun aber zurück zum Serverstart. User rules ----------------------------. . Enter the rules for this user, and hit ctrl-D once you are done: (the user can have an empty rules set) Geben Sie an dieser Stelle die Regeln ein und drücken Sie (STRG)+(D) wenn Sie fertig sind. Sandini Bib 3.2 Nessus 165 Danach bekommen Sie eine Auflistung der eingegebenen Daten und müssen dies bestätigen oder widerrufen: . . Is that ok ? (y/n) [y] <Falls alle Angaben korrekt sind, bestätigen Sie bitte mit ‚y’> Danach sind Sie fertig und können Nessus starten: Linux:~# ./nessusd start Starting nessusd Konfiguration Um Nessus zu konfigurieren müssen Sie die Konfigurationsdatei bearbeiten. Diese finden Sie entweder unter /etc/nessus/nessusd.conf oder unter /usr/local/etc/ nessus/nessusd.conf. Wir werden an dieser Stelle nicht auf die einzelnen Zeilen dieser Datei eingehen, da sie sehr gut dokumentiert ist und jeder sich schnell darin zurechtfinden sollte. 3.2.3 Clientkonfiguration (text) Neben der grafischen Version haben Sie zusätzlich die Option, Nessus im Textmodus zu fahren. Die dafür verfügbaren Optionen finden Sie in Tabelle 3.1. Option Beschreibung -n Keine Pixmaps. Zu empfehlen, wenn Sie Nessus auf einem entfernten Rechner laufen haben und keine hohe Bandbreite zur Verfügung haben. -q Server Port Login Targetsfile Resultsfile Setzt Quite- oder Batch-Modus. Hiermit können Sie die Optionen für den Batch-Modus setzen. -C Mit dieser Option können Sie eine passphrase zur Verschlüsselung Ihres private keys verwenden. -L Listet Einträge in der user key-Datenbank auf -K <Keyname> Löscht einen Schlüssel aus der user key-Datenbank -k <Keylength> Setzt die minimale Schlüssellänge. Der Defaultwert liegt bei 1024 -X <Key-Datei> Schreibt den public user key in die angegebene Datei -v Zeigt die Versionsnummer -h Listet die verfügbaren Optionen auf -T <Typ> Speichert die Daten im angegebenen Format (html, html_graph, text, tex, nsr) Tabelle 3.1 Verfügbare Optionen Sandini Bib 166 3.2.4 3 Systemaudit Nessus Attack Scripting Language Dieser Abschnitt des Buches wird sich um die nessuseigene Skriptsprache NASL drehen. Diese Sprache ermöglicht es, binnen weniger Minuten Tests für bekannte Sicherheitslöcher zu schreiben und weiterzugeben, ohne dabei auf das Betriebssystems achten zu müssen. NASL ist aber nicht die einzige Sprache, mit der Sie diese Aufgabe erledigen können. Die Sprache C bietet ebenfalls diese Möglichkeiten, doch sollten Sie Ihre Tests auf jeden Fall mit NASL schreiben, da diese Sprache eigens für Nessus entwickelt wurde und deswegen wie keine andere auf dieses Programm zugeschnitten ist. Nichtsdestotrotz gibt es Momente, in denen man nicht anders kann und auf die »Atomsprache« C zurückgreifen muss. Die meisten Aufgaben lassen sich aber problemlos mit NASL bewältigen. Falls Sie sich an dieser Stelle fragen, warum sich die Entwickler von Nessus entschieden haben, eine eigene Sprache zu entwerfen, obwohl so viele andere, weitaus mächtigere Skriptsprachen wie Perl zur Verfügung stehen, sollten Sie einmal daran denken, dass Sie mit diesen Sprachen weitaus mehr anfangen können, als einfach Tests zu schreiben. So könnten Sie zum Beispiel ein Perlskript schreiben und in Nessus integrieren, das dann auch nach einer bestimmten Sicherheitslücke sucht, doch diese (falls sie existiert) mit einigen wichtigen und interessanten Informationen an einen Cracker schickt, der sie dann nutzen kann, um das unsichere System zu erobern. NASL schiebt dem einen Riegel vor und garantiert, dass dies nicht vorkommt (das garantiert die Einfachheit dieser Sprache). So können Sie zum Beispiel keine Befehl auf dem Remotehost ausführen oder Daten an andere Programme versenden. Ein weiterer Vorteil von NASL ist der Speicherverbrauch. Haben Sie schon einmal versucht, 25 Sicherheitstests laufen zu lassen, während Sie auf einem Rechner mit 256 MB Arbeitsspeicher vernünftig arbeiten wollen? Dies wird mit Perl nicht klappen, mit NASL aber schon. Weiter brauchen Sie nicht zuerst aufwändig irgendwelche Module zu installieren. Sie können sofort loslegen, und genau das werden wir jetzt auch machen. Interpreter Skriptsprachen werden im Gegensatz zu Hochsprachen wie C nicht kompiliert, sondern interpretiert. Da Sie wahrscheinlich nicht so sehr an der Prozessorarchitektur vom X86-System interessiert sind und Sie die Prozesse beim Start eines Programms auch nicht so sehr begeistern, werde ich diese Themen nicht anschneiden. Das Einzige, was Sie wissen müssen, ist, wie Sie Ihre selbst geschriebenen Tests zum Laufen bringen. Dazu benötigen Sie das Paket nasl, das wir bereits installiert haben. Um die Tests zu initialisieren, müssen Sie nichts weiter machen, als die Skripts dem Interpreter zu übergeben. Der Befehl hierfür lautet wie folgt: Linux:~# nasl <datei> Sandini Bib 3.2 Nessus 167 Da Sie bei der Installation aber schon sehr viel Skripte mitgeliefert bekommen haben, können Sie sich vorstellen, dass es noch einen anderen – weitaus sinnvolleren – Weg geben muss, um solche Skripte zu initialisieren. Nun denn, Sie haben Recht. Der einfachste Weg hierfür besteht darin, Ihre Skripte in den Plugin-Ordner zu kopieren. Falls Sie jetzt nicht genau wissen sollten, wo dieser Ordner bei Ihnen liegt, werfen Sie einen Blick in die Konfigurationsdatei (nessusd.conf). Dort steht an erster Stelle folgender Eintrag: # Path to the security checks folder: plugins_folder = /usr/bin/nessus/plugins Kopieren Sie Ihre Security Checks einfach in diesen Ordner und Nessus kann Sie nutzen und ausführen. Syntax Bevor wir uns mit Sicherheitstests befassen, müssen wir uns in die recht einfache Syntax von NASL einarbeiten, die, wie auch bei vielen anderen Skriptsprachen, der C-Syntax sehr ähnlich ist. Kommentare Bei einem Kommentar handelt es sich um eine Zeile, die der Interpreter schlicht überliest und somit ignoriert. Kommentare sind in der Welt der Programmierung sehr wichtig, da Sie es dem Programmierer ermöglichen seine Programme zu dokumentieren und machen es somit anderen Entwicklern leichter, sich in den Code einzulesen und ihn zu bearbeiten. Um den Interpreter mitzuteilen, dass ein Kommentar folgt, benötigen Sie ein Kommentarzeichen. Alles was hinter diesem Zeichen steht, wird bei der Programmausführung ignoriert. NASL verwendet hierfür dasselbe Zeichen wie Perl: #. Im Folgenden sehen Sie ein Beispiel für die Anwendung eines Kommentarzeichens: a = 1; # Alles Hinter dieser Anweisung ignoriert der Interpreter Anweisungen Wie Sie am Beispiel für einen Kommentar sehen können, endet die Befehlszeile mit einem Semikolon. Falls Sie schon einmal mit Perl programmiert haben, wird Ihnen diese Syntax durchaus bekannt vorkommen. Anweisungen wie das Übergeben eines bestimmten Werts an eine Variable müssen mit einem Semikolon abgeschlossen werden. Funktionsbeschreibungen hingegen in Klammern gesetzt. Dabei sind Verschachtelungen erlaubt. Falls Sie dieses Prinzip noch nicht vollkommen verstanden haben sollten, werden Sie dies mit Sicherheit innerhalb der nächsten Seiten. Variablen Jede Skriptsprache braucht sie und annähernd jede hat sie. Die Variablen in NASL brauchen Sie nicht zu deklarieren, auch die Typen sind bei der Erstellung eines Skripts nicht wichtig. Falls Sie nicht wissen, was Variablen sind, werde ich Ihnen eine kurze (und nicht 100%ig richtige) Beschreibung dazu liefern. Sandini Bib 168 3 Systemaudit Sie werden in Programmen bestimmte Werte an Funktionen übergeben oder bestimmte Werte irgendwo speichern müssen. Um diese bestimmten Informationen zu speichern, benutzen Sie in der Regel Variablen. Man könnte eine Variable also mit einer Art Platzhalter für Informationen bezeichnen. Wie der Name schon sagt, können sich die Werte in diesen Platzhaltern ändern (da die Daten darin ja variabel sind). Includes Falls Sie sich fragen, ob NASL, da diese Sprache ja an C angelehnt ist, auch Includes braucht, kann ich Sie beruhigen. Sie werden bei der Programmierung Ihrer Tests vollkommen auf Includes verzichten können. Strings In der Variablenbeschreibung haben wir den Vergleich mit einem Platzhalter herangezogen. Wir haben festgestellt, dass man in Variablen bestimmte Daten ablegen kann. Diese Daten können so genannte Strings sein. In NASL stehen Ihnen zwei Arten von Strings zur Verfügung. Die erste Art beschreibt Zahlen. Sie können Variablen also bestimmte Zahlenwerte übergeben. Bei diesen Werten darf es sich um dezimale, hexadezimale oder binäre Daten handeln. Das folgende Programmfragment zeigt Ihnen nun zu jedem dieser Zahlensysteme ein Beispiel, bei dem einer Variable ein bestimmter Zahlenwert übergeben wird. a = 1; # Der Variable a wird der dezimale Wert 1 zugewiesen b = FF; # Der Variable b wird der hexadezimale Wert FF zugewiesen c = 11111110; # c wird auf den binären Wert 11111110 gesetzt Die nächste Art von Variablen stellen Strings dar. Das heißt, Sie können Variablen nicht nur Zahlenwerte zuweisen, sondern auch Zeichenketten wie zum Beispiel einen Satz. Beachten Sie dabei, dass Sie den Wert der Variable in Gänsefüßchen setzen müssen. Als Beispiel betrachten Sie bitte das nächste Codefragment: a = "Hallo, ich liebe Linux"; # Variable a wird auf den Wert Hallo, # ich liebe Linux gesetzt Beachten Sie dabei bitte, dass bei dieser einfachen Zuweisung die Buchstaben nicht interpoliert werden. Dafür benutzen Sie bitte die string() Funktion, die Sie weiter unten noch vorgestellt bekommen. Non Anonymous Funktionen Wenn Sie dieses Kapitel durchgearbeitet haben, werden Sie sicherlich einen Sicherheitstest nach dem anderen mit NASL schreiben. Da wird es sicher bald vorkommen, dass Sie auf Funktionen stoßen, die sehr viele Argumente brauchen (die Sie der Funktion übergeben müssen). Falls diese Argumente unterschiedlichen Typs sind, spricht man von einer Non Anonymous Funktion (und wenn die Reihenfolge von Bedeutung ist). Wenn Sie schon einmal mit einer Hochsprache gearbei- Sandini Bib 3.2 Nessus 169 tet haben, wissen Sie, dass diese Sprachen auf die exakte Reihenfolge bei Ihren Funktionsparametern bestehen. NASL vereinfacht die Sache ungemein, wie Sie am folgenden Beispiel sehen können: Dieses Beispiel ruft eine Funktion auf, die ein UDP-Paket erstellen soll (Sie werden die komplette Funktion später kennen lernen): forge_udp_paket(uhsport : 1000, uhdport : 9000); Diese Funktionsbeschreibung ist zwar von der Syntax her korrekt, doch habe ich vergessen alle Parameter zu übergeben. Der NASL-Interpreter wird mich während der Laufzeit darauf aufmerksam machen. Worauf ich aber hinaus will, wird das folgende Beispiel zeigen: forge_udp_paket(udport : 9000, usport : 1000); Im Gegensatz zu einer Funktionsbeschreibung in einer Hochsprache ist diese hier mit der oben aufgeführten identisch und ruft exakt dasselbe auf. Die Reihenfolge ist daher zu vernachlässigen, sollte aber aus Gründen der Übersicht und Übertragbarkeit eingehalten werden. Anonyme Funktionen Eine anonyme Funktion besteht entweder aus nur einem zu übergebenden Argument oder aus mehreren Argumenten desselben Typs. Sie dürfen aber bestimmte Optionen beinhalten, wie zum Beispiel pcap oder ähnliches. Auch hier führen wir ein einfaches Beispiel einer anonymen Funktion mit der pcap-Option an: send_packet(packet, use_pcap:FALSE); While-Schleife Wie so vieles in NASL funktioniert die while-Schleife genauso wie in C. Falls Sie die Syntax noch nicht kennen, werden Sie diese jetzt kennen lernen: Sie können bei der Initialisierung der Schleifen entweder eine Funktion oder einige Funktionsanweisungen nachstellen, die, falls die Bedingung der Schleife erfüllt ist, aufgeführt werden. while(Bedingung) { # Funktionsanweisungen } oder while(Bedingung)Funktion(); Sandini Bib 170 3 Systemaudit Um sich dieses Modell besser vorstellen zu können, betrachten Sie bitte das folgende Beispiel a = 1; while(a < 10) { a = a+1; } Dieses Beispiel prüft, ob die Variable a kleiner als 10 ist und solange dies der Fall ist, wird die Anweisung in den geschweiften Klammern ausgeführt. Diese besagt, dass nach jedem Schleifendurchgang der Wert der Variablen a (anfangs 1) um 1 erhöht werden soll. Nachdem die Schleifenbedingung so oft wiederholt wurde, dass a 10 ist, wird die Schleife übergangen und es werden die weiteren Anweisungen im Code bearbeitet. For-Schleife Auch diese Schleife bemächtigt sich der C-Syntax. Tabelle 3.2 enthält die Teile der For-Schleife und liefert zu jedem Punkt eine kleine Beschreibung: Schleifenteil Beschreibung Initialisierung Dieser Teil der Schleife wird vor dem ersten Schleifendurchlauf ausgeführt. Variablen erhalten hierbei oft einen Wert. Test Im Testteil einer Schleife wird eine bestimmte Bedingung getestet. Stellt sich diese Bedingung als wahr heraus, so wird die Schleife durchlaufen. Falls nicht, wird Sie übersprungen. Inkrement Das Inkrement wird vor jedem möglichen Verlassen oder Wiedereintritt in die Schleife ausgewertet. Schleifenkörper Der Schleifenkörper beinhaltet die Anweisungen oder Funktionen, die bei jedem Schleifendurchlauf ausgeführt werden. Tabelle 3.2 For Schleife Die Syntax für For-Schleifen lautet folgendermaßen: for (Initialisierung; Test; Inkrement) { # Funktionsanweisungen } oder for (Initialisierung; Test; Inkrement) Funktion(); Damit Sie das Prinzip dieser Anweisung besser verstehen, werden wir einige Beispiele hierfür aufführen: for (a=1;a <=10; a=a+1)display("a hat den Wert : ", a, "\n"); Sandini Bib 3.2 Nessus 171 Dieses Beispiel zeigt Ihnen eine Anwendungsmöglichkeit von For-Schleifen und stellt Ihnen gleichzeitig die Funktion display() vor. Da Sie die Syntax sicherlich aus dem Beispiel ablesen können und noch in weiteren Beispielen zu sehen bekommen werden, werde ich an dieser Stelle nicht zu tief in deren Beschreibung eingehen. Die Syntax ist sehr einfach gehalten und mit der Funktion printf() von C zu vergleichen, da Sie ebenfalls einen Wert auf die Standardausgabe (stdout) – zumeist der Bildschirm – auswirft. Wie Sie im Beispiel oben sehen können erfolgt der Aufruf über den Funktionsnamen display(). In den Funktionsklammern sind diejenigen Werte, die auf die Standardausgabe ausgegeben werden, in Gänsefüßchen gesetzt. Die Variable a, die zwischen den beiden auszugebenden Werten steht, gibt den Wert der Variablen a aus. Das nächste Zeichen ist ein so genanntes Steuerzeichen. Diese sind stets hinter einem Backslash zu finden und werden ebenfalls in Gänsefüßchen gesetzt. Das hier aufgeführte Steuerzeichen bewirkt einen Zeilenumbruch, sprich der Cursor springt in die nächste Zeile, nachdem er A hat den Wert 1 A hat den Wert 2 A hat den Wert 3 ... auf dem Bildschirm ausgegeben hat. Diesem Listing können Sie bestimmt schon die Funktionsweise der For-Schleife entnehmen, welche solange a kleiner gleich 10 ist, den Schleifenkörper durchläuft und den Wert von a auf die Standardausgabe ausgibt. Operatoren Wie Sie sich sicher vorstellen können, werden Sie bei der Programmierung von Sicherheitstest viel mit Schleifen arbeiten. Dabei sollten Sie aber einen Nachteil der Schleifen nie aus den Augen verlieren. Sie sind langsam. Bei einem Sicherheitstest werden Sie mit einer Schleifenfunktion einen Test durchführen. Falls dieser erfolgreich verläuft werden eine vordefinierte Funktion oder einige vordefinierte Anweisungen von Ihnen durchgeführt. Nachdem dies erledigt ist, wird der Test nochmals durchgeführt. All das braucht enorm viel Rechenzeit. Glücklicherweise stellt uns NASL einige Operatoren vor, die uns das Leben enorm erleichtern können. Diese werden Sie in den Tabellen 3.3, 3.4, 3.5, 3.6 und 3.7 kennen lernen: Arithmetische Operatoren Verwendung Beschreibung * x*y Multiplikation / x/y Division ohne Rest Tabelle 3.3 Arithmetische Operatoren Sandini Bib 172 3 Systemaudit Arithmetische Operatoren Verwendung Beschreibung % x%y Es verbleibt Rest bei Division + x+y Addition - x–y Subtraktion Tabelle 3.3 Arithmetische Operatoren (Forts.) Vergleichsoperatoren Verwendung Beschreibung < x<y Kleiner als <= x <= y Kleiner gleich > x>y Größer gleich >= x >= y Größer gleich == x == y Gleich != x != y Ungleich Tabelle 3.4 Vergleichsoperatoren Logische Operatoren Verwendung Beschreibung ! !x Logische Verneinung && x && y Logische Und-Verknüpfung || x || y Logische Oder-Verknüpfung Tabelle 3.5 Logische Operatoren Binär Operatoren Verwendung Beschreibung | x|y Bitweise Und-Verknüpfung & x&y Bitweise Oder-Verknüpfung Tabelle 3.6 Binär Operatoren NASL Operatoren Verwendung Beschreibung x Funktion() x Funktion() wird x mal ausgeführt >< x><y Liefert den Wert true, falls x in y vorkommt. Tabelle 3.7 NASL Operatoren Benutzerdefinierte Funktionen Sicherheitslücken sind nicht immer gleich (wäre ja auch zu schön) und da Sie variieren, werden auch Ihre Testskripte immer anders aussehen. Es wird sicher vor- Sandini Bib 3.2 Nessus 173 kommen, dass Ihnen die von NASL zur Verfügung gestellten Funktionen nicht mehr ausreichen und Sie sich gezwungen sehen, Ihre eigenen Funktionen zu entwerfen. Leider gibt es unter NASL einige Einschränkungen, die man dabei beachten muss: Im Gegensatz zu »normalen« Funktionen, dürfen benutzerdefinierte Funktionen keine weiteren benutzerdefinierte Funktionen enthalten. Sie müssen bei der Erstellung dieser Funktionen Non Anonymous Argumente verwenden. Der eigentliche Sinn einer Funktion besteht in der Rückgabe eines bestimmten Wertes. Dafür benutzt man die Funktion return(). Im Gegensatz zu manchen anderen Sprachen, muss hier der Rückgabewert in Klammern stehen. Die allgemeine Syntax einer benutzerdefinierten Funktion sieht wie folgt aus: function Funktionsname(Argument 1, Argument 2, Argument 3, Argument n) Um dies zu verdeutlichen werden wir uns bemühen eine nicht allzu sinnlose kurze Funktion zu programmieren: function n_plus_zwei(a) { if ((a == 0) || (a == 1)) return(a +2); else return(a); } display("Es kann nie ein Wert unter drei ausgegeben werden, im momentanen Beispiel hat a den Wert", test_plus_zwei(a),"\n"); Sockets allgemein Bevor wir uns mit den verfügbaren Socketfunktionen von Nessus bzw. NASL auseinandersetzen, sollten wir kurz erörtern, was ein Socket überhaupt ist. Man könnte ihn als eine Art Tunnel, der entweder verbindungsorientiert ist oder nicht, definieren, den man nutzt, um Daten durch eine Pipe von einem Rechner zu einem anderen im Netzwerk zu schicken. UDP Socket öffnen Die Funktion open_sock_udp() erlaubt es einem, einen UDP-Socket zu öffnen. Da UDP nicht verbindungsorientiert ist, kann man nicht so leicht feststellen, ob ein UDP-Port auf dem Remoterechner geöffnet oder geschlossen ist. Zu beachten dabei ist, dass zurzeit nur ein Socket zu einem bestimmten Zeitpunkt zu einem bestimmten Port geöffnet werden kann, und dass diese Funktion nur anonyme Argumente verwendet. Die nötige Syntax hierfür sieht folgendermaßen aus: open_socket_udp(Portnummer); Sandini Bib 174 3 Systemaudit TCP Socket öffnen Für diese Funktion gelten dieselben Restriktionen wie für die open_sock_udp()Funktion, hat aber dabei den Vorteil, dass man sehr leicht erkennen kann, ob der Verbindungsaufbau erfolgreich war oder nicht. Dies ist möglich, da TCP ein verbindungsorientiertes Protokoll ist und NASL somit den Wert 0 zurückgeben kann, falls die Verbindung zustande gekommen ist. Zur Verwendung benutzen Sie bitte diese Syntax: open_sock_tcp(Portnummer); Damit Sie den Nutzen einer solchen Funktion erkennen, werden wir damit das beliebteste Spielzeug eines Crackers programmieren, einen Portscanner: # TCP Portscanner in NASL begin = prompt("Bei welchem Port soll das Scannen beginnen?\n "); ende = prompt("Bei welchem Port soll das Scannen aufhoeren?\n "); for(i=begin;i<ende;i=i+1) { socket = open_sock_tcp(i); if(socket) { display("Port ", i, " open\n"); close(socket); } } Socket schließen Am letzen Beispiel können Sie schon die einfache Syntax für das Schließen eines Sockets ersehen. close(); Mit Sockets senden und empfangen Um Daten von einem Socket zu empfangen oder dorthin zu senden gibt es mehrere Möglichkeiten. Im Folgenden werden Sie einige Informationen zu verfügbaren Funktionen erhalten. Dabei werden wir zu jeder dieser Funktionen die Syntax und eine kurze Beschreibung erhalten. Am Ende dieses Abschnittes wird die Handhabung anhand eines Beispiels verdeutlicht. recv(socket:<socketname>, length:<length> [,timeout : <timeout>) Die recv()-Funktion ist für TCP als auch für UDP verfügbar und empfängt <length> Bytes vom Socket <socketname>. Der Defaultwert für das Argument timeout liegt bei fünf Sekunden. recv_line(socket:<socketname>, length:<length> [, timeout: <timeout>]) Sandini Bib 3.2 Nessus 175 Diese Funktion ist der recv() Funktion sehr ähnlich, bricht aber das Lesen vom Socket ab, sobald ein \n-Zeichen (new line, neue Zeile) empfangen wird. Außerdem kann man sie nur für TCP verwenden. Auch hier liegt der timeout bei 5 Sekunden. send(socket:<socket>, data:<data> [, length:<length>]) Diese Funktion sendet die Daten (die durch das Argument data übergeben werden) an den angegebenen Socket (socket). Das Argument length ist optional und gibt an, wie viele Bytes tatsächlich gesendet werden sollen. Falls Sie dieses Argument nicht übergeben, wird solange gesendet bis eine binäre NULL erkannt wird. Es ist schwierig für diese Optionen passende Beispiele zu finden, die nicht auf Funktionen eingehen, die Sie noch nicht kennen gelernt haben, deshalb werden wir an dieser Stelle ein etwas sinnloses Skript anbringen, das den Banner eines sshd-Servers abfragt oder abbricht falls dieser geschützt (tcp_wrapper) oder nicht erreichbar ist: # Skript zum Abfangen eines sshd-Banners socket = open_sock_tcp(22); if(socket) { banner = recv_line(socket:socket, lenght:1024); if(banner) { display("Der sshd Server hat folgenden Banner ausgegeben:\n", banner, "\n"); } else { display("Bannerabfrage fehlgeschlagen"); } close(socket); } Die Funktion zum Datenversand auf einen Socket werden Sie im Laufe des Kapitels noch kennen lernen. High Level Funktionen Für Web und FTP stehen einige weitergehende Funktionen zur Verfügung, die Sie nachfolgend erklärt bekommen werden. ftp_log_in(socket:<socket>, user:<login>, pass:<Passwort>) Nachdem Sie mit der Funktion open_sock_tcp() eine Verbindung zu einem FTP-Server oder Bouncer aufgebaut haben, können Sie sich mit Hilfe dieser Funktion dort anmelden. ftp_get_pasv_port(socket:<socket>) Sandini Bib 176 3 Systemaudit Diese Funktion ermöglicht es Ihnen bestimmte Daten von einem FTP-Server herunter zu laden. Außerdem sendet sie einen PASV-Befehl an den Server und liefert den Port für eine Verbindung. Falls dabei ein Fehler auftritt liefert die Funktion den Rückgabewert false. is_cgi_installed(<name>) Prüft ob das CGI Skript <name> auf dem Webserver installiert ist und gibt bei Erfolg den Rückgabewert true zurück. Es verwendet dabei den GET-Befehl. Das Skript verwendet als Standardpfadangabe /cgi-bin/. Sie können diese aber ändern, in dem Sie den absoluten Pfad beginnend mit einem Slash selbst angeben. Diese Funktion ist dabei selbstverständlich nicht auf cgi-Dateien beschränkt, sondern kann auch für jedes andere Dateiformat verwendet werden. Sie sehen jetzt zu den oben angeführten Funktionen einige Beispielskripte: Das erste Beispielskript wird versuchen, Ihnen mit Hilfe des FTP-Servers die Passwortdatei anzeigen zu lassen: socket = open_sock_tcp(21); if (ftp_log_in(socket:socket, user:"Helmschrott", pass:"Fischer")) { port = ftp_get_pasv_port(socket:socket); if(port) { socket2 = open_sock_tcp(port);; data = string("RETR /etc/passwd\r\n"); send(socket:socket, data:data); passfile = recv(socket:socket2, length:50000); display(passfile); close(socket2); } close(socket); } Das nächste Beispiel wird prüfen, ob die Datei running.php im Verzeichnis nasltest eines Webservers existiert: open_sock_tcp(80); if (is_cgi_installed("/nasl-test/running.php")); { display("Die Datei running.php existiert\n"); } Hilfsfunktionen Bei der Beschreibung der folgenden Netzwerkfunktionen werden Sie auf einige Hilfsfunktionen stoßen, die Ihnen die Arbeit enorm erleichtern können. Damit Sie Sandini Bib 3.2 Nessus 177 sich nicht fragen, was solche Funktionen in der Argumentsübergabe zu suchen haben, werden wir Sie an dieser Stelle vorab schon einmal besprechen: this_host() Diese Funktion übergibt die IP Adresse des Host, auf dem das Skript läuft. Sie benötigt selbst keine Argumente. get_host_name() Auch diese Funktion benötigt kein Argument. Sie liefert den Hostnamen des getesteten Rechners. get_host_ip() Sie können diese Funktion verwenden, um die IP des getesteten Rechners zu übergeben und müssen auch hierbei kein Argument verwenden. get_host_open_port() Falls Sie den ersten offenen Port eines Hosts bestimmen wollen, können Sie diese Funktion verwenden, Sie müssen hierbei keine Argumente übergeben. get_port_state(Portnummer) Diese Funktion gibt den Wert TRUE zurück, falls der Port (Portnummer) offen oder sein Zustand unbekannt ist. telnet_init(Socket) Falls Sie den Banner eins Netzwerkprogramms abfangen wollen, können Sie diese Funktion verwenden. Sie baut eine Telnet-Verbindung über den angegebenen – vorher initialisierten – Socket auf und liefert die erste Zeile der empfangenen Daten, die Sie dann via display() Wiedergeben können. tcp_ping() Liefert den Rückgabewert true, falls der Host auf eine TCP Paket mit gesetztem ACK-Flag reagiert. Es verwendet kein Argument. getrpcport() Liefert den Rückgabewert 0, falls ein Fehler auftritt. Sie kennen diese Funktion wahrscheinlich schon aus C. Trotzdem wollen wir seine Syntax an dieser Stelle noch mal anführen: <Resultat> = getrpcport(program : <program_number>, protocol: IPPROTO_TCP|IPPROTO_UDP, [version: <version>]); Sandini Bib 178 3 Systemaudit Raw-Pakete Sie haben mit Nessus die Möglichkeit IP-Pakete zu erstellen und einzusetzen. Falls Sie bestimmte Änderungen an dem Paket vornehmen, wird die Prüfsumme neu berechnet und das length – Feld auf den neusten Stand gebraucht. Alle Funktionen, die Raw-Pakete erstellen, verwenden Non Anonymous Argumente und beziehen Ihre Namen aus einer BSD-Include-Datei. Ein IP Paket erstellen Mit der Funktion forge_ip_packet() können Sie IP-Pakete erstellen. Die dabei verwendeten Argumentnamen stammen aus BSD Include – Dateien, deshalb können einige Abweichungen auftreten. Das ip_sum Feld ist optional. Für eine Liste der Protokolle, die Sie dem Argument ip_p übergeben können, werfen Sie bitte einen Blick auf Tabelle 3.8 (Sie können aber auch numerische Werte übergeben). Sehen Sie sich zur Verdeutlichung die Syntax und ein Beispiel dazu an: <Rückgabewert> = forge_ip_packet( ip_hl : <ip_hl>, ip_v : <ip_v>, ip_tos : <ip_tos>, ip_len : <ip_len>, ip_id : <ip_id>, ip_off : <ip_off>, ip_ttl : <ip_ttl>, ip_p : <ip_p>, ip_src : <ip_src>, ip_dst : <ip_dst>, [ip_sum : <ip_sum>] ); Im Folgenden sehen Sie ein einfaches Beispiel dazu: Ip = forge_ip_packet(ip_v : 4, ip_hl : 5, ip_tos : 0, ip_id: 9, ip_len : 28, ip_off : 0, ip_p : IPPROTO_UDP, ip_src : this_host(), ip_ttl : 255); Zu übergebendes Argument Protokoll IPPROTO_TCP TCP IPPROTO_UDP UDP IPPROTO_ICMP ICMP IPPROTO_IGMP IGMP IPPROTO_IP IP Tabelle 3.8 Argumente für ip_p Sie sehen, Sie können in einen solchen Aufruf auch Funktionen etc. verpacken. Sandini Bib 3.2 Nessus 179 Elemente eine IP Paketes auslesen Die Funktion get_ip_element() ermöglicht es Ihnen bestimmte Felder eines IP Paketes auszulesen. Die Syntax und ein Beispiel dazu finden Sie im Anschluss. <Elementname> = get_ip_element(ip : <ip_variable>, element : "ip_hl"|"ip_v"|"ip_tos"|"ip_len"| "ip_id"|"ip_off"|"ip_ttl"|"ip_p"| "ip_sum"|"ip_src"|"ip_dst"); Das nächste Beispiel verdeutlicht Ihnen die Syntax noch mehr: aga = get_ip_elemet(ip : rep, element:"ip_src"); Sie sehen, dass es auch genügt, wenn Sie ein Paket angeben, welches ausgelesen werden soll. Vergessen Sie bei dieser Funktion bitte nicht die Anführungszeichen. Inhalt eines IP Pakets verändern Set_ip_elements() ermöglicht es Ihnen bestimmte IP Pakete beziehungsweise deren Inhalt zu verändern und die Prüfsumme neu berechnen zu lassen (Sie können aber auch angeben, dass die Prüfsumme nicht neu berechnet wird). Die Syntax hierzu lautet: set_ip_elements( ip : <IP Paket>, [ip_hl : <ip_hl>, ] [ip_v : <ip_v>, ] [ip_tos : <ip_tos>,] [ip_len : <ip_len>,] [ip_id : <ip_id>, ] [ip_off : <ip_offset>,] [ip_ttl : <ip_ttl>,] [ip_p : <ip_proto>, ] [ip_src : <ip_src>,] [ip_dst : <ip_dst>,] [ip_sum : <ip_sum> ] ); Zur Vervollständigung werden wir auch für diese Funktion einige Beispiele aufführen: Set_ip_elements(ip:igmp, ip_len:1500, ip_off:IP_MF); Set_ip_elements(ip:igmp, ip_off:a|IP_MF); Wie Sie aus dem letzen Beispiel ersehen können, können Sie auch Operatoren in die Funktionsaufrufe einbauen. Der | Operator verbindet mehrere Argumente. IP Pakete lesbar auf die Standardausgabe (stdout) ausgeben Diese Funktion sollten Sie nicht in Ihre Skripte einbauen. Es sei denn, es ist unbedingt notwendig (z.B. für Tests, Fehlersuche etc.). Der Name der Funktion lautet dump_ip_packet() und stellt schon fast die gesamte Syntax dar: dump_ip_packet(Paketname); Sandini Bib 180 3 Systemaudit TCP-Pakete erstellen Die Funktion, die Sie benötigen, um TCP-Pakete zu erstellen, ist der, die Sie bei der Erstellung von IP Paketen benutzen, sehr ähnlich. Sie trägt den Namen forge_tcp_packet() und wird wie folgt verwendet: tcppacket = forge_tcp_packet(ip : <ip_packet>, th_sport : <source_port>, th_dport : <destination_port>, th_flags : <tcp_flags>, th_seq : <seqünce_number>, th_ack : <acknowledgement_number>, [th_x2 : <unused>], th_off : <offset>, th_win : <window>, th_urp : <urgent_pointer>, [th_sum : <checkum>], [data : <data>]); Die Option th_flags muss eine der folgenden Optionen beinhalten. Diese können mit dem | Operator verknüpft werden. TH_SYN TH_ACK TH_FIN TH_PUSH TH_RST Numerischer Wert Die Option ip_packet muss über vorher die Funktion forge_ip_packet() generiert werden oder muss aus einem über send_packet() oder pcap_next() gelesenen Paket bestehen. Auch dazu werden wir einige Beispiele aufführen: tcp = forge_tcp_packet(ip:ip, th_sport:10003, th_dport:port, th_win:4096, th_seq:rand(), th_ack:0, th_off:5, th_flags:TH_SYN, th_x2:0, th_urp:0): tcppacket = forge_tcp_packet(ip:ip, th_sport:sport, th_dport:dport, th_flags:TH_ACK, th_seq:rand(), th_ack:rand(), th_x2:0, th_off:5, th_win:2048, th_urp); Elemente aus einem TCP Paket verändern Sie kennen diese Funktion für IP Pakete bereits und werden in der Handhabung kaum auf Schwierigkeiten stoßen, da die Syntax annähernd dieselbe ist. Die Checksumme wird hier automatisch neu berechnet, außer Sie setzen die Option th_sum. set_tcp_elements(tcp : <tcp_packet>, [th_sport : <source_port>,] [th_dport : <destination_port>,] Sandini Bib 3.2 Nessus 181 [th_flags : <tcp_flags>,] [th_seq : <sequnce_number>,] [th_ack : <acknowledgement_number>,] [th_x2 : <unused>,] [th_off : <offset>,] [th_win : <window>,] [th_urp : <urgent_pointer>,] [th_sum : <checkum>], [data : <data>] ); Elemente aus TCP Paketen auslesen Um bestimmte Elemente aus einem TCP Paket auszulesen, steht Ihnen die Funktion get_tcp_element() zur Verfügung. Zur Verwendung benutzen Sie bitte folgende Syntax, doch beachten Sie dabei, dass die Option <element_name> aus einem Element der folgenden Auflistung bestehen muss (vergessen Sie bei der Initialisierung bitte die Anführungszeichen nicht): »tcp_sport« »th_dport« »th_flags« »th_seq« »th_ack« »th_x2« »th_off« »th_win« »th_urp« »th_sum« element = get_tcp_elements(tcp: <tcp_packet>, element: <element_name>); Natürlichen dürfen auch bei dieser Funktionsbeschreibung die Beispiele nicht fehlen: beispiel = get_tcp_element(tcp:r, element:"th_flags"); beispiel2 = get_tcp_element(tcp:r, element:"th_sport"); UDP Pakete erstellen Um Wiederholungen zu vermeiden, werde ich an dieser Stelle nur die Syntax für die Funktion forge_udp_packet() anbringen, da Sie die Handhabung dieser Funktion schon von der Funktion forge_tcp_packet() her kennen: udp = forge_udp_packet(ip:<ip_packet>, uh_sport : <source_port>, uh_dport : <destination_port>, Sandini Bib 182 3 Systemaudit uh_ulen [uh_sum [data : <length>, : <checksum>], : <data>]); Dazu auch noch einige Beispiele: s = 56; d =16343; udp = forge_udp_packet(ip:ip, uh_sport:s, uh_dport:d, uh_leng:56); udp2 = forge_udp_packet(ip:ip, uh_sport:s, uh_dport:d, uh_ulen:56, update_ip_len:FALSE); Elemente eines UDP Paketes ändern Sie kennen diese Prozedur ja schon von den vorherigen Netzwerkfunktionen, deshalb werden wir die Funktion set_udp_elements() nicht näher beschreiben. Elemente aus einem UDP Paket auslesen Auch die Funktionsweise der Funktion get_udp_elements() werden wir nicht näher beschreiben, da sie ausreichend bekannt sein dürfte. ICMP Pakete erstellen Sie können die Funktion forge_icmp_packet() verwenden, um ICMP Pakete zu erstellen. Die Syntax und einige Beispiele dazu werden Ihnen bei der Erstellung dieser Tests mit Sicherheit weiter helfen. <Rückgabewert> = forge_icmp_packet(ip:<ip_Variable>, icmp_type:<icmp_type>, icmp_code:<code>, icmp_seq:<seq-nr>, icmp_id:<id> [data:<data>] Dazu einige Beispiele: icmp1 = forge_icmp_packet(ip:ip, icmp_type:17, icmp_code:0, icmp_seq:1, icmpq_id:1); icmp2 = forge_icmp_packet(ip:ip, icmp_type:8, icmp_code:0, icmp_seq:2, icmp_id:2. data: "Sicherheitstest!"); icmp3 = forge_icmp_packet(ip:ip, icmp_type:13, icmp_code:0, icmp_seq:1, icmp_id:1); Elemente eines ICMP Paketes ändern Auch die set_icmp_packet() Funktion sollten Sie nach der sorgfältigen Lektüre dieses Kapitels bereits beherrschen, da Sie nach dem selben Prinzip wie die anderen Funktionen zur Änderung bestimmter Werte in Paketen funktioniert. Deshalb werden wir nicht näher darauf eingehen. Sandini Bib 3.2 Nessus 183 Elemente eines ICMP Paketes auslesen Auch die Funktion get_icmp_element() funktioniert nach demselben Prinzip wie die anderen Funktionen dieser Art. Trotzdem werden wir zum besseren Verständnis einige Beispiele aufführen: icmp1 = get_icmp_element(icmp:r, element:"icmp_type"); icmp2 = get_icmp_element(icmp:rep, element:"icmp_type"); icmp3 = get_icmp_element(icmp:r, element:"icmp_type"); icmp4 = get_icmp_element(icmp:r, element:"icmp_id"); Erstellen eines IGMP Paketes Um eine IGMP Paket zu erstellen, benutzen Sie bitte die Funktion forge_igmp_packet(). Die Syntax hierzu ist den bereits besprochenen wieder sehr ähnlich: <Rückgabewert> = forge_igmp_packet(ip:<ip_Variable>, type:<type>, code:<code>, group:<group>, [data:<data]); Hierzu noch ein Beispiel: Igmp = forge_igmp_packet(ip:ip, type:2, code:31, group:128.1.1.1, data:crap(1500)); Die Funktion crap() wird weiter unten im Kapitel besprochen. IGMP Elemente ändern Um Elemente eines IGMP Paketes zu ändern, benutzen Sie bitte die Funktion set_igmp_element(). Die Verwendung ist äquivalent zu den bereits erklärten Funktionen. IGMP Elemente auslesen Auch die Verwendung der Funktion get_igmp_element() funktioniert nach dem bereits beschriebenen Prinzip. Erstellte Pakete versenden Sie sind nun an einem Punkt des Buches angelangt, an dem es Ihnen möglich ist, Pakete mit NASL selbst zu erstellen. Die Erstellung eines Pakets macht natürlich nur Sinn, wenn Sie die Möglichkeit besteht, diese danach auch zu versenden. Um nun ein Paket unter Nessus zu verschicken können Sie die Funktion send_packet() benutzen. Zur Verwendung ist die folgende Syntax nötig: <Rückgabewert> = send_packet(packet1, packet2, ...., packetN, pcap_active: <TRUE|FALSE>, pcap_filter: <pcap_filter> pcap_timeout:<timeout>); Sandini Bib 184 3 Systemaudit Die Option pcap_active kann zwei Werte annehmen: TRUE oder FALSE. Der Defaultwert liegt bei TRUE und besagt, dass die Funktion auf eine Antwort des Zielrechners wartet (was das Argument FALSE bedeutet dürfte somit klar sein). Die nächste Option ist etwas komplexer, da sie einen Filter darstellt. Man kann die pacp_filter-Option so setzen, dass die gewünschte Paketart definiert wird. Leider können wir an dieser Stelle nicht alle möglichen Filter ansprechen, da dies einige Seiten füllen würde. Um die verfügbaren Filter zu erhalten, installieren Sie bitte das Paket libpcap oder tcpdump und rufen Sie die dementsprechende Manpage auf, dort werden alle Filter und die Verknüpfungsarten (and, or oder not) beschrieben. Der pcap_timeout-Wert wird in Sekunden angegeben. Damit diese Funktion etwas verständlicher wird, werden wir einige Beispiele dazu aufführen: reply = send_packet(udpip, pcpap_filter:"udp and dst port 44444", pcap_active:TRUE); Dies ist eine ziemlich einfach gehaltene Funktion, erfüllt jedoch seinen Zweck. Das nächste Beispiel hingegen wird an Komplexität zunehmen. filter = string("dst host", src, "and icmp and ((icmp[0]==3) or (icmp[0]==11))", "and (icmp[24]==", str_ip-z")"); z[0]=" "; t = strstr(z, "."); filter = filter + string("and (icmp[25]==",z-t,") "); t[0]=" "; z = strstr(t, "."); filter = filter + string("and (icmp[26]==", t-z,") "); z[0]=" "; filter = filter + string("and (icmp[27]==", z, ")"); . . reply = send_packet(p, pcap_active:TRUE, pcap_filter:filter); Lassen Sie sich von der Komplexität dieses Codefragments nicht abschrecken, es soll Ihnen nur zeigen, wie genau man solche Filterregeln definieren kann. Bestimmte Pakete lesen Natürlich will man Pakete nicht nur versenden, sondern auch lesen. NASL bietet hierzu eine ziemlich einfache Funktion namens pcap_next(). Falls Sie diese Funktion verwenden, liest Nessus das Paket von der zuletzt in einem Filter definierten Schnittstelle. Die Syntax hierzu lautet: reply = pcap_next(); Sandini Bib 3.2 Nessus 185 Ein Beispiel hierzu könnte sein: filter = string("tcp and src host" , get_host_ip(), " and dst host ", this_host(), "and src port", port, "and dst port", 12345); aga = send_packet(tcp, pcap_active:TRUE, pcap_filter:filter); if(aga) { aga2 = pcap_next(); if(aga2) security_warning(port:0); } Allgemeines zu Zeichenketten Da NASL Zeichenketten wie Zahlen behandelt können Sie auch Operatoren verwenden. Wir werden dies anhand einiger Beispiele verdeutlichen: a = "version 1.2.3"; b = "version 1.4.1"; if(a < b){ # # Da a kleiner ist als b, wird der Schleifenkörper # ausgefuehrt } Sie können nach demselben Prinzip auch andere Operatoren, die Sie bereits kennen gelernt haben einsetzen. Es besteht auch die Möglichkeit Zeichenketten zu addieren oder subtrahieren. Wir werden uns dies anhand einiger Beispiele verdeutlichen: Bei diesem Skriptfragment erhält b den Wert »21.10«. a = "Geburtsdatum 21.10"; b = a - "Geburtsdatum "; Dieses Beispiel weist c den Wert »Linux« zu. a = "Linux ist das Groesste"; b = " ist das Groesste "; c = a - b; Das letzte Beispiel weist a den Wert »LinuxLinux« zu. a = "Linux"; a = a+a; In den nächsten Abschnitten werden Sie einige Funktionen von NASL, die mit Zeichenketten arbeiten, kennen lernen. Sandini Bib 186 3 Systemaudit Mustervergleich Für Mustervergleiche steht Ihnen unter NASL die Funktion ereg() zur Verfügung. Die passende Syntax zu dieser Funktion lautet: <Rückgabewert> = ereg(pattern:<pattern>, string:<string>) Um Genaueres über die Syntax des Arguments pattern zu erfahren, betrachten Sie bitte Tabelle 3.9, welche die möglichen Metazeichen für dieses Argument mit einer passenden Beschreibung erläutert. Falls Sie einige Beispiele für Suchmuster einsehen wollen, werfen Sie einen Blick in Tabelle 3.10. Metazeichen Beschreibung . Trifft auf jedes Zeichen zu. * Trifft auf beliebig viel vorher angegebene Zeichen zu. ^ Trifft auf Zeilenanfang zu. $ Trifft auf Zeilenende zu. \ Die folgende Sonderbedeutung eines Zeichens wird aufgehoben. [] Trifft auf ein Zeichen zu, welches sich in der Menge, die in den Klammern angegeben ist, befindet. \{ \} Trifft auf eine bestimmte Anzahl von Instanzen zu. + Trifft auf eines oder mehrere der vorher angegebenen Zeichen zu. ? Trifft auf keines der vorher angegebenen Zeichen zu. | Trennt Auswahlmöglichkeiten. () Gruppiert Auswahlmöglichkeiten. Tabelle 3.9 Metazeichen für das Argument pattern Suchmuster Beschreibung Version Sucht nach der Zeichenkette »version«. ^version Sucht auch nach der Zeichenkette »version«. Es wird aber nur ein Treffer gemeldet, falls sich diese Zeichenkette am Anfang einer Zeile befindet. version$ Hier trifft das Suchmuster zu, falls die Zeichenkette sich am Ende der Zeile befindet. ^version$ Um hierbei einen Treffer zu erzielen, muss die Zeichenkette das einzige Wort in der Zeile sein. versi.n Hierbei kann das sechste Zeichen beliebig sein. ^… $ Tifft auf jede Zeile mit genau drei Zeichen zu. ^\. Jede Zeile die mit einem Punkt beginnt, stellt bei diesem Suchmuster einen Treffer dar. Tabelle 3.10 Beispiele zum Argument pattern Sandini Bib 3.2 Nessus 187 Suchmuster Beschreibung version* Auf dieses Suchmuster würden zum Beispiel folgende Zeichenketten zutreffen: versionsnummer, versionstest … [123] Trifft zu, wenn eine der Ziffern 1, 2 oder 3 enthalten ist. Feuerwehr(mann|frau) Die Zeichenkette kann Feuerwehrmann oder Feuerwehrfrau lautet. Beides träfe zu. [a-zA-Z] Zeichenkette kann ein beliebiger Buchstabe sein. [0-9A-Za-z]* Trifft auf alle alphanumerischen Zeichenfolgen zu. [A-Z]* Trifft auf beliebig viele Großbuchstaben zu. [A-Z].* Trifft auf eine Zeichenkette zu, die aus einem beliebigen Großbuchstaben gefolgt von beliebig vielen Zeichen besteht. [A-Z]+ Zeichenkette muss aus einem oder mehreren Zeichenketten bestehen. »*version«* Trifft auf die Zeichenkette zu, ob mit oder ohne Anführungszeichen. Tabelle 3.10 Beispiele zum Argument pattern (Forts.) Falls Ihnen die in Tabelle 3.10 aufgeführten Beispiele und die folgenden Codefragmente noch nicht reichen, können Sie die egrep-Manpage aufrufen, um weitere Informationen zu diesem Argument zu bekommen. ereg(pattern:".*vr([0-9][^0-9]|10).*$",string:r)); ereg(patter:"^connected. time/date: .*, version:.*$", string:r)); ereg(pattern:".*.Version\ (8\.1\.6)|(8\.0\.6)|(7\.3\.4).*.", string:version)); Eine weitere Funktion, die sich mit Mustervergleichen beschäftigt, lautet egrep(). Diese Funktion gibt die erste Zeile eines Textes wieder, die mit dem Suchbegriff, der dem Argument pattern übergeben wird. Falls dieser Text nur aus einer einzigen Zeile besteht, so entspricht diese Funktion der Funktion ereg(). Wenn keine übereinstimmende Textpassage gefunden wird, wird der Wert false zurückgegeben. Die Syntax für diese Funktion lautet wie folgt (die Metazeichen hierzu finden Sie ebenfalls in Tabelle 3.9): funktion = egrep(pattern : <pattern>, string: <string>); Natürlich halten wir auch ein passendes Beispiel dazu bereit. port = get_kb_item("Services/www"); if( !port) port = 80 ; if(get_port_state(port)) { key = string("www/banner/", port); banner = get_kb_item(key); if(!banner) { Sandini Bib 188 3 Systemaudit socket = open_sock_tcp(port); req = http_head(item:"/", port:port); send(socket :socket, data :req) ; banner = recv(socket:socket, length:2000); close(socket); } if(egrep( pattern:"(.*PHP/3\.0\.((1[0-6])|([0-9]([^0-9]|$)))) |(.*PHP/4\.0\.[0-2]([^0-9]|$))", string:banner)) { security_waring(port); } } Bufferoverflowattacken simulieren Wenn man etwas mit Hacking identifiziert, dann Bufferoverflow-Attacken. NASL bietet eine recht einfach gestrickte, aber durchaus sinnvolle Funktion, mit der Sie testen können, ob bestimmte Programme eine Bufferoverflowlücke haben oder nicht. Diese Funktion heißt crap() und kann auf zwei verschiedenen Weisen benutzt werden: Die erste Möglichkeit diese Funktion zu benutzten besteht darin, eine Zeichenkette bestimmter Länge (<length>) bestehend aus lauter X zu erzeugen und diese zu übergeben. Die nötige Syntax hierfür lautet: crap(<length>); Falls Sie aber einen ständig wiederholenden Inhalt (data) bestimmter Länge (<length>) übergeben wollen, können Sie auch die zweite Möglichkeit der Initialisierung benutzen: crap(length:<length>, data:<data>); Um die Funktionsweise besser verdeutlichen zu können, werde ich hierzu einige simple Beispiele aufführen: a = crap(2); # uebergibt a = "XX" c = crap(length:7, data:"ab"); # uebergibt c = "abababa" Zeichenketten in Zeichenketten verwenden Die Funktion string() werden Sie sehr oft in Ihren Tests verwenden, da Sie es einem ermöglicht bestimmte Zeichenketten in anderen Zeichenketten zu werden und dabei Steuerzeichen interpoliert. Die zu verwendende Syntax lautet wie folgt: string(<string1>, [<string2>, ..., <stringN>]); Schauen Sie sich die folgenden Beispiele genau an, damit Sie die Handhabung dieser Funktion auch wirklich verstehen: Sandini Bib 3.2 Nessus 189 Das erste Beispiel weist der Variable den Wert: »Ich arbeite nur mit Linux« mit dem Steuerzeichen »NewLine« am Ende der Zeile zu. os = "Linux"; a = string("Ich arbeite nur mit ", os, "\n"); Das nächste Listing übergibt der Variable den Wert: »1 und 2 ergibt 3«: b = string(1, " und ", 2, " ergibt ", 1+2); Das letzte Codefragment belegt c mit dem Wert: »TEST XXXX« gefolgt von einem Carriage Return und einem New Line am Ende der Zeile: c = string("TEST ", crap(4), "\r\n"); Länge einer Zeichenkette Die Funktion strlen() wird wohl jedem C-Programmierer bekannt sein. Sie ermittelt die Länge einer Zeichenkette und wird wie folgt verwendet: Variable = strlen(); Ein passendes Beispiel zu dieser Funktion finden Sie im nächsten Listing. Variable = strlen("keihlp"); # a erhält den Wert 6 NASL Integer zu binären Integer konvertieren Mit der strtoint() Funktion kann man NASL Integer zu binären Integer konvertieren, die dazu nötige Syntax lautet wie folgt: Variable = strtoint(number:<nasl_integer>, size:<number_of_bytes>); Diese Funktion können Sie zusammen mit raw_string() verwenden (Sie werden merken, dass Sie diese Funktion fast nur in Verbindung dazu nutzen werden), wobei das Argument size der Byteanzahl entspricht in die der Integer von NASL konvertiert werden soll. Mögliche Größen hierfür sind 1, 2 und 4. Beispiel: num = rand(); raw_data = strtoint(number:num, size:2); Zeichenketten in Kleinbuchstaben konvertieren Dies ist eine recht einfach, aber dennoch praktische Funktion, die es Ihnen erlaubt einen bestimmten String in Kleinbuchstaben zu konvertieren. Die Syntax lautet: tolower(<string>) Zur Veranschaulichung stellen wir auch zu dieser Funktion ein Beispiel bereit: a = "Ich will nur Kleinbuchstaben haben"; b = tolower(a); # b = "ich will nur kleinbuchstaben haben" Sandini Bib 190 3 Systemaudit Portstatus ermitteln Mit der Funktion get_port_state() steht Ihnen eine Funktion zur Verfügung, die es Ihnen ermöglicht zu überprüfen, ob ein bestimmter Port offen ist. Falls er offen oder sein Status unbekannt ist liefert die Funktion den Wert true, ansonsten false. Beachten Sie, dass es bei NASL Sicherheitstests sehr auf die schnelle Abarbeitung der einzelnen Skripte ankommt und es daher sehr sinnvoll ist, diese Funktion einzusetzen, um zu testen, ob eine bestimmte Verbindung (die ein anderes Skript bzw. eine andere Funktion in demselben Skript aufbauen muss) überhaupt zustande kommen kann, da sehr viel Zeit mit einer Firewall, die Pakete zum Zielport blockt, verschwendet werden kann. Die Syntax für diese Funktion lautet: get_port_state(<Portnummer>) Knowledge Base Vorab möchte ich Sie darauf hinweisen, dass Sie zum Verständnis der Nessus Knowlegde Base den Abschnitt weiter unten im Buch, der sich ausschließlich darum dreht, lesen sollten. Die Nessus Knowledge Base wurde entwickelt, um Arbeit, die bereits verrichtet wurde, nicht noch einmal machen zu müssen und Sie anderen Skripten zur Verfügung zu stellen. Bevor ich mich lange in den Ausführungen über die Theorie darüber aale, werde ich ein kleines Beispiel bringen, das Ihnen sicherlich helfen wird, die Thematik zu verstehen. Nehmen wir an, Sie haben einen FTP-Server laufen, der sicherheitskritische Daten für einige Ihrer Mitarbeiter bereitstellt. Natürlich sind Sie nun darauf bedacht, dass dieser Dienst stets sicher ist und ihm niemand ein »Ei« unterjubelt. Daher haben Sie sich entschlossen, den Server alle 30 Sekunden überprüfen zu lassen. Wenn Sie sich nun über einige Variablen des Servers sicher sind (Port etc.), brauchen Sie diese logischerweise nicht mehr überprüfen lassen, da dies ja doppelte Arbeit wäre. Sie können diese bekannten Fakten nun aus der Nessus Knowledge Base beziehen und sparen sich somit einen Haufen Arbeit und Traffic. Natürlich werden spezifische Änderungen in der KB gespeichert (Änderung der Portnummer). Nachdem Sie nun wissen, was die Knowledge Base ist, sollten Sie noch erfahren, mit welchem Aufruf Sie sie in Ihre Skripte einbauen können. Dabei müssen Sie aber beachten, dass es zwei Möglichkeiten gibt, diese Funktion zu initialisieren. Die erste ist anonym und und liefert den in der Knowledge Base gespeicherten Wert des Feldes <name>. get_kb_item(<name>); Die zweite Möglichkeit besteht darin, ein Feld in der Knowledge Base upzudaten. set_kb_item(name:<name>, value:<value>); Sandini Bib 3.2 Nessus 191 Beachten Sie dabei, dass es nicht möglich ist ein Feld in Zeile x zu setzen und es in Zeile x+y wieder einzulesen, da die lokale Knowledge Base noch nicht auf den neusten Stand gebracht wurde. Aufbau eines NASL Skriptes Bevor Sie Ihr NASL Skript in den dafür vorgesehenen Ordner kopieren können (zumeist /usr/lib/nessus/plugins) müssen Sie es schreiben und dabei eine gewissen Form einhalten. Dies ist wichtig, da sich das Skript automatisch am Nessus-Server anmeldet und ihm einige Informationen über sich übergibt. Sie werden im Folgenden ein Muster – »Skriptgerüst« sehen, das Ihnen die nötigen Formatierungen zeigen wird: # # NASL SKRIPT # if(description) { # # Hier platzieren Sie bitte die Register Section # exit(0); } # # Die Attack Section befindet sich hier und # beinhaltet den eigentlichen Code # Die globale Variable description wird auf TRUE gesetzt, falls sich ein Skript registrieren muss oder auf FALSE, wenn es das nicht tun muss. Register Section In diesem Teil des Skriptes müssen folgende Optionen gesetzt werden: script_name(language1:<name>, [...]); Der Name, den Sie hier angeben, wird im Nessus-Client erscheinen. script_description(language1:<desc>, [...]); Wenn der User den Namen im Client anklickt, wird diese Beschreibung gezeigt. script_summary(language1:<summary>, [...]); Hier können Sie die Kurzbeschreibung angeben, die bei den Tooltips erscheinen wird (Sie dürfen dabei keinen Text angeben, der mehr als eine Zeile benötigt). script_category(<category>); Sandini Bib 192 3 Systemaudit Gibt die Skriptkategorie an, welche aus einer der in Tabelle 3.11 angegebenen Argumente bestehen muss. Skriptkategorie Beschreibung ACT_GATHER_ INFO Die Skripte werden vorab durchgeführt und können den Zielhost unter keinen Umständen schädigen. ACT_ATTACK Diese Tests versuchen bestimmte Rechte am Zielhost zu erhalten. Die dafür verwendeten Methoden können den Zielhost durchaus Schaden zufügen (Bufferoverflowattacken etc.). ACT_DENIAL Falls ein Skript dieser Kategorie erfolgreich ist, wird der Zielhost mit Sicherheit Schaden nehmen, da das Skript versucht den Rechner zum Absturz zu bringen. ACT_SCANNER Bei der Anwendung solcher Skripte hat der Zielhost keinen Schaden zu befürchten, da es sich um ein Portscannerskript handelt. Tabelle 3.11 Skriptkategorien für die Register Section script_copyright(language1:<copyright>, [...]); In diesem Abschnitt können Sie bestimmte Copyright-Angaben machen, die das Skript betreffen. Welche das sind, bleibt völlig Ihnen überlassen. script_family(language1:<family>, [...]); Gibt die Skriptfamilie an. Da es aber zurzeit keine klar vordefinierten Familien gibt, können Sie eine x-beliebige angeben, was aber wenig Sinn macht, da Sie nicht der einzige sein werden, der mit Nessus arbeitet. Um sicherzugehen, dass Sie auch Administratoren außerhalb Ihres Büros verstehen (bzw. Ihre Skripte), sollten Sie eine der folgenden – vordefinierten – Familien angeben: Backdoors CGI abuses Denial of Service FTP Finger abuses Firewalls Gain a shell remotely Gain root remotely Misc. NIS RPC Sandini Bib 3.2 Nessus 193 Remote file access SMTP problems Useless services script_Funktion(english:englischer_text, [francais:franzoesischer_text, deutsch:deutscher_text, ...]); Das oben angeführte Listing ist keine eigenständige Funktion, sondern betrifft alle Funktionen. Sie haben bei den Funktionsaufrufen gesehen, dass vor jeder Angabe immer das Argument language1 stand. Wie Sie sehen können, ist es unter Nessus möglich, die Angaben in mehreren Sprachen zu verfassen. Welche Sprachen Sie dabei wählen bleibt Ihnen überlassen, solange Sie Ihre Angaben mindestens in Englisch verfassen. Damit Sie besser verstehen, was ich meine, werfen Sie bitte einen Blick auf das folgende Beispiel: If(description) { name["english"] = "Bufferoverflow test for apache"; name["deutsch"] = "Bufferoverflowtest für Apache"; name["francais"] = "Je ne parles pas francais"; script_dependencies(filename1 [,filename2, ..., filenameN]); Diese Funktion ist nicht vorgeschrieben, aber manchmal sehr hilfreich. Sie können an dieser Stelle angeben, ob Ihr Skript erst ausgeführt werden soll, nachdem ein anderes bereits gelaufen ist. Dies kann äußerst praktisch sein, falls zwei Skripte denselben Server scannen, da Ihr Skript dann alle spezifischen Daten, die es zum erfolgreichen Test braucht, aus der Knowledge Base beziehen kann. Attack Section In der Attack Section steht alles, das für einen erfolgreichen Sicherheitstest notwendig ist. Falls ein Test erfolgreich war, können Informationen für ähnlich arbeitende Tests mit den beiden folgenden Funktionen weitergegeben werden. security_warning(<port> [, protocol:<proto>]); security_hole(<port> [, protocol:<proto>]); security_warning(port:<port>, data:<data> [, protocol:<proto>]); security_hole(port:<port>, data:<data> [, protocol:<proto>]); Die jeweils zuerst erwähnte Funktion beschreibt ein Sicherheitsloch, dessen Risiko nicht so hoch ist wie das bei einer security_hole. Falls Sie sich für den ersten Aufruf entscheiden, so wird die Skriptbeschreibung, die Sie am Anfang angegeben haben, im Client angezeigt. Für den Fall, dass Sie sich für die längere Syntax entscheiden, wird der Inhalt des Feldes data angezeigt. Sandini Bib 194 3 Systemaudit Ausführung einschränken Obwohl wir dieses Szenario schon öfters in diesem Kapitel besprochen haben, möchte ich es trotzdem gerne auch an dieser Stelle benutzen. Stellen Sie sich vor, Sie haben ein Skript geschrieben, das einen bestimmten Service, welcher auf einem bestimmten Port läuft, auf Sicherheitslücken überprüft. Falls dieser Dienst nicht aktiv oder erreichbar ist, ist Ihr Skript völlig nutzlos und kostet nur wertvolle Zeit. Nessus bietet Ihnen die Möglichkeit die Ausführung bestimmter Skripte einzuschränken. Welche Funktionen – die Sie übrigens in der description section, also ganz am Anfang, angeben müssen – Ihnen dabei zur Verfügung stehen, werden Sie jetzt erfahren: script_require_ports(<port1>, <port2>, ...) Falls Sie diese Funktion verwenden, wird Ihr Skript nur ausgeführt, wenn der Port <port> offen oder nicht bekannt ist. Sie können Ihre Angaben numerisch (21) oder symbolisch (Services/ftp) machen. script_require_keys(<key1>, <key2>, ...) Skripte, die diese Funktion beinhalten, werden nur ausgeführt, falls die Argumente <key> alle in der Knowledge Base vorhanden sind. script_exclude_keys(<key1>, <key2>, ...) Nessus wird dieses Skript nicht ausführen, falls eines der Argumente <key> in der Knowledge Base gesetzt ist. Natürlich haben wir auch zu diesen Funktionen einige Beispiele bereitgestellt: script_require_ports("Services/www", 80); script_require_keys("rpc/portmap"); script_exclude_keys("imap/false_imap"); 3.2.5 Knowledge Base Die Knowledge Base ist eine Art Datenbank, die bestimmte Felder (Nessus nennt diese Felder Schlüssel – für eine Liste mit den wichtigsten Feldern besuchen Sie bitte unsere Buch-Website) mit Daten füllt, die sich bei bestimmten Testdurchläufen ergeben (wie zum Beispiel Portnummern). Skripte können sich dadurch eine Menge Arbeit sparen, indem Sie bestimmte – wichtige – Fakten nicht selbst herausfinden müssen, sondern sich der Knowledge Base bedienen und sich die Informationen aus den Feldern holen. Dies spart eine Menge Zeit und Bandbreite. In Abbildung 3.1 können Sie das Konfigurationsfenster für die Konfiguration der Knowledge Base sehen. Sandini Bib 3.2 Nessus 195 Abbildung 3.1 Clientkonfigurationsfenster für Knowledge Base Wir werden nun in den folgenden Abschnitten auf die einzelnen Punkte dieses Konfigurationsfensters eingehen und Ihnen erklären, was diese genau bedeuten. Knowledge Base aktivieren Abbildung 3.2 zeigt, welchen Punkt Sie aktivieren müssen, damit Sie die Vorzüge einer Knowledge Base nutzen können. Beachten Sie dabei aber bitte, dass, falls Sie nur diese Funktion alleine aktivieren, die Felder in der Datenbank von anderen Tests nicht genützt werden. Wie Sie Nessus konfigurieren, so dass die gespeicherten Ergebnisse von bereits durchgeführten Tests auch für andere Skripte verfügbar sind, erfahren Sie im Anschluss an diesen Abschnitt. Sandini Bib 196 3 Systemaudit Abbildung 3.2 Knowledge Base aktivieren Wie bereits erwähnt, können Sie die getesteten Ergebnisse damit noch nicht für andere Tests verfügbar machen. Um dies zu erreichen müssen Sie den in Abbildung 3.3 gezeigten Punkt aktivieren. Seien Sie aber sehr vorsichtig mit dieser Option. Obwohl die Vorteile klar auf der Hand liegen (Schonung der Bandbreite, Zeitersparnis), hat das Verfügbarmachen von bestimmten Testergebnissen auch enorme Schattenseiten. Stellen Sie sich vor, es wäre Ihre Aufgabe, einen bestimmten Webserver jeden Tag auf aktuelle Sicherheitslücken zu testen. Wenn Sie sich nun die Zeit für das Portscanning sparen wollen und Ihrem Skript den Schlüsselwert aus der Knowledge Base übergeben, könnte es durchaus sein, dass Sie so gravierende Sicherheitslücken wie Trojaner Sandini Bib 3.2 Nessus 197 nicht entdecken. Wägen Sie also ab, wie sicher das zu testende Netzwerk bereits ist und welche Rolle die Zeit bei Ihren Tests spielt. Finden Sie ein Mittelmaß, mit dem Sie schnell und sorgfältig testen können. Abbildung 3.3 Knowledge Base verfügbar machen Nachdem Sie diese Option aktiviert haben, können Ihre Tests auf die Knowledge Base zugreifen. Welche Aktionen Ihre Tests dabei nicht mehr jedes Mal aufs Neue herausfinden sollen, können Sie an den Punkten in Abbildung 3.4 einstellen. Sandini Bib 198 3 Systemaudit Abbildung 3.4 Optionen für Knowledge Base Was soll getestet werden? Falls Sie eine Knowledge Base wünschen und dies im ersten Schritt angegeben haben, ist es möglich, bestimmte Einschränkungen vorzunehmen. Diese Restriktionen beziehen sich auf die zu testenden Hosts. Wie Sie anhand von Abbildung 3.5 sehen können, stehen Ihnen dabei drei Auswahlmöglichkeiten zur Verfügung. Test all hosts Falls Sie diesen Punkt aktivieren, werden alle Hosts, die Sie im Target-Feld angegeben haben, getestet. Only test hosts that have been tested in the past Sandini Bib 3.2 Nessus 199 Diese Option bewirkt, dass nur Hosts überprüft werden, die eine aktuelle (noch nicht verfallene) Knowledge Base angehängt haben. Only test hosts that have never been tested in the past Um Nessus dazu zu bringen, nur Hosts zu scannen, die keine oder nur eine abgelaufene Knowledge Base angehängt haben, müssen Sie diese Option aktivieren. Abbildung 3.5 Einschränkungen für zu testende Hosts Aktualität (up-to-date) Im vorhergehenden Abschnitt habe ich von einer abgelaufenen und aktuellen Knowlegde Base gesprochen. Falls Sie das verwirrt hat, hoffe ich, dass dieser Abschnitt die Unklarheiten beseitigen wird. Nessus bietet Ihnen die Möglichkeit, Ihrer Knowledge Base ein bestimmtes Verfallsdatum zu geben. Falls dieses Datum überschritten ist, erkennt Nessus dies Sandini Bib 200 3 Systemaudit und deklariert die KB als outdated (abgelaufen). Abbildung 3.6 zeigt Ihnen einen Screenshot des Dialogs, der Ihnen die Möglichkeit gibt, Nessus das Verfallsdatum einer KB mitzuteilen. Die Grenzen nach oben stehen Ihnen dabei frei. Nach unten haben Sie jedoch ein Limit von 3600 Sekunden einzuhalten. Wie schon erwähnt, sind Angaben in Sekunden zu machen. Abbildung 3.6 Verfallsdatum einer KB 3.2.6 Session saving Falls Sie sich einmal die Mühe machen und das Programm IPTraf den Netzwerkverkehr mitloggen lassen, den Nessus verursacht, werden Sie sehr schnell merken, dass dieser enorm hoch ist. Deshalb ist es umso ärgerlicher, wenn ein Scandurchlauf durch irgendetwas unterbrochen wird (Host stürzt ab, Netzwerkverbindung wird inaktiv etc.). Für solche Fälle hat man sich entschlossen ein neues Feature in Sandini Bib 3.2 Nessus 201 Nessus zu implementieren. Mit Hilfe des Session saving-Features haben Sie in Fällen unerwarteter Unterbrechungen eines Durchlaufs die Möglichkeit, Ihren Scan annähernd von der Stelle, an der die Unterbrechung stattgefunden hat, zu starten und verlieren somit wesentlich weniger Daten und setzen das Netzwerk nicht nochmals einer großen Scanbelastung aus. Abbildung 3.7 zeigt das Dialogfenster (TARGET SELECTION), in dem Sie Session saving aktivieren können. Abbildung 3.7 Session saving-Dialog Um Session saving zu aktivieren müssen Sie lediglich den dazugehörigen Menüpunkt aktivieren. Session wiederherstellen Falls es nun wirklich einmal passiert sein sollte, können Sie eine abgestürzte Session mit dem Punkt RESTORE SESSION wiederherstellen. Sie sollten den Namen der Sandini Bib 202 3 Systemaudit abgestürzten Session sehen, sobald Sie sich wieder mit dem Nessus Server verbunden haben. Das dabei verwendete Format ist <YYYYMMDD-HHMMSS>. Session löschen Wie Sie sich sicher schon gedacht haben, können Sie mit dem DELETE SESSION-Button Sessions auf der Nessus Server-Seite löschen. Fehlerbehebung Es kann dabei durchaus einmal vorkommen, dass Ihnen Nessus bei einem Scandurchlauf abstürzt und Sie – nachdem Sie sich mit Ihrem Server neu verbunden haben – noch immer keine Session, die Sie wiederherstellen können, sehen. In diesem Fall könnte dies daran liegen, dass die Session noch gelockt ist. Sie können diesen Lock lösen, indem Sie den folgenden Befehl ausführen: rm /usr/local/var/nessus/<username>/sessions/.*.lck 3.2.7 Weitere Plugins Natürlich können wir noch einige Seiten mit wirklich sehr guten und gelungenen Plugins von Nessus füllen, doch ich denke, dass das nicht im Sinne dieses Buches ist. Falls Sie aber interessiert sind, weitere Plugins kennen zu lernen, besuchen Sie doch die offizielle Nessusseite oder unsere Buchseite. Wir haben dort einige Informationen für Sie aufbereitet, die Ihnen mit Sicherheit helfen, die Möglichkeiten von Nessus voll auszuschöpfen. 3.3 VPASS Jetzt ist es an der Zeit unsere Passwörter zu prüfen. Wir werden Ihnen einige Tools vorstellen, mit denen Sie überprüfen können, ob die Passwörter und die dazugehörigen Usernamen sicher sind oder eben nicht und es einer Änderung bedarf. Das erste Tool diese Serie ist vpass. Vpass überprüft anhand der beliebten cracklib, ob die übergebene Kombination aus Username und Passwort (oder nur das Passwort) sicher ist. Falls nicht, sollten Sie vermeiden dieses Passwort zu wählen. Nun werden Sie sich denken, was der blauäugige Autor da so von sich gibt, ist zwar ganz nett, aber leider in der Praxis völlig sinnlos. Denn wie sollen Sie als Administrator eines lebendigen Netzwerkes, in dem jeder User sein Passwort nach Belieben ändern kann (oder sogar muss), überprüfen, ob das Passwort, das gewählt wurde, sicher ist. Mit dieser These liegen Sie natürlich richtig. Sie können in solchen Fällen selbstverständlich auf Programme wie crack oder john the ripper zurückgreifen, aber es gibt auch eine Möglichkeit das Programm vpass sinnvoll einzusetzen. Das ist selbstredend kein hundertprozentig sicherer Weg, er könnte aber einige User davon abhalten Ihr Passwort ungeschickt zu wählen. Sandini Bib 3.3 VPASS 203 Syntax Der allgemeine Aufruf erfolgt über den Programmnamen. Zusätzlich können noch einige weitere Angaben gemacht werden: Linux:~# echo "USER PASS" | vpass [Optionen] [Wörterbuch] Die beiden verfügbaren Optionen finden Sie in Tabelle 3.12. Option Beschreibung -h oder --help Gibt die Hilfefunktion aus -u oder --nouser Informiert vpass darüber, dass kein Username angegeben wird. Es wird also nur das Passwort überprüft. Tabelle 3.12 Optionen für vpass Anstelle des Platzhalters [Wörterbuch] können Sie optional ein Verzeichnis angeben, in dem sich Crackwörterbücher befinden. Falls Sie kein Verzeichnis spezifizieren, wird das Standardverzeichnis /usr/lib/cracklib_dict benutzt. Tabelle 3.13 informiert Sie über die möglichen Rückmeldungen von vpass bezüglich der Sicherheit der angegebenen Passwörter. Meldung Beschreibung OK Passwort scheint nicht einfach zu erraten zu sein. ERR a message Gibt eine Meldung aus, warum Sie diese Kombination nicht wählen sollten. Tabelle 3.13 Rückmeldungen von vpass Beispiele Linux:~# echo "a a" | vpass ERRNO 3:do not use your user name as a password Linux:~# echo "a b" | vpass ERRNO 5:unsuitable password because it is too short. Linux:~# echo "joe bunnylein" | vpass ERRNO 6:do not use all lower case passwords Linux:~# echo "joe bunNyLein" | vpass OK Sandini Bib Sandini Bib 4 Filesystem Integrity Checker Falls Ihnen die Überschrift dieses Kapitels noch nicht allzu viel sagt, wird es definitiv Zeit, dass Sie sich mit dieser Materie auseinander setzen. Bevor ich Ihnen kurz erläutern werde, was Filesystem Integrity Checker überhaupt sind, möchte ich Sie bitten kurz über die Schwächen so genannter Attack-Signature-Scanner (AntiViren-Programme) nachzudenken. Dabei wird Ihnen mit Sicherheit auffallen, dass diese Programme –um einen guten Job machen zu können– stets eine aktuelle Bibliothek benötigen (man könnte auch sagen, dass Sie eine gute Virendatenbank bräuchten), in der Sie Informationen über bekannte Virensignaturen finden, um bereits bekannte, bösartige Fremdprogramme zu erkennen und somit das System vor solchen Eindringlingen schützen können. In diesem Kapitel werden wir uns mit freier Software beschäftigen, die diesen Makel nicht hat und zusätzlich einen wesentlich größeren Schutz für Ihr System bieten kann. Filesystem Integrity Checker konservieren (stark vereinfach gesagt) einen Systemzustand, der als sicher gilt. Falls nun eine bösartige Software nicht vom Virenscanner erkannt wird und somit zum Beispiel durch eine E-Mail ins System gelangt, kann es mit Hilfe des konservierten Systemzustands gefunden und beseitigt werden. 4.1 Tripwire Tripwire ist wohl der bekannteste Vertreter der Filesystem Integrity Checker und mit Sicherheit auch eines der besten freien Tools, die sich mit IT-Security einen Namen gemacht haben. Die Entwickler Gene Kim und Eugene Spafford haben es sich zur Aufgabe gemacht, ein Programm zu schaffen, das dabei weitaus mehr bietet als einen einfachen Vergleich des aktuellen Systemzustands mit einer als sicher geltenden Sicherungskopie. Da den Entwicklern bereits sehr bald klar wurde, dass man die Integrität eines Dateisystems anhand einiger, signifikanter Merkmale genauso gut überprüfen kann wie anhand einer exakten Sicherungskopie, bestand die große Aufgabe und Schwierigkeit darin, diese Merkmale auf eine sinnvolle Weise – auch und besonders in Hinblick auf die späteren Überprüfungen – zu extrahieren. Um die Datenmengen, die dabei entstehen, so gering wie möglich zu halten, hat man sich dazu entschlossen, die Informationen mit Algorithmen aus dem Bereich der Nachrichtenverschlüsselung aus dem System zu gewinnen (zum Beispiel MD5). Bevor wir beginnen, möchte ich an dieser Stelle vorab erwähnen, dass wir mit der weit verbreiteten Academic-Source-Release (ASR) arbeiten, aber an den meisten Stellen (Selection Masks und Templates) auch auf die Vorzüge der »anderen« Version eingehen werden. Sie können bereits bei der Installation festlegen, welche Version Sie beziehen. Dies hängt dabei aber zum Großteil davon ab, wie Sie Tripwire nutzen (lizenzpolitisch). Sandini Bib 206 4.1.1 4 Filesystem Integrity Checker Allgemeine Vorteile Das Kuriose an Tripwire ist, dass es eigentlich über sein Ziel hinausschießt (im absolut positiven Sinne). Wie wir bereits erfahren haben, war das Ziel der Entwickler ein Programm zu schaffen, das es einem ermöglicht, den aktuellen Sicherheitsstand unseres Systems daran zu erkennen, ob bestimmte (von uns angegebene) Charakteristika verändert wurden oder sich noch im gewünschten Zustand befinden. Dieses System bringt aber noch einige andere Vorteile mit sich. So erleichtert Tripwire das Entfernen schlecht geschriebener Software enorm. Ein weiterer großer Vorteil wird dem Programm im Bereich der aktiven Beweissicherung nachgesagt. Ohne mich zu weit aus dem Fenster lehnen zu wollen (ich muss zugeben, ich hatte nur einige, wenige Vorlesungen während meines Studiums, die sich um Computerrecht oder Ähnliches gedreht haben), könnte die Signatur einer One-Way-Hash-Funktion durchaus als Beweismittel vor Gericht dienen. Da aber zumeist der Angreifer nicht in der Lage ist, den finanziellen Schaden, den er durch seinen Angriff angerichtet hat, zu begleichen, erscheint es wohl sinnvoller, diese Datei der Versicherung zu mailen. 4.1.2 Konfigurationsaufwand Nachdem wir nun die geplanten und nicht geplanten Features von Tripwire kennen, ist es wohl an der Zeit, den Verwaltungs- und Konfigurationsaufwand dieser Software zu besprechen. Da Tripwire ein statisches System ist, müssen Sie sich jedes Mal mit der Konfiguration beschäftigen, sobald Sie Software hinzufügen oder entfernen. Das heißt, dass auf Testrechnern und ähnlichen Systemen Tripwire nichts zu suchen hat. Da aber die Softwarekonfiguration auf den meisten kritischen Serversystemen nicht wöchentlich geändert wird, sollten Sie sich um den Konfigurationsaufwand keine allzu großen Gedanken machen, da dieser im Vergleich zum Nutzen ein gerne in Kauf genommenes kleines Übel darstellt. 4.1.3 Installation Wie immer sollten Sie sich die aktuelle Version von Tripwire aus einer sicheren Quelle wie der Buchseite oder bevorzugt von den offiziellen Tripwireseiten, welche Sie in der folgenden Auflistung finden, herunterladen: http://www.cs.purdue.edu/coast http://www.tripwiresecurity.com Nachdem Sie die Echtheit Ihres Pakets überprüft haben, können Sie es ohne Bedenken installieren. Linux:~# rpm –ivh tripwire-version-i.386.rpm Sandini Bib 4.1 Tripwire 207 Wie ich zu Beginn bereits erwähnt habe, werde ich Ihnen Tripwire anhand der ACR vorstellen. Falls Sie sich schon länger mit Tripwire beschäftigen, werden Sie sicherlich wissen, dass sich in letzter Zeit einiges in Sachen Vermarktung, Open Source etc. getan hat. Wer mehr über die Geschichte von Tripwire wissen möchte, kann dazu mehr unter folgender Adresse finden: http://www.forbes.com/tool/html/toolbox.htm Wer daran interessiert ist, an der Entwicklung von Tripwire teilzuhaben, kann sich bei Sourceforge Informationen dazu besorgen: http://sourceforge.net/projects/tripwire Wer die aktuellen Binaries beziehen will, kann dies natürlich auch per Internet tun: http://www.tripwire.org Jetzt sollten Sie alle wichtigen Adressen und Informationen erhalten haben, um sich die richtige Version zu beschaffen, und wir können guten Gewissens starten. 4.1.4 Konfigurationsdatei Die Konfigurationsdatei tw.config bildet das Herzstück von Tripwire. An sich ist die Syntax leicht zu verstehen und zu erlernen. Falls Sie aber vorhaben tw.config für mehrere Hosts, die unterschiedliche Betriebssysteme fahren, einzusetzen, kann die Syntax schnell sehr komplex werden. Aber keine Angst, wir werden mit einer einfachen Konfiguration einsteigen, so dass Sie sich ganz langsam an die Syntax und ihre Tücken gewöhnen können. Tripwire bietet eine Vielzahl an Optionen, die es einem ermöglichen, Daten oder ganze Verzeichnisse (auch rekursiv) zu überwachen. Um einen einfachen Weg zu bieten, auch plattformabhängige Charakteristika eines Dateisystems in die Überwachung nahtlos einschließen zu können, hat man sich dazu entschlossen, die Konfigurationsdatei ähnlich einer Liste aufzubauen. Die Grundsyntax hierbei sieht folgendermaßen aus: [!|=] Objekt [Auswahlmaske] [Kommentar] Kommentare Vorab möchte ich gleich auf die Kommentare eingehen. Wie bei vielen anderen Skriptsprachen und wie bei den meisten Konfigurationsdateien leiten Sie einen Kommentar mit dem #-Zeichen ein, wobei auch hier die Zeichen und Anweisungen hinter dem Kommentarzeichen ignoriert werden. Objekte und Operatoren Objekte in Tripwire stellen entweder Dateien oder ganze Verzeichnisse dar. Wenn Sie sich die Syntax von tw.config nochmals ansehen, werden Sie bemerken, Sandini Bib 208 4 Filesystem Integrity Checker dass Sie optional die Operatoren ! und = einsetzen können. Ich möchte Ihnen zuerst den =-Operator anhand eines Beispieles vorstellen: # Beispielfragment aus tw.config . = /mail L . Das hier aufgeführte Codefragment weist Tripwire an, dass es zwar die Inode des Verzeichnisses /mail überwachen soll, aber nicht den Inhalt dieses Verzeichnisses. Das heißt, Sie werden zum Beispiel über die Erstellung oder das Löschen von Dateien informiert, aber nicht über die betroffenen Objekte oder die Art der Veränderungen. Dies ist eine äußerst ressourcensparende Option, da sich der Inhalt der Verzeichnisse wie /mail, /tmp und /var/spool im Regelfall sehr oft ändert. Falls Sie keinen Operator verwenden, werden Sie zusätzlich über die Art der Veränderungen und die betroffenen Objekte informiert. Das nächste Codefragment zeigt die Verwendung des !-Operators, der es Ihnen erlaubt, bestimmte Objekte aus der Überwachung auszuschließen. Diese Option ist für Verzeichnisse wie /dev äußerst nützlich. Sie sollten aber grundsätzlich darauf verzichten, da jede Verwendung des Stopp–Operators möglicherweise auf Kosten der Sicherheit geht. # Beispielfragment aus tw.config . !/dev . . Bevor wir den Abschnitt über Objekte abschließen, möchte ich Sie noch darauf hinweisen, dass Sie unbedingt die Dateisystemgrenzen beachten müssen. Sind zum Beispiel /joey und /joey/aga Mountpunkte für zwei Partitionen und Sie wollen das Verzeichnis /joey komplett überwachen, so müssen beide Pfade separat aufgeführt werden. Selection masks / select-flags Wir haben gesehen, dass Sie mit den verfügbaren Operatoren die Möglichkeit haben, die Überwachung in groben Zügen einzuschränken. Tripwire bietet aber eine weitaus tiefer gehende und feinere Methode, um Abstimmungen über die vorzunehmende Überwachung zu treffen. Mit den so genannten Selection masks oder Select-flags (hier scheiden sich die Geister, wenn es um die korrekte Betitelung dieser Option geht) haben Sie die Möglichkeit eine konkrete Eigenschaft des zugeordneten Objekts zu kennzeichnen. Welche Eigenschaft Sie dabei wählen können, hängt zum Großteil vom Dateisystem (EXT2 hat sich als Quasistandard etabliert) ab. Welche Selection Masks Ihnen grundsätzlich in Linux unter EXT2 Sandini Bib 4.1 Tripwire 209 zur Verfügung stehen, sehen Sie in Tabelle 4.1. Über die sinnvolle Implementierung anhand einiger Codefragmente und eventuelle Alternativen werden wir uns im Anschluss Gedanken machen. Selection Mask Bericht Beschreibung P st_mode Ausführungsmodi (SUID-Bit, SGID-Bit und Text-Bit) und Zugriffsrechte I st_ino Inodenummer. Allgemeines zu Inodenummern finden Sie in Kapitel 1. Normalerweise wird durch Schreiben und Lesen einer Datei die Inodenummer nicht verändert. Findet Tripwire dennoch eine Veränderung, so kann man daraus schließen, dass das betroffene Objekt gelöscht oder durch eine Datei mit anderem Inhalt, aber selbem Namen ersetzt wurde. N st_nlink Link-Count. Repräsentiert die Anzahl der Links (keine dynamischen, sondern ausschließlich Hardlinks) und Unterverzeichnisse. Im Falle von Verzeichnissen gibt der Zähler (Counter) die Anzahl der zugehörigen Unterverzeichnisse an. Im Falle einer einfachen Datei die Anzahl der mit der Inode verbundenen Links. Der Zähler erhöht sich bei jedem Hardlink auf die zugehörige Datenzone. U st_uid UID. Benutzer ID G st_gid GID. Gruppen ID S st_size File size. Eine sehr wichtige Mask, da Veränderungen wichtiger Dateien meistens mit einer Änderung der Dateigröße einhergehen. A st_atime Access timestamp. Auf der Jagd nach Crackern erweist sich diese Mask als äußerst hilfreich, da ihr Wert bereits beim Betrachten bzw. beim Einlesen einer Datei geändert wird. Sie sollten diese Datei mit keiner Mask verwenden, die zur Berechnung des Werts die Datei einlesen muss (zum Beispiel Signaturberechnung). M st_mtime Modification-timestamp. Dieses Feld wird geändert, falls eine Datei verändert und mit den Veränderungen gesichert wird. C st_ctime Inode-change-timestamp. Diese Mask gibt den Wert der letzen Statusänderung zurück. Dies entspricht dem letzten Schreibzugriff auf die Inode (zum Beispiel, wenn die Zugriffsrechte einer Datei geändert wurden). T Object Type Dateityp Tabelle 4.1 Verfügbare Selection-Masks Sandini Bib 210 4 Filesystem Integrity Checker Selection Mask Bericht Beschreibung D Device Nr. Beim Partitionieren sind mit einer speziellen Kennzahl versehen, welche Aufschluss über die Art der Formatierung gibt. Diese Mask stellt sicher, dass diese Kennzahl (neben anderen Merkmalen) in die Referenzdatenbank eingetragen wird, von der die Inode des dazugehörigen Objekts stammt. I Size Vorab ist zu dieser Mask zu sagen, dass sie unter ASR nur in Verbindung mit einer anderen Selection-Mask als Template (werden wir später noch genauer besprechen) zur Verfügung steht. Anders als die Mask s, die bei jeder Veränderung der Dateigröße »anspringt«, erfolgt bei dieser Mask nur eine Meldung, falls eine Datei verkleinert wurde. Diese Mask sollte man auf Logfiles ansetzen, da diese von Eindringlingen gerne verändert werden. R File Device Nr. Diese Mask ist nur für Gerätedateien verfügbar und bezeichnet die Gerätetreibernummer, die mit der dazugehörigen Inode verbunden ist. B Blocks Steht für die Anzahl der Datenblöcke (für EXT2 typischerweise 1024 Bit), die durch die Zonenzeiger der Inode belegt werden. Tabelle 4.1 Verfügbare Selection-Masks (Forts.) Nachdem Sie nun einige der Selection-Mask kennen gelernt haben, wollen wir uns mit den verfügbaren Algorithmen beschäftigen. Die Wahl des Algorithmus ist von großer Bedeutung und von vielen Faktoren abhängig. Denn was hilft Ihnen ein absolut sicheres System (was es ja sowieso nicht geben kann, außer Sie schalten den Rechner aus), wenn die Performance so gering ist, dass eine Bedienung nahezu unmöglich ist. In Tabelle 4.2 finden Sie die in Tripwire verfügbaren Algorithmen mit einigen durchaus hilfreichen Bemerkungen. Das Feld »Geschwindigkeit« kann die Werte 1 bis 8 einnehmen, wobei 1 der schnellste Algorithmus ist und 8 der langsamste. Das Feld »Sicherheit« kann zwischen 1 und 5 variieren, wobei Algorithmen, die den Wert 5 zugewiesen bekamen, die sichersten darstellen. Beachten Sie dabei, dass auch die Auswahl des Algorithmus mit Hilfe der Selection-Masks zu treffen ist. Mask Algorithmus Geschwindigkeit Sicherheit Beschreibung 0 - - - null signature 1 MD5 5 5 Message Digest 5 Algorithmus, sicherer, aber auch langsamer als sein Vorgänger Tabelle 4.2 Algorithmen Sandini Bib 4.1 Tripwire 211 Mask Algorithmus Geschwindigkeit Sicherheit Beschreibung 2 Snefru 7 4 Langsamer, aber als sicher geltender Algorithmus 3 CRC-32 4 2 Ursprünglich gedacht zur Erkennung von hardwarebedingten Übertragungsfehlern. Sollte bei sicherheitskritischen Systemen nicht verwendet werden. 4 CRC-16 1 1 Siehe Beschreibung zu CRC-32. Absolut schneller Algorithmus, der in Sachen Geschwindigkeit seinesgleichen sucht! Sollte aber bei sicherheitskritischen Serversystemen nicht eingesetzt werden. 5 MD4 2 3 Sehr beliebt bei RISC Systemen, da er auch sehr schnell ist. Sollte aber auf keinen Fall eingesetzt werden. 6 MD2 8 4 Ist noch auf 8 Bit Prozessortechnik ausgelegt und von daher ungemein langsam. Obwohl er als sicher gilt, sollte er aufgrund der mangelnden Geschwindigkeit nicht eingesetzt werden. 7 SHA 6 5 Ist mit MD4 verwandt. Obwohl – wie Sie vielleicht wissen – einige Gerüchte im Raum stehen, dass dieser Algorithmus eine nicht dokumentierte Sicherheitslücke besitzt, können Sie ihn meiner Ansicht nach bedenkenlos einsetzen (die NASA tut es ja auch). 8 Haval 3 4 Bietet 15 unterschiedliche Varianten für praktische Anwendungen, ist sicher und schnell. Kann durchaus für sicherheitskritische Systeme eingesetzt werden. Tabelle 4.2 Algorithmen (Forts.) Verwendung von Select-Masks Der einfachste Weg, um eine vollständige Beschreibung aller interessanten Eigenschaften eines Objekts zu bekommen, besteht darin, alle dafür nötigen Masks aneinander zu reihen. Dabei haben Sie die Möglichkeit mit zwei weiteren Operatoren (+ und -) bestimmte Masks explizit aus- bzw. einzuschließen. Dabei müssen Sie beachten, dass die von uns verwendete Version ASR alle nicht ausdrücklich ausgeschlossenen Masks (Sie können bestimmte Masks mit Hilfe des –-Operators ausschließen) in die Überwachung einschließt. Falls Sie sich an dieser Stelle fragen, wofür dann der +-Operator zu gebrauchen sein sollte, haben Sie bitte noch etwas Geduld. Sie werden es im Abschnitt über Templates erfahren. Sandini Bib 212 4 Filesystem Integrity Checker Da das eben erwähnte »Feature« in den Manpages nur schlecht bis überhaupt nicht beschrieben ist, werden wir uns anhand einiger Beispiele noch tiefer in die Materie einarbeiten. Im folgenden Listing finden Sie einige Auswahlmasken, die trotz völlig unterschiedlicher Syntax genau dasselbe bewirken. /joey/aj +ug-n /joey/aj –n /joey/aj +piuagsmc123456789-n Wie Sie aus dem Listing entnehmen können, ist aus Ihrem Wunsch, nur die UID und GID ohne die Anzahl der Hardlinks zu überwachen, nichts geworden, da Tripwire automatisch alle nicht explizit ausgeschlossenen Masks einbezieht. Um zu erreichen, dass wirklich nur die UID und die GID angezeigt werden, müssen Sie folgende Auswahlmaske benutzen: /joey/aj +ug-pinsamc123456789 oder /joey/aj –pinsamc123456789 Templates Im vorhergehenden Abschnitt haben Sie gesehen, wie man eine Auswahlmaske definiert und welche Eigenheiten Sie dabei beachten müssen. Wie Sie sich gut vorstellen können, kann es durchaus vorkommen, dass Sie bei solch langen Masken Fehler machen. Um diese Fehlerquelle teilweise zu beseitigen, haben Sie die Möglichkeit so genannte Templates zu verwenden. Dies sind vordefinierte Auswahlmasken, die es Ihnen ermöglichen, oft genutzte Auswahlschemata mit nur einem Buchstaben zu initialisieren. In Tabelle 4.3 sind die verfügbaren Templates zu sehen. Template Äquivalent Beschreibung R +pinugsm12-ac3456789 Read-Only. Dateien sind allgemein verfügbar, dürfen aber nur gelesen werden. (Defaultwert) L +pinug-sacm123456789 Log file. Verzeichnisse und Dateien, die sich ständig verändern N +pinugsamc123456789 Ignore-Nothing. Nichts ignorieren. Alle Masken sind aktiv. E -pinugsamc123456789 Ignore-Everything. Alles ignorieren. Hier werden nur hinzugefügte oder gelöschte Objekte ausgewiesen. > +pinug-samc123456789 Growing-File. Gut geeignet für Logdateien, die zwar wachsen dürfen, aber deren Größe nicht abnehmen darf. Device +pugsdr-intlbamcCMSH Dateien, die Tripwire nicht öffnen darf (Gerätedateien) Tabelle 4.3 Verfügbare Templates Sandini Bib 4.1 Tripwire 213 Eine Konfigurationsdatei für das gesamte Netzwerk Nachdem Sie nun wissen, welche Möglichkeiten beim Designen der tw.config zur Verfügung stehen, sollten Sie sich Gedanken machen wie Sie Ihr Netzwerk schützen. Denn – wie wir alle wissen – der Computer ist nichts, da das Netzwerk alles ist. Und da ein solches – von IBM gepriesenes – Netzwerk aus vielen Computern besteht, ist es an der Zeit, über die Möglichkeiten zu sprechen, die Sie haben, um Tripwire zentral zu konfigurieren, das heißt, wie Sie die Konfigurationsdatei verfassen, so dass Sie damit alle Rechner in Ihrem Netzwerk überprüfen und verwalten können. Natürlich können Sie auch auf jedem Rechner eine eigene tw.config anlegen, doch dies bedeutet einen enormen Aufwand bei der Verwaltung. Tripwire bietet uns dafür die Preprocessor-Syntax, deren Befehle mit einem doppelten @ (@@) initialisiert werden. Tabelle 4.4 beinhaltet die verfügbaren Optionen hierfür. Argument Beschreibung @@ifhost hostname Wahr, wenn hostname mit uname –n oder hostname übereinstimmt. Wenn der Wert wahr zurückgegeben wird, werden alle Anweisungen bis zum nächsten @@endif oder @@else ausgeführt. @@ifnhost hostname Wahr, wenn hostname mit uname –n oder hostname nicht übereinstimmt. Wenn der Wert wahr zurückgegeben wird, werden alle Anweisungen bis zum nächsten @@endif oder @@else ausgeführt. @@else Wird ausgeführt, falls @@ifhost, @@ifnhost, @@ifdef oder @@ifndef den Wert falsch zurückgeben @@ifdef Variable Gibt den Wert true zurück, wenn die Variable definiert ist @@ifndef Variable Gibt den Wert true zurück, wenn die Variable nicht definiert ist @@endif Schließt das @@if* Statement @@define Variable String Weist der Variable einen String zu, falls kein String angegeben wird, so wird der Null-String zugewiesen @@undef Variable Variable ist nicht weiter definiert @@include Pfadname Zieht die Datei, die unter dem angegebenen Pfadnamen liegt, mit ein. Diese Datei muss dieselbe Konfigurationssyntax haben. @@Variable Weist den String, der in Variable gespeichert ist zu. @@{Variable} Selbe Beschreibung wie das zuvor aufgeführte Argument || Logisches ODER && Logisches UND Tabelle 4.4 Preprozessoren unter Tripwire Um Ihnen die Syntax näher zu bringen, habe ich im Folgenden einige Beispiele für Sie vorbereitet. Ich werde die einzelnen Schritte direkt im Code anhand von Kommentaren beschreiben. Sandini Bib 214 4 Filesystem Integrity Checker # Tripwire Konfigurationsdatei mit Preprocessoren # # Die erste Zeile aendert das Template READ (R) so ab, dass anstelle # der Selection-Masks # 7 und 8 die Masks 1 und 2 verwendet werden. @@define READ R+78-12 # # Da wir ein Netzwerk mit vielen unterschiedlichen Betriebssystemen # haben, brauchen wir # fuer jedes OS eigene Auswahlmasken. Wir werden Tripwire nun # "sagen" welche Hosts welches Betriebssystem fahren. # Als Erstes weisen wir den Rechnern joey, roland, grassl das OS # Linux zu. # @@ifhost joey || roland || grassl @@define LINUX @@endif # # Nun weisen wir den Rechnern aga, aj, bill das OS MS Windows zu. # @@ifhost aga || aj || bill @@define WINDOWS @@endif # # Natürlich haben wir auch einige Solarisserver im Haus # @@ifhost angelus || woodstock @@define SOLARIS @@endif # # Die restlichen Computer in unserem Netzwerk fahren IRIX # @@ifndef SOLARIS @@ifndef LINUX @@ifndef WINDOWS @@define IRIX @@endif @@endif @@endif @@endif # # Jetzt kommen wir zum eigentlichen Start von Tripwire # # Fuer Linux haben wir eine eigene Konfigurationsdatei unter # /usr/local/tripwire/etc/tw.config.linux angelegt. # @@ifdef LINUX Sandini Bib 4.1 Tripwire 215 @@include /usr/local/tripwire/etc/tw.config.linux @@else . # # Hier lasse ich einen Großteil der Syntax weg, da Sie die # Argumente darin bereits kennen. # . @@endif . @@ifdef SOLARIS . # # Jetzt definieren wir noch unsere eigenen Variablen und weisen # ihnen Selection Masks zu # @@define privat E @@define geheim R /home/joey @@private /root/online-banking @@geheim . . @@endif . . Ich hoffe, dieses Beispiel hat Ihnen weiter geholfen und Sie sehen sich nun in der Lage eine eigene zentrale Konfigurationsdatei zu entwerfen. 4.1.5 Funktionsweise Bevor wir uns näher mit den einzelnen Befehlen von Tripwire auseinander setzen können, sollten wir uns zuerst mit der Funktionsweise dieses Tools beschäftigen. Man kann diese Prozedur in drei Phasen unterteilen: 1. Initialisierung 2. Integritätstest 3. Updatemodus 4. Wir werden nun kurz auf die einzelnen Phasen eingehen und deren Nutzen und Funktionen erläutern. Initialisierung Bei der Initialisierung wird auf Basis der Konfigurationsdatei (tw.config) eine Referenzdatenbank erstellt, welche – wie wir ja bereits besprochen haben – eine Beschreibung der sicherheitsrelevanten Objekte des betroffenen Systems bzw. Sandini Bib 216 4 Filesystem Integrity Checker des betroffenen Netzwerks enthält. Diese Beschreibung ergibt sich aus der Auswahlmaskendefinition, die Sie mit Hilfe der Selection-Masks erstellen. Die dabei erstellte Referenzdatenbank (welche im ASCII Format erstellt wird) müssen Sie nach der Initialisierung auf jeden Fall noch in ein anderes Verzeichnis verschieben. Genaueres dazu werden Sie bei der Besprechung der einzelnen Argumente für den Tripwire-Befehl finden. Beachten Sie bitte, dass Ihr System bei der Initialisierung frei von jeglichen bösartigen Fremdkörpern, die nichts in Ihrem System zu suchen haben, ist. Am besten geeignet dafür ist selbstverständlich ein frisch aufgesetztes System; da dies in der Realität natürlich kaum zu bewerkstelligen ist, sollten Sie durch manuelle Überprüfung einiger systemkritischer Dateien (wie inetd.conf bzw. xinetd.conf oder passwd) sicherstellen, dass sich das System in einem sicheren Zustand befindet. Die Syntax für die Initialisierung werden Sie nach der Besprechung der Funktionsweise erhalten. Integritätstest Diese Phase stellt die eigentliche Systemüberprüfung dar. Auch hierbei wird eine Datenbank auf Basis der Konfigurationsdatei erstellt, welche den aktuellen Stand des Dateisystems widerspiegelt. Der erste Vergleich mit der Referenzdatenbank liefert dabei folgende Informationen: Anzahl der gescannten Dateien Anzahl der hinzugefügten Dateien Anzahl der gelöschten Dateien Der folgende genaue Vergleich wendet dann die von Ihnen definierten Auswahlmasken an und gibt Ihnen die Anzahl der noch übrig bleibenden Dateien zurück. Das heißt: Anfangs werden alle Änderungen im System angezeigt, aber nach Anwendung der Regeln zeigt Ihnen Tripwire, ob bei diesen Änderungen Dateien oder Attribute betroffen sind, die Sie durch Ihre Auswahlmasken spezifiziert haben. Die Bildschirmausgabe eines Integritätstests, der keine gefährlichen Änderungen an den Dateien, die in tw.config spezifiziert sind, ausweist, sieht folgendermaßen aus: Linux:~# tripwire ### Phase 1: Reading configuration file ### Phase 2: Generating file list ### Phase 3: Creating file information database ### Phase 4: Searching for inconsistencies ### ### Total files scanned: 231 ### Files added: 0 ### Files deleted: 0 Sandini Bib 4.1 Tripwire ### ### ### ### ### 217 Files changed: 231 After applying rules: Changes discarded: Changes remaining: 231 0 Dem aufgeführten Listing können Sie entnehmen, dass 231 Dateien geändert wurden, aber dass keine dieser Änderungen auf eine Auswahlmaske zutrifft. Updatemodus Falls Sie eines Tages bemerken, dass der Integritätstest von Tripwire eine Veränderung anspricht, die von Ihnen gewollt wurde, ist es an der Zeit, die Referenzdatenbank auf den neuesten Stand zu bringen, da Tripwire diesen »Missstand« ansonsten bei jedem Durchgang erneut bemängeln würde. Diese Option erlaubt es Ihnen aber auch, Ihre Konfigurationsdatei zu verändern, ohne dabei eine komplette Reinitialisierung veranlassen zu müssen. Sie werden zu diesem Befehl im folgenden Abschnitt mehr erfahren. 4.1.6 Die Tripwire-Befehle Dieser Abschnitt beschäftigt sich mit den verfügbaren Tripwire-Befehlen, die Ihnen beim Umgang und bei der Pflege Ihres Systems zur Seite stehen. Bevor wir die einzelnen Optionen dazu besprechen, möchte ich Sie darauf hinweisen, dass das eigentliche Tripwire-Programm (also der Integritätstest) aufgerufen wird, falls Sie der Konsole nur den Programmnamen übergeben. Linux:~# tripwire Sie haben ja bereits bei der Besprechung der Funktionsweise gesehen, wie die Bildschirmausgabe aussehen sollte, falls »nennenswerte« Änderungen auftraten (sprich, wenn Ihre Auswahlmasken nicht berührt wurden). Nun werden wir uns damit beschäftigen, wie Tripwire die Ausgabe gestaltet, falls eine Auswahlmaske betroffen wurde. Wir haben dazu der Datei /joey/neu/test eine Zeile hinzugefügt, und da Tripwire in der Konfigurationsdatei die Maske erhielt, dass diese Datei nicht verändert, sondern nur gelesen werden darf, wird der Integritätstest eine Inkonsistenz bemerken und diese auch anzeigen: Linux:~# tripwire ### Phase 1: Reading configuration file ### Phase 2: Generating file list ### Phase 3: Creating file information database ### Phase 4: Searching for inconsistencies ### Sandini Bib 218 4 Filesystem Integrity Checker ### Total files scanned: 232 ### Files added: 0 ### Files deleted: 0 ### Files changed: 232 ### ### After applying rules: ### Changes discarded: 231 ### Changes remaining: 1 ### changed: -rw-r—r—joey 18 Jun 25 19:50:40 2001 /joey/neu/test ### Phase 5: Generating observed/expected pairs for changed files ### ### Attr Observed (what it is) Expected (what it should be) ### ======== ========================= ============================ /joey/neu/test st_ino: 137046 136996 st_size: 18 6 st_mtime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 st_ctime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 md5 (sig1): 1oDgYoDDEL.5g2tFr9W.Nm 2kwNorphIYEyAtMnhMr:kIa snefru (sig2):2.ZirbrL3ZN289TyymBJ5H 27shvz29Wzo.DeyYN38no9 Wie Sie aus dem Listing gut entnehmen können, hat Tripwire die Änderung an unserer Datei bemerkt und uns sofort darüber informiert. Neben dem Integritätsaufruf bietet Tripwire aber noch einige zusätzliche Optionen, welche wir nun besprechen werden: Initialisierung Sie kennen diese Option bereits aus der Besprechung der Funktionsweise. Wir werden sie aber an dieser Stelle trotzdem nochmals ausführlich besprechen. Diese Option werden Sie nicht sehr häufig benutzen, da Sie im späteren Systemlauf durch die Updatefunktion zum Großteil ersetzt werden kann. Sie kommen aber nicht drum herum, die Funktion zum Start Ihres Tripwiresystems zu benutzen, da Sie damit die Referenzdatenbank erstellen. Sie rufen diese Funktion wie folgt auf: Linux:~# tripwire –initialize Nachdem Sie den Befehl eingegeben haben, erhalten Sie folgende Bildschirmausgabe: ### Warning: ### ### Phase 1: creating ./databases directory! Reading configuration file Sandini Bib 4.1 Tripwire 219 ### Phase 2: Generating file list ### Phase 3: Creating file information database ### ### Warning: Database file placed in ./databases/ tw.db_rechnername ### ### Make sure to move this file and the configuration ### to secure media! ### ### (Tripwire expects to find it in ‘/etc/tw’.) Wie Sie der Bildschirmausgabe entnehmen können, erstellt Tripwire ein Verzeichnis namens databases im Verzeichnis, in dem Sie sich beim Aufruf des Befehls befunden haben. Dort speichert es die Datenbank unter dem Namen tw.rechnername (wobei rechnername durch den Rechnernamen Ihres Systems zu ersetzen ist). Danach werden Sie aufgefordert die Datenbank und die Konfiguration auf ein sicheres Medium zu speichern. Sie erhalten zusätzlich den Hinweis, dass Tripwire die Datenbank in dem Verzeichnis /etc/tw vermutet. Sie sollten – falls Sie sich dazu entscheiden, die Datenbank in diesem Verzeichnis aufzubewahren – das Read-Only-Flag für dieses Verzeichnis setzen. Eine weitaus sicherere Methode wäre es aber, die Datenbank auf eine CD zu brennen, da bei dieser Methode definitiv keine Änderungen daran vorgenommen werden können (Falls ein Angreifer Rootrechte erlangt, könnte er das Read-Only-Flag für das Verzeichnis problemlos wieder entfernen.) Vergessen Sie bei dieser Methode aber nicht die CD auf /etc/tw zu mounten. Wir werden uns im weiteren Verlauf dieses Kapitels noch intensiver mit der Sicherung der Datenbank beschäftigen. Fürs Erste denke ich aber, dass Sie alles Nötige wissen. Updatemodus Auch diese Option kennen Sie bereits aus der Besprechung der Funktionsweise von Tripwire. Um Ihnen die Vorteile und Möglichkeiten diese Option näher zu bringen, werde ich ein Beispiel aus dem alltäglichen Administratorleben benutzen (dieses Beispiel ist zwar etwas stupide, aber es erfüllt seinen Zweck): Nehmen wir an, Sie bemerken (beziehungsweise der Tripwire-Integritätstest bemerkt dies bei einem seiner Scandurchläufe), dass ein von Ihrem Unternehmen entwickelter Server namens fishd als changed dargestellt wird (Ursache dafür könnte sein, dass Sie Tripwire gesagt haben, dass die Größe dieser Datei stets gleich bleiben muss). Nachdem Sie sich mit Entwicklern in Ihrem Hause unterhalten haben, kommen Sie zum Ergebnis, dass dieser Vorfall völlig legitim war (ihre Entwickler haben etwas Code hinzugefügt und deshalb wurde die Datei größer). Natürlich sollte man das auch Tripwire mitteilen, da es ansonsten bei jedem Scandurchlauf diesen Missstand anzeigen wird. Ein Weg, um dieses Problem zu lösen, ist eine komplett neue Referenzdatenbank zu erstellen. Das ist aber eher der Sandini Bib 220 4 Filesystem Integrity Checker »grobe« Weg. Tripwire bietet einen viel eleganteren Modus, um bestimmte Änderungen wirksam zu machen. Mit dem Updatemodus können Sie schnell und einfach die Änderung des Servers in die Referenzdatenbank aufnehmen, so dass auch Tripwire über die neue Größe der Datei Bescheid weiß. Da der Server unter /usr/sbin liegt und die Datei fishd heißt, ergibt sich folgender Befehl: Linux:~# tripwire –update /usr/sbin /usr/sbin/fishd Nachdem Sie den Befehl eingegeben haben, werden Sie folgende Bildschirmausgabe erhalten, welche Sie über die Aktualisierung informiert: ### Phase 1: Reading configuration file ### Phase 2: Generating file list Updating: update entry: /usr/sbin Updating: update file: /usr/sbin/fishd ### Phase 3: Updating file information database ### ### Old database file will be moved to ‘tw.rechnername.old’ ### in ./databases ### ### Update database will be stored in ‘./databases/tw.rechnername’ ### (Tripwire expects it to be moved to ‘/etc/tw’.) ### Wie Sie sehen können, wird die alte Datenbank zu tw.rechnername.old umbenannt und eine neue Referenzdatenbank mit den aktualisierten Informationen erstellt, welche Sie wieder in das angegebene Verzeichnis verschieben müssen. Automatische Aktualisierung Diese – durchaus brauchbare und praktische – Funktion ist mit Vorsicht zu genießen. Sie haben in den vorhergehenden Abschnitten gesehen, in welchen Schritten ein Integritätstest und ein nötiges Update eines Eintrages ablaufen: 1. Tripwire-Integritätstest 2. Bericht über Änderung an Objekt 3. eventuelle Aktualisierung der Datenbank 4. Im Grunde bietet die Funktion, die wir jetzt besprechen, die Möglichkeit all diese Schritte durch einen einzigen Befehl zu bewerkstelligen. Sie lassen also Tripwire nach Inkonsistenten in Ihrem Dateisystem suchen, erhalten danach einen Bericht über mögliche Treffer und können die betroffenen Objekte und Felder sofort aktualisieren. Auf den ersten Blick eine sehr praktische Funktion. Doch sie hat zwei entscheidende Nachteile: Sandini Bib 4.1 Tripwire 221 Der Administrator muss bei jedem Integritätstest anwesend sein, um mögliche Aktualisierungen vornehmen zu können. Bei einem normalen Test ist dies nicht notwendig. Der Systemverwalter könnte die Bildschirmausgabe zum Beispiel in eine Datei umleiten, die er sich dann automatisch zuschicken lässt, oder er könnte diese Datei mit einem Skript auf Inkonsistenten untersuchen und, falls eine Gefahrenquelle entdeckt wurde, könnte dieses Skript den Administrator automatisch per E-Mail oder SMS (mit Hilfe des Pakets yaps) über die Lage benachrichtigen. Man wird leichtfertig und vergibt Updates schneller und leichter, als man dies täte, wenn man sie per Hand eingeben müsste. Sie müssen also selbst entscheiden, was für Sie am besten geeignet ist. Seien Sie aber vorsichtig damit und machen Sie lieber einige Handgriffe mehr. Nachdem wir jetzt die Funktion kennen, können wir uns mit der Bildschirmausgabe, die wir bei einer gefunden Inkonsistenz (wir benutzen dafür wieder unsere Datei test aus dem vorhergehenden Beispiel) erhalten, beschäftigen. Der Aufruf dieser Funktion geschieht über folgenden Befehl: Linux:~# tripwire –interactive Und hier die dadurch entstehende Bildschirmausgabe: ### Phase 1: Reading configuration file ### Phase 2: Generating file list ### Phase 3: Creating file information database ### Phase 4: Searching for inconsistencies ### ### Total files scanned: 232 ### Files added: 0 ### Files deleted: 0 ### Files changed: 232 ### ### After applying rules: ### Changes discarded: 231 ### Changes remaining: 1 ### changed: -rw-r—r—joey 18 Jun 25 19:50:40 2001 /joey/neu/test ### Phase 5: Generating observed/expected pairs for changed files ### ### Attr Observed (what it is) Expected (what it should be) ### ======== ========================= ============================ /joey/neu/test st_ino: 137046 136996 st_size: 18 6 st_mtime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 Sandini Bib 222 4 Filesystem Integrity Checker st_ctime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 md5 (sig1): 1oDgYoDDEL.5g2tFr9W.Nm 2kwNorphIYEyAtMnhMr:kIa ----> File: ‘/joey/neu/test’ ----> Update entry [YN(y)nh?] Updating entry : /joey/neu/test ### Updating database... ### ### Phase 1: Reading configuration file ### Phase 2: Generating file list Updating: update entry: /joey/neu/test ### Phase 3: Updating file information database ### ### Old database file will be move to ‘tw.rechnername.old’ ### in ./databases ### ### Updated database will be stored in ‘./databases/ tw.rechnername’ ### (Tripwire expects it to be moved to ‘/etc/tw’.) ### ### ### If you changed the tw.config file, remember to run ### ‘twdb_check.pl’ to ensure database consistency. ### See the README file for details Anhand dieses Listings können Sie gut erkennen, wie einfach es einem gestressten Systemverwalter gemacht wird, bestimmte Einträge zu aktualisieren. Wie Sie sehen können, läuft der Integritätstest genauso ab wie beim normalen Aufruf von Tripwire. Doch am Ende des Tests werden Sie gefragt, ob Sie die auffälligen Einträge aktualisieren wollen. Dabei stehen Ihnen grundsätzlich drei Optionen zur Verfügung. 1. Nein (Nn) 2. Ja (Yy und Defaultwert, falls Sie keine Angabe machen) 3. Aufruf einer kleinen Hilfefunktion (h?) 4. An Punkt zwei können Sie eine weitere Tücke erkennen. Falls Sie keine Angaben über die Aktualisierung eines Eintrages machen, so kommt der Defaultwert zum Zuge, der ein Update des Eintrages initialisiert. 5. Nachdem Sie Tripwire mitgeteilt haben, welche Einträge Sie aktualisieren möchten, erhalten Sie dieselben Ausgaben wie beim normalen Updatemodus. Mit einem Unterschied: 6. Sie werden darauf hingewiesen, das Skript twdb_check.pl aufzurufen, um die Datenbank zu überprüfen. Mit Hilfe dieses Befehls (er sollte sich bei der Installation automatisch nach /usr/sbin kopieren) können Sie die Integrität der Sandini Bib 4.1 Tripwire 223 Datenbank testen. Die Syntax ist – wie Sie sehen – einfach: twdb_check.pl <tw.db_rechnername> <tw.config> Test–tuning Wenn Sie Tripwire nutzen wollen, um sehr große Datenmengen zu überprüfen, merken Sie bald, dass jeder Test viel Rechenzeit verschlingt und eine gewisse Zeit bis zur Abarbeitung benötigt. Tripwire bietet Ihnen mit der --ignore-Funktion ein Hilfsmittel, um schnelle Tests durchzuführen. Doch auch dieses Bonbon ist mit Vorsicht zu genießen, da die Funktion den Performancegewinn durch das Ausblenden bestimmter spezifizierter Auswahlmasken erreicht, was wiederum zu einem enormen Informationsverlust führen kann. Es wäre aber durchaus denkbar, dass Sie zum Beispiel täglich einen kompletten Integritätstest durchführen und sich bei der stündlichen Überprüfung Ihres Systems auf die abgespeckte Variante verlassen. Der Aufruf dieser Funktion erfolgt über folgende Syntax: Linux:~# tripwire –-ignore Selection Mask Falls diese Funktion bei Ihnen nicht funktioniert, haben Sie Möglichkeit (außer bei den brandneuen Versionen) auf die Funktion loosedir auszuweichen, die grundsätzlich ähnliche Vorteile bietet. Sie können aber dabei (im Gegensatz zu ignore) selbst bestimmen, welche Masken Sie ignorieren wollen. Es werden automatisch folgende Flags ausgeblendet: st_size st_nlinks st_mtime st_ino Auch hier erfolgt der Aufruf in gewohnter Manier: Linux: tripwire –loosedir Die Bildschirmausgabe, die Sie dabei erhalten, unterscheidet sich nicht von der eines normalen Integritätstests und wird daher nicht extra aufgeführt. Alternative Datenbank Falls Sie mehrere Datenbanken auf Ihrem System gespeichert haben, können Sie auch eine alternative Datenbank spezifizieren. Tripwire wird dann diese anstatt der Datenbank, die sich in dem Defaultverzeichnis befindet, verwenden. Der Aufruf erfolgt über folgende Syntax: Linux:~# tripwire –-dbfile Datenbank Sandini Bib 224 4 Filesystem Integrity Checker Auch hier führen wir die Alternative für andere Systeme (Versionen) auf: Linux:~# tripwire –d Datenbank Alternative Konfigurationsdatei Neben einer alternativen Datenbank können Sie bei Tripwire auch eine alternative Konfigurationsdatei angeben, die dann anstelle der Konfigurationsdatei, welche sich im Defaultverzeichnis befindet, verwendet wird. Der Aufruf verbirgt auch bei dieser Funktion keine großen Überraschungen: Linux:~# tripwire –-cfgfile Konfigurationsdatei Auch hier führen wir die Alternative für andere Systeme (Versionen) auf: Linux:~# tripwire –c Konfigurationsdatei Datenbank aus File Descriptor lesen Eine äußerst praktische und ressourcensparende Methode, ideal für Verschlüsselung und Packen. Die Syntax ist auch hier sehr einfach gehalten: Linux:~# tripwire –dfd Open File Descriptor Konfigurationsdatei aus File Descriptor lesen Sie haben auch die Möglichkeit, die Konfigurationsdatei aus einem File Descriptor zu lesen. Die Syntax ist den bereits bekannten Befehlen sehr ähnlich: Linux:~# tripwire –cfd Open File Discriptor Variablen definieren Sie haben ja bereits eine Möglichkeit kennen gelernt, um Variablen zu definieren. Außer dem Preprocessor @@define gibt es aber noch einen anderen Weg, das zu erledigen. Sie können mit dem Befehl –Dvar eine Variable als String definieren. Die Initialisierung und Bildschirmausgabe können Sie im folgenden Listing ersehen: Linux:~# tripwire –Dvar=string Zum besseren Verständnis werfen Sie einen Blick auf die Bildschirmausgabe: Linux:~# tripwire –DOS=LINUX ### Phase 1: Reading configuration file ### Phase 2: Generating file list ### Phase 3: Creating file information database ### Phase 4: Searching for inconsistencies ### ### Total files scanned: 232 ### Files added: 0 ### Files deleted: 0 Sandini Bib 4.1 Tripwire 225 ### Files changed: 232 ### ### After applying rules: ### Changes discarded: 231 ### Changes remaining: 1 ### changed: -rw-r—r—joey 18 Jun 25 19:50:40 2001 /joey/neu/test ### Phase 5: Generating observed/expected pairs for changed files ### ### Attr Observed (what it is) Expected (what it should be) ### ======== ========================= ============================ . . . Wie Sie der Initialisierung entnehmen können, haben Sie mit diesem Befehl die Möglichkeit einer Variable einen bestimmten Wert zuzuweisen. Nachdem Sie das getan haben, wird die Initialisierung – mit der neuen Variable – wie gewohnt durchgeführt. Variablendefinition rückgängig machen Nachdem Sie nun einen Weg gesehen haben, der es Ihnen erlaubt, Variablen von der Konsole aus zu definieren, werden Sie jetzt das Gegenstück dazu kennen lernen, mit dem Sie die Möglichkeit haben, definierte Variablen zu »un-definieren« (sprich die Definition der Variable rückgängig zu machen): Linux:~# tripwire –Uvar Auch hier ein kleiner Ausschnitt aus der Bildschirmausgabe: Linux:~# tripwire –UOS ### Phase 1: Reading configuration file ### Phase 2: Generating file list ### Phase 3: Creating file information database ### Phase 4: Searching for inconsistencies ### ### Total files scanned: 232 ### Files added: 0 . . . Genauso wie bei der Definition bestimmter Variablen wird bei diesem Befehl der Integritätstest wie gewohnt durchgeführt. Sandini Bib 226 4 Filesystem Integrity Checker Signaturtest unterbinden Es kann durchaus Situationen im Leben eines Administrators geben, bei denen er einen schnellen Integritätstest braucht. Wir haben ja bereits einige Möglichkeiten gesehen, wie man dies erreichen kann. Einer der leichtesten Wege den Test zu beschleunigen ist, nur eine oder wenige Signaturen anfertigen zu lassen (ein stabiler, aussagekräftiger und sicherer Integritätstest benutzt mehrere Algorithmen, um die Signatur zu bestimmen). Das folgende Listing zeigt die Signaturbestimmung unserer beliebten Datei test durch die Algorithmen MD5 und snefru. . . . ### Attr Observed (what it is) Expected (what it should be) ### ======== ========================= ============================ /joey/neu/test st_ino: 137046 136996 st_size: 18 6 st_mtime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 st_ctime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 md5 (sig1): 1oDgYoDDEL.5g2tFr9W.Nm 2kwNorphIYEyAtMnhMr:kIa snefru (sig2):2.ZirbrL3ZN289TyymBJ5H 27shvz29Wzo.DeyYN38no9 Natürlich braucht der Rechner einige Zeit, bis er die zu bestimmenden Signaturen berechnet hat, wie bereits erwähnt, können Sie Tripwire dazu bringen, bestimmte Signaturberechnungen zu übergehen. Der Befehl hierfür muss lauten: Linux:~# tripwire –i Algorithmen Falls Sie mehrere Algorithmen übergehen möchten, müssen Sie diese durch Kommas voneinander trennen. Das folgende Listing zeigt die Bildschirmausgabe, die wir erhalten, wenn wir wollen, dass nur durch snefru eine Signatur berechnet wird. Die MD5–Berechnung soll also wegfallen. Linux:~# tripwire –i 1 . . . ### Attr Observed (what it is) Expected (what it should be) ### ======== ========================= ============================ /joey/neu/test st_ino: 137046 136996 st_size: 18 6 st_mtime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 st_ctime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 snefru (sig2):2.ZirbrL3ZN289TyymBJ5H 27shvz29Wzo.DeyYN38no9 Sandini Bib 4.1 Tripwire 227 Wie Sie sehen können, wurde die MD5–Berechnung nicht ausgeführt und der Vorgang beschleunigt. Falls Sie wollen, dass überhaupt keine Signaturberechnung durchgeführt wird, können Sie dies mit folgendem Befehl verwirklichen: Linux:~# tripwire –i all Die Bildschirmausgabe hierzu lautet: . . . ### Attr Observed (what it is) Expected (what it should be) ### ======== ========================= ============================ /joey/neu/test st_ino: 137046 136996 st_size: 18 6 st_mtime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 st_ctime: Mon Jun 25 19:50:40:2001 Mon Jun 25 19:49:31 2001 Durch die Eingabe des oben aufgeführten Befehls wurde keine Signaturberechnung durchgeführt. Konfiguration testen Mit der folgenden Funktion haben Sie die Möglichkeit Ihre Konfiguration zu testen, da bei diesem Befehl nur ein »preprocess« der Konfigurationsdatei zu machen und diese dann auf die Standardausgabe zu werfen ist. Der Aufruf dieses Befehls lautet: Linux:~# tripwire –E oder Linux:~# tripwire –preprocess Minimaler Output Falls Sie das Output eines Integritätstests nicht in eine Datei zur Weiterverarbeitung durch ein Skript geben, kann es sehr lästig sein, wenn viele Anomalien entdeckt wurden, da die Ausgabe dadurch enorm lang wird. Abhilfe schafft der hier vorgestellte Befehl, da er Tripwire veranlasst jeweils nur eine Zeile pro geänderter Datei auszugeben. Der Aufruf erfolgt über folgenden Befehl: Linux:~# tripwire –q Falls das bei Ihnen nicht funktioniert, versuchen Sie bitte folgende Alternative (diese Option hat zwar nicht exakt dieselben Eigenschaften, aber sie schränkt ebenfalls die Ausgabe ein): Linux:~# tripwire –quiet Sandini Bib 228 4 Filesystem Integrity Checker Maximaler Output Mit dem Verbose Modus haben Sie die Möglichkeit alle von Tripwire gescannten Dateien auf die Standardausgabe werfen zu lassen. Falls Ihnen diese Option sinnlos erscheint, bedenken Sie, dass sie bei der Fehlersuche enorm hilfreich sein kann. Stellen Sie sich dazu einfach vor, Sie haben die Vermutung, dass Tripwire – aus irgendwelchen Gründen– die Datei /joey/neu/test2 nicht scannt. Mit dem Verbose Modus können Sie dies leicht überprüfen. Leiten Sie dazu die Ausgabe des Verbose Modus einfach in eine Datei um. Danach gehen Sie in das betreffende Verzeichnis (/joey/neu) und geben dort den find-Befehl ein, dessen Ausgabe Sie wiederum in eine Datei umleiten. Danach benutzen Sie den diff-Befehl, um zu sehen, ob Tripwire die Datei test2 wirklich nicht scannt. Hilfe über Inodes Falls Sie mehr über die Inodes erfahren wollen, können Sie diesen Befehl benutzen: Linux:~# tripwire –help Versionsnummer ausgeben lassen Um sich die Versionsnummer ausgeben zu lassen, benutzen Sie bitte folgenden Befehl: Linux:~# tripwire –version 4.1.7 Schutz der Datenbank Nach der Lektüre des bisherigen Kapitels sollten Sie fit im Umgang mit Tripwire sein. Bevor ich Sie aber »aus diesem Kurs entlassen« kann, möchte ich noch ein Wort über die Datenbank und den Schutz dafür verlieren. Wir haben bereits bei der Initialisierung gesehen, dass Ihnen Tripwire vorschlägt, die Datenbank auf ein sicheres (READ-ONLY) Medium zu verfrachten. Ich möchte Ihnen hierbei auch ans Herz legen, dies ernst zu nehmen. Dabei ist es wichtig, dass das Medium selbst die READ-ONLY Flag gesetzt hat, das heißt, die READ-ONLYFlag sollte physikalisch und nicht logisch sein. Denn logischerweise kann jede logische Barriere durch logisches Handeln wieder aufgehoben oder zumindest umgangen werden. Mein Vorschlag (ich weiß, ich wiederhole mich bei diesem Punkt, aber er ist wirklich wichtig) ist daher, die Datenbank auf eine CD zu brennen, diese CD in ein CD-Rom bzw. ein DVD-Rom zu legen und ins Dateisystem einzuhängen. Zusätzlich zu diesem Schutz können Sie mit dem Tripwire–Tool siggen die Signatur der Datenbank überprüfen (praktisch, wenn Sie keinen lokalen Zugriff auf die CD-Rom haben und sie theoretisch unbemerkt ausgewechselt werden könnte). Die Handhabung dieses Tools ist einfach. Sandini Bib 4.1 Tripwire 229 Nachdem Sie die Datenbank erstellt und auf die CD gebrannt haben, wenden Sie das Tool an, um die Signatur zu berechnen. Danach können Sie ein Skript schreiben, welches durch einen Croneintrag täglich überprüft, ob sich die Signatur und damit die Authentizität der Datenbank geändert hat. Dies mag etwas paranoid erscheinen, bietet aber einen ziemlich sicheren Weg, um Angreifern wieder eine Barriere mehr in den Weg zu stellen. Die Syntax für das siggen-Tool lautet wie folgt: Linux:~# siggen –Option Konfigurationsdatei Tabelle 4.5 enthält alle verfügbaren Optionen zu siggen. Option Beschreibung -h Gibt die Signatur hexadezimal anstatt base 64 aus -q Gibt alle Signaturen in einer Zeile aus und lässt somit weitergehende Informationen weg -a Es werden alle Signaturen berechnet (Defaultwert) -v Verbose Modus (Defaultwert) -0 Berechnet 0 Signatur -1 Berechnet MD5 Signatur -2 Berechnet snefru Signatur -3 Berechnet CRC 32 Signatur -4 Berechnet CRC 16 Signatur -5 Berechnet MD4 Signatur -6 Berechnet MD2 Signatur -7 Berechnet SHA Signatur -8 Berechnet Haval Signatur -9 Berechnet 0 Signatur (Reserviert für zukünftigen Gebrauch) Tabelle 4.5 Verfügbare Optionen für siggen Um den Abschnitt über Tripwire endgültig abzuschließen, können Sie die Verwendung von siggen anhand des folgenden Listings einsehen: Linux:~# siggen /etc/tw/tw.linux sig0: nullsig: 0 sig1: md5 : 1UESQLg04KTxCswAXxnkr sig2: snefru : 1pdbqHak2P42KbnlsyEcqA sig3: crc32 : 17UDxV sig4: crc16 : 000EJQ sig5: md4 : 0jUn3uxIMxJ2gTe.:pIeoB sig6: md2 : 1j9rITQBzWsFqgjV.9Qmdq sig7: sha : 677qhN468Wvtzpuhvw4IZaptiLV sig8: haval : 0v5vAv59leWQm4b0UxGMH9 sig9: nullsig: 0 Sandini Bib 230 4.2 4 Filesystem Integrity Checker MD5Sum Wenn es um die Installation eines Tools ging, habe ich im Laufe des Buches sehr oft gesagt, dass Sie die Herkunft des Programms genau überprüfen sollen. Außerdem habe ich Ihnen des Öfteren ans Herz gelegt, dass Sie das frisch heruntergeladene Tool auf Echtheit hin überprüfen. Zumeist wird dafür auf den Downloadseiten eine MD5-Checksum angeboten. Wir werden in diesem Abschnitt des Buches nun das Tool besprechen, mit dem Sie 128-Bit-Prüfsummen leicht überprüfen können. 4.2.1 Syntax Da dieses Tool nicht weiter beschrieben werden muss, können wir uns sofort mit der zu verwendenden Syntax beschäftigen. Aufruf Der allgemeine Aufruf dieses Programms lautet wie folgt: Linux:~# md5sum [Optionen] Datei Falls Sie keine Datei oder den Platzhalter »-« stattdessen angeben, liest MD5sum von der Standardeingabe (STDIN). Optionen Da dieses Tool alles andere als schwer zu bedienen ist, werden wir uns sofort mit den verfügbaren Optionen, die Sie in Tabelle 4.6 erkennen können, beschäftigen. Option Beschreibung -b, --binary Hiermit werden alle Eingabedateien als Binarydateien behandelt. Für uns Linuxbenutzer spielt diese Option keine große Rolle, da UNIX-Systeme nicht zwischen Textdateien und Binaries unterscheiden. --status Diese Option ist nur dann sinnvoll, wenn Sie Checksummen überprüfen. -t, --text Hiermit werden alle Binarydateien als Textfiles behandelt. Diese Option ist das Gegenstück zur Option »--binary«. -w, --warn Wenn Checksummen überprüft werden, wird bei nicht richtig formatierten MD5-Checksummen gewarnt. Diese Option kann sehr hilfreich sein, wenn alle Checksummen mit einigen wenigen Ausnahmen als gültig erkannt wurden. Tabelle 4.6 Verfügbare Optionen Sandini Bib 5 Verschlüsselung Der Begriff Verschlüsselung hat wohl zusammen mit dem Ausdruck Firewall die Securitybranche in den letzten Jahren geprägt. Jede wichtige Datei wird mehr oder weniger sicher verschlüsselt oder gehashed. Wir wollen uns in diesem Kapitel nicht mit der Theorie der Verschlüsselung oder mit zur Verfügung stehenden Algorithmen beschäftigen. Es geht uns hauptsächlich darum, die wichtigsten Tools, die es in diesem Sektor gibt, kurz vorzustellen und Ihnen die Möglichkeiten dieser Programme näher zu bringen. 5.1 Gnu PG (GPG) GPG ist die Open-Source-Alternative zu dem weit verbreiteten E-Mail- und Dateiverschlüsselungsprogramm PGP. Bis vor kurzem hatte dieses geniale Tool aber einen entscheidenden Nachteil. Da keine eigene Bibliothek vorhanden war, war es für Entwickler äußerst mühselig die Funktionen (Verschlüsselung nach dem Public-Key-Verfahren) in eigenen Programmen verfügbar zu machen. Seit GPGME ist dies aber kein Problem mehr. 5.1.1 Funktionsweise GPG arbeitet – wie PGP auch – nach dem Public-Key-Verfahren. Im Gegensatz zu einer »normalen« Verschlüsselung, bei der der Absender die zu sendende Nachricht mit demselben Schlüssel verschlüsselt, mit dem auch der Empfänger die Nachricht wieder entschlüsselt, bringt dieses Verfahren, da es zwei Schlüssel benutzt, enorme Sicherheitsvorteile. Wie Sie sich denken können, hat die »normale« Verschlüsselung mit nur einem Schlüssel eine große Sicherheitslücke, da hierbei der Schlüssel auf einem – potentiell unsicheren – Kommunikationsweg (zum Beispiel E-Mail) verschickt werden muss. Ist es einem Angreifer möglich, diese E-Mail abzufangen, kann er die folgende – geheime – Kommunikation der beiden beteiligten Seiten problemlos entschlüsseln und mit verfolgen. Anders sieht die Sache aus, wenn sich die beiden Partner entschlossen haben, das Public-Key-Verfahren zu verwenden. Dort läuft der Kommunikationsvorgang folgendermaßen ab: Der Absender besorgt sich den öffentlichen Schlüssel des Empfängers (Website, E-Mail usw.). Danach verschlüsselt er die abzusendende Nachricht mit diesem Schlüssel. Auf dem Weg zum Empfänger wird diese Nachricht ebenfalls von einem Angreifer abgefangen, der – genauso wie der Absender – den öffentlichen Schlüssel des Benutzers besitzt. Beim Versuch, die abgefangene Mail zu ent- Sandini Bib 232 5 Verschlüsselung schlüsseln, hat der Angreifer aber wenig Erfolg, da sich die Nachricht nicht mit dem öffentlichen Schlüssel entschlüsseln lässt. Dies ist nur mit dem privaten Schlüssel möglich, den – idealerweise – nur der Empfänger besitzt. Außerdem ist es nicht möglich, aus dem öffentlichen Schlüssel den privaten abzuleiten. Wie Sie sehen, ist das Public-Key-Verfahren relativ sicher. Aber auch diese Methode hat eine potentielle Schwachstelle. Nehmen wir an, unser Angreifer weiß, dass User A User B seinen öffentlichen Schlüssel schicken will, damit sie eine sichere Datenkommunikation initiieren können. Falls es dem Angreifer nun gelingt, die E-Mail von A an B abzufangen, ist er im Besitz des öffentlichen Schlüssels. Wir haben ja bereits gesehen, dass dies noch kein Grund zur Sorge ist, er kann die Nachrichten immer noch nicht entschlüsseln, denn dafür braucht er den privaten Schlüssel. Auf den ersten Blick besteht der einzige Nachteil darin, dass User B die E-Mail nicht bekommen hat. Dies ist aber auch nicht weiter tragisch, er kann sie ja erneut anfordern. Schlimm wird es erst, wenn der Angreifer die ursprüngliche E-Mail von User A an B modifiziert und damit den originalen öffentlichen Schlüssel mit einem von ihm generierten Schlüssel austauscht und danach an User B weiterleitet. User B antwortet auf diese Mail und bestätigt dabei User A, dass er den öffentlichen Schlüssel erhalten hat. Beide User denken, dass alles in Ordnung ist, und beginnen mit der Übertragung der sensiblen Daten. Der gewiefte Angreifer fängt nun aber jede E-Mail ab entschlüsselt sie und leitet Sie – modifiziert – an die jeweiligen Kommunikationspartner weiter. Weder A noch B werden merken, dass sie Opfer eines Angriffs wurden. Aber auch hierfür bietet GPG Abhilfe. GPG (und auch PGP) lassen es zu, öffentliche Schlüssel unterschreiben zu lassen. Diese Unterschriften sollen dem Empfänger zeigen, dass der Schlüssel auch zu der richtigen Person passt. Man sollte natürlich die Leute, die unterschrieben haben, kennen und ihnen auch vertrauen. 5.1.2 Installation Als sicherheitsinteressierter Administrator haben Sie sicher die Probleme mit der Ausfuhr von PGP aus den USA in andere Länder mitbekommen. Falls nicht, möchte ich Sie bitten die dementsprechenden Berichte auf der Buchseite zu lesen, da das Buch hier dafür nicht der geeignete Rahmen ist. Durch die erwähnten Probleme (Kryptographie ist den Vereinigten Staaten Rüstungsgut) können Sie sich GPG (wie auch PGP) nicht von amerikanischen Servern downloaden. Da es aber genügend europäische Server gibt, stellt dies definitiv kein Problem dar. Es ist auch nicht strafbar, wenn Sie GPG in die USA einführen. Besorgen Sie sich eine aktuelle und stabile Version von der Buchseite oder offiziellen Seite www.gnupg.org (Sie können auch im Paketverzeichnis Ihrer Distribu- Sandini Bib 5.1 Gnu PG (GPG) 233 tion nachschauen, die meisten führen das Paket). Sie haben dabei die Auswahl aus drei Paketen: 1. Debian Paket 2. RedHat RPM 3. Source Code 4. Wir werden an dieser Stelle die Installation der Pakete eins und zwei besprechen. RedHat RPM Das easy-to-use-Paket RPM sollte keine allzu großen Schwierigkeiten bereiten, daher werden wir nur den Aufruf anführen: Linux:~# gnupg-version.rpm Und schon ist das Paket installiert! Source Code Vom gepackten Paket bis zum fertig kompilierten und installierten Programm sind es nur fünf Schritte, die Sie im Folgenden sehen werden. Linux:~# tar -xfz gnupg-version.tar.gz Linux:~# cd gnupg-version Linux:~# ./configure Linux:~# make Linux:~# make install Falls Sie GPG mit anderen Optionen kompilieren wollen, sind dementsprechende Änderungen vorzunehmen. Nachdem Sie das Paket nun installiert haben, können wir uns daran machen, dieses wirklich gute Tool genau zu besprechen. Ich werde an dieser Stelle aber zwei Besprechungen anbieten. 1. Die erste Besprechung wird anhand des Mini-Howtos auf der offiziellen Gnupgp Seite stattfinden. Dort werden Sie sehen, wie Sie mit wenigen und nicht komplizierten Schritten die wichtigsten Features von GPG sinnvoll nutzen können. 2. Die zweite Besprechung ist eher eine Referenz als eine Besprechung. Ich werde versuchen Ihnen alle möglichen Optionen und Features dieses umfangreichen Programms aufzuzählen und näher zu bringen. Sandini Bib 234 5.1.3 5 Verschlüsselung Besprechung 1 (Howto) In dieser Besprechung werden Sie erfahren, wie Sie mit wenig Aufwand viel erreichen können. Falls Sie aber alle Features von GPG nutzen wollen, schlage ich Ihnen vor einen Blick auf Besprechung Nummer 2 zu werfen. Dort finden Sie alle verfügbaren Optionen und Argumente. Hinweis zur Sprache der Listings Die von mir verwendete Version von GPG unterstützt die deutsche Sprache. Falls Sie aber eine andere Version benutzen, werden die Listings möglicherweise in Englisch ausgeworfen. Ich möchte hierbei betonen, dass die Ausgaben der Listings nicht von mir übersetzt worden sind, sondern zum Bestandteil der von mir verwendeten Distribution von GPG gehören. Schlüssel Wie Sie bereits bei der Besprechung erfahren haben, brauchen Sie für die Verund Entschlüsselung Ihrer E-Mails zwei Schlüssel: 1. einen öffentlichen 2. einen privaten Schlüsselpaar erzeugen Um dieses Schlüsselpaar zu erzeugen benutzen Sie den Befehl --gen-key Nachdem Sie der Kommandozeile diesen Befehl übergeben haben, sollten Sie folgendes Listing erhalten: Linux:~# gpg --gen-key gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc. This programm comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details. Bitte wählen Sie, welche Art von Schlüssel Sie möchten: (1) DSA und ELGamal (voreingestellt) (2) DSA (nur signieren/beglaubigen) (3) ELGamal (signieren/beglaubigen und verschlüsseln) Ihre Auswahl? Wie Sie sehen können, müssen Sie nun den zu verwendenden Algorithmus aussuchen. Sie sollten die Nummer 1 wählen. Wenn Sie Ihre Auswahl getroffen haben, erhalten Sie die folgende Bildschirmausgabe: Sandini Bib 5.1 Gnu PG (GPG) 235 . . . Ihre Auswahl? 1 Der DSA Schlüssel wird 1024 Bit haben. Es wird ein neues ELG-E Schlüsselpaar erzeugt. kleinste Schlüssellänge ist 768 Bit standard Schlüssellänge ist 1024 Bit größte sinnvolle Schlüssellänge ist 2048 Welche Schlüssellänge wünschen Sie? (1024) Jetzt ist es an der Zeit, die Schlüssellänge zu bestimmen. Dabei kann ich Ihnen leider sehr schlecht weiterhelfen. Sie sollten dabei aber beachten, dass die Länge des Schlüssels die Sicherheit und die Performance enorm beeinträchtigen kann. Wählen Sie zum Beispiel den kleinsten Schlüssel von 768 Bit, werden Ihre Daten schnell verschlüsselt und Sie werden kaum einen Performanceverlust spuren. Die Sicherheit ist bei dieser Verschlüsselungsart aber nicht allzu groß. Setzen Sie aber auf große Sicherheit und wählen einen Schlüssel über 2000 Bit, so werden Ihre Daten zwar sicher sein, aber die Performance wird spürbar sinken. Sie müssen also selbst entscheiden, was für Sie und Ihre Daten wichtig ist. Falls Sie zum Großteil Glückwunschkarten versenden, sollte es der Standardschlüssel mit 1024 tun, falls Sie aber sensitive Daten vertreiben, ist ein Schlüssel mit 2048 Bit geradezu ein Muss. Wir werden an dieser Stelle eine Schlüssellänge von 1024 Bit wählen. Danach erhalten Sie eine weitere Ausgabe, die Sie auffordert weitere Daten anzugeben: . . . Welche Schlüssellänge wünschen Sie? (1024) 1024 Die verlangte Schlüssellänge beträgt 1024 Bit Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll. 0 = Schlüssel verfällt nie <n> = Schlüssel verfällt nach n Tagen <n>w = Schlüssel verfällt nach n Wochen <n>m = Schlüssel verfällt nach n Monaten <n>y = Schlüssel verfällt nach n Jahren Der Schlüssel bleibt wie lange gültig? (0) Zu diesem Zeitpunkt werden Sie gefragt, wann die Gültigkeit des erstellten Schlüssels verfallen soll. Auch diese Angabe sollten Sie wieder nach Ihren Bedürfnissen machen. Bedenken Sie dabei aber auch die Umstellungen, die bei einer Schlüsseländerung auf Sie zukommen. Wir wollen, dass der Schlüssel nie verfällt. Sandini Bib 236 5 Verschlüsselung . . . Der Schlüssel bleibt wie lange gültig? (0) 0 Der Schlüssel verfällt nie. Ist dies richtig? (j/n) j Nachdem wir dies bestätigt haben, werden wir gebeten Informationen zu übergeben, aus denen GPG unsere Benutzer-ID erstellen wird. Eine Benutzer-ID ist notwendig, damit der Schlüssel eindeutig identifiziert werden kann. Beachten Sie die Korrektheit der Angaben und insbesondere der E-Mail-Adresse, da damit die komplette Benutzererkennung unterschrieben wird. . . . Sie benötigen eine User-ID, um Ihren Schlüssel eindeutig zu machen; das Programm baut diese User-ID aus Ihrem echten Namen, einem Kommentar und Ihrer E-Mail-Adresse in dieser Form auf: "Heinrich Heine (Der Dichter) heinrichh@duesseldorf.de" Ihr Name ("Vorname Nachname"): Josef Brunner E-Mail-Adresse: josef.brunner@triblen.de Kommentar: freiberuflicher Sicherheitsberater und Programmierer Sie haben diese User-ID gewählt: "Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) josef.brunner@triblen.de" Ändern (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(B)eenden? F Nachdem Sie die gewünschten und benötigten Angaben korrekt gemacht haben, haben Sie die Wahl Änderungen an bestimmten Stellen vorzunehmen, falls die Angaben aber korrekt sind, können Sie mit (F) den nächsten Schritt einleiten. Mit der Taste (B) brechen Sie ab. . . . Ändern (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(B)eenden? F Sie benötigen ein Mantra, um den geheimen Schlüssel zu schützen. Ein Mantra ist eine Art Passphrase, das heißt es können auch Leerzeichen darin vorkommen. Wählen Sie ein sicheres Passwort, aber bedenken Sie, dass Sie sich dieses Mantra auch merken können müssen, da ansonsten der Schlüssel wertlos würde. Sandini Bib 5.1 Gnu PG (GPG) 237 . . . Geben Sie ein Mantra ein: Geben Sie das Mantra nochmals ein: Nachdem Sie dies erledigt haben, müssen Sie die gleiche Eingabe nochmals vornehmen. Stimmen die beiden Eingaben, werden die Zufallswerte erzeugt: . . . Wir müssen eine ganze Menge Zufallswerte erzeugen. Sie können dies unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen. ++++++++++++++++.+++++++++++++.++++++++.+..+++++++++++++.+++++++++ ++ ++++++++++.+…..+++++++++++++++>+++++++++++++.++++++++++++++++ Es sind nicht genügend Zufallswerte vorhanden. Bitte führen Sie andere Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann! (Es werden noch weitere 275 Byte benötigt.) Wie Sie aus dem Listing erkennen können, werden an dieser Stelle jede Menge Zufallswerte erzeugt, wenn Sie wollen, können Sie dabei – wie beschrieben – mithelfen. Sie sollten diese Hilfestellung auf jeden Fall leisten, da dies die Dauer dieses Prozesses enorm verkürzen kann. Nachdem das Schlüsselpaar erzeugt und signiert wurde, sollten Sie abschließend diese Meldung bekommen: . . . Öffentlichen und geheimen Schlüssel erzeugt und signiert Damit ist das Erstellen eines Schlüsselpaares erledigt und wir können uns weiteren Themen rund um Schlüssel in GPG widmen. Schlüssel exportieren und zugänglich machen Nachdem wir nun unser Schlüsselpaar erstellt haben, wäre es durchaus sinnvoll, wenn wir diesen unter unserer Kollegenschaft verbreiten würden, so dass diese uns Ihre sensitiven Daten verschlüsselt zukommen lassen. Für dieses Vorhaben benutzen wir die Exportfunktion von GPG, die es uns ermöglicht, den Schlüssel »an den Mann zu bringen«. GPG stellt uns eine Vielzahl an verschiedenen Möglichkeiten zum Export von Schlüsseln zur Verfügung, die wir an dieser Stelle aber nicht alle besprechen können. Falls Sie Interesse an ande- Sandini Bib 238 5 Verschlüsselung ren Methoden haben, werfen Sie einen Blick auf die zweite Besprechung, dort werden Sie alle verfügbaren Methoden kennen lernen. Trotzdem möchte ich Ihnen die verfügbaren Exportmöglichkeiten kurz aufzeigen: Export von Schlüssel nach STDOUT Schlüssel an Schlüsselserver (keyserver) schicken Alle Schlüssel – auch nicht OpenPGP-kompatibel – exportieren Geheimschlüssel exportieren (gefährlich) Wir werden uns nur mit dem normalen Export von Schlüsseln beschäftigen, da dies wohl die am häufigsten genutzte Option darstellt. Nehmen wir an, Sie wollen Ihren Schlüssel auf Ihrer Website zum Download (im ASCII-Format) anbieten, so dass jeder Benutzer des Internets Ihnen eine verschlüsselte E-Mail schicken kann. Dafür wollen Sie für Ihren Schlüssel in eine Datei kopieren, welche Sie dann auf Ihren Webserver schieben. Um dies zu erreichen, geben Sie bitte die folgenden Befehle ein. Als Erstes müssen Sie den betreffenden Schlüssel exportieren. Dafür benötigen Sie den Namen des Schlüssels – in unserem Fall lautet dieser: Josef Brunner. Falls Sie den Namen nicht angeben, werden alle vorhandenen Schlüssel ausgegeben. Da Sie die Ausgabe im ASCII-Format haben wollen, müssen Sie zusätzlich die Option -a verwenden. Zum Schluss müssen Sie die Ausgabe bloß noch in eine Datei umleiten, die Sie dann per E-Mail verschicken können oder auf Ihren Webserver zum Download stellen. Linux:~# gpg --export -a Josef Brunner > pub_key Danach haben Sie eine Datei pub_key, die Ihren privaten Schlüssel enthält. Sie hätten statt des Shelloperators > auch die Option -o [Dateiname] verwenden können. Linux:~# gpg --export -a -o pub_key2 Josef Brunner Um zu verdeutlichen, dass diese beiden Methoden dasselbe Ergebnis haben, bediene ich mich des diff-Kommandos, das mehrere Dateien vergleichen kann und einem nach dem Durchlauf die Unterschiede der beiden Dateien aufzeigt. Sollten die Dateien pub_key und pub_key2 also nicht identisch sein, werden wir dies sofort erfahren: Linux:~# diff pub_key pub_key2 Linux:~# Wie Sie sehen, bekommen wir keine Meldung und können davon ausgehen, dass die beiden Dateien und somit die beiden Methoden identisch sind. Sandini Bib 5.1 Gnu PG (GPG) 239 Schlüssel in Schlüsselbund aufnehmen (Importieren) Natürlich sind Sie nicht der einzige GPG der PGP User, der seinen Schlüssel exportiert. Falls Sie sich einen Schlüssel von einer Website geholt haben und nun dem Verfasser eine E-Mail (verschlüsselt) senden wollen, sollten Sie den Schlüssel in Ihren Schlüsselbund aufnehmen. Dies geschieht über folgenden Befehl: Linux:~# gpg --import new_key Danach haben Sie den neuen Schlüssel in Ihrem Schlüsselbund. Sie können sich davon überzeugen, indem Sie sich mit dem folgenden Befehl die Schlüssel in Ihrem Schlüsselbund anzeigen lassen: Linux:~# gpg --list-keys Schlüssel widerrufen Falls Sie eines Tages zu dem Schluss kommen, dass Ihr Schlüssel einer Änderung bedarf, da er zu klein geworden ist in falsche Hände geriet die UID nicht mehr stimmt etc. können Sie ihn widerrufen. Dafür sollten Sie sich den zu löschenden Schlüssel vorher ansehen und genau auswählen. In unserem Fall hat uns ein Windows-Security-Administrator verlassen (ein guter Mann), aber deshalb braucht die Workstation diesen Schlüssel nicht mehr und wir widerrufen ihn. Dazu lassen wir uns alle Schlüssel auflisten, um zu sehen, ob mehrere Schlüssel zu löschen sind (er könnte ja mehrere Schlüssel angelegt haben): Linux:~# gpg --list-keys /root/.gnupg/pubring.gpg -----------------------. . . pub 1024D/75CC62B5 2001-07-14 Andreas Neut (Security Administrator for Windows Systems) <aj@mircosoft.com> sub 1024g/F8D34998 2001-07-14 . . . Nachdem wir nun den Schlüssel eindeutig identifiziert haben, können wir ein Schlüsselwiderrufszertifikat erstellen: Linux:~# gpg --gen-revoke Sandini Bib 240 5 Verschlüsselung Dazu brauchen Sie aber den privaten Schlüssel. Löschen können Sie den Schlüssel mit dieser Option allerdings nicht. Informationen über das Löschen von Schlüsseln finden Sie im nächsten Abschnitt. Schlüssel anzeigen lassen Im Schlüsselbund werden alle Informationen über Ihre Schlüssel gespeichert (bis auf Ownertrust). Die erste Option, die ich Ihnen gerne vorstellen würde, haben wir bereits des Öfteren benutzt, um unsere vorhandenen Schlüssel anzeigen zu lassen (Sie finden die Ausgabe dieser Option im vorhergehenden Abschnitt): Linux:~# gpg --list-keys Um zusätzlich noch Informationen über die Signaturen zu bekommen, müssen Sie diese Option verwenden: Linux:~# gpg --list-sigs GPG bietet Ihnen weiter an, Ihre vorhandenen Schlüssel mit den dazugehörigen »Fingerabdrücken« anzuzeigen. Diese Fingerabdrücke können benutzt werden, um einen Schlüssel eindeutig zu identifizieren. Dies ist ein wesentlich schnellerer Weg, als den kompletten Schlüssel zu vergleichen (außer Sie bedienen sich eines Befehls wie diff). Die Option für das zusätzliche Anzeigen der Fingerabdrücke wird folgendermaßen initialisiert: Linux:~# gpg --fingerprint /root/.gnupg/pubring.gpg ------------------------pub 1024D/8A573357 2001-07-14 Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) josef.brunner@triblen.de Key fingerprint = 11BC 9622 54A1 C6AF 50A8 EC27 A3AE C9EB 8A57 3357 sub 1024g/BF49D00 200107-14 . . . Um die geheimen Schlüssel aufzuzeigen, benutzen Sie bitte diese Option: Linux:~# gpg --list-secret-keys /root/.gnupg/secring.gpg ------------------------sec 1024D/8A573357 2001-07-14 Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) josef.brunner@triblen.de ssb 1024g/7BF49D00 2001-07-14 Sandini Bib 5.1 Gnu PG (GPG) 241 Schlüssel löschen Natürlich werden wir an dieser Stelle auch eine Option zum Löschen eines Schlüssels vorstellen. Dabei müssen Sie zwischen öffentlichem und privatem Schlüssel unterscheiden. Falls Sie einen öffentlichen Schlüssel löschen wollen, gehen Sie bitte folgendermaßen vor: Linux:~# gpg --delete-key [UID] Für einen privaten Schlüssel müssen Sie folgende Option an GPG übergeben: Linux:~# gpg --delete-secret-key [UID] Schlüssel editieren Natürlich können Sie die Werte und Informationen eines Schlüssels auch editieren. Sie brauchen dazu lediglich diesen Befehl zu benutzen: Linux:~# gpg --edit-key [UID] Danach öffnet sich ein Menü (folgendes Listing) und Sie müssen den Editierungsbefehl spezifizieren. Linux:~# gpg --edit-key [UID] gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc. This program comes with ABSOLUTLY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details. Secret key is available. pub 1024D/8A573357created: 2001-07-14 expires: nevertrust: -/u sub 1024g/7BF49D00created: 2001-07-14 expires: never (1). Josef Brunner (freiberuflicher Sicherheitsbeauftragter und Programmierer) josef.brunner@triblen.de Command> Wie Sie sehen, werden Sie nach dem genauen Editierungsbefehl befragt. Tabelle 5.1 enthält die verfügbaren Befehle und gibt zu jedem Punkt eine kurze Beschreibung (falls Sie eine genauere und weiterführende Beschreibung wollen, finden Sie diese in der zweiten Besprechung): Befehl Beschreibung quit Beendet das Menü save Speichert und beendet das Menü Tabelle 5.1 Editierungsbefehle Sandini Bib 242 5 Verschlüsselung Befehl Beschreibung help Gibt eine kurze Befehlsübersichtsliste aus fpr Zeigt den Fingerabdruck list Listet Schlüssel und User-IDs auf uid Wählt eine User-ID aus key Wählt sekundären Schlüssel aus check Listet Signaturen auf sign Unterschreibt einen Schlüssel lsign Unterschreibt einen Schlüssel (lokal) adduid Fügt eine UID hinzu deluid Löscht eine UID addkey Fügt sekundären Schlüssel hinzu delkey Löscht sekundären Schlüssel delsig Löscht Signaturen expire Ändert das Verfallsdatum des Schlüssels toggle Verbindet zwischen öffentlichem und privatem Schlüssel pref Listet Präferenzen auf showpref Listet ebenfalls Präferenzen auf passwd Ändert die Passphrase (Mantra bei deutschen Versionen) trust Ändert den Ownertrust (Sie werden im Laufe des Kapitels noch erfahren, was ein Ownertrust ist) revsig Widerruft Signaturen revkey Widerruft einen sekundären Schlüssel disable Deaktiviert einen Schlüssel enable Aktiviert einen Schlüsse Tabelle 5.1 Editierungsbefehle (Forts.) Signieren und Ownertrust Falls Sie den Abschnitt über das Editieren von Schlüsseln gelesen haben, wissen Sie ja, wie man Schlüssel signiert. Dazu verwendet man beim Editieren den Befehl sign. Das Unterschreiben eines Schlüssels ist sehr wichtig (siehe Einleitung zu GPG), da dies der einzige Weg ist, sicherzugehen, den richtigen Schlüssel bekommen zu haben. Nun wird anhand der Unterschriften und des »Ownertrusts« die Gültigkeit des Schlüssels ermittelt. Mit dem Ownertrust legen Sie fest, ob (und wie sehr) Sie dem Schlüsselinhaber zutrauen, andere Schlüssel korrekt und verlässlich zu unterschreiben. Dieser Ownertrust wird in einer separaten Datei gespeichert. Sandini Bib 5.1 Gnu PG (GPG) 243 Falls Sie sich fragen, wie man den Ownertrust erkennen kann, sollten Sie einen Blick in die vorhergegangenen Listings werfen. Dort finden Sie des Öfteren das Wort trust. Dies steht für den Ownertrust. Wie Sie dabei weiter bemerkt haben dürften, liefert dieses Schlüsselwort zwei Ownertrusts. Der erste steht dabei für den zugewiesenen, der zweite für den berechneten. Ein Beispiel hierfür könnte sein: trust: -/u In diesem Beispiel wäre der zugewiesene Wert »-« und der berechnete »u«. Was diese Einstufungen bedeuten, erfahren Sie aus Tabelle 5.2. Einstufung Bedeutung - Kein Ownertrust zugewiesen bzw. noch nicht berechnet. e Berechnung schlug fehl. Dies deutet auf einen bereits abgelaufenen Schlüssel hin. q Hierbei sind für eine Berechnung nicht genügend Informationen vorhanden. n Vertrauen Sie diesem Schlüssel nie. m Nicht besonders vertrauenswürdig. f Vollkommen vertrauenswürdig. u Mit Sicherheit vertrauenswürdig. Tabelle 5.2 Einstufungen für Ownertrust Dateien verschlüsseln Bevor wir uns mit den einzelnen Befehlen beschäftigen, sollten wir uns darüber informieren, wie man den Empfänger spezifizieren kann. Dies geschieht folgendermaßen: Linux:~# gpg --recipient [UID] Aber auch, wenn Sie vergessen eine UID als Empfänger zu spezifizieren, ist dies nicht arg schlimm. Wir werden dies im folgenden Szenario annehmen (bei der Verschlüsselung der Datei). Falls Sie eine Datei verschlüsseln wollen, ist der Aufruf dafür simpel gehalten: Linux:~# gpg -e Empfänger [Datei] Wir werden nun eine Datei namens important mit dem Inhalt »Wichtige Information« erstellen. Diese werden wir danach mit dem eben kennen gelernten Befehl verschlüsseln. Dabei geben wir keinen Empfänger an. Als Erstes müssen wir die Datei erstellen: Linux:~# echo "Wichtige Information" > important Sandini Bib 244 5 Verschlüsselung Danach verschlüsseln wir diese Datei. Da wir keinen Empfänger angegeben haben, werden wir danach gefragt. Linux:~# gpg -e important You did not specify a user ID. (you may use "-r") Enter the user ID: Andreas Neut Jetzt sollten wir eine neue Datei in unserem Verzeichnis haben, die wie die spezifizierte Datei heißt, jedoch mit der Endung gpg versehen ist. In unserem Fall haben wir also eine Datei namens important.gpg erstellt (beziehungsweiße GPG hat diesen Job für uns erledigt). Wenn wir die Datei öffnen, werden wir sehen, dass der Inhalt verschlüsselt wurde. Datei entschlüsseln Nun wollen wir die eben verschlüsselte Datei wieder entschlüsseln. Dafür müssen wir folgenden Befehl verwenden: Linux:~# gpg -d [Datei] Auf unser Szenario bezogen lautet der Befehl also: Linux:~# gpg -d important.gpg > important.re Nachdem wir diesen Befehl ausgeführt haben, sollte der Inhalt der Datei important.re dem Inhalt der ursprünglichen Datei important entsprechen. Dies wollen wir mit dem diff-Kommando testen: Linux:~# diff important important.re Linux:~# Wie Sie sehen können, sind die beiden Dateien identisch. Signieren Um eine Datei zu unterschreiben, können Sie folgenden Befehl verwenden. Bedenken Sie dabei aber, dass die Datei danach nicht mehr lesbar ist. Linux:~# gpg -s [Datei] Ein einfaches Listing hierzu: Linux:~# gpg -s test You need a passphrase to unlock the secret key for user: "Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) <josef.brunner@triblen.de>" 1024-bit DSA key, ID 8A573357, created 2001-07-14 Enter passphrase: Sandini Bib 5.1 Gnu PG (GPG) 245 Jetzt haben wir in unserem Verzeichnis eine Datei namens test.gpg, welche signiert und nicht mehr lesbar ist. Signieren und Datei lesbar lassen Wie Sie gesehen haben, ist die Datei, die wir signiert haben, nicht mehr lesbar. Dies ist in vielen Situationen äußerst unpraktisch. In solchen Fällen sollten Sie die jetzt vorgestellte Option für das Signieren von Dateien wählen, da diese die Datei lesbar lässt. Linux:~# gpg --clearsign [Datei] Auch hierzu ein kleines Beispiel: Linux:~# gpg --clearsign test2 You need a passphrase to unlock the secret key for user: "Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) <josef.brunner@triblen.de>" 1024-bit DSA key, ID 8A573357, created 2001-07-14 Enter passphrase: Nach diesem gezeigten Listing erstellt GPG eine neue Datei namens test2.asc, welche folgenden Inhalt hat (der ursprüngliche Text in Datei war »hallo«). -----BEGIN PGP SIGNED MESSAGE----Hash: SHA1 hallo -----BEGIN PGP SIGNATURE----Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iEYeaRECAAYFAjtR!Z0Acgko67J64pXM1dqLQCvCrqKi5yWUlg4vqdADBvy94XdTOo Am gI59ju11pdyRXLSI2L677FdLVdL =xTV3 -----END PGP SINGATURE----- Wie Sie sehen können, ist der Inhalt immer noch problemlos lesbar. Signatur in externe Datei Die beiden eben gezeigten Methoden zum Signieren einer Datei eignen sich hervorragend für Textdateien, aber falls Sie ein TAR-Archiv damit signieren wollen, sieht die Sache schon anders aus. Für Binärdateien sollen Sie die Option benutzen, die wir jetzt kennen lernen werden. Diese Option schreibt die Signatur nicht in die Datei, die signiert werden soll, sondern in ein externes File. Sandini Bib 246 5 Verschlüsselung Linux:~# gpg -b [Datei] Auch hier werden wir uns ein kleines Szenario dazu anschauen. Als Erstes erstellen wir ein Archiv. Wir packen unsere Datei test dafür in ein Archiv namens test.tar. Linux:~# tar -cf test.tar test Danach signieren wir dieses Archiv und versuchen es danach wieder zu entpacken. Falls GPG etwas in das Archiv schreiben würde, wäre das Entpacken nicht mehr möglich. Linux:~# gpg -b test.tar You need a passphrase to unlock the secret key for user: "Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) <josef.brunner@triblen.de>" 1024-bit DSA key, ID 8A573357, created 2001-07-14 Enter passphrase: Wenn wir nun in unser Verzeichnis schauen, finden wir dort eine Datei namens test.tar.sig. Als Erstes wollen wir aber versuchen, das Archiv wieder zu entpacken (Wir können vorher auch wieder unseren diff-Test vollziehen). Linux:~# diff test.tar.sig test.tar Linux:~# Wie Sie sehen, sind die beiden Dateien völlig identisch, das Entpacken sollte daher kein Problem darstellen (Wir gehen dazu in ein anderes Verzeichnis, damit wir die ursprüngliche Datei test nicht überschreiben.) Linux:~# tar -xf test.tar Der Blick in das Verzeichnis zeigt uns, dass das Entpacken erfolgreich war. Verschlüsseln und Signieren Meistens werden Sie Dateien aber nicht nur signieren, sondern auch verschlüsseln wollen. Wie dies funktioniert, haben Sie bereits kennen gelernt. Wir werden uns den Befehl trotzdem noch einmal ins Gedächtnis rufen: gpg [-u Absender] [-r Empfänger] -s -e [Datei] Sie können auch hier die ASCII-Funktion --armor aktivieren. Signatur einer unverschlüsselten Datei prüfen Wir werden in diesem Abschnitt nur die Signaturüberprüfung einer unverschlüsselten Datei besprechen, da GPG die Signatur einer verschlüsselten Datei automatisch prüft. Sandini Bib 5.1 Gnu PG (GPG) 247 Um die Signatur zu testen, gehen Sie wie folgt vor: Linux:~# --verify [Datei] Sehen wir uns zum Abschluss ein kurzes Listing dazu an: Linux:~# gpg --verify test.gpg gpg: Signature made Sun Jul 15 19:32:44 2001 CEST using DSA key ID 8A573357 gpg: Good signature from "Josef Brunner (freiberuflicher Sicherheitsberater und Programmierer) <josef.brunner@triblen.de>" Wie Sie sehen, handelt es sich um eine »good« (gute) Signatur. Falls Sie weiterführende Informationen zu den verfügbaren Optionen wünschen, werden Sie diese mit Sicherheit in Besprechung 2 finden. Falls nicht, können Sie diese überspringen. 5.1.4 Besprechung 2 (Referenz) In diesem Teil werden wir uns intensiv mit der Benutzung von GPG und mit den verfügbaren Optionen auseinander setzen. Da es davon eine ganze Reihe gibt, werden wir nicht allzu tief auf jeden einzelnen Punkt eingehen können. Sie werden aber jede verfügbare Option kurz beschrieben finden. Allgemeiner Aufruf Der allgemeine Aufruf des Programms erfolgt über diese Syntax: Linux:~# gpg [--homedir Name] [--Optionen Datei] [Optionen] Befehl [Argumente] Verfügbare Befehle Tabelle 5.3 listet alle verfügbaren Befehle auf und gibt zu jedem Punkt eine kleine Beschreibung. Befehl Beschreibung -s, --sign Unterschreibt eine Datei. Kann mit --encrypt kombiniert werden. Datei wird danach unlesbar. --clearsign Unterschreibt im Klartext. Datei bleibt lesbar. -b, --detach-sign Unterschrift wird in externe Datei geschrieben. -e, --encrypt Verschlüsselt Daten. Kann mit --sign kombiniert werden. -c, --symmetric Verschlüsselt nur symmetrisch. Sie werden nach einer Passphrase gefragt. Tabelle 5.3 Verfügbare Befehle Sandini Bib 248 5 Verschlüsselung Befehl Beschreibung --store Es wird ein RFC1991 Paket erzeugt. --decrypt [Datei] Entschlüsselt Datei oder Zeichen aus STDIN, falls Sie keine Datei angeben, und gibt das Ergebnis auf die Standardausgabe (STDOUT) aus. Sie können mit der Option --output eine Datei angeben, in die die Dateien geschrieben werden. Falls die verschlüsselte Datei unterschrieben worden ist, wird die Unterschrift ebenfalls überprüft. Diese Option nimmt keine Dateien an, die nicht mit einer verschlüsselten Nachricht beginnen. --verify [[Signaturdatei] [Signaturdateien] --verify-files [Dateien] Dies ist eine besondere Abart des --verify-Befehls und funktioniert nicht mit detached-Signaturen. --list-keys [Namen] Listet alle Schlüssel auf oder nur diejenigen, die an der Kommandozeile angegeben wurden. --list-public-keys [Namen] Listet alle Schlüssel des öffentlichen Schlüsselbundes auf oder nur diejenigen, die an der Kommandozeile angegeben wurden. --list-secret-keys [Namen] Listet alle Schlüssel des privaten Schlüsselbundes auf oder nur diejenigen, die an der Kommandozeile angegeben wurden. --list-sigs [Namen] Es werden alle Schlüssel und Unterschriften aufgelistet. --check-sigs [Namen] Es werden alle Schlüssel aufgelistet und die Unterschriften überprüft. --fingerprint [Namen] Listet alle Schlüssel mit den dazugehörigen Fingerabdrücken auf. Falls Sie diesen Befehl zweimal angeben, werden alle Fingerabdrücke der sekundären Schlüssel ausgegeben. --list-packets Listet nur die Sequenz der Pakete auf. --gen-key Hiermit können Sie ein neues Schlüsselpaar erzeugen. Für weitergehende Informationen können Sie Besprechung 1 zu Rate ziehen. --edit-key Name Mit diesem Befehl gelangen Sie in ein Menü, in dem Sie alle wichtigen Editierungsaufgaben Schlüssel betreffend übernehmen können. Verfügbare Kommandos in diesem Menü sind: Sign Unterschreibt einen Schlüssel. Falls der Schlüssel noch nicht vom Defaultuser unterschrieben wurde, werden die Informationen über den Schlüssel und die dazugehörigen Fingerabdrücke erneut ausgegeben und es wird gefragt, ob der Schlüssel unterschrieben werden soll. Diese Prozedur wird für alle mit der Option -u spezifizierten User durchgeführt. Lsign Diese Funktion ist im Grunde dieselbe wie die eben vorgestellte sign-Option, mit dem Unterschied, dass die Signaturen als nonexportable gekennzeichnet werden und somit von niemand mehr benutzt werden können. Geeignet für das lokale Netzwerk. Tabelle 5.3 Verfügbare Befehle (Forts.) Sandini Bib 5.1 Gnu PG (GPG) Befehl 249 Beschreibung revsig Hiermit widerrufen Sie eine Signatur. Dabei wird bei jeder Signatur danach gefragt, ob ein Widerrufszertifikat erstellt werden soll. trust Ändert den Wert des »Ownertrust«. Für eine Beschreibung des Ownertrust werfen Sie einen Blick in Beschreibung 1. Die trustdb wird sofort auf den neuesten Stand gebracht. disable Deaktiviert einen Schlüssel. Ein deaktivierter Schlüssel kann nicht mehr für die Verschlüsselung benutzt werden. enable Aktiviert einen deaktivierten Schlüssel adduid Es wird eine alternative UID generiert. deluid Es wird eine bestehende UID gelöscht. addkey Es wird ein Subschlüssel zu diesem Schlüssel erstellt und hinzugefügt. delkey Ein Subschlüssel wird gelöscht. revkey Ein Subschlüssel wird widerrufen. expire Ändert das Verfallsdatum eines Schlüssels. Falls Sie keinen Schlüssel ausgewählt haben, wird das Verfallsdatum des primären Schlüssels geändert. passwd Ändert die Passphrase des privaten Schlüssels. uid n Verbindet die ausgewählte UID mit einem Index n. Mit 0 lösen Sie alle Bindungen. key n Verbindet den ausgewählten Subschlüssel mit einem Index n. Mit 0 lösen Sie alle Bindungen. check Überprüft alle ausgewählten User IDs. pref Listet Präferenzen auf. Tabelle 5.3 Verfügbare Befehle (Forts.) Sandini Bib 250 Befehl 5 Verschlüsselung Beschreibung showpref Listet Präferenzen mit mehr Details und mehr Informationen auf. toggle Verbindet die Ausgabe der privaten und öffentlichen Schlüssel. save Alle Änderungen werden im Schlüsselbund gespeichert. Das Menü wird beendet. quit Beendet das Menü, ohne den Schlüsselbund auf den neuesten Stand zu bringen. Im Folgenden sehen Sie eine Liste mit den verschiedenen Stufen des Ownertrust. Es wurde kein Ownertrust angegeben bzw. der Ownertrust wurde noch nicht berechnet. e Die Berechnung schlug fehl. Ursache hierfür kann ein abgelaufener Schlüssel sein. q Nicht genug Informationen für eine Berechnung vorhanden n Vertrauen Sie diesem Schlüssel niemals. m Begrenzt glaubwürdig f Völlig vertrauenswürdig u Unbegrenzt vertrauenswürdig Ownertrust Format: trust zugewiesener Ownertrust/berechneter Ownertrust --sign-key Name Hiermit unterschreiben Sie einen öffentlichen Schlüssel mit Ihrem privaten Schlüssel. --lsign-key Name Hiermit unterschreiben Sie einen öffentlichen Schlüssel mit Ihrem privaten Schlüssel, kennzeichnen ihn aber als non-exportable. Dies ist die Kurzversion des lsign-Kommandos mit Editionsmenü. Tabelle 5.3 Verfügbare Befehle (Forts.) Sandini Bib 5.1 Gnu PG (GPG) 251 Befehl Beschreibung --trusted-key Schlüssel ID Mit dieser Option geben Sie dem spezifizierten Schlüssel (Sie müssen für die Spezifikation die 8 Byte Schlüssel-ID angeben) denselben Status, den Sie auch Ihren eigenen privaten Schlüsseln geben. Das heißt, der Schlüssel wird als vollkommen vertrauenswürdig eingestuft. --delete-key Name Löscht den Schlüssel aus dem öffentlichen Schlüsselbund --delete-secret-key Name Löscht den Schlüssel aus dem privaten und öffentlichen Schlüsselbund --delete-secret-and-publickey Name Selbe Funktion wie --delete-key, mit dem Unterschied, dass, falls ein privater Schlüssel existiert, dieser zuerst gelöscht wird --gen-revoke Erstellt ein Widerrufszertifikat für den kompletten Schlüssel. Um einen Subschlüssel oder eine Signatur zu löschen, müssen Sie die --edit-Option benutzen. --export Namen Falls Sie keine Schlüsselnamen angeben, werden alle Schlüssel aus dem Schlüsselbund (Defaultschlüsselbunde und die, die Sie mit der --keyring-Option angegeben haben) exportiert. Falls Sie aber einen oder mehrere Namen angeben, werden diese Schlüssel exportiert. Der dabei entstehende Schlüsselbund wird auf die Standardausgabe weitergeleitet. Falls Sie diese Schlüssel mailen wollen, sollten Sie die --armor-Option benutzen, um sie im ASCII-Format zu erstellen und anzuzeigen. --send-keys Namen Im Grunde dieselbe Option wie --export, mit dem Unterschied, dass die Schlüssel zu einem Schlüsselserver geschickt werden. Dabei müssen Sie mit der Option --keyserver einen Schlüsselserver spezifizieren. Schicken Sie nicht alle Ihre Schlüssel zu diesem Server, sondern nur diejenigen, die neu sind oder die Sie geändert haben. --export-all Namen Eigentlich dieselbe Funktion wie --export, mit dem Unterschied, dass auch Schlüssel, die nicht mit OpenPGP kompatibel sind, exportiert werden --export-secret-keys Namen Funktioniert wie die --export-Funktion, hierbei werden aber anstatt der öffentlichen die privaten Schlüssel exportiert. Sie sollten mit dieser Funktion sehr vorsichtig sein! --export-secret-subkeys Namen Rändert den privaten und geheimen Teil des privaten Schlüssels. Andere Programme (außer GNU OpenPGP) können diesen Schlüssel nicht wieder importieren. --import Dateien Importiert Schlüssel. Mit dieser Funktion fügen Sie die spezifizierten Schlüssel Ihrem Schlüsselbund hinzu. Es wird eine trustdb erstellt. Sie können die Funktionsweise dieser Option durch folgende Optionen verändern und beeinträchtigen: --merge-only (Fügt Schlüssel nicht in den Schlüsselbund ein) --allow-secret-key-import Tabelle 5.3 Verfügbare Befehle (Forts.) Sandini Bib 252 5 Verschlüsselung Befehl Beschreibung --fast-import Dateien Importiert Schlüssel schneller als die Option --import. Mit dieser Funktion fügen Sie die spezifizierten Schlüssel Ihrem Schlüsselbund hinzu. Es wird keine trust-db erstellt. Sie können die Funktionsweise dieser Option durch folgende Optionen verändern und beeinträchtigen: --merge-only (Fügt Schlüssel nicht in den Schlüsselbund ein) --allow-secret-key-import --recv-keys Schlüssel IDs Importiert die Schlüssel mit der spezifizierten ID von einem HKP-Schlüsselserver. Sie müssen zusätzlich die Option --keyserver benutzen, um einen Schlüsselserver zu spezifizieren. --export-ownertrust Zeigt den angegebenen Ownertrust im ASCII-Format an. Nützlich für Backupzwecke. --import-ownertrust Dateien Hiermit wird die trust-db mit den Ownertrustwerten, die sich in der angegebenen Datei bzw. Dateien befinden, auf den neuesten Stand gebracht. Falls Sie keine Datei angeben, werden die Werte von der Standardeingabe gelesen. --print-md Algorithmus Dateien Gibt eine Nachricht über den angegebenen Algorithmus für alle spezifizierten Dateien aus. Falls Sie für die Spezifikation des Algorithmus die Wildcard »*« benutzen, werden eine Übersicht und Informationen über alle verfügbaren Algorithmen ausgegeben. --gen-random 0|1|2 [count] 0|1|2 gibt das Qualitätslevel an, für das der COUNT ausgegeben werden soll. Falls Sie keinen COUNT oder 0 angeben, wird eine endlose Sequenz von Zufallszahlen ausgegeben. Seien Sie mit dieser Funktion sehr vorsichtig! --gen-prime Modus Bits [qbits] An dieser Funktion wird immer noch gearbeitet, da das Outputformat nicht zufrieden stellend ist. --version Gibt die Versionsnummer und die verfügbaren Algorithmen aus und beendet danach --warranty Gibt Informationen über die Garantieleistungen aus -h, --help Gibt eine sehr lange Liste von verfügbaren Optionen aus Tabelle 5.3 Verfügbare Befehle (Forts.) Optionen Nun werden wir uns mit den verfügbaren Optionen auseinander setzen. Bevor wir uns aber an die Besprechung der einzelnen Optionen machen, möchte ich Sie mit der Optionsdatei von GPG bekannt machen. Optionsdatei Sie können in Ihrem GPG-Verzeichnis (zum Beispiel /home/joe/.gnupg) eine Datei namens options anlegen, in der Sie lange Befehle speichern können. Beachten Sie dabei aber, dass Sie die beiden anführenden Gedankenstriche weglassen. Schreiben Sie also nur den Namen der Option und die eventuell benötigten Argumente in die Datei. Sandini Bib 5.1 Gnu PG (GPG) 253 Verfügbare Optionen Tabelle 5.4 stellt Ihnen alle verfügbaren Optionen mit einer kurzen Beschreibung vor. Option Beschreibung -a, --armor Die Ausgabe wird im ASCII-Format dargestellt. -o, --output Datei Schreibt die Ausgabe in eine Datei -u, --local-user Name Benutzt den Namen als User-ID um zu unterschreiben. Diese Option wird bei Listkommandos ignoriert. Sie kann aber in der Optionsdatei geführt werden. --default-key Name Benutzt den angegebenen Namen als Standard-User-ID für Unterschriften. Falls Sie keinen Namen angeben, wird die im privaten Schlüsselbund zuerst gefundene User-ID als Standard benutzt. -r, --recipient Name Hiermit geben Sie einen Empfänger an. Falls Sie keinen angeben, wird GPG Sie danach fragen oder den Standardempfänger benutzt. --default-recipient Name Hiermit können Sie einen Standardempfänger spezifizieren. --default-recipient-self Benutzt den Standardschlüssel als Standardempfänger. Der Standardschlüssel ist der erste Schlüssel des privaten Schlüsselbundes oder ein Schlüssel, den Sie mit der Option --defaultkey angegeben haben. --no-default-recipient Löscht die Werte, die Sie mit den folgenden Optionen angegeben haben. --default-recipient --default-recipient-self Sie müssen nach diesem Reset neue Standardwerte mit den aufgezeigten Optionen übergeben. --encrypt-to Name Im Grunde ist diese Funktion mit der Option --recipient identisch. Diese Option ist jedoch für die Optionsdatei gedacht und kann mit Ihrer eigenen User-ID benutzt werden. Diese Schlüssel werden nur benutzt, wenn auch andere Empfänger angegeben wurden (entweder durch die Beantwortung der Recipientfrage von GPG oder durch die Option --recipient). Beachten Sie aber, dass hierbei keine Prüfung des Ownertrust vorgenommen wird und dass Sie sogar deaktivierte Schlüssel benutzen können. --no-encrypt-to Hiermit werden alle --encrypt-to-Schlüssel deaktiviert. -v, --verbose Mit dieser Option erhalten Sie während der Arbeit mehr Information. Falls Sie sie zweimal verwenden, werden die Inputdaten im Detail aufgelistet. -q, --quiet Sie bekommen kaum Output. Tabelle 5.4 Verfügbare Optionen von GPG Sandini Bib 254 5 Verschlüsselung Option Beschreibung -z n Hiermit können Sie das Kompressionslevel setzen. Falls Sie den Wert 0 übergeben, wird Kompression deaktiviert. Normalerweise sollten Sie das Level von zlib benutzt (meistens 6). -t, --textmode Initialisiert Textmodus. Um Unterschriften im Klartext zu erreichen, können Sie die -t (aber nicht --textmode) zusammen mit -a und -s verwenden. Normalerweise würden Sie --sign oder --clearsign hierfür verwenden. Der hier beschriebene »Trick« wird aber für die Kompatibilität zu PGP benötigt. -n, --dry-run Diese Option veranlasst GPG keine Änderungen vorzunehmen (ist noch nicht vollständig implementiert, seinen Sie daher also bei Verwendung sehr vorsichtig). -i, --interactive GPG gibt eine Meldung aus, bevor es Dateien überschreibt. --batch GPG läuft im Batch-Modus, das heißt, dass Sie keine Meldungen bekommen werden und keine interaktiven Befehle erlaubt sind. --no-tty Vergewissern Sie sich, dass der Terminal nicht für irgendwelche Ausgaben benutzt wird. Diese Option wird manchmal benötigt, wenn GPG im --batch-Modus Warnungen ausgibt. --no-batch Hierbei wird der --batch-Modus deaktiviert. Sie können diese Option benutzt, wenn Sie den --batch-Modus über die Optionsdatei gestartet haben. --yes GPG vermutet, dass Sie die meisten Fragen mit »yes« beantworten. --no GPG vermutet, dass Sie die meisten Fragen mit »no« beantworten. --always-trust Hiermit überspringen Sie den Test der Schlüssel. GPG vermutet, dass alle Schlüssel immer vollständig vertrauenswürdig sind. Sie sollten mit dieser Methode äußerst vorsichtig sein, da sie Ihnen eine Sicherheitsbarriere nimmt. --keyserver Name Hiermit geben Sie einen Schlüsselserver an. Sie benötigen diese Option als Zusatz für einige andere Optionen. Da sich alle Schlüsselserver miteinander synchronisieren, brauchen Sie Ihre Schlüssel nur zu einem zu senden. Falls Sie eine Liste mit allen verfügbaren Schlüsselservern erhalten wollen, geben Sie folgenden Befehl ein: host -l pgp.net | egrep wwwkeys --no-auto-key-retrieve Diese Option deaktiviert das automatische Empfangen von Schlüsseln von einem Schlüsselserver, solange Sie Signaturen überprüfen. --honor-http-proxy Mit dieser Option erreichen Sie, dass GPG versucht den Schlüsselserver über einen Proxy zu erreichen. Diesen Proxy können Sie mit der Variable »http_proxy« spezifizieren. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) Sandini Bib 5.1 Gnu PG (GPG) 255 Option Beschreibung --keyring Datei Fügt die Datei zu der Liste von Schlüsselbunden hinzu. Falls die Datei mit einer Tilde und einem Slash beginnt, wird dies durch das Homeverzeichnis ersetzt. Falls dies nicht vorhanden ist, wird angenommen, dass sich die Datei bereits im Homeverzeichnis befindet. Sie können die Datei mit folgenden Werten beginnen: gnupg-ring Default gnupg-gdbm Wird für GDBM verwendet. Bedenken Sie aber, dass GDBM eventuell in den nächsten Versionen nicht mehr vertreten sein wird. --secret-keyring Datei Diese Option bietet dieselben Funktionen wie --keyring, mit dem Unterschied, dass es sich hierbei um private Schlüsselbunde handelt. --homedir Verzeichnis Diese Option überschreibt die Umgebungsvariable GNUPGHOME. Sie können hiermit Ihr Homeverzeichnis angeben. Falls Sie kein Verzeichnis spezifizieren, wird der Defaultwert benutzt (./gnupg). --charset Name Hiermit können Sie Ihren Zeichensatz spezifizieren. Sie können diese Option benutzen, um Strings in UTF-8 umzuwandeln. Mögliche Werte hierfür sind (Platzhalter Name): iso-8859-1 Latin 1 (Default) iso-8859.2 Latin 2 koi8-r Russischer Zeichensatz utf-8 Umgeht alle Übersetzungen und nimmt an, dass das Betriebssystem UTF-8 encoding benutzt. --optionsfile Datei Liest Optionen aus der angegebenen Datei. Damit werden die Optionen aus der Standardoptionsdatei ignoriert. --no-utf8-strings, --utf8-strings Nimmt an, dass die Argumente bereits als UTF8 Strings übergeben werden. Der Standard besagt, dass Argumente nach dem Zeichensatz, den Sie mit der Option --charset übergeben haben, encoded sind (--no-utf8-strings). --no-options Hiermit werden alle Optionen im Optionsfile nach /dev/null weitergeleitet. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) Sandini Bib 256 5 Verschlüsselung Option Beschreibung --load-extension Name Hiermit wird ein Erweiterungsmodul geladen. Falls Sie für den Platzhalter »Name« kein Verzeichnis angeben (GPG sucht nach einem Slash), wird das Modul im Verzeichnis /usr/local/lib/gnugp gesucht. --debug Flags Wenn Sie diese Option benutzen, können Sie das Flag in C-Manier (C-Syntax) für das Debugging setzen. Zum Beispiel: 0x0042 --debug all Es werden alle nützlichen und sinnvollen Debugflags gesetzt. --status-fd n Es werden besondere Statusstrings in den Filedescriptor n geschrieben. --logger-fd n Schreibt das Logginoutput in den angegebenen Filedescriptor anstatt nach STDERR --no-comment Weist GPG an, keine Kommentarpakete mehr zu schreiben. Nur für private Schlüssel verfügbar. Das hat nichts mit Kommentaren in Klartextunterschriften zu tun. --comment String Was Sie dieser Option anstatt des Platzhalters »String« übergeben, wird als Kommentar in Klartextunterschriften erscheinen. Falls Sie keinen Kommentar in Klartextunterschriften wünschen, übergeben Sie dieser Option kein Argument. --default-comment Hiermit erreichen Sie, dass der Standardkommentar in Klartextunterschriften eingefügt wird. --no-version Falls Sie diese Option verwenden, werden keine Hinweise zur Version in Klartextunterschriften erscheinen. --emit-version Damit wird die Versionsnummer in Klartextunterschriften eingefügt. -N, --notation-data Name=Wert Sie können das Name/Wert Paar als Kommentar in Ihre Signaturen einbauen. Der String »Name« kann dabei aus alphanumerischen Zeichen, Zahlen und Unterstrichen bestehen, wobei das erste Zeichen nicht aus einer Zahl bestehen darf. Der String »Wert« kann dabei aus jedem druckbaren Zeichen bestehen und wird in UTF 8 encoded. Falls Sie Ihren Kommentar als kritisch einstufen haben wollen, setzen Sie ihm ein Ausrufezeichen vorweg (rfc2440:5.2.3.15). --set-policy-url String Bei dieser Option können Sie für den Platzhalter String eine Policy URL angeben. Auch diese URL können Sie wieder als kritisch einstufen, indem Sie ihr ein Ausrufezeichen vorstellen (rfc2440:5.2.3.19). --set-filename String Geben Sie für den Platzhalter String den Namen der Datei an, die in Messages gespeichert ist. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) Sandini Bib 5.1 Gnu PG (GPG) 257 Option Beschreibung --use-embedded-filename Versucht eine Datei mit dem Namen der eingebundenen Daten zu erstellen. Seien Sie hierbei sehr vorsichtig, da es vorkommen kann, dass Dateien überschrieben werden. --completes-needed n Anzahl der »completely trusted« User, um einen neuen Schlüssel einzuführen Defaultwert liegt bei 1 --marginals-needed n Anzahl der »marginally trusted« User, um einen neuen Schlüssel einzuführen Defaultwert liegt bei 3 --max-cert-depth n Gibt die maximal erlaubte Tiefe der Zertifikationsketten an Defaultwert liegt bei 5 --cipher-algo Name Anstelle des Platzhalters »Name« können Sie einen Verschlüsselungs-Algorithmus angeben. Um eine Liste der unterstützten Algorithmen zu bekommen, können Sie folgenden Befehl nutzen. Linux:~# gpg --version | egrep algorithms --digest-algo Name Anstelle des Platzhalters »Name« können Sie den »Message Digest Algorithmus« angeben. Auch hier können Sie mit dem --version-Befehl eine Liste der verfügbaren Optionen anzeigen lassen. --s2k-cipher-algo Name Diese Option erlaubt es Ihnen, einen Verschlüsselungs-Algorithmus anzugeben (für den Platzhalter Name), der benutzt wird, um private Schlüssel zu beschützen. Der Defaultalgorithmus ist BLOWFISH. Diese Algorithmus wird auch für konventionelle Verschlüsselung genutzt, falls Sie die Option --cipher-algo nicht angegeben haben. --s2k-digest-algo Name Benutzt den angegebenen Algorithmus, um Passphrases zu verschlüsseln. Der Defaultalgorithmus ist RIPE-MD-160. Dieser Algorithmus wird ebenfalls für normale Verschlüsselung benutzt, falls die Option --digest-algo nicht angegeben wurde. --s2k-mode n Mit dieser Option geben Sie an, wie mit den Passphrases verfahren werden soll. Falls Sie eine 0 für den Wert n einsetzen, so wird eine plain Passphrase benutzt. Falls Sie eine 1 angeben, wird ein »salt« an die Passphrase angehängt (dies ist der Defaultwert). Falls Sie eine 3 angeben, wird die Passphase einige Male verdoppelt. Falls --rfc1991 nicht angegeben wurde, wird dieser Modus auch für konventionelle Verschlüsselung gebraucht. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) Sandini Bib 258 5 Verschlüsselung Option Beschreibung --compress-algo n Sie können mit dieser Option den Algorithmus angeben, der für die Kompression genutzt werden soll. Bei einer 1 wird die alte Zipversion, die auch von PGP verwendet wird, benutzt. Bei einer 2 wird die RFC1950-Kompression verwendet (dies ist der Defaultwert). Dieser Algorithmus hat einen entscheidenden Vorteil, da die Windowgröße nicht auf 8 K beschränkt ist. --disable-cipher-algo Name Hiermit verbieten Sie GPG den von Ihnen anstatt dem Platzhalter angegebenen Algorithmus als Cipher-Algorithmus zu benutzen. --disable-pubkey-algo Name Hiermit verbieten Sie GPG den von Ihnen anstatt dem Platzhalter angegebenen Algorithmus als Public-Key-Algorithmus zu benutzen. --throw-keyid Sie können diese Option verwenden, um GPG anzuweisen, die Schlüssel-ID nicht in verschlüsselten Pakete zu erwähnen (damit wird der Empfänger geheim gehalten). Dies ist eine gute Gegenmaßnahme, um Trafficanalysen zu verhindern. Beachten Sie dabei aber bitte, dass die Entschlüsselungszeit damit rapide ansteigen kann, da jeder verfügbare private Schlüssel durchprobiert wird. --not-dash-escaped Hiermit können Sie Klartextunterschriften so abändern, dass Sie sie für Patchfiles verwenden können. Sie sollten diese Dateien aber danach nicht als E-Mail verschicken, da auch alle Leerzeichen und Zeilenendungen gehashed sind. Sie können diese Option nicht für Daten verwenden, die am Anfang einer Zeile fünf Hashes haben. Diese Funktion wird durch eine spezielle Zeile im Header der Unterschrift ermöglicht. --escape-from-lines Da einige Mailprogramme die Zeile »From« zu »<From« abändern, ist es eine gute Idee, diese Zeilen in Klartextunterschriften besonders zu behandeln. (Alle anderen PGP Version verfahren nach demselben Prinzip.) Diese Option ist per Default nicht aktiv, da sie RFC2440 verletzen würde. --passphrase-fd n Mit dieser Option geben Sie an, dass GPG die Passphrase aus dem File Descriptor n lesen soll. Falls Sie an diese Stelle für den Wert n 0 angeben, so wird die Passphrase von der Standardeingabe gelesen. Dies funktioniert nur für eine Passphrase. Beachten Sie hierbei aber, dass diese Option eventuell ein großes Sicherheitsrisiko darstellt. So kann ein Mit-User Ihrer Workstation durch die History Ihrer Kommandozeile viele Informationen ergattern, die er besser nicht wissen sollte. --rfc1991 Hiermit wird versucht, sich an RFC1991 (PGP 2.X) besser anzupassen. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) Sandini Bib 5.1 Gnu PG (GPG) 259 Option Beschreibung --openpgp Falls Sie diese Option initialisieren, werden alle Packet-, Cipherund Digest-Optionen wieder auf Null und somit auf OpenPGPVerhalten zurückgestellt. Davon sind folgende Optionen betroffen: --rfc1991, --force-v3-sigs, --s2k-*, --cipher-algo, --digest-algo und --compress-algo Es werden ebenfalls alle PGP Workarounds deaktiviert. --force-v3-sigs Der OpenPGP-Standard besagt, dass v4-Unterschriften zu generieren sind. Leider erkennt PGP v4-Unterschriften nur bei Schlüsselmaterial. Diese Option bringt GPG dazu, für Datenunterschriften v3 zu benutzen. --force-mdc Hiermit bringen Sie GPG dazu, an jede Verschlüsselung »manipulation-code« anzuhängen. Dies wird bei den neueren CipherAlgorithmen stets benutzt (die mit einer Blockgröße größer als 64K versehen sind). Es könnte sein, dass diese Option bei Ihnen noch nicht implementiert ist. --allow-non-selfsigned-uid Erlaubt den Import von nicht selbst unterschriebenen Schlüsseln. Die »Key-Validation« wird bei solchen Schlüsseln aber nicht erfolgreich sein und Sie müssen die Gültigkeit des Schlüssels anders überprüfen. Diese Option sollte normalerweise nicht benutzt werden, ist aber für einige deutsche Schlüssel, die mit PGP 2.6.3 erstellt wurden, nötig. --ignore-time-conflict Normalerweise überprüft GPG, ob die timestamps bestimmter Schlüssel und Unterschriften plausible Werte haben. Es kann aber durchaus einmal vorkommen, dass eine Unterschrift älter als ein Schlüssel ist (es sollte zwar nicht vorkommen, aber leider geschieht es doch hin und wieder). Für solche Problem- und Sonderfälle können Sie diese Option benutzen. --lock-once Hiermit wird die Datenbank beim ersten Sperrgesuch gesperrt und erst wieder entsperrt, wenn der Prozess beendet ist. --lock-multiple Entsperrt die Datenbank, sobald die Sperre nicht mehr benötigt wird. --lock-never Mit dieser Option deaktivieren Sie das Sperren von Datenbanken komplett. Sie sollten sie nur verwenden, wenn Sie sich absolut sicher sind, dass dadurch keine Daten beschädigt oder korrumpiert werden können. --no-random-seed-file GPG benutzt eine Datei, um seinen internen radom Pool für Anfragen zu speichern. --no-verbose Es wird kein Output mehr gegeben. --no-greeting Hiermit wird die Copyrightnachricht unterdrückt. Das Programm befindet sich aber dadurch nicht im Batch-Modus. --no-secmem-warning Dadurch können Sie die Warnung »using insecure memory« abschalten. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) Sandini Bib 260 5 Verschlüsselung Option Beschreibung --no-armor Sie können diese Option verwenden, falls die Inputdaten nicht im ASCII-Format verfasst wurden. --no-default-keyring Dadurch wird der Defaultschlüsselbund nicht zu der Liste der Schlüsselbunde hinzugefügt. --skip-verify Falls Sie keine Überprüfung der Unterschriften benötigen, können Sie diese Option benutzen, um diesen Schritt zu überspringen. Da keine Bestätigung gebraucht wird, ist die Entschlüsselung wesentlich schneller. --with-colons Bei Schlüssellistings werden die einzelnen Einträge durch Kommas getrennt dargestellt. --with-key-data Bei Schlüssellistings werden die einzelnen Einträge durch Kommas getrennt dargestellt. Zusätzlich erhalten Sie noch Daten über den öffentlichen Schlüssel. --with-fingerprint Bietet dieselbe Funktionalität wie die Option --fingerprint, mit dem Unterschied, dass hierbei nur das Ausgabeformat geändert wird und dass Sie diese Option mit anderen Befehlen kombinieren können. --fast-list-mode Hiermit können Sie die Ausgabe von Listkommandos wesentlich beschleunigen, da einige Felder ausgelassen werden. Da sich diese Version in der nahen Zukunft noch des Öfteren ändern wird, sollten Sie einfach ausprobieren, welche Felder weggelassen werden. --list-only Auch diese Option wird in der Zukunft noch verändert. Zurzeit überspringt sie lediglich eine Funktion und ist daher in der Lage die Schlüssel schneller aufzulisten. Tabelle 5.4 Verfügbare Optionen von GPG (Forts.) 5.2 OpenSSH Wir leben im Kommunikationszeitalter. Das wertvollste (materielle) Gut, das wir zurzeit haben, ist die Information. Wir alle versuchen mit aller Gewalt (zumindest sollten wir dies) unsere persönlichen und geheimen Daten und Informationen vor unerlaubtem Zugriff zu schützen. Um dies zu erreichen, errichten wir Sicherheitsbarrieren, die es einem Angreifer unmöglich machen sollen, unsere Daten zu erspähen. In der Praxis dienen uns Usernamen und Passwörter als Sicherheitsbarrieren. Im konkreten Beispiel loggen wir uns mit diesem Authentifizierungspaar zum Beispiel an einem FTP-Server ein. Da dieser weiß, dass wir unsere Daten schützen möchten, fragt er nach einem Passwort und einem dazugehörigen Usernamen. Wir schicken ihm die gewünschten Informationen zu und hoffen uns nicht vertippt zu haben. Der Server empfängt die Daten und weiß somit, dass wir auch wirklich wir sind, und gibt uns Zugriff auf unsere Daten. Sandini Bib 5.2 OpenSSH 261 Obwohl dieses System allein schon nicht allzu sicher ist, vertrauen wir darauf, da wir denken, dass nur wir die richtige Kombination aus Usernamen und Passwort kennen. Dies mag zwar stimmen, aber leider kümmern wir uns wenig um das Programm, das wir zur Authentifizierung nutzen. So kommt es leider immer noch vor, dass Benutzer ihre Passwörter via Telnet oder FTP im Internet hin- und herschicken, obwohl sie eigentlich wissen sollen, dass die sensitiven Daten, die dabei ausgetauscht werden, von jedermann eingesehen werden können. Dies liegt daran, dass der Datenverkehr nicht verschlüsselt wird. Die OpenSSH-Programm-Suite liefert uns einige Tools, die den ausgetauschten Datenverkehr verschlüsseln und uns somit vor gemeinen Snifferattacken schützen. Welche Programme uns dabei zur Verfügung stehen und was sie uns bieten, erfahren Sie im Folgenden: ssh – ein Client, den Sie benutzen können, um sich an einem Server anzumelden sshd – der Server, der den Zugriff regelt ssh-agent – ein Agent für Authentifizierung, der private Schlüssel speichern kann ssh-add – mit diesem Tool können Sie Schlüssel zum ssh-agent hinzufügen sftp – ein FTP Client, der das SSH1- und SSH2-Protokoll versteht und einsetzt scp – hiermit können Sie Daten sicher kopieren ssh-keygen – dieses Programm brauchen Sie um Schlüssel zu generieren sftp-server – ein sicherer FTP-Server, der automatisch mit dem SSH Server ge- startet wird ssh-keyscan – Sie können dieses Programm benutzen, um öffentliche Hostschlüssel von verschiedenen Rechnern zusammenzutragen Wir werden jedes der aufgeführten Tools genau besprechen. Vorab möchte ich Ihnen aber schon raten, diese Programme für den Datenaustausch zu benutzen, um sicherzugehen, dass Ihre Passwörter und die sensitiven Informationen auch nicht lesbar übertragen werden. 5.2.1 Installation Obwohl die meisten Distributionen OpenSSH als Paket mitliefern, sollten Sie sich die jeweils aktuellste Version aus einer sicheren Quelle besorgen. Sichere Bezugsquellen 1. Die erste Möglichkeit besteht darin, sich das Paket (Source oder RPM) von der Buchseite zu besorgen. 2. Sie können das Programm aber www.openssh.com downloaden. auch von der offiziellen Seite Sandini Bib 262 5 Verschlüsselung RPM Falls Sie sich für das RPM-Paket entschieden haben, ist die Installation ein Kinderspiel: Linux:~# rpm -i openssh-version.rpm Danach haben Sie ein fertig installiertes OpenSSH-Paket auf Ihrem Rechner. 5.2.2 Der Server Da ich mir nicht im Geringsten anmaßen will, Ihnen an dieser Stelle die volle Komplexität dieses Servers und seiner Funktionsweise zu erklären, werde ich versuchen, Ihnen in wenigen Sätzen darzustellen, was dieser Server überhaupt ist und was er leisten kann. Funktionsweise In diesem Abschnitt werden Sie erfahren, wie ein Login-Prozess über einen SSH Server abläuft und wie er funktioniert. Verbindungsaufbau und Protokollaustausch 1. Der Client schickt zum Zielserver einen Verbindungsaufbau auf Port 22. Nachdem der Server der Verbindung zugestimmt hat, tauschen der Client und der Server die jeweiligen Protokollversionen aus, um sicherzugehen, dass eine Kommunikation fehlerfrei stattfinden kann (Abbildung 5.1). Abbildung 5.1 Erster Schritt im Login-Prozess Wechsel zu Binärprotokoll Danach wechseln der Server und der Client auf ein Binärprotokoll. Server sendet RSA-Schlüssel Der Server sendet seine beiden öffentlichen Schlüssel Hpub (permanenter Hostkey) und Spub (dynamischer Hostkey). Der dynamische Key Spub bedingt eine zusätzliche Sicherheit, so dass die Kenntnis des statischen Keys nicht ausreicht. Außerdem wird dem Client noch eine Liste mit den verfügbaren Chiffren übermittelt (Abbildung 5.2) Sandini Bib 5.2 OpenSSH 263 Abbildung 5.2 Server sendet RSA-Schlüssel Vergleich der Schlüssel Der Client vergleicht nun seine lokale Kopie des Hostkeys mit dem vom Server angegebenen Schlüssel (Hpub) anhand seiner lokalen Dateien. Falls der Rechner nicht bekannt ist, wird gefragt, ob der Serverschlüssel akzeptiert werden soll. Falls ja, wird dieser lokal gespeichert und beim nächsten Mal wieder verwendet, ansonsten wird die Verbindung abgebrochen (Abbildung 5.3) Abbildung 5.3 Vergleich der Schlüssel Sitzungsschlüssel wird generiert Nun generiert der Client einen 256 Bit großen Sitzungsschlüssel und verschlüsselt diesen mit dem permanenten und dem dynamischen Hostschlüssel. Danach schickt er das Ergebnis zum Server und übergibt ihm das symmetrische Verfahren, das er gewählt hat. Authentifizierung Da der gesamte Datenverkehr nun mit dem Session Key (Sitzungsschlüssel) verschlüsselt wird, kann die Authentifizierung via Passwort usw. erfolgen, ohne dass die Gefahr des Abfangens besteht. Abbildung 5.4 Datenverkehr wird verschlüsselt Sandini Bib 264 5 Verschlüsselung Da dieses Buch aber hauptsächlich als eine Art großes Howto dienen sollte, werden wir nicht näher auf die weitere Authentifizierung eingehen, sondern uns gleich mit der Konfiguration des Servers beschäftigen. Sie brauchen hier aber keine Angst zu haben, dass Ihnen dabei wichtige Informationen über die Authentifizierung oder Ähnliches entgehen, da die Besprechung der verschiedenen Tools und der dafür verfügbaren Optionen alle Einzelheiten der Funktionsweise aufgreifen wird. Konfiguration über die Kommandozeile Grundsätzlich gibt es zwei Methoden, um den SSH-Server zu konfigurieren. 1. Über die Kommandozeile 2. Über eine Konfigurationsdatei 3. Wir werden uns als Erstes mit der Konfiguration über die Kommandozeile beschäftigen. Beachten Sie dabei, dass Sie diese Methode auch verwenden können, um bestimmte Werte in der Konfigurationsdatei zu überschreiben. Allgemeine Syntax Der allgemeine Aufruf für die Konfiguration über die Kommandozeile lautet: Linux:~# sshd -Optionen Verfügbare Optionen Wir werden uns nun mit den verfügbaren Optionen für die Konfiguration des Servers beschäftigen. Tabelle 5.5 enthält alle Optionen und gibt zu jedem aufgeführten Punkt eine kurze Beschreibung. Option Beschreibung -b Bits Gibt die Anzahl der Bits im flüchtigen Serverschlüssel an. Der Defaultwert liegt bei 768 Bit. -d Hiermit initialisieren Sie den Debugmodus. Der Server wird viel Debugausgaben ausgeben und nicht im Hintergrund laufen. Er wird dabei nur eine Verbindung bearbeiten. Sie können den Level des Debugmodus erhöhen, indem Sie die Option mehrmals angeben. Das Maximum liegt bei dreimal. -e Wenn Sie diese Option angeben, wird der SSH-Server seine Ausgaben nach STDERR (standard error) anstatt zum Systemlog schicken. -f Konfigurationsdatei Sie können diese Option benutzen, um dem Server die Konfigurationsdatei zu übergeben. Er wird nicht starten, wenn Sie keine Konfigurationsdatei angelegt haben. Der Defaultwert liegt bei /etc/ssh/sshd_config. -g login_grace_time Mit dieser Option geben Sie an, wie viel Zeit (in Sekunden) einem Client zur Authentifizierung eines Users zur Verfügung steht. Falls er es nicht schafft, den User innerhalb der angegebenen Zeit zu authentifizieren, wird die Verbindung beendet. Tabelle 5.5 Verfügbare Optionen Sandini Bib 5.2 OpenSSH Option 265 Beschreibung Der Defaultwert liegt bei 600 Sekunden. Falls Sie kein Limit für die Authentifizierung setzen wollen, können Sie dies erreichen, indem Sie eine 0 angeben. -h host_key_Datei Mit dieser Option spezifizieren Sie die host_key_Datei, aus der der Hostschlüssel gelesen wird. Sie müssen diese Option angeben, falls der Server nicht als root läuft. Es ist weiter möglich, mehrere Dateien anzugeben (für verschiedene Protokollversionen und Hostschlüsselalgorithmen). -i Falls Sie wollen, dass Ihr SSH-Server unter dem Superserver (inetd) läuft, können Sie das durch diese Option erreichen. Sie sollten dabei aber beachten, dass es normalerweise besser ist, wenn der Server nicht unter inetd läuft, da er einen Serverschlüssel generieren muss. Clients müssten zu lange warten, wenn der Schlüssel jedes Mal neu generiert werden müsste. Sie könnten dieses Problem umgehen, indem Sie die Schlüsselgröße auf 512 begrenzen – dies geht dann aber zu Lasten der Sicherheit. -k key_gen_time Diese Option gibt an, wie oft der flüchtige Schlüssel eines Protokoll-1Servers neu generiert werden muss. Der Defaultwert liegt bei 3600 Sekunden. Wenn Sie den Wert 0 übergeben, so wird der Schlüssel niemals neu generiert. -p port Hiermit können Sie den Port, auf dem der Server lauschen soll, angeben. Normalerweise läuft der Server auf Port 22. -q Quiet mode. Falls Sie nicht wollen, dass der Server Ihr Systemlog füllt, können Sie das mit dieser Option erreichen. Falls Sie diese Option nicht angeben (empfehlenswert), werden der Beginn, die Authentifizierung und die Beendigung einer Verbindung geloggt. -u len Um die Größe des Feldes in der UTMP-Struktur, die den Namen des Remotehosts speichert, zu spezifizieren, können Sie diese Option verwenden. Falls der antwortende Rechner einen Namen hat, der länger ist als die von Ihnen hier angegebene Länge des Feldes, so wird die IPAdresse als Name verwendet. Dies hat zur Folge, dass auch Hosts mit sehr langen Namen immer noch eindeutig identifiziert werden können. Falls Sie nur IP-Adressen zur Identifizierung wünschen, können Sie dies erreichen, indem Sie -u0 angeben. -D Diese Option erlaubt es Ihnen, Ihren SSH-Server zu überprüfen. Falls Sie diese Option angeben, wird der Server nicht als Daemon laufen. -4 Es werden nur IPv4-Adressen verwendet. -6 Hiermit werden nur IPv6-Adressen verwendet. Tabelle 5.5 Verfügbare Optionen (Forts.) Sandini Bib 266 5 Verschlüsselung Konfiguration über die Konfigurationsdatei Nun werden wir uns mit der zweiten Konfigurationsmöglichkeit beschäftigen – der Konfigurationsdatei. Diese besteht aus Schlüsselwörtern, denen Sie bestimmte Werte oder Argumente zuweisen müssen. Kommentare läuten Sie durch das #-Zeichen ein. Verfügbare Schlüsselwörter Tabelle 5.6 stellt Ihnen die verfügbaren Schlüsselwörter vor und gibt zu jedem aufgeführten Punkt eine kleine Beschreibung. Schlüsselwort Beschreibung AFSTokenPassing Dieses Schlüsselwort gibt an, ob AFS Token zum Server weitergeleitet werden sollen oder nicht. Der Defaultwert steht auf »yes«. AllowGroups Hiermit können Sie den Login auf Mitglieder bestimmter Gruppen beschränken. Falls Sie mehrere Gruppen angeben wollen, können Sie die einzelnen Namen durch Leerzeichen trennen. Beachten Sie dabei aber, dass nur Gruppennamen erlaubt sind. Falls Sie die numerische Gruppen-ID angeben, wird diese nicht erkannt. Per Default ist keine Gruppe angegeben und der Login somit für jeden User möglich. Sie können ebenfalls die Wildcard »*« (all) und »?« (any) benutzen. AllowTcpForwarding Falls Sie TCP Forwarding verbieten wollen, müssen Sie diesem Schlüsselwort das Argument »no« übergeben. Hierbei gilt es aber zu beachten, dass das Verbieten von TCP Forwarding alleine die Sicherheit nicht erhöht, solange ein User Zugriff auf die Shell hat und dort somit seinen eigenen Forwarder installieren kann. Der Defaultwert ist »yes« und TCP Forwarding ist somit erlaubt. AllowUsers Diese Option erlaubt es Ihnen, den Login auf bestimmte User zu beschränken. Die User, die Sie diesem Schlüsselwort übergeben können Sie durch Leerzeichen trennen. User, die Sie nicht aufführen, haben keine Loginberechtigung. Beachten Sie, dass nur Usernamen erlaubt sind, falls Sie eine numerische User-ID angeben, wird diese nicht erkannt. Per Default ist kein User angegeben und der Login somit für jeden User möglich. Sie haben die Möglichkeit die Wildcard »*« (all) und »?« (any) zu benutzen. Banner Sie können diesem Schlüsselwort eine bestimmte Datei (zum Beispiel /etc/ssh/warning) übergeben, deren Inhalt dann vor jeder Authentifizierung an den betreffenden User geschickt wird. Sie sollten diese Option nutzen, da Sie danach rechtlich besser abgesichert sind. Diese Option ist allerdings nur für Protokollversion 2 verfügbar. Tabelle 5.6 Verfügbare Schlüsselwörter Sandini Bib 5.2 OpenSSH 267 Schlüsselwort Beschreibung ChallengeResponseAuthentication Gibt an, ob »Challenge Response Authentication« erlaubt ist oder nicht. Zurzeit gibt es nur Unterstützung für skey-Authentifizierung (werden wir im Verlauf dieses Kapitels noch genauer besprechen). Der Defaultwert ist »yes«. Ciphers Mit Hilfe dieser Option können Sie die erlaubten Cipher-Algorithmen für Protokoll 2 angeben. Falls Sie mehrere angeben wollen, müssen Sie diese mit einem Komma voneinander trennen. Der Defaultwert ist: »aes128-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, arcfour«. CheckMail Gibt an, ob der SSH Server überprüfen soll, ob neue Mails für interaktive Logins vorhanden sind. Der Defaultwert ist »no«. ClientAliveInterval Hiermit können Sie einen bestimmten Zeitraum (in Sekunden) angeben, in dem der Client keine Daten an den Server schicken muss. Hat er aber dieses Intervall überschritten, schickt der Server eine Nachricht zum Client, in der er eine Antwort vom Client erbittet. Falls Sie diesem Schlüsselwort den Wert 0 übergeben, so wird diese Nachricht niemals losgeschickt. Diese Option funktioniert nur unter Protokollversion 2. Beachten Sie aber bitte, dass diese Option völlig anders agiert als die Option Keepalive, welche weiter unten beschrieben wird. Die hier vorgestellte Option schickt die Nachrichten an den Client durch den verschlüsselten Sitzungskanal und macht es somit unmöglich, dass diese Nachrichten gefälscht werden. ClientAliveCountMax Sie können mit dieser Option angeben, wie viele Client-Alive-Messages (siehe vorhergehende Option) an den Client geschickt werden, ohne dass der Server eine Antwort erhält. Falls diese Schwelle überschritten wird, trennt der Server die Verbindung und beendet die Sitzung. Der Defaultwert ist 3. Falls Sie der ClientAliveInterval-Option den Wert 15 übergeben und den Wert dieser Option auf 3 lassen, so wird ein Client, der nicht antwortet, nach ca. 45 Sekunden vom Server getrennt. DenyGroups Sie können dieser Option Gruppennamen übergeben, deren Mitglieder sich danach nicht mehr am SSH-Server einloggen dürfen. Falls Sie mehrere Gruppennamen übergeben wollen, können Sie die einzelnen Einträge durch Leerzeichen voneinander trennen. Beachten Sie dabei aber bitte, dass Sie nur Gruppennamen übergeben dürfen, falls Sie eine numerische Gruppen-ID übergeben, wird diese nicht erkannt. Per Default ist keine Gruppenbeschränkung angegeben. DenyUser Auch hierbei können Sie bestimmten Usern den Login auf Ihrem SSHServer verbieten. Falls Sie mehrere User angeben wollen, können Sie die einzelnen Namen durch Leerzeichen voneinander trennen. BeachTabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 268 Schlüsselwort 5 Verschlüsselung Beschreibung ten Sie dabei aber bitte, dass Sie nur Usernamen angeben dürfen, falls Sie eine numerische User-ID übergeben, wird diese nicht erkannt. Per Default darf sich jeder User anmelden. GatewayPorts Gibt an, ob sich Remotehosts auf Ports, die vom Client weitergeleitet werden, verbinden dürfen. Der Defaultwert liegt bei »no«. HostbasedAuthentication Gibt an, ob rhosts oder /etc/hosts.equiv-Authentifizierung zusammen mit erfolgreicher Public Key Client Hostauthentifizierung erlaubt ist (hostbased Authentication). Diese Option ist gleichbedeutend mit der Option RhostsRSAAuthentication und benötigt Protokollversion 2. Der Defaultwert ist »no«. HostKey Dieser Option können Sie die Datei übergeben, welche die privaten Hostschlüssel, die von SSH Protokoll 1 und 2 genützt werden, enthält. Beachten Sie dabei aber, dass der Server eine Datei, die von der Gruppe World (also von jedermann) eingesehen werden kann, ablehnen wird. Sie können dabei auch mehrere Dateien angeben. RSA1 Schlüssel werden von Protokollversion 1 genutzt, wohingegen DSA und RSA von Protokollversion 2 genutzt werden. Der Defaultwert liegt bei /etc/ssh/ssh_host_key. IgnoreRhosts Falls Sie dieser Option den Wert »yes« übergeben, werden .rhostsund .shosts-Dateien nicht für RhostsAuthentication, RhostsRSAAuthentication oder HostbasedAuthentication benutzt. /etc/hosts.equiv und /etc/ssh/shosts.equiv werden weiterhin genutzt. Der Defaultwert ist »yes«. IgnoreUserKnownHosts Durch Verwendung dieser Option geben Sie an, ob die User Known Hosts in $HOME/.ssh/known_hosts während einer RhostsRSAAuthentication oder HostbasedAuthentication ignoriert werden sollen. Der Defaultwert ist »no«. KeepAlive Hiermit geben Sie an, ob KeepAlive-Nachrichten zur nicht antwortenden Seite geschickt werden sollen. Falls diese Nachrichten geschickt werden, werden Sie eine Meldung bekommen, ob ein Rechner abgestürzt ist oder die Verbindung getrennt wurde. Dies heißt aber auch, dass die Verbindung beendet wird, falls die Route zur nicht antwortenden Seite (Server oder Client) zeitweise nicht verfügbar ist. Andererseits verhindern Sie damit, dass Sitzungen unendlich lange auf dem Server »hängen bleiben«, während die Verbindung schon lange zu Ende ist. Dies kann Ihnen eine Menge Ressourcen sparen. Beachten Sie dabei aber, dass diese Nachrichten nicht durch den verschlüsselten Kanal geschickt werden und somit leicht gefälscht werden können. Tabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 5.2 OpenSSH Schlüsselwort 269 Beschreibung Der Defaultwert ist »yes« (das heißt, Keepalive-Nachrichten werden verschickt). Falls Sie das Versenden dieser Nachrichten verhindern wollen, sollten Sie in der Server- und der Client-Konfigurationsdatei den Wert »no« übergeben. KerberosAuthentication Mit diesem Schlüsselwort spezifizieren Sie, ob Kerberos-Authentifizierung erlaubt ist oder nicht. Diese Authentifizierung kann in Form eines Kerberos-Tickets oder, wenn PasswordAuthentication den Wert »yes« gesetzt hat, in Form eines Passworts, das durch Kerberos KDC überprüft wird, stattfinden. Damit Sie diese Option nutzen können, braucht der Server eine »servtab«, die die Verifizierung von KDC-Identitäten erlaubt. Der Defaultwert ist auf »yes« gesetzt. KerberosOrLocalPassword Wenn die Passwortauthentifizierung durch Kerberos fehlgeschlagen ist, können Sie mit Hilfe dieser Option eine Überprüfung durch einen zusätzlichen Mechanismus wie /etc/passwd erreichen. KerberosTgtPassing Gibt an, ob ein Kerberos TGT zum Server weitergeleitet werden soll Per Default ist die Option auf »yes« gesetzt. Der Defaultwert ist »no«. Beachten Sie, dass diese Option nur funktioniert, wenn der Kerberos KDV ein AFS kaserver ist. KerberosTicketCleanup Dieses Schlüsselwort bestimmt, ob die Benutzerticketcachedatei nach einem Logout gelöscht werden soll. Der Defaultwert ist »yes«. KeyRegenerationInterval Hierbei geben Sie an nach wie vielen Sekunden der in Protokoll 1 genutzte flüchtige Schlüssel regeneriert werden soll. Falls Sie an dieser Stelle den Wert 0 übergeben, wird der Schlüssel niemals regeneriert. Der Defaultwert liegt bei 3600 (Sekunden). ListenAddress Hiermit spezifizieren Sie die lokale Adresse, auf der der SSH-Server lauschen soll. Sie können die folgenden Formate benutzen: ListenAddress host | IPv4_addr | IPv6_addr ListenAddress host | IPv4_addr : Port ListenAddress [host|IPv6_addr] : Port Per Default lauscht der Server auf allen lokalen Adressen. Sie können auch mehrere Adressen angeben. Falls Sie keinen Port angeben, wird der Port, den Sie dem Schlüsselwort Port (wird weiter unten besprochen) übergeben haben, verwendet. LoginGraceTime Dieses Schlüsselwort spezifiziert, nach welchem Zeitintervall der User getrennt wird, falls er sich nicht erfolgreich einloggen konnte. Um kein solches Limit anzugeben, übergeben Sie der Option den Wert 0. Per Default wird der User nach 600 Sekunden getrennt. Tabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 270 5 Verschlüsselung Schlüsselwort Beschreibung LogLevel Mit dieser Option können Sie das Log Level des SSH Servers spezifizieren. Mögliche Werte hierfür sind: QUIET FATAL ERROR INFO VERBOSE DEBUG Beachten Sie dabei aber bitte, dass das Argument DEBUG die Privatsphäre des Benutzers verletzen könnte und daher nur in gerechtfertigten Situationen eingesetzt werden sollte. Per Default ist das Log Level INFO. MACs Spezifiziert die verfügbaren MAC (Message Authentication Code)Algorithmen, die unter Protokollversion 2 benutzt werden, um die Integrität von Daten zu schützen. Falls Sie mehrere Algorithmen angeben wollen, müssen Sie die einzelnen Argumente durch Kommas voneinander trennen. Der Defaultwert ist: »hmac-md5, hmac-sha1, hmac-ripemd160, hmacripemd160@openssh.com, hmac-sha1-96, hmac-md5-96« MaxStartups Hiermit können Sie die maximale Anzahl von noch nicht authentifizierten Verbindungen zum SSH-Server spezifizieren. Falls nach dem Erreichen des hier angegebenen Limits weiter Verbindungsanfragen von Clients durchgeführt werden, werden diese abgelehnt, bis eine Verbindung authentifiziert wurde oder die LoginGraceTime für eine Verbindung abgelaufen ist. Der Defaultwert liegt bei 10. Es gibt dafür aber noch eine zweite Möglichkeit, bei der die Verbindungsanfragen nach dem Erreichen des Limits zufällig abgelehnt werden. Die Syntax hierfür lautet: start:rate:full (zum Beispiel 10:50:30) Der Platzhalter start gibt das Limit für nicht authentifizierte Verbindungen an (10). Rate beschreibt die Wahrscheinlichkeit, dass eine Verbindungsanfrage abgelehnt wird (50%). Falls die Zahl, die Sie dem Platzhalter full übergeben haben, erreicht wird (60), werden alle Verbindungsanfragen abgelehnt. PAMAuthenticationViaKbdInt Gibt an, ob PAM Challenge Response Authentication erlaubt ist oder nicht. Falls ja, wird es dadurch ermöglicht, die meisten PAM Challenge Response Authentication-Module zu benutzen. Weiter wird aber auch die Passwort-Authentifikation erlaubt, egal ob die Option PasswordAuthentication aktiviert oder deaktiviert ist. Der Defaultwert ist »no«. Tabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 5.2 OpenSSH 271 Schlüsselwort Beschreibung PasswordAuthentication Mit Hilfe dieses Schlüsselwortes können Sie angeben, ob PasswortAuthentifizierung erlaubt sein soll oder nicht. Der Defaultwert ist »yes«. PermitEmptyPasswords Falls Sie die vorhergegangene Option PasswordAuthentication aktivieren, können Sie mit dieser Option hier angeben, ob es dem User erlaubt ist, sich in Accounts einzuloggen, die nur mit einem leeren Passwort geschützt sind. PermitRootLogin Sie können mit dieser Option angeben, ob sich der Superuser (root) mit Hilfe des SSH-Clients an Ihrem SSH-Server einloggen darf. Mögliche Werte für dieses Schlüsselwort sind: Der Defaultwert ist »no«. yes no without-password forced-commands-only Der Defaultwert ist »yes«. Falls Sie das Argument »without-password« übergeben, wird die Passwortauthentifizierung für den Superuser deaktiviert. Falls Sie das Argument »forced-commands-only« übergeben, darf sich der Superuser via Public Key-Authentifizierung einloggen, aber nur wenn die Option command spezifiziert wurde. Alle anderen Authentifizierungsmethoden werden deaktiviert. PidFile Diese Option erlaubt es Ihnen, die Datei, die den Process Identifier Ihres SSH-Servers enthält, zu spezifizieren. Der Defaultwert liegt bei »/var/run/sshd.pid«. Port Gibt die Portnummer an, auf der der Server lauscht. Sie können auch mehrere Ports angeben PrintLastLog Falls Sie diesem Schlüsselwort das Argument »yes« übergeben, zeigt der SSH Server das Datum und die Zeit des letzten erfolgreichen Logins eines Users. Der Defaultport ist 22. Der Defaultwert ist »yes«. PrintMotd Gibt an, ob der SSH Server die Datei /etc/motd ausgeben soll, wenn sich ein User interaktiv einloggt Der Defaultwert ist »yes«. Protocol Gibt die Version des Protokolls an, die der SSH-Server benutzen soll. Verfügbare Protokollversionen sind 1 und 2. Sie können auch beide Versionen angeben. Dann müssen Sie diese aber durch ein Komma voneinander trennen. Der Defaultwert liegt bei »2,1«. Tabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 272 5 Verschlüsselung Schlüsselwort Beschreibung PubkeyAuthentication Hiermit können Sie Public-Key-Authentication erlauben. Beachten Sie dabei aber, dass dies nur von Protokoll 2 unterstützt wird. Der Defaultwert liegt bei »yes«. ReverseMappingCheck Diese Option stellt eine Art »kleinen Spoofingschutz« des SSH-Servers dar, da es ihn mit diesem Schlüsselwort dazu anweist, den Namen des Remotehosts und die dazugehörige IP-Adresse zu verifizieren, indem es überprüft, ob Antwortpakete zu derselben IP zurückgehen. Der Defaultwert ist »no«. RhostsRSAAuthentication Gibt an, ob rhosts- oder /etc/hosts.equiv-Authentifizierung zusammen mit erfolgreicher RSA Host-Authentifizierung erlaubt ist. Der Defaultwert ist »no«. Diese Option bezieht sich nur auf Protokoll 1. RSAAuthentication Gibt an, ob reine RSA-Authentifizierung erlaubt ist. Der Defaultwert ist »yes«. Diese Option bezieht sich nur auf Protokoll 1. ServerKeyBits Hierbei können Sie die Anzahl der Bits im flüchtigen Serverschlüssel des Protokoll Version 1 definieren. Die minimale Anzahl beläuft sich auf 512 Bit. Per Default besteht dieser Key aus 768 Bit. StrictModes Mit Hilfe dieser Option können Sie Ihren SSH-Server anweisen, den Modus und den Ownership der Dateien und des Homeverzeichnisses des Users, der sich einloggen will, zu überprüfen. Der Defaultwert hierfür ist »yes«. Subsystem Dieses Schlüsselwort konfiguriert ein externes Subsystem (wie zum Beispiel den File Transfer Daemon – FTPD). So implementiert zum Beispiel das Argument »stfp-server« den »sftp« File Transfer Server als Subsystem. Per Default werden keine Subsysteme gestartet. Beachten Sie bitte, dass sich dieses Schlüsselwort auf die Benutzung des Protokolls Version 2 bezieht. SyslogFacility Hiermit können Sie den Facility Code für Logging-Nachrichten angeben. Mögliche Werte für dieses Argument sind: DAEMON USER AUTH LOCAL0 LOCAL1 LOCAL2 LOCAL3 LOCAL4 Tabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 5.2 OpenSSH Schlüsselwort 273 Beschreibung LOCAL5 LOCAL6 LOCAL7 Der Defauftwert ist AUTH. UseLogin Sie können mit dieser Option festlegen, ob das Prgramm login für interaktive Sitzungen verwendet werden soll oder nicht. Bedenken Sie, dass login niemals für die Ausführung von Remotebefehlen benutzt wird. X11DisplayOffset Sie können hiermit die erste für Ihren SSH-Server verfügbare Displaynummer für X11 Forwarding spezifizieren. Damit wird gewährleistet, dass der SSH Server die »wirklichen« X11-Server nicht stört. X11Forwarding Gibt an, ob X11 Forwarding erlaubt ist. Wenn Sie dieses Feature verbieten, heißt das noch lange nicht, dass kein X11 Forwarding stattfindet, da jeder User sein eigenes Forwardingtool installieren kann. XauthLocation Gibt an, wo sich das Programm xauth befindet Der Defaultwert ist »no«. Der Defaultwert liegt bei 10. Der Defaultwert ist »no«. Der Defaultwert ist /usr/X11R6/xauth. Tabelle 5.6 Verfügbare Schlüsselwörter (Forts.) Beispielkonfigurationsdatei Da wir nun alle verfügbaren Schlüsselwörter für die Serverkonfigurationsdatei kennen und verstehen gelernt haben, sollten wir einen Blick auf eine Beispielkonfigurationsdatei werfen. # $OpenBSD: sshd_config, v 1.38 2001/04/15 21:41:29 deraadt Exp $ # This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin # This is the sshd server system-wide configuration file. See sshd(8) # for more information. Port 22 Protocol 1,2 ListenAddress 209.100.190.116 HostKey /etc/ssh/ssh_host_key HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key ServerKeyBits 1024 LoginGraceTime 500 KeyRegenerationInterval 7200 PermitRootLogin no IgnoreRhosts yes Sandini Bib 274 5 Verschlüsselung StrictModes yes X11Forwarding no X11DislpayOffset 10 PrintMotd yes PrintLastLog yes KeepAlive no # # Loggingeinstellungen # SyslogFacility AUTH LogLevel INFO # # Ende Loggineinstellungen # RhostsAuthentication no RhostsRSAAuthentication no HostbasedAuthentication no RSAAuthentication yes PasswordAuthentication yes PermitEmptyPasswords no ChallengeResponseAuthentication no KerberosAuthentication no KerberosOrLocalPasswd yes AFSTokenPassing no KerberosTicketCleanup no CheckMail yes UseLogin no MaxStartups 20:50:100 Banner /etc/ssh/banner ReverseMappingCheck yes Subsystemsftp/usr/lib/ssh/sftp-server Wir werden nun nicht auf die einzelnen Schlüsselwörter eingehen, da diese bereits ausführlich besprochen worden sind. 5.2.3 Wichtige Dateien Sicherlich haben Sie bemerkt, dass ich bei der Besprechung der Serverkonfigurationsdatei jede Menge anderer Dateien erwähnt habe, die für den erfolgreichen Betrieb einer SSH-Umgebung ebenfalls wichtig sind. Wir werden uns nun einige der wichtigsten Dateien etwas genauer anschauen. Die Dateien, deren Syntax nicht zu wichtig ist, werden wir kürzer besprechen. Sandini Bib 5.2 OpenSSH 275 AUTHORIZED_KEYS Diese Datei enthält alle RSA-Schlüssel, die für RSA-Authentifizierung unter Protokoll Version 1 benutzt werden dürfen. Standardmäßig lautet die Adresse dieser Datei: $HOME/.ssh/authorized_keys Unter Protokoll Version 2 enthält diese Datei alle RSA- und DSA-Schlüssel, die für Public Key-Authentifizierung benutzt werden dürfen. Sie ist unter folgendem Namen zu finden: $HOME/.ssh/authorized_keys2 Formatierung An dieser Stelle werden wir kurz die Formatierung dieser Datei besprechen und die verfügbaren Optionen dazu kennen lernen. Jede Zeile in dieser Datei hat einen Schlüssel. Falls es sich bei einem Schlüssel um einen RSA Public Key handelt, so besteht diese Zeile aus folgenden Feldern, welche durch Leerzeichen voneinander getrennt sind: options bits exponent modulus comment Jeder Public Key unter Protokoll Version 2 besteht wiederum aus diesen Feldern: options keytype base64 encoded key comment Die »options«-Felder sind dabei optional. Ob sie erscheinen hängt davon ab, ob eine Zeile mit einer Zahl beginnt oder nicht (»options«-Felder beginnen niemals mit einer Zahl). Die Felder »bits«, »exponent«, »modulus« und »comment« ergeben den RSA-Schlüssel für Protokoll Version 1. Im Falle von Protokoll Version 2 kann das Feld »keytype« die beiden folgenden Werte annehmen: 1. ssh-dss 2. ssh-rsa Sandini Bib 276 5 Verschlüsselung 3. Beachten Sie dabei aber bitte die Größe und Länge dieser Zeilen. Da die benutzten RSA »key modulus« sehr groß sind, sind die einzelnen Zeilen in dieser Datei mehrere hundert Bytes lang. Weil es schier unmöglich ist, diese gewaltige Menge an Zeichen abzutippen, sollten Sie folgende Dateien editieren und die gewünschten Einträge in die authorized_key-Datei übertragen: identity.pub id_dsa.pub id_rsa.pub Falls die erwähnten »options«-Felder vorhanden sind, bestehen Sie aus Optionsspezifikationen, die durch Kommas voneinander abgetrennt sein. Welche Optionsspezifikationen dabei zur Verfügung stehen, können Sie Tabelle 5.7 entnehmen. Optionsspezifikation Beschreibung from=»Patternliste« Gibt an, dass zusätzlich zur RSA-Authentifizierung der kanonische Name des Remotehosts in einer durch Kommas getrennten Liste von Pattern vorhanden sein muss. Sie können dabei auch die Wildcards »*« (all) und »?« (any) benutzen. Diese Liste kann ebenfalls negierte Pattern erhalten (Eine Negierung erreichen Sie, indem Sie »!« vor den Pattern stellen.). Falls der kanonische Hostname auf ein negiertes Pattern zutrifft, wird der betreffende Schlüssel nicht akzeptiert. Damit wird es für einen Cracker, der einen akzeptierten Schlüssel gestohlen hat, schwieriger, diesen einzusetzen, da die Rechner (bzw. die Rechnernamen), die den Schlüssel benutzen dürfen, durch die eben vorgestellte Liste begrenzt werden können. Command=»Befehl« Hiermit geben Sie an, dass der von Ihnen spezifizierte Befehl jedes Mal ausgeführt wird, wenn der Schlüssel für eine Authentifizierung genutzt wird. Falls der User einen Befehl übergibt, wird dieser ignoriert. Wenn die Verbindung einen pty verlangt, wird der Befehl dort ausgeführt. Andernfalls wird er ohne tty ausgeführt. Falls Sie jedoch einen sauberen 8 Bit Kanal wünschen, dürfen Sie einen pty verlangen oder sollten no-pty spezifizieren. Sie können auch Anführungszeichen in Ihren Befehl einbauen, wenn Sie diese mit einem Backslash anführen. Sie können diese Option nutzen, um RSA- Schlüssel davon abzuhalten, bestimmte Operationen durchzuführen. Environment= »NAME=Wert« Falls sich ein User mit Hilfe des betreffenden Schlüssels einloggt, wird der hier angegebene String seiner ENV hinzugefügt. Beachten Sie hierbei aber, dass die durch diese Option spezifizierten Variablen die Defaultvariablen der ENV überschreiben. Tabelle 5.7 Verfügbare Optionsspezifikationen Sandini Bib 5.2 OpenSSH 277 Optionsspezifikation Beschreibung no-port-forwarding Diese Option verbietet TCP/IP-Weiterleitung, falls der betreffende Schlüssel für die Authentifizierung genutzt wurde. Jede Weiterleitungsanfrage des Clients wird mit einer Fehlermeldung beantwortet. no-X11-forwarding Hierbei wird X11-Weiterleitung verboten, falls der betreffende Schlüssel für die Authentifizierung genutzt wurde. Auch hier erhält der Client einer Fehlermeldung. no-agent-forwarding Falls der betreffende Schlüssel für die Authentifizierung genutzt wurde, wird »authentication agent« Weiterleitung untersagt. no-pty Mit dieser Option verhindern Sie, dass dem User ein tty zugewiesen wird. Permitopen=»Host:Port« Hiermit können Sie lokale Portweiterleitung (ssh -L) so weit limitieren, dass nur noch zum angegebenen Host und dem spezifizierten Port eine Verbindung aufgebaut werden kann. Falls Sie diese Option mehrmals aufführen möchten, müssen Sie die einzelnen Einträge durch Kommas voneinander trennen. Tabelle 5.7 Verfügbare Optionsspezifikationen (Forts.) SSH_KNOWN_HOSTS In folgenden Dateien finden Sie Informationen über die öffentlichen Schlüssel der bekannten Hosts: /etc/ssh/ssh_known_hosts (Protokoll Version 1) /etc/ssh/ssh_known_hosts2 (Protokoll Version 2) $HOME/.ssh/known_hosts (Protokoll Version 1) $HOME/.ssh/known_hosts2 (Protokoll Version 2) Formatierung Jede Zeile in einer dieser Dateien enthält folgende Felder: hostnames bits exponent modulus comment Diese Felder werden durch Kommas voneinander getrennt. Das Feld »hostnames« besteht aus einer Liste von Pattern, die durch Kommas voneinander abgetrennt werden. Jedes aufgeführte Pattern trifft abwechselnd auf den kanonischen Hostnamen (wenn ein Client authentifiziert wird) oder auf einen vom User angegebenen Namen (wenn ein Server authentifiziert wird). Sie können für die Pattern die Wildcards »*« (all) und »?« (any) benutzen oder sie Sandini Bib 278 5 Verschlüsselung durch Voranstellen des !-Operators negieren. Falls ein Hostname auf ein negiertes Pattern zutrifft, wird dieses von der betreffenden Zeile nicht akzeptiert. Die Felder »bits«, »exponent« und »modulus« werden direkt aus dem RSA-Hostschlüssel entnommen. Das optionale Feld »comment« wird nicht benutzt. Wenn die Authentifizierung durchgeführt wird, wird die Authentifizierung akzeptiert, sobald eine zutreffende Zeile einen passenden Schlüssel aufweist. Daher ist es zulässig (aber nicht empfehlenswert), mehrere Zeilen oder unterschiedliche Hostschlüssel für denselben Namen zu haben. Dies wird unvermeidlich geschehen, falls Sie die Kurzform von verschiedenen Hostnamen aus verschiedenen Domänen in dieselbe Datei stecken. 5.2.4 Alle Dateien Nachdem wir nun die zwei »wichtigsten« Dateien besprochen haben, werden wir im Folgenden eine Art Referenz für alle Dateien schaffen. Wir werden dabei nicht zu tief in die Syntax der jeweiligen Files eingehen, sondern lediglich kurz die wichtigsten Informationen darüber beschreiben. In dieser Referenz finden Sie alle Dateien wieder. Auch diejenigen, die wir bereits ausführlich besprochen haben. /etc/ssh/sshd_config Dies ist die Serverkonfigurationsdatei. Diese Datei sollte nur für den Superuser beschreibbar sein. /etc/ssh/ssh_host_key, ssh_host_dsa_key, ssh_host_rsa_key In diesen Dateien befindet sich der private Teil der Hostschlüssel. Sie sollten Eigentum des Superusers sein, der auch der Einzige sein sollte, der diese Dateien lesen darf. /etc/ssh/ssh_host_key.pub, ssh_host_dsa_key.pub, ssh_host_rsa_key.pub Der öffentliche Teil der Hostschlüssel befindet sich in diesen Dateien. Sie sollten von jedermann eingesehen, aber nur vom Superuser geändert werden dürfen. Die Inhalte sollten auf die entsprechenden privaten Teile passen. Sie können diese Dateien mit dem Programm ssh-keygen generieren, das wir noch ausführlich besprechen werden. /etc/ssh/primes Diese Datei enthält »Diffie-Hellman«-Gruppen, welche für den »Diffie-Hellman Group Exchange« benötigt werden. Sandini Bib 5.2 OpenSSH 279 /var/run/sshd.pid In dieser Datei befindet sich die Process ID (PID) des als letzten gestarteten SSH Servers. $HOME/.ssh/authorized_keys Die RSA-Schlüssel, die ein User zum Einloggen in seinen Account benutzten kann, befinden sich in dieser Datei. Sie sollte nur vom Superuser eingesehen werden dürfen. $HOME/.ssh/authorized_keys2 Diese Datei listet die öffentlichen Schlüssel (RSA und DSA) auf, die zum Einloggen in einen Useraccount benutzt werden können. Auch dieses File sollte nur vom Superuser eingesehen werden dürfen. /etc/ssh/ssh_known_hosts, $HOME/.ssh/known_hosts Diese Dateien werden befragt, wenn rhosts zusammen mit RSA Hostauthentifizierung benutzt wird, um den öffentlichen Schlüssel eines Hosts zu überprüfen. Der Schlüssel muss in einer dieser Dateien aufgelistet sein, ansonsten wird er nicht akzeptiert. Der Client benutzt dieselben Dateien, um sicherzugehen, dass er sich mit dem richten Remotehost verbindet. Diese Dateien sollten nur vom Superuser verändert werden dürfen. /etc/ssh/ssh_known_hosts2, $HOME/.ssh/known_hosts2 Diese Dateien werden befragt, wenn Protokoll Version 2 hostbasierende Authentifizierung genutzt wird, um den öffentlichen Schlüssel eines Host zu überprüfen. Der Schlüssel muss in einer dieser Dateien aufgelistet sein, ansonsten wird er nicht akzeptiert. Der Client benutzt dieselben Dateien, um sicherzugehen, dass er sich mit dem richtigen Remotehost verbindet. Diese Dateien sollten nur vom Superuser verändert werden dürfen. /etc/nologin Falls diese Datei existiert, ist es nur dem User Root erlaubt, sich einzuloggen. Alle Verbindungsanfragen, die nicht vom Superuser gestellt werden, werden abgelehnt. dabei bekommt jeder, der sich einzuloggen versucht, den Inhalt dieser Datei angezeigt. /etc/hosts.allow, /etc/hosts.deny Wenn Ihr Server mit LIBWRAP-Unterstützung erstellt wurde, können Sie die TCP Wrapper Zugriffskontrollen in diesen Dateien definieren. $HOME/.rhosts Diese Datei enthält in jeder Zeile genau ein »Host-Username« Paar, die durch Kommas voneinander getrennt ist. Der User, der in diesem Paar erwähnt wird, darf sich Sandini Bib 280 5 Verschlüsselung an dem angegebenen Host ohne Passwort anmelden. Diese Datei wird auch von den Servern rlogind und rshd genutzt. Sie können auch netgroups definieren. Entweder der Host- oder der Username können durch ein »+@Gruppenname« angegeben werden, um alle Hosts oder alle User in einer Gruppe zu spezifizieren. $HOME/.shosts Diese Datei ist das SSH-Gegenstück zu $HOME/.rhosts, wird aber nicht von den Servern rlogind und rshd genutzt. Falls Sie diese Datei also benutzen, ist ein Zugriff nur via SSH möglich. /etc/hosts.equiv Dieses File wird während einer .rhosts-Authentifizierung genutzt. Im einfachsten Fall enthält sie lediglich einen Hostnamen pro Zeile. Die User auf einem der aufgeführten Rechner dürfen Sie ohne Passwort einloggen, falls Sie auch User auf dem Remotesystem sind. Dieser Hostname kann aber auch von einem Benutzernamen gefolgt werden. Solche Benutzer haben das Recht, sich unter jedem Usernamen (außer root) auf dem Remotesystem einzuloggen. Sie können mit der Syntax +@group auch netgroups definieren. Um Einträge zu negieren, können Sie den Operator »-« benutzen. Bedenken Sie aber dabei, dass es sehr gefährlich sein kann, wenn Sie einen Usernamen in dieser Datei aufführen, da sich dieser – wie bereits erwähnt – unter jedem Benutzernamen anmelden kann. /etc/ssh/shosts.equiv Diese Datei funktioniert nach demselben Prinzip wie /etc/hosts.equiv mit dem Unterschied, dass hierbei rsh-, rlogin- und ssh-Logins betroffen sind. $HOME/.ssh/environment Falls diese Datei existiert, werden die Einträge (NAME=Wert) in die ENV übernommen. Diese Einträge überschreiben bereits vorhandene Umgebungsvariablen. $HOME/.ssh/rc Wenn diese Datei existiert, werden die darin aufgeführten Syntaxzeilen von der Shell /bin/sh ausgeführt. Dies geschieht, nachdem die Umgebungsvariablen gelesen wurden, aber bevor die Shell des Benutzers gestartet wird. Die Hauptaufgabe dieses Files ist es, Startroutinen, die laufen müssen, bevor das Homeverzeichnis des Users zugänglich ist, auszuführen. Ein Beispiel für die Einträge dieser Datei finden wir in dem Manual: if read proto cookie; then echo add $DISPLAY $proto $cookie | xauth -q fi Sandini Bib 5.2 OpenSSH 281 Falls diese Datei nicht existiert, wird stattdessen das File /etc/ssh/sshrc ausgeführt. Wenn auch diese Datei nicht verfügbar ist, wird xauth benutzt, um den Cookie zu speichern. /etc/ssh/sshrc Diese Datei wird ausgeführt, falls die Datei $HOME/.ssh/rc nicht verfügbar ist, und kann benutzt werden, um globale Startroutinen zu definieren. 5.2.5 Der Client Nachdem wir den SSH-Server nun ausführlich besprochen haben und damit in der Lage sind, einen sicheren Loginserver zu installieren, sollten wir uns den Client dazu näher anschauen. Der Client ermöglicht es, sich in einem Remotesystem, auf dem ein SSH Server läuft, einzuloggen und dort Befehle auszuführen. Falls Sie die Wahl haben, sollten Sie diesen Client auf jeden Fall Programmen wie rsh und rlogin vorziehen, da die Verbindungen über SSH über einen sicheren, verschlüsselten Kanal laufen. Obwohl wir die grundsätzlichen Abläufe bei einem Login bereits ausführlich besprochen haben, sollten wir einen Blick auf die Geschehnisse nach dem erfolgreichen Login anschauen. Sitzung Nachdem der Benutzer seine Identität gegenüber dem Client bewiesen und der Server den User akzeptiert hat, führt der Server entweder den übergebenen Befehl aus oder gibt dem Benutzer eine normale Shell. Falls der User einen pty (Pseudo-Terminal) zugewiesen bekommen hat, hat er die Möglichkeit so genannte Escape Characters zu benutzen. Falls aber kein pty zugewiesen wurde, ist die Sitzung transparent und kann zur zuverlässigen Übertragung von binären Daten dienen. Sie haben aber auch die Möglichkeit durch das Setzen des Escape Characters »none« eine transparente Sitzung zu erzeugen, obwohl Sie einen Terminal zugewiesen bekommen haben. Escape Characters Wie wir bereits gesehen haben, können Sie eine Vielzahl an Funktionen benutzen, falls Sie einen Pseudo-Terminal zugewiesen bekommen haben. Diese Funktionen können Sie über die Escape Characters ansprechen, welche Sie mit einer Tilde (~) einleiten. Falls Sie die Funktionen der Tilde wie bei einer lokalen Shell nutzen wollen, können Sie dies erreichen, indem Sie die Tilde doppelt aufführen (~~). Wie wir im Laufe dieses Kapitels noch erfahren werden, können Sie diese Escape Characters in der Konfigurationsdatei oder durch die Option -e ändern. Tabelle Sandini Bib 282 5 Verschlüsselung 5.8 listet alle verfügbaren Standard-Escapes auf und gibt Ihnen zu jedem Punkt eine kurze Beschreibung. Escape Character Beschreibung ~. Verbindung trennen ~^Z Hintergrund SSH ~# Listet die weitergeleiteten Verbindungen auf ~& Hintergrund SSH bei einem Logout, wenn auf weitergeleitete Verbindungen oder zu beendende X11-Sitzungen gewartet wird (Protokoll Version 1) ~? Gibt eine Liste von verfügbaren »Escape Characters« aus ~R Erbittet eine Rejustierung der Verbindung Tabelle 5.8 Verfügbare »Escape Characters« X11- und TCP-Weiterleitungen Wenn der Benutzer X11 benutzt, wird die Verbindung zur X11-Anzeige automatisch zum Remotesystem weitergeleitet, so dass alle X11-Programme, die von der Shell oder über einen Befehl gestartet werden, durch den verschlüsselten Kanal gehen. Die Verbindungen zum echten X-Server werden dabei vom lokalen System initialisiert und verwirklicht. Sie können diese Weiterleitungen in der Konfigurationsdatei und über einen Befehl konfigurieren. Server-Authentifizierung Obwohl wir die Authentifizierung schon ausführlich besprochen haben, möchte ich nochmals kurz darauf eingehen. SSH verfügt über eine Datenbank, die Informationen zur Identifizierung alle bekannten Rechner enthält. In welchen Files diese Informationen untergebracht sind, werden Sie im Folgenden erfahren, falls Sie mehr Informationen über die einzelnen Dateien wünschen, werfen Sie einen Blick auf den bereits besprochenen Abschnitt »Wichtige Dateien«. $HOME/.ssh/known_hosts, $HOME/.ssh/known_hosts2 Diese Dateien enthalten Informationen über die RSA-Hostschlüssel. Informationen, die für Protokoll Version 1 interessant sind, werden in der Datei known_hosts gespeichert, wohingegen Informationen zu Protokoll Version 2 in dem File known_hosts2 zu finden sind. /etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2 Falls SSH die benötigten Daten in den vorhergehenden Dateien nicht finden kann, werden diese (globalen) Files zusätzlich überprüft. Wobei alle neuen Hosts automatisch zu den benutzerspezifischen Dateien hinzugefügt werden. Sandini Bib 5.2 OpenSSH 283 Falls sich die Identifikation eines Hosts jemals ändert, erhält der Benutzer darüber eine Meldung. Außerdem wird die Passwort-Authentifizierung deaktiviert, damit das Benutzerkennwort nicht von einem Trojanischen Pferd abgefangen werden kann. Aufruf Der allgemeine Aufruf des SSH-Clients erfolgt über folgenden Befehl: Linux:~# ssh [Optionen] [Hostname | User@Hostname] [Befehl] Die Optionen zu diesem Befehl werden Sie im folgenden Abschnitt kennen lernen. Optionen Der SSH-Client ist ein sehr komplexes und umfangreiches Tool. Um die Features dieses Programms voll ausschöpfen zu können, sollten Sie alle verfügbaren Optionen kennen. Tabelle 5.9 listet alle verfügbaren Optionen auf und gibt Ihnen eine kurze Beschreibung zu jeder aufgeführten Option. Option Beschreibung -a Hiermit verhindern Sie, dass die Verbindung des »Authentication Agent« weitergeleitet wird. -A Diese Option aktiviert die Weiterleitung des »Authentication Agent«. -c blowfish | 3des Spezifiziert den Cipher-Algorithmus, der für die Verschlüsselung der Sitzung benutzt werden soll. 3des (triple-des) gilt als sicher und benutzt drei verschiedene Schlüssel. blowfish ist ebenfalls ein sehr sichere Algorithmus, aber wesentlich schneller als triple-des. Per Default wird der triple-des-Algorithmus verwendet. -c cipher-spec Zusätzlich können Sie unter Protokoll Version 2 eine Liste von CipherAlgorithmen übergeben. Dabei müssen Sie die einzelnen Felder durch Kommas voneinander trennen. -e ch | ^ch | none Hiermit können Sie den »Escape Character« setzen (Default: »~«). Dieser wird nur erkannt, wenn er am Anfang der Zeile übergeben wird. Falls Sie »none« übergeben, wird die Sitzung transparent. -f Diese Option bittet SSH kurz vor der Ausführung des Befehls in den Hintergrund zu gehen. Dies kann sehr nützlich sein, falls SSH nach einem Passwort verlangt, der Benutzer das Programm aber nur im Hintergrund laufen lassen will. Diese Option impliziert die Option »-n«. Es wird empfohlen, X11-Programme auf der Remoteseite folgendermaßen zu starten: ssh -f host xterm Tabelle 5.9 Verfügbare Optionen Sandini Bib 284 5 Verschlüsselung Option Beschreibung -g Erlaubt Remotesystemen, sich zu lokal weitergeleitetem Port zu verbinden -i Identifikations_ Datei Diese Option erlaubt es Ihnen, die Datei, aus der der private Schlüssel für RSA- oder DSA-Authentifizierung gelesen wird, zu spezifizieren. Per Default ist diese Datei unter folgendem Namen zu finden: $HOME/.ssh/identity Sie können diese Datei aber auch über die Konfigurationsdatei angeben. -k Hiermit deaktivieren Sie die Weiterleitung von Kerberos Tickets und AFS Tokens. Auch diese Option lässt sich über die Konfigurationsdatei angeben. -l Loginname Falls Sie sich nicht unter Ihrem eigenen Usernamen am Remotesystem anmelden wollen, können Sie mit dieser Option den gewünschten Username (unter dem Sie sich anmelden werden) angeben. Auch diese Option kann in der Konfigurationsdatei spezifiziert werden. -m mac_spec Nur für Protokoll Version 2 Hiermit können Sie eine Liste von MAC (message authentication code) Algorithmen übergeben, wobei Sie die einzelnen Felder durch Kommas voneinander abtrennen müssen. -n Mit dieser Option können Sie verhindern, dass von der Standardeingabe gelesen wird. Sie müssen diese Option benutzen, wenn Sie wollen, dass SSH im Hintergrund läuft (zum Beispiel für X11 Programme). -N Dadurch wird verhindert, dass Remotebefehle ausgeführt werden. Sie können diese Option nutzen, falls Sie nur Ports weiterleiten wollen. -o Option Hiermit können Sie Optionen im Format der Konfigurationsdatei übergeben. Dies ist sehr hilfreich, falls Sie eine Option benötigen, für die es keinen separaten Kommandozeilenaufruf gibt. -p Port Gibt den Port an, auf den Sie sich am Remotesystem anmelden wollen. -P Bei Verwendung dieser Option wird für rausgehende Verbindungen ein nicht privilegierter Port benutzt. Sie können diese Option nutzen, falls Ihre Firewall den Port bis zur 1024er Grenze sperrt. -q Quiet Mode. Nachdem Sie diese Option angegeben haben, werden nur noch fatale Fehler angezeigt. Alle anderen Meldungen werden unterdrückt. -s Sie können diese Option nutzen, um ein Subsystem (zum Beispiel sftpd) auf einem Remotesystem aufzurufen. -t Hiermit bekommen Sie einen Pseudo-Terminal zugewiesen. Falls Sie diese Option mehrmals übergeben, bekommen Sie einen tty zugewiesen, selbst wenn SSH keinen lokalen Terminal besitzt. -T Zeigt die Zuordnung für Pseudo-Terminals Tabelle 5.9 Verfügbare Optionen (Forts.) Sandini Bib 5.2 OpenSSH 285 Option Beschreibung -v Verbose Mode. Damit erreichen Sie, dass SSH Debugnachrichten über die erreichten Fortschritte ausgibt. Falls Sie diese Option mehrmals übergeben, erhöht sich die Ausgabe noch weiter. -x Zeigt X11-Weiterleitungen -X Aktiviert X11-Weiterleitungen. Sie können dies aber auch in der Konfigurationsdatei aktivieren. -C Falls Sie eine langsame Leitung (zum Beispiel eine Modemleitung), können Sie mit dieser Option alle Daten (STDIN, STDOUT, Dateien für X11-Weiterleitungen und TCP/IP-Verbindungen) komprimieren. Bei schnellen Leitungen sollten Sie diese Option aber nicht benutzen, da dies nur zu einer Verlangsamung führen würde. -L Port:Host:Hostport Gibt an, dass der übergebene Port auf dem lokalen Rechner (Client) zum Rechner und Port auf dem Remotesystem weitergeleitet wird. Beachten Sie dabei, dass Sie für IPv6-Adressen eine andere Syntax verwenden sollten: port/host/hostport -1 Nur Protokoll Version 1 wird verwendet. -2 Nur Protokoll Version 2 wird verwendet. -4 Es werden nur IPv4-Adressen benutzt. -6 Es werden nur IPv6-Adressen benutzt. Tabelle 5.9 Verfügbare Optionen (Forts.) Konfigurationsdateien SSH liest die Konfigurationen aus den folgenden Quellen und in der aufgeführten Reihenfolge: 1. Kommandozeilenoptionen (Tabelle 5.9) 2. Benutzerkonfigurationsdatei $HOME/.ssh/config 3. Systemweite Konfigurationsdatei /etc/ssh/ssh_config 4. Da wir die Kommandozeilenoptionen bereits kennen gelernt haben, können wir uns nun mit den Konfigurationsdateien beschäftigen. 5. Sie können für jeden Parameter in diesen Dateien mehrere Werte angeben, wobei immer der erste passende benutzt wird. Sie sollten daher die hostspezifischen Deklarationen am Anfang der Zeile unterbringen. Syntax Die Konfigurationsdatei besteht aus Zeilen, die das Format »Schlüsselwort Argumente« haben. Die Dateien enthalten Sektionen, die durch die Spezifikationen des Sandini Bib 286 5 Verschlüsselung Schlüsselwortes »Host« eingeschlossen werden. Eine solche Sektion wird nur für den Hosts, der auf eine der gemachten Spezifikationen zutrifft, angewendet. Tabelle 5.10 stellt Ihnen die verfügbaren Schlüsselwörter vor und gibt zu jedem Punkt eine kleine Beschreibung. Schlüsselwort Beschreibung Host Begrenzt die folgenden Deklarationen bis zum nächsten Hostschlüsselwort. Diese Deklarationen gelten nur für einen Host, der auf einen der nachfolgenden Patterns zutrifft. Sie können für die Deklaration der Patterns die Wildcard »*« (all) und »?« (any) benutzen. AFSTokenPassing Diese Option ist nur für Protokoll Version 1 nutzbar und gibt an, ob ein AFS Token zum Remotesystem geleitet werden soll oder nicht. Das übergebende Argument für dieses Schlüsselwort muss »yes« oder »no« sein. BatchMode Hiermit deaktivieren Sie die Abfrage von Passwörtern und Passphrases. Diese Option ist sehr nützlich, falls Sie ein Skript schreiben wollen. Das übergebende Argument für dieses Schlüsselwort muss »yes« oder »no« sein. Der Defaultwert ist »yes«. CheckHostIP Wenn Sie diese Flag setzen, wird SSH zusätzlich die Host IP-Adresse im known_hosts-File überprüfen. Damit ist SSH in der Lage festzustellen, ob sich der Hostschlüssel durch DNS Spoofing geändert hat. Der Defaultwert ist »yes«, das heißt die Überprüfung wird per Default durchgeführt. Cipher Hiermit geben Sie den Cipher-Algorithmus an, mit dem die Sitzungen in Protokoll Version 1 verschlüsselt werden sollen. Zurzeit werden folgende Algorithmen unterstützt: blowfish 3des Per Default wird der »3des«-Algorithmus benutzt. Ciphers Hiermit geben Sie die Cipher-Algorithmen für Protokoll Version 2 an. Falls Sie mehrere Angaben machen, müssen Sie die einzelnen Felder mit Kommas voneinander trennen. Der Default ist: »aes128-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, arcfour, aes192-cbc, aes256-cbc« Compression Durch dieses Schlüsselwort legen Sie fest, ob die Daten komprimiert werden sollen. Das zu übergebende Argument muss »yes« oder »no« sein. Der Defaultwert ist »no«. Beachten Sie, dass Sie diese Option nur für extrem langsame Leitungen (Modem) benutzen sollen, da Sie ansonsten die Prozesse nur künstlich verlangsamen. Tabelle 5.10 Verfügbare Schlüsselwörter Sandini Bib 5.2 OpenSSH 287 Schlüsselwort Beschreibung CompressionLevel Falls Sie sich für die Benutzung von Kompression entschieden haben, können Sie mit diesem Schlüsselwort den Level dazu bestimmen. Das Argument hierzu muss ein Integerwert zwischen 1 und 9 sein, wobei 1 die schnellste Kompression darstellt und 9 die beste (aber auch langsamste). Das Defaultlevel ist 6. Diese Option ist nur für Protokoll Version 1 verfügbar. ConnectionAttempts Gibt die Anzahl der Verbindungsversuche (einer pro Sekunde) an, bevor das Programm zu rsh zurückfällt oder abbricht. Das Argument, das Sie hierbei verwenden, muss ein Integerwert sein. Der Defaultwert liegt bei 4. EscapeChar Mit diesem Schlüsselwort können Sie den »Escape Character« bestimmen (Default: »~«). Das Argument sollte ein einzelnes Zeichen gefolgt von einem Buchstaben sein. Falls Sie »none« übergeben, erhalten Sie eine transparente Verbindung. FallBackToRsh Falls eine Verbindung mit SSH wegen eines »connection refused error« (z.B. kein Remoteserver verfügbar) abgelehnt wird, können Sie mit diesem Schlüsselwort festlegen, ob stattdessen eine Verbindung mit rsh aufgebaut werden soll. Der Defaultwert ist »no«. Das heißt, dass keine Verbindung aufgebaut wird. ForwardArgent Gibt an, ob die Verbindung zum »authentication agent« zum Remotesystem weitergeleitet werden soll Der Defaultwert ist »no«. ForwardX11 Gibt an, ob X11-Verbindungen automatisch über den sicheren und verschlüsselten Kanal weitergeleitet werden sollen GatewayPorts Hiermit können Sie bestimmen, ob es Remotesystemen erlaubt ist, sich an lokal weitergeleitete Ports zu verbinden. Der Defaultwert ist »no«. Der Defaultwert ist »no«. GlobalKnownHostsFile Mit diesem Schlüsselwort können Sie die Adresse der globalen Hostschlüsseldatenbank für Protokoll Version 1 angeben, falls diese nicht unter /etc/ssh/ssh_known_hosts zu finden ist. GlobalKnownHostsFile2 Mit diesem Schlüsselwort können Sie die Adresse der globalen Hostschlüsseldatenbank für Protokoll Version 2 angeben, falls diese nicht unter /etc/ssh/ssh_known_hosts2 zu finden ist. HostbasedAuthentication Sie können mit diesem Schlüsselwort bestimmen, ob rhostsbasierende Authentifizierung zusammen mit Public Key-Authentifizierung genutzt werden soll. Diese Option ist gleichbedeutend mit dem Schlüsselwort RhostsRSAAuthentication und benötigt Protokoll Version 1. Der Defaultwert ist »yes«. Tabelle 5.10 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 288 5 Verschlüsselung Schlüsselwort Beschreibung HostKeyAlgorithms Hiermit geben Sie die Schlüsselalgorithmen für Protokoll Version 2 an, die der Client benutzen soll. Der Defaultwert ist »ssh-rsa, ssh-dss«. HostKeyAlias Falls Sie nicht wollen, dass bei einem Lookup oder einem Eintrag in den Hostschlüsseldatenbankdateien der echte Hostname auftaucht, können Sie einen Alias für diesen Hostnamen mit diesem Schlüsselwort spezifizieren. Diese Option kann sehr hilfreich sein, falls Sie SSH-Verbindungen tunneln wollen. HostName Sie können diesem Schlüsselwort den wahren Hostnamen übergeben. Hiermit können Sie Spitznamen oder Abkürzungen für Ihren Rechner angeben. Es ist auch erlaubt, dass Sie eine IP-Adresse angeben. IdentityFile Gibt die Datei an, aus der die RSA- oder DSA-Authentifizierungsidentität gelesen werden soll (Default ist $HOME/.ssh/identity). Zusätzlich werden die Identitäten, die durch den Authentifizierungsagenten repräsentiert werden, ebenfalls für die Authentifizierung genutzt. Sie können mehrere Dateien angeben, die dann der Reihe nach durchsucht werden. KeepAlive Hiermit geben Sie an, ob das System Keepalive-Nachrichten zu der nicht antwortenden Seite schicken soll. Beachten Sie aber, dass diese Nachrichten nicht durch den verschlüsselten Tunnel gehen und somit gefälscht werden können. Falls Sie diese Nachrichten aber nicht verschicken, könnte es sein, dass eine Verbindung ewig »hängen bleibt«. Falls Sie diese Option deaktivieren wollen, sollten Sie dies in der Serverkonfigurationsdatei sowie in der Clientkonfigurationsdatei angeben. KerberosAuthentication Dieses Schlüsselwort bestimmt, ob Kerberos-Authentifizierung genutzt werden soll oder nicht. Falls Sie diese Art der Authentifizierung abschalten wollen, müssen Sie das Argument »no« übergeben, ansonsten »yes«. KerberosTgtPassing Gibt an, ob ein Kerberos TGT zum Server weitergeleitet wird oder nicht. Dies wird nur funktionieren, wenn der Kerberosserver ein AFS kaserver ist. Der Defaultwert ist »yes«. Das zu übergebende Argument muss entweder »yes« oder »no« sein. LocalForward Gibt an, dass ein TCP/IP Port auf der lokalen Maschine über den sicheren verschlüsselten Kanal zum angegebenen Port auf dem angegebenen Server (Syntax Host:Port) weitergeleitet wird. Das erste Argument muss folglich eine Portnummer sein, wohingegen das zweite Argument eines Host, gefolgt von einem Port auf diesem Host sein muss. Diese beiden letzten Felder sind durch einen Doppelpunkt zu trennen. Sie können auch mehrere Weiterleitungen angeben. Beachten Sie dabei aber, dass nur der Superuser auf privilegierte Ports weiterleiten kann. Tabelle 5.10 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 5.2 OpenSSH 289 Schlüsselwort Beschreibung LogLevel Gibt den LogLevel an. Je höher das Level, desto mehr Loggingeinträge werden Sie bekommen. Verfügbare Levels sind: QUIET (niedrigstes Level) FATAL ERROR INFO VERBOSE DEBUG (höchstes Level) Der Defaultwert ist INFO. MACs Gibt die MAC (message authentication code)-Algorithmen an, welcher unter Protokoll Version 2 für den Schutz der Datenintegrität genutzt wird. Falls Sie mehrere Algorithmen angeben wollen, müssen Sie diese durch Kommas voneinander trennen. Der Defaultwert ist: »hmac-md5, hmac-sha1, hmacripemd160@openssh.com, hmac-sha1-96, hmac-md5-96«. NumberOfPasswordPrompts Spezifiziert die Anzahl der Passwortprompts, bevor aufgegeben wird. Das Argument für dieses Schlüsselwort muss ein Integerwert sein. PasswordAuthentication Gibt an, ob Passwort-Authentifizierung genutzt werden soll Port Hiermit können Sie den Port auf dem Remotesystem, an dem sich der Client anmelden soll, angeben. Der Defaultwert ist 3. Der Defaultwert ist »yes«. Der Defaultwert ist 22. PreferredAuthentications Mit diesem Schlüsselwort können Sie die Reihenfolge der verschiedenen Authentifizierungsmethoden unter Protokoll Version 2 angeben. Somit können Sie eine bestimmte Methode einer anderen vorziehen. Der Defaultwert lautet »publickey, password, keyboard-interactive«. Protocol Sie haben die Möglichkeit mit diesem Schlüsselwort die Reihenfolge der zu unterstützenden Protokoll-Versionen anzugeben. Falls Sie nur ein Protokoll (1 oder 2) angeben, wird das nicht angegebene Protokoll auch nicht unterstützt. ProxyCommand Diesem Schlüsselwort müssen Sie den Befehl zur Verbindung zum Server übergeben. Der Befehlsstring erstreckt sich dabei bis zum Ende der Zeile und wird mit /bi/sh ausgeführt. In diesem String können Sie folgende Platzhalter verwenden: Der Defaultwert ist »2,1«. %h (wird durch den Hostname des Servers ersetzt) %p (wird durch den Port ersetzt). Dieser Befehl kann grundsätzlich alles sein. Beachten Sie dabei aber, dass die Option CheckHostIP für solche Verbindungen nicht zur Verfügung steht. Tabelle 5.10 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 290 5 Verschlüsselung Schlüsselwort Beschreibung PubkeyAuthentication Gibt an, ob die Public Key-Authentifizierung durchgeführt werden soll. Der Defaultwert ist »yes«. Dieses Schlüsselwort ist nur für Protokoll Version 2 verfügbar. RemoteForward Gibt an, dass ein TCP/IP Port auf dem Remotesystem über den sicheren verschlüsselten Kanal zum angegebenen Port auf dem lokalen System (Syntax Host:Port) weitergeleitet wird. Das erste Argument muss folglich eine Portnummer sein, wohingegen das zweite Argument eines Host gefolgt von einem Port auf diesem Host sein muss. Diese beiden letzten Felder sind durch einen Doppelpunkt zu trennen. Sie können auch mehrere Weiterleitungen angeben. Beachten Sie dabei aber, dass nur der Superuser auf privilegierte Ports weiterleiten kann. Rhostsauthentication Gibt an, ob Rhostsbasierende Authentifizierung durchgeführt werden soll. Beachten Sie, dass diese Deklaration nur die Clientseite betrifft und keine Auswirkungen auf die Sicherheit hat. Da diese Art der Authentifizierung sehr unsicher ist, erlauben die meisten Server keine Rhostbasierende Authentifizierung. Der Defaultwert ist »yes«. Beachten Sie, dass sich dieses Schlüsselwort auf Protokoll 1 bezieht. RSAAuthentication Hiermit geben Sie an, ob RSA-Authentifizierung durchgeführt werden soll. Diese Art der Authentifizierung wird jedoch nur unternommen, wenn ein Authentifizierungsagent läuft oder ein »identity« File existiert. Der Defaultwert ist »yes«. Beachten Sie, dass sich diese Option nur auf Protokoll 1 bezieht. ChallengeResponseAuthentication Mit diesem Schlüsselwort können Sie festlegen, ob »Challenge ResponseAuthentifizierung« durchgeführt werden soll. Zurzeit ist lediglich Unterstützung für skey-Authentifizierung vorhanden. Der Defaultwert ist »no«. StrictHostKeyChecking Wenn Sie diese Flag auf »yes« setzen, wird SSH niemals Hostschlüssel automatisch zu den Dateien $HOME/.ssh/known_hosts und $HOME/.ssh/ known_hosts2 hinzufügen. Außerdem wird das Programm eine Verbindung zu Rechnern, deren Hostschlüssel sich geändert haben, ablehnen. Dies bietet einen sehr guten Schutz vor Trojanischen Pferden. Sie müssen neue Hosts dadurch allerdings per Hand in die entsprechenden Dateien eintragen. Falls Sie die Flag aber auf »no« setzen, wird SSH neue Hosts automatisch in die beiden vorher aufgeführten Dateien eintragen. Sie können aber auch das Argument »ask« übergeben. In solchen Fällen wird SSH Sie vor dem Hinzufügen eines neuen Hosts in eine der Dateien informieren. Nur wenn Sie damit einverstanden sind, wird der neue Host hinzugefügt. Verbindungen zu Hosts, deren Schlüssel sich geändert hat, werden weiterhin abgelehnt. Der Defaultwert ist »ask«. Tabelle 5.10 Verfügbare Schlüsselwörter (Forts.) Sandini Bib 5.2 OpenSSH 291 Schlüsselwort Beschreibung UsePrivilegedPort Gibt an, ob für ausgehende Verbindungen ein privilegierter Port benutzt werden soll Der Defaultwert ist »no«. User Hiermit können Sie den Usernamen spezifizieren, unter dem Sie sich einloggen möchten. Dies ist sehr nützlich falls, Sie auf verschiedenen Servern unterschiedliche Benutzernamen haben. UserKnownHostsFile Hiermit können Sie eine alternative Datei für die Hostschlüssel unter Protokoll Version 1 angeben (normalerweise werden diese aus der Datei $HOME/.ssh/known_hosts gelesen). UserKnownHostsFile2 Hiermit können Sie eine alternative Datei für die Hostschlüssel unter Protokoll Version 2 angeben (normalerweise werden diese aus der Datei $HOME/.ssh/known_hosts2 gelesen). UseRsh Hiermit geben Sie an, dass für den betreffenden Host für das Einloggen die Programme rlogin/rsh benutzt werden sollen. Alle anderen Optionen (außer HostName) werden ignoriert, falls Sie diese Option aufgeführt haben. Das Argument, das Sie übergeben, muss entweder »yes« oder »no« sein. XAuthLocation Hiermit geben Sie den Speicherort des Programms xauth an. Der Defaultspeicherort ist /usr/X11R6/bin/xauth Tabelle 5.10 Verfügbare Schlüsselwörter (Forts.) Umgebungsvariablen Tabelle 5.11 zeigt die von SSH gesetzten Umgebungsvariablen und gibt eine kurze Beschreibung zu den einzelnen Punkten. Umgebungsvariable Beschreibung DISPLAY Diese Variable enthält die Adresse des X11-Servers. Sie wird automatisch von SSH gesetzt und hat folgendes Format: Hostname:n Wobei das Feld »Hostname« den Host, auf dem die Shell läuft, angibt und das Feld ein Integerwert >= 1 ist. SSH benutzt diesen Wert, um X11-Verbindungen über einen sicheren Kanal weiterzuleiten. Sie sollten diese Variable nicht manuell setzen, da dies zu Sicherheitsrisiken führen kann. HOME Enthält die Adresse des Homeverzeichnisses des Benutzers LOGNAME Enthält den Namen des Benutzers, unter dem sich der User eingeloggt hat Diese Variable ist ein Synonym zur Variable USER und wurde aus Kompatibilitätsgründen zu anderen Systemen eingeführt. MAIL Zeigt auf die Mailbox des Users Tabelle 5.11 Umgebungsvariablen Sandini Bib 292 5 Verschlüsselung Umgebungsvariable Beschreibung PATH Enthält den Default-Pfad, den Sie während der Erstellung von SSH angegeben haben SSH_AUTH_SOCK Diese Umgebungsvariable enthält den Pfad zu einem Unix-DomainSocket, der zur Kommunikation mit dem Agenten benötigt wird. SSH_CLIENT Identifiziert den Client einer Verbindung. Diese Variable enthält folgende drei Felder, die durch Leerzeichen voneinander getrennt sind: Client IP-Adresse Client Portnummer Server Portnummer SSH_ORIGINAL Diese Variable enthält den originalen Befehl aus der Kommandozeile. _COMMAND SSH_TTY Enthält den Namen des Terminals (tty), der mit der aktuellen Shell oder dem aktuellen Befehl verbunden ist Falls die aktuelle Sitzung keinen Terminal hat, wird diese Variable nicht gesetzt. TZ Diese Variable enthält die gegenwärtige Zeitzone, falls sie beim Start des Daemons angegeben wurde. USER Enthält den Namen des Benutzers, unter dem sich der User eingeloggt hat Tabelle 5.11 Umgebungsvariablen (Forts.) 5.2.6 Authentifizierungsagent Der SSH-Authentifizierungsagent ist ein Programm, das die privaten Schlüssel, die für Public Key-Authentifizierung genutzt werden, aufbewahrt. Der ssh-agent wird dabei beim Beginn einer X- oder Login-Sitzung gestartet, so dass alle danach gestarteten Programme als Clients des SSH-Authentifizierungsagenten gestartet werden. Syntax Der Aufruf des SSH-Authentifizierungsagenten erfolgt über den anschließenden Befehl: Linux:~# ssh-agent [Optionen] Die verfügbaren Optionen dazu werden Sie im nächsten Abschnitt kennen lernen. Optionen Tabelle 5.12 zeigt die verfügbaren Optionen und gibt zu jedem dort aufgeführten Punkt eine kurze Beschreibung. Sandini Bib 5.2 OpenSSH Option -c 293 Beschreibung Generiert C-Shell-Befehle auf STDOUT Dies ist der Defaultwert, falls die Shell dem Typ einer csh ähnelt. -s Generiert Bourne Shell-Befehle auf STDOUT Dies ist der Defaultwert, falls die Shell nicht wie eine csh Shell aussieht. -k Killt den aktuellen Agenten Tabelle 5.12 Verfügbare Optionen Befehle Falls dem Authentifizierungsagenten ein Befehl übergeben wurde, wird dieser als Unterprozess des Agenten ausgeführt. Wenn der Befehl beendet ist, ist auch der Agent beendet. Schlüssel hinzufügen Wenn Sie den Agenten das erste Mal benützen, wird dieser noch keine Schlüssel besitzen. Sie können ihm bestimmte Schlüssel hinzufügen, indem Sie das Programm ssh-add, welches wir im Laufe dieses Kapitels noch ausführlicher besprechen werden, benutzen. Falls Sie diesem Programm keine Argumente übergeben, wird es die Datei $HOME/.ssh/identity hinzufügen und gegebenenfalls nach einer Passphrase fragen. Danach schickt es die Identität zum Authentifizierungsagenten. Schlüssel anzeigen Sie haben leider keine Möglichkeit die im Authentifizierungsagenten gespeicherten Schlüssel (der Authentifizierungsagent kann mehrere Schlüssel speichern und benutzen) anzeigen zu lassen. Sie können aber auf das schon erwähnte Programm ssh-add ausweichen und somit folgenden Befehl übergeben, um die Schlüssel anzuzeigen, die der Authentifizierungsagent aktuell aufbewahrt: Linux:~# ssh-add -l Nutzen Der Nutzen eines Authentifizierungsagenten liegt klar auf der Hand: Wenn der Agent auf dem Rechner des Users (oder auf seiner Shell) läuft, müssen Authentifizierungsdaten auf keinem fremden System mehr gespeichert werden und somit müssen die Passphrases, die zur Authentifizierung benötigt werden, nicht mehr über das Netzwerk verschickt werden. Wichtige Dateien Auch der Authentifizierungsagent benutzt einige Dateien, deren Nutzen und Aufgabe Sie kennen sollten. Wir werden uns im Folgenden diese Files anhand einer dazugehörigen Beschreibung genauer ansehen. Sandini Bib 294 5 Verschlüsselung $HOME/.ssh/identity Diese Datei enthält die Protokoll Version 1 RSA-Authentifizierungsidentität des Benutzers. Dieses File sollte nur vom User gelesen werden können. Es ist dabei möglich, bei der Erstellung des Schlüssels eine Passphrase zu spezifizieren, welche dann genutzt wird, um den privaten Teil dieser Datei zu verschlüsseln. Diese Datei wird nicht vom Authentifizierungsagenten selbst genutzt, wird aber zumeist vom Befehl ssh-add hinzugefügt. $HOME/.ssh/id_dsa In dieser Datei finden Sie die Protokoll Version 2 DSA-Authentifizierungsidentität des Benutzers. $HOME/.ssh/id_rsa Die Protokoll Version 2 RSA-Authentifizierungsidentität des Benutzers wird in dieser Datei abgespeichert. /tmp/ssh-XXXXXXXX/agent.<pid> Dieses File enthält Unix-Domain-Sockets, die die Verbindung zum Authentifizierungsagenten enthalten. Diese Sockets sollte nur der Eigentümer lesen können und sie sollten entfernt werden, wenn der Agent sich beendet. 5.2.7 SSH-ADD Mit dem Programm ssh-add können Sie dem eben kennen gelernten Authentifizierungsagenten RSA- und DSA-Identitäten hinzufügen. Wie wir gesehen haben, wird dabei die Datei $HOME/.ssh/identity hinzugefügt, falls Sie dem Programm keinen alternativen Speicherort beim Aufruf zuweisen. Da diese zwei Sätze eigentlich schon den kompletten Nutzen und Sinn dieses Programms grob dargestellt haben, können wir uns sofort mit der Syntax beschäftigen. Syntax Der Aufruf erfolgt über die anschließende Syntax: Linux:~# ssh-add [Optionen] [alternativer Speicherplatz bzw. Datei] Tabelle 5.13 stellt uns die verfügbaren Optionen kurz vor. Option Beschreibung -l Hiermit werden alle Fingerabdrücke der Identitäten angezeigt, die im Moment vom Agenten repräsentiert werden. -L Sie können diese Option benutzen, um die Public Key-Parameter der Identitäten, die der Agent zurzeit hält, anzeigen zu lassen. Tabelle 5.13 Verfügbare Optionen für ssh-add Sandini Bib 5.2 OpenSSH 295 Option Beschreibung -d Mit dieser Option können Sie eine Identität löschen. -D Um alle Identitäten zu löschen, können Sie diese Option benutzen. Tabelle 5.13 Verfügbare Optionen für ssh-add (Forts.) Wichtige Dateien Auch an dieser Stelle werden wir uns die für dieses Programm wichtigen Dateien kurz anschauen und gegebenenfalls besprechen. $HOME/.ssh/identity Diese Datei enthält die Protokoll Version 1 RSA-Authentifizierungsidentität des Benutzers und sollte daher nur vom betreffenden Eigentümer gelesen werden dürfen. Falls diese Datei jedoch auch für andere Benutzer lesbar sein sollte, wird ssh-add es ignorieren. Beim Erstellen dieser Datei ist es möglich, eine Passphrase zu spezifizieren, die dann genützt wird, um den privaten Teil dieser Datei zu verschlüsseln. Dies ist die Defaultdatei bzw. der Defaultspeicherplatz für Identitäten, falls Sie keine Alternative angeben. $HOME/.ssh/id_dsa In diesem File finden Sie die Protokoll Version 2 DSA-Authentifizierungsidentität des Benutzers. $HOME/.ssh/id_rsa In diesem File finden Sie die Protokoll Version 2 RSA-Authentifizierungsidentität des betreffenden Users. 5.2.8 Hostschlüssel zusammentragen Wir haben im Verlauf dieses Kapitels schon einige wichtige Informationen über den praktischen, effektiven und sicheren Gebrauch der Secure Shell erfahren. Vielleicht haben Sie ja bemerkt, dass das Zusammentragen der Hostschlüssel in einem Netzwerk richtig viel Arbeit bereiten kann. Damit dieser Prozess verkürzt wird, wurde das Programm ssh-keyscan entwickelt, das die Hostschlüssel eines jeden Hosts in einer Domäne mit mehr als 1000 Rechnern unter einer Minute zusammentragen kann. Falls Sie Ihre ssh_known_hosts-Files auf diese Art und Weise erstellen, sollten Sie dabei beachten, dass die Scandurchläufe und damit auch die Antworten nicht verschlüsselt werden. Syntax Der allgemeine Aufruf dieses Programms lautet: Linux:~# ssh-keyscan [Optionen] Hostname Sandini Bib 296 5 Verschlüsselung Optionen Die für dieses Programm verfügbaren Optionen finden Sie in Tabelle 5.14. Option Beschreibung -t Mit dieser Option können Sie den Timeout für Verbindungsanfragen setzen. Falls ein Host über den Zeitraum des Timeouts nicht antwortet, wird der Verbindungsversuch abgebrochen. Der Defaultwert liegt bei 5 Sekunden. -f Diese Option erlaubt es Ihnen, eine Datei anzugeben, aus der ssh-keyscan die zu scannenden Hosts liest. Dabei liest es jeweils die einzelnen Hosts (10.209.100.1, 10.209.100.2) oder Adressenlisten-Namenslisten Paare (joey.testdomain.de, joey) ein. Falls Sie anstelle des Dateinamens den Operator »-« übergeben, liest sshkeyscan die Werte aus der Standardeingabe. Tabelle 5.14 Optionen für ssh-keyscan 5.2.9 Schlüssel generieren In diesem Abschnitt des Buchs werden Sie ein Tool kennen lernen, das es Ihnen ermöglicht, Ihre Authentifizierungsschlüssel zu generieren, zu verwalten und zu konvertieren. Per Default generiert dieses Programm RSA-Schlüssel für Protokoll 1. Wie Sie Schlüssel für Protokoll 2 erstellen können, erfahren Sie im Abschnitt über die Syntax. Sie können mit ssh-keygen Schlüssel für die folgenden Dateien (oder die von Ihnen angegebenen Alternativen dazu) erstellen: $HOME/.ssh/identity $HOME/.ssh/id_dsa $HOME/.ssh/id_rsa /etc/rc Funktionsweise Wenn Sie einen Schlüssel durch ssh-keygen erstellen lassen, werden Sie nach der Datei, in die der private Schlüssel gespeichert werden soll, gefragt. Der öffentliche Schlüssel wird in einer Datei mit demselben Namen, aber mit der Endung .pub geschrieben. Danach will das Programm die Passphrase von Ihnen wissen, falls Sie keine Passphrase angeben wollen, lassen Sie das Feld leer. Beachten Sie dabei, dass Hostschlüssel eine leere (bzw. keine) Passphrase haben müssen. Sie können die hier angegebene Passphrase später ändern (mit der Option »-p«). Falls Sie Ihre Passphrase vergessen haben, müssen Sie einen neuen Schlüssel erstellen. Es gibt keinen Weg eine vergessene Passphrase aus dem Schlüssel auszulesen. Sandini Bib 5.2 OpenSSH 297 Wenn Sie einen RSA1-Schlüssel erstellen, beinhaltet dieser zusätzlich ein Kommentarfeld, das dem User helfen soll, den Schlüssel zu identifizieren. Dieses Feld erhält bei der Erstellung automatisch den Wert user@host, kann aber später durch die Option -c geändert werden. Syntax Um einen Schlüssel zu generieren, zu verwalten oder zu konvertieren, benutzen Sie bitte folgende allgemeine Syntax: Linux:~# ssh-keygen [Optionen] Optionen Tabelle 5.15 stellt Ihnen die für dieses Programm verfügbaren Optionen anhand einer kurzen Beschreibung vor. Option Beschreibung -b Bits Hiermit geben Sie die Anzahl der Bits für den zu erstellenden Schlüssel an. Das Minimum hierfür beträgt 512 Bits. Sie sollten aber eine Bitgröße von 1024 wählen. Der Defaultwert ist 1024. Schlüssel, die größer als der Defaultwert sind, erhöhen das Sicherheitslevel nicht mehr, sondern verlangsamen lediglich den Ablauf. -c Mit dieser Option können Sie den Kommentar im privaten und öffentlichen Schlüssel ändern. Hierfür müssen Sie den Speicherort des Schlüssels und gegebenenfalls die Passphrase angeben. -e Diese Option liest einen privaten oder öffentlichen OpenSSH-Schlüssel und gibt diesen Schlüssel im »SECSH Public Key File-Format« auf die Standardausgabe aus. -f Gibt den Dateinamen der Schlüsseldatei an -i Diese Option liest ein unverschlüsseltes privates oder öffentliches Schlüsselfile im SSH2-kompatiblen Format und gibt den OpenSSHkompatiblen Schlüssel dann auf der Standardausgabe aus. Dies erlaubt Ihnen den Import von verschiedenen kommerziellen SSHSchlüsseln. -l Zeigt den Fingerabdruck des angegebenen privaten oder öffentlichen Schlüsselfiles -p Hiermit können Sie die Passphrase einer privaten Schlüsseldatei ändern. Um dies machen zu können, müssen Sie die alte Passphrase angeben. -q Sie werden danach kaum Ausgaben von ssh-keygen bekommen. -y Diese Option liest ein Datei im privaten OpenSSH-Format und gibt danach ein OpenSSH Public File auf die Standardausgabe aus. Tabelle 5.15 Verfügbare Optionen für ssh-keygen Sandini Bib 298 5 Verschlüsselung Option Beschreibung -t type Mit dieser Option können Sie den Typen des zu erstellenden Schlüssels angeben. Mögliche Werte hierfür sind: RSA1 (Protokoll Version 1) RSA (Protokoll Version 2) DSA (Protokoll Version 2) Der Defaultwert ist RSA1. -B Zeigt die »bubblebabble« Übersicht des spezifizierten privaten oder öffentlichen Schlüsselfiles -C Kommentar Übergibt den neuen Kommentar -N Neue_Passphrase Übergibt die neue Passphrase -P Alte_Passphrase Übergibt die alte Passphrase Tabelle 5.15 Verfügbare Optionen für ssh-keygen (Forts.) Wichtige Dateien Wie Sie es von den vorhergehenden Programmen, die sich auf die SSH-Programmsuite beziehen, schon kennen, werden wir auch zu ssh-keygen die wichtigsten Dateien auflisten und eine kurze Beschreibung dazu liefern. $HOME/.ssh/identity In diese Datei wird der Schlüssel, der generiert werden soll, geschrieben. $HOME/.ssh/identity.pub Hier finden Sie den passenden öffentlichen Schlüssel. Sie sollten den Inhalt dieser Datei in die Datei $HOME/.ssh/authorized_keys auf allen Rechnern, auf denen Sie sich via SSH einloggen wollen, einfügen. $HOME/.ssh/id_dsa Diese Datei enthält die Protokoll Version 2 DSA-Authentifizierungsidentität des Benutzers. $HOME/.ssh/id_dsa.pub Dieses File enthält den Protokoll Version 2 RSA-öffentlichen Schlüssel für die Authentifizierung. Sie sollten den Inhalt dieser Datei in die Datei $HOME/.ssh/ authorized_keys2 auf allen Rechnern, auf denen Sie sich via SSH anmelden wollen, einfügen. $HOME/.ssh/id_rsa Sie werden in diesem File die Protokoll Version 2 Authentifizierungsidentität des Benutzers finden. $HOME/.ssh/id_rsa.pub In diesem File finden Sie den öffentlichen Schlüssel für das Protokoll 2, den Sie für die Authentifizierung benötigen. Sie sollten den Inhalt dieser Datei in die Datei Sandini Bib 5.2 OpenSSH 299 $HOME/.ssh/authorized_keys2 auf allen Rechnern, auf denen Sie sich via SSH anmelden wollen, einfügen. 5.2.10 Sicheres Kopieren im Netzwerk Das nächste Programm, das wir in unserer SSH-Reihe besprechen werden, heißt scp und ermöglicht es Ihnen, Dateien sicher zwischen zwei Rechnern in einem unsicheren Netzwerk zu kopieren. Es wurde als Alternative zu rcp entwickelt, bietet jedoch – da es die Daten über einen verschlüsselten Kanal überträgt – mehr Sicherheit. Sie können damit sogar Dateien von einem Remotesystem zum anderen kopieren. Syntax Ich denke, dass sich die Syntax im Großen und Ganzen selbst erklärt: Linux:~# scp [Optionen] [[Username@Host1:]Datei1 […] ] [[Username@Host2:] Datei2 Optionen Tabelle 5.16 stellt Ihnen die für scp verfügbaren Optionen vor und gibt zu den aufgeführten Punkten eine kurze Beschreibung. Option Beschreibung -c Cipher Mit dieser Option können Sie den Cipher-Algorithmus auswählen, der danach für die Verschlüsselung des Datentransfers zuständig ist. -i identity_Datei Hiermit geben Sie an, in welcher Datei der private Schlüssel für die RSAAuthentifizierung zu finden ist. -p Sie können diese Option benutzen, um folgende Eigenschaften der Datei(en) zu erhalten: modification time (letzte Änderung) access time (letzter Zugriff) modes (Modi) -r Kopiert das gesamte Verzeichnis rekursiv. -v Verbose Mode. Hiermit veranlassen Sie scp und ssh Debugnachrichten über den Fortschritt des Prozesses auszugeben. -B Wenn Sie scp in einem Skript verwenden wollen, kann es hilfreich sein, wenn Sie in den Batchmodus gehen, da dort nicht nach Passwörtern und Passphrases gefragt wird. -q Um die Fortschrittsanzeige zu unterdrücken, können Sie diese Option übergeben. -C Mit dieser Option aktivieren Sie Kompression. Tabelle 5.16 Verfügbare Optionen für scp Sandini Bib 300 5 Verschlüsselung Option Beschreibung -P Port Hiermit können Sie den Port auf dem Remotesystem, an dem Sie sich anmelden wollen, spezifizieren. -S Programm Falls Sie ein Programm für die Verschlüsselung der Verbindung selbst angeben wollen, können Sie dies mit dieser Option tun. Beachten Sie dabei aber, dass dieses Programm SSH-Optionen verstehen muss. -o Option Damit können Sie eine Option direkt an SSH weiterleiten. -4 Veranlasst scp nur IPv4-Adressen zuzulassen -6 Veranlasst scp nur IPv6-Adressen zuzulassen Tabelle 5.16 Verfügbare Optionen für scp (Forts.) 5.2.11 Sicherer FTP-Server An sich gibt es über diesen Server nicht allzu viel zu sagen, da er nur ein Subsystem des SSH Servers (sshd) ist und somit auch in der Serverkonfigurationsdatei konfiguriert wird. Wenn Sie also einen solchen Server betreiben wollen, müssen Sie einen sicheren SSH Server aufsetzen. Instruktionen dazu finden Sie im Abschnitt »Server« dieses Kapitels. 5.2.12 Sicherer FTP Client Dieser Client ermöglicht es Ihnen, Dateien von einem SFTP-Subsystem eines SSH Servers über einen verschlüsselten Kanal zu beziehen. Dabei können Sie auch einige SSH-spezifische Features wie Public Key-Authentifizierung und Kompression nutzen. Syntax Bevor wir uns mit der Syntax dieses Programms beschäftigen, sollten wir uns vor Augen führen, dass es drei verschiedene Möglichkeiten gibt, dieses Programm zu nutzen. Obwohl das Endprodukt immer gleich ist, sieht die entsprechende Syntax dafür immer etwas anders aus. Wir wollen uns also vor der Besprechung der verfügbaren Optionen kurz mit den drei verschiedenen Methoden beschäftigen. Interaktiver Befehlsmodus Die erste Methode ist die wohl bekannteste und am häufigsten genutzte. Hierbei verbindet sich der SFTP-Client mit einem vorher spezifizierten Host und geht dann in einen »interaktiven Befehlsmodus«. Die Syntax zu dieser ersten Methode sieht folgendermaßen aus: Linux:~# sftp [Optionen] [Host] Sandini Bib 5.2 OpenSSH 301 Dateien automatisch holen Diese Methode dürfte für Programmierer interessant sein, da sie sie leicht und ohne Schwierigkeiten in Skripte einbauen können. Hierbei werden Dateien automatisch vom Server geholt, falls eine nicht interaktive Authentifizierung benutzt wird. Falls Sie Eingaben bei der Authentifizierung machen müssen, werden die Dateien danach automatisch geladen. Für diese Methode sieht die zu benutzende Syntax etwas anders aus: Linux:~# sftp [[User@Host [:Datei [Datei]]] Start in einem bestimmten Remoteverzeichnis Die letzte Methode erlaubt es Ihnen, in einem bestimmten Remoteverzeichnis zu starten. Dies erspart Ihnen etwas Tipparbeit und kann ebenfalls sehr gut in Skripten umgesetzt werden. Die Syntax hierzu lautet: Linux:~# sftp [[User@Host [:dir[/]]] Optionen Nachdem Sie nun die drei verschiedenen Modi kennen gelernt haben, können wir uns mit den Optionen beschäftigen. Tabelle 5.17 listet alle verfügbaren Optionen auf und gibt zu jedem aufgeführten Punkt eine kurze Erläuterung. Option Erläuterung -b Batchdatei Die hier übergebene Batchdatei wird als Standardinput für den Client benutzt, das heißt, dass dieser die Befehle aus dieser Datei lesen wird. Sie sollten diese Option für nicht interaktive Authentifizierungen verwenden. Der Client wird abbrechen, wenn die Ausführung eines der folgenden Befehle nicht gelingt: get put rename ln rm mkdir chdir lchdir mlkdir -C Mit dieser Option können Sie Kompression aktivieren. Tabelle 5.17 Verfügbare Optionen für sftp Sandini Bib 302 5 Verschlüsselung Option Erläuterung -o SSH_Option Diese Option ermöglicht es Ihnen, eine SSH-Option direkt an SSH weiterzuleiten und ausführen zu lassen. -v Hiermit erhöhen Sie das Logginglevel. Tabelle 5.17 Verfügbare Optionen für sftp (Forts.) Interaktive Befehle Wenn Ihr SFTP-Client in den interaktiven Befehlsmodus gegangen ist, können Sie ihm eine Reihe von Befehlen ähnlich zum normalen FTP-Client übergeben. Beachten Sie bitte, dass Sie Verzeichnisse, die ein Leerzeichen beinhalten, in Anführungszeichen setzen. Tabelle 5.18 stellt Ihnen alle zur Verfügung stehenden Befehle vor und gibt zu jedem Punkt eine kleine Beschreibung. Befehl Beschreibung cd Pfad Hiermit wechseln Sie in das Remoteverzeichnis, das Sie mit dem Argument »Pfad« übergeben haben. lcd Pfad Hiermit wechseln Sie in das lokale Verzeichnis, das Sie mit dem Argument »Pfad« übergeben haben. chgrp Gruppe-Pfad Diese Option erlaubt es Ihnen, die Gruppe der Datei, die unter Pfad zu finden ist, zu ändern. Die dabei übergebene Gruppe muss eine numerische Gruppen-ID sein. chmod Modus-Pfad Sie können mit dieser Option die Zugriffserlaubnis (Argument Modus) der Datei, die unter dem angegebenen Pfad zu finden ist, ändern. chown EigentümerPfad Falls Sie den Eigentümer einer Datei ändern wollen, können Sie dies mit dieser Option machen. Der Eigentümer muss dabei als numerische UID übergeben werden. Exit Beendet den SFTP-Client get [flags] RemotePfad [lokaler Pfad] Diese Option bewirkt, dass das Remoteverzeichnis, das Sie mit dem Argument »Remote-Pfad« übergeben, auf dem angegebenen Pfad auf dem lokalen System (Argument »lokaler Pfad«) gespeichert wird. Falls Sie den lokalen Pfad nicht spezifizieren, erhält das Verzeichnis denselben Namen, den es auf dem Remotesystem hat. Falls Sie zusätzlich die Flag -P setzen, werden auch die Zugriffsberechtigungen und Zugriffszeiten kopiert. Help Listet eine kleine Hilfe auf lls [ls-options [Pfad]] Gibt ein ls-Listing des angegebenen lokalen Pfades an. Falls Sie den Pfad nicht weiter spezifiziert haben, erhalten Sie ein Listing des aktuellen lokalen Verzeichnisses. Tabelle 5.18 Interaktive Befehle Sandini Bib 5.2 OpenSSH 303 Befehl Beschreibung lmkdir Pfad Diese Option erlaubt es Ihnen, ein lokales Verzeichnis zu erstellen. Den Namen dieses Verzeichnisses übergeben Sie mit dem Argument »Pfad«. ln Pfad_1 Pfad_2 Hiermit erstellen Sie einen symbolischen Link von Pfad_1 nach Pfad_2. Lpwd Wenn Sie diese Option benutzen, wird Ihnen das lokale Verzeichnis ausgegeben, in dem Sie sich gerade befinden. ls [Pfad] Gibt ein ls-Listing des angegebenen Remote-Pfades an. Falls Sie den Pfad nicht weiter spezifiziert haben, erhalten Sie ein Listing des aktuellen Remote-Verzeichnisses. lumask umask Setzt die lokale »umask« auf »umask«. mkdir Pfad Diese Option erstellt ein Remoteverzeichnis mit dem Namen, den Sie mit dem Argument »Pfad« übergeben haben. put [flags] lokaler_Pfad [Remote_Pfad] Hiermit laden Sie die Datei oder das Verzeichnis, das Sie mit dem Argument »lokaler_Pfad« übergeben haben, auf das Remotesystem. Falls Sie den Namen des neuen Remoteverzeichnisses nicht mit dem Argument »Remote_Pfad« übergeben haben, so erhält der neu erstellte Ordner oder die neu erstellte Datei denselben Namen, den er/sie auch auf dem lokalen System hat. Pwd Wenn Sie diese Option benutzen, wird Ihnen das Remote-Verzeichnis ausgegeben, in dem Sie sich gerade befinden quit Beendet den SFTP-Client rename alter_Pfad neuer_Pfad Benennt den Pfad, den Sie mit dem Argument »alter_Pfad« übergeben haben, in den Namen um, den Sie mit dem Argument »neuer_Pfad« übergeben haben. rmdir Pfad Wenn Sie diesen Befehl übergeben, wird das Verzeichnis, das Sie mit dem Argument »Pfad« übergeben haben, auf dem Remotesystem gelöscht. rm Pfad Wenn Sie diesen Befehl übergeben, wird das File, das Sie mit dem Argument »Pfad« übergeben haben, auf dem Remotesystem gelöscht. symlink Pfad1 Pfad2 Hiermit erstellen Sie einen symbolischen Link von Pfad_1 nach Pfad_2. ! Befehl Durch die Übergabe dieses Befehls wird der angegebene Befehl auf der lokalen Shell ausgeführt. ! Hiermit kommen Sie auf die lokale Shell. ? Listet eine kleine Hilfe auf. Tabelle 5.18 Interaktive Befehle (Forts.) Sandini Bib Sandini Bib 6 Tools Ich muss zugeben, der Titel für dieses Kapitel ist nicht besonders geistreich und lässt kaum auf den Inhalt schließen. Doch leider fiel mir kein besserer Titel für diesen Abschnitt des Buchs ein, in dem es sich nun mal einfach nur um gute Tools dreht, die einem genervten Administrator eine Menge Arbeit ersparen können. Da die hier beschriebenen Programme weit gefächerte Funktionsmöglichkeiten haben, werde ich nicht viel Zeit mit der Einleitung verschwenden und gleich mit der Besprechung des ersten Tools beginnen. 6.1 Superuser Do (sudo) Oftmals ist es so, dass ein Administrator einfach zu viel zu tun hat und sich nicht um jedes kleine Problem, das einen User bei der Verrichtung der täglichen Arbeit hindert, kümmern kann. Meistens ringt er sich doch durch, den genervten User aufzusuchen und ihm zu helfen. Dabei könnte und möchte der gestresste User dem Administrator viel Arbeit abnehmen, aber leider ist dies nicht möglich, da er die nötigen Rechte dazu nicht hat. Da gäbe es nun die Möglichkeit dem User einfach die Rechte zu geben (zum Beispiel könnte man ihm das Rootpasswort geben), doch jeder vernünftige Systemverwalter weiß, dass dies mächtig in die Hose gehen kann! Also bleibt einem da nichts anderes übrig, als jedes Mal zum Benutzer zu laufen? Nein, nicht ganz. Sie haben die Möglichkeit dem Benutzer genau die Rechte zu erteilen die er braucht. Nehmen wir an, der User muss einmal am Tag eine bestimmte Arbeit verrichten, damit der Geschäftsablauf gewährleistet bleibt. Man könnte diesem Benutzer nun durch sudo erlauben, genau die Befehle, die er ausführen muss, auszuführen. Damit sind der Arbeitsablauf und die Omnipotenz des Rootaccounts gesichert. 6.1.1 Installation Beschaffen Sie sich die neueste stabile Version aus einer sicheren Quelle, wie zum Beispiel: Der Buchseite Der offiziellen SUDO-Page www.courtesan.com/courtesan/products/sudo Aus der Paketdatenbank Ihrer Distribution Nachdem Sie sich das Paket beschafft haben, sollten Sie es folgendermaßen kompilieren und installieren: Linux:~# tar -xfz sudo-version.tar.gz Linux:~# cd sudo-version Linux:~# ./configure --with pam \ --with-timeout=0 Sandini Bib 306 6 Tools Linux:~# make Linux:~# make install Linux:~# cp sample.pam /etc/pam.d/sudo Mit dieser Befehlskette wird sudo mit pam-Unterstützung und einem Timeout von 0 kompiliert. Das heißt, dass bei jeder Befehlseingabe über sudo ein Passwort nötig wird. 6.1.2 Konfiguration und Einsatz Falls wir nur die Optionen von sudo besprechen müssten, wäre dies innerhalb weniger Seiten getan. Da wir aber die Konfiguration von sudo ebenfalls besprechen wollen, wird sich dies etwas platzunfreundlicher gestalten. visudo Die Konfiguration erfolgt über die Datei /etc/sudoers. Diese Datei können Sie durch visudo editieren. Dafür müssen Sie logischerweise als root eingeloggt sein. Falls Sie die Konfigurationsdatei /etc/sudoers also verändern wollen, müssen Sie folgenden Befehl eingeben: Linux:~# visudo Danach wird mit Hilfe des Visual Editors die Konfigurationsdatei geöffnet und kann editiert werden. Natürlich könnten Sie die Datei auch direkt über den Editor verändern, doch ich rate stark davon ab. Die Gründe dafür wären: 1. Die Konfigurationsdatei ist so konzipiert, dass eine zentrale Administration von verteilten sudo-Zugriffsrechten ermöglicht wird. Nehmen wir an, mehrere Systemverwalter haben das Recht die Konfigurationsdatei zu ändern. Falls nun zwei Administratoren zur selben Zeit die Datei ändern würden (über einen Editor oder über die Pipe), hätte das fatale Folgen (im worst case). Visudo verhindert das, da dieses Programm simultane Zugriffe auf /etc/sudoers unterbindet. 2. Falls Sie sudo nur auf einem Rechner ansetzen, ist das gerade eben beschriebene Problem für Sie nicht von allzu großer Bedeutung, da höchstwahrscheinlich nur Sie an der Konfigurationsdatei arbeiten. Dies schützt Sie aber noch nicht vor Syntaxfehlern. Falls Sie die Konfigurationsdatei mit visudo ändern, wird die Syntax vor dem Abspeichern noch einmal auf Fehler gecheckt. Wenn ein Fehler gefunden wird, wird die Datei nicht abgespeichert und visudo zeigt Ihnen die Zeilen, in denen die Syntaxfehler gefunden wurden, an und bittet Sie darum, das Problem zu klären (what’s now). Der User hat nun die Möglichkeit über die Option e die Konfigurationsdatei nochmals zu editieren. Er kann aber die Datei mit Hilfe der Option x verlassen, ohne dass die Änderungen gespeichert werden. Die letzte – und nicht zu empfehlende – Option lau- Sandini Bib 6.1 Superuser Do (sudo) 307 tet Q. Hierbei wird die Datei ebenfalls verlassen, die Änderungen (inklusive der falschen Syntax) werden aber gespeichert. Sie sollten diese Option nur in extremen Ausnahmefällen benutzen! Syntax Ich denke, Sie wissen nun, dass es unbedingt empfehlenswert ist, die Konfigurationsdatei nur über visudo zu öffnen. Damit Sie dies auch tun können, werden wir Ihnen im Folgenden die verfügbaren Optionen für diesen Befehl kurz vorstellen. Der allgemeine Aufruf sollte keine Überraschungen in sich bergen: Linux:~# visudo [Optionen] Tabelle 6.1 zeigt die verfügbaren Optionen und gibt jeweils eine kleine Beschreibung dazu ab: Option Beschreibung -c Falls Sie diese Option verwenden, wird die Konfigurationsdatei nicht bearbeitet, sondern auf Fehler in der Syntax überprüft. Dabei bekommen Sie 0 als Rückgabewert, wenn keine Fehler gefunden werden. Andernfalls erhalten Sie eine 1. -f [alternative Konfigurationsdatei] Mit dieser Option können Sie visudo eine alternative Konfigurationsdatei übergeben. Per Default wird die Datei /etc/sudoers editiert. -q Bei dieser Option werden keine Details über die gefundenen Syntaxfehler ausgegeben. -s Um eine sehr genau Überprüfung der Syntax vorzunehmen, können Sie sich dieser Option bedienen. -V Zeigt die aktuelle Versionsnummer von visudo und bricht ab. Tabelle 6.1 Optionen für visudo Fehlermeldungen Wie bereits besprochen, gibt Ihnen visudo in bestimmen Situationen eine Fehlermeldung zurück. Welche Fehlermeldungen dabei angezeigt werden können und was sie bedeuten, sollte aus Tabelle 6.2 hervorgehen. Fehlermeldung Bedeutung Sudoers file busy, try again later Sie können die Konfigurationsdatei momentan nicht bearbeiten, da gerade ein anderer Administrator Änderungen daran vornimmt. /etc/sudoers.tmp: Permission denied Sie haben visudo nicht als root aufgerufen. sudoers.tmp ist die Datei, die erzeugt wird, wenn Sie Änderungen an der Konfigurationsdatei vornehmen wollen. Aus Sicherheitsgründen werden diese Änderungen nicht direkt an der Datei /etc/sudoers vorgenommen. Tabelle 6.2 Fehlermeldungen Sandini Bib 308 6 Tools Fehlermeldung Bedeutung Can't find you in the passwd database Ihre User-ID ist nicht in der Passwortdatei zu finden. Warning: undeclared Alias Entweder benutzen Sie einen {User, Runas, Host, Cmnd}_Alias, referenced near ... bevor Sie diesen definiert haben, oder Sie haben einen Usernamen oder einen Hostnamen aufgeführt, der nur aus Großbuchstaben, Ziffern oder einem Unterstrich besteht. Falls Sie die –sOption benutzen, werden diese Meldungen nicht als Warnungen, sondern als Fehler ausgegeben. Tabelle 6.2 Fehlermeldungen (Forts.) Nachdem Sie nun wissen, wie Sie die Konfigurationsdatei editieren können, sollen wir uns der Syntax dazu widmen. Konfigurationsdatei Vorwort zum Manual Falls Sie sich denken, dass die Beschreibung in diesem Buch etwas zu knapp geraten ist (was ich nicht hoffe, da ich versuche, jeden einzelnen Punkt genau zu beschreiben), können Sie einen Blick in das Manual werfen. Seien Sie aber nicht überrascht, falls Sie nicht auf Anhieb alles verstehen werden. Die Erklärungen in der Manpage sind in Extended Backus Naur Form (EBNF) verfasst. Falls Sie aber dennoch einen Blick in die Manpage werfen wollen oder eine andere Manpage, die in EBNF verfasst wurde, verstehen wollen, können Sie einen Blick in den folgenden Exkurs werfen, welcher kurz die Metazeichen dafür erläutert. Danach sollten Sie nach einiger Einarbeitungszeit EBNF lesen können. Extended Backus Naur Form (EBNF) Sprachkonstrukt Sprachkonstrukt der Programmiersprache <1> ::= <2> Ableitungsregel: Der linke Teil <1> wird durch den rechten Teil <2> definiert. | Oder-Definition { } Das in Mengenklammern eingeschlossene Konstrukt kann 0-mal oder mehrfach vorkommen. [ ] Das in Intervallklammern eingeschlossene Konstrukt kann 0-mal oder höchstens 1-mal vorkommen Für weitergehende Informationen sollten Sie sich die RFC dazu ansehen: http://www.ietf.org/rfc/rfc2234.txt Sandini Bib 6.1 Superuser Do (sudo) 309 Bestandteile Die Syntax der Konfigurationsdatei /etc/sudoers besteht grundsätzlich aus zwei Einträgen: Aliase Benutzerspezifikationen Aliase Sudo bietet grundsätzlich vier verschiedene Aliase zur Auswahl an. Tabelle 6.3 stellt Ihnen diese Aliase kurz vor und gibt zu jedem Punkt eine kurze Beschreibung. Aliase Beschreibung User_Alias Hiermit können Sie einzelne User oder Gruppen zusammenfassen. Runas_Alias Hiermit können Sie einzelne User oder Gruppen zusammenfassen, deren UIS durch die »-u«-Option von Sudo angenommen werden. Host_Alias Hiermit können Sie einzelne Hosts, IP-Adressen oder ganze Netzwerke zusammenfassen. Cmnd_Alias Hiermit können Sie einzelne Befehle oder Verzeichnisse, in denen sich Befehle befinden, zusammenfassen. Tabelle 6.3 Verfügbare Aliase Lassen Sie uns dazu ein Beispiel ansehen: Nehmen wir an, Sie wollen, dass alle Dominoentwickler in Ihrem Haus bestimmte Befehle ausführen dürfen. Dazu müssen Sie als Erstes eine Gruppe erstellen, die alle betreffenden Dominoentwickler enthält. Der Aufruf hierfür sieht folgendermaßen aus: User_Alias DOMINO = roland, joe, aga, aj Wie Sie sehen können, haben wir die User roland, joe, aga und aj in die Gruppe DOMINO verfrachtet. Der Gruppenname ist absichtlich in Großbuchstaben verfasst. Sie könnten aber zusätzlich auch Ziffern oder Unterstriche verwenden (jedoch keine Kleinbuchstaben). Als Nächstes müssen Sie sich Gedanken machen, auf welchen Hosts diese Entwickler die bestimmten Rechte haben sollten. Sie kommen zu dem Schluss, dass es reicht, wenn Sie die benötigten Befehle auf den Dominoservern ausführen dürfen (domina1 und domina2). Host_Alias DOMINOSERVER = domina1, domina2 Sandini Bib 310 6 Tools Der letzte Schritt, den wir mit unserem derzeitigen Wissen durchführen können, besteht in der Befehlsdefinition. Hierbei müssen Sie einen Namen für die Befehle angeben (ahnlich den beiden zuvor gesehenen Definitionen). Dafür sollten Sie sich überlegen, welche Befehle die Entwickler benötigen. Nach einiger Zeit und nach einer intensiven Befragung des Teams kommen Sie zum Schluss, dass folgende Befehle benötigt werden: 1. /usr/bin/kill 2. /usr/sbin/halt, /usr/sbin/fasthalt 3. /usr/bin/su 4. Jetzt müssen Sie diese Befehle noch zusammenfassen: Cmnd_Alias DOM_CMND = /usr/bin/kill, /usr/sbin/halt, /usr/ sbin/fasthalt, /usr/bin/su 5. Die genaue Definition und die Bedingungen für die Ausführung können wir im Moment noch nicht realisieren. Defaults Bestimmte Konfigurationsoptionen können während der Laufzeit von Ihrem Defaultwert geändert werden. Diese Änderung kann dabei jeden Host, jeden User auf einem bestimmten Host oder einen bestimmten User betreffen. Falls mehrere Zeilen zutreffen, werden diese der Reihe nach angewendet. Falls bestimmte Werte im Konflikt zueinander stehen, wird der letzte Wert angewendet. Sehen wir uns hierzu drei kurze Beispiele an: Sie wollen alle User aus der Gruppe DOMINA spezifizieren: Defaults:DOMINA Parameter Sie wollen den User joe spezifizieren: Defaults:joeParameter Sie wollen alle Hosts der Gruppe SERVERS spezifizieren: Defaults@SERVERSParameter Aus den Beispielen können Sie die unterschiedliche Verwendung der Syntax gut erkennen. Nun sollten wir uns dem Wert Parameter widmen. Dieser kann aus folgenden Werten bestehen: flags Integerwerte Sandini Bib 6.1 Superuser Do (sudo) 311 strings lists Flags Operator Sie können bestimmte Flags mit dem !-Operator abschalten. Zum Beispiel: Defaults:joe !authenticate Integerwerte, strings- und lists-Operatoren Auch diese Werte können Sie abschalten (ähnlich zu den Flags). Wenn Sie diesen Werten mehrere Wörter übergeben wollen, müssen Sie diese in Anführungszeichen setzen. Listen haben jedoch zwei weitere Operatoren zur Verfügung: Mit Hilfe des +=-Operators können Sie bestimmte Werte zu einer Liste hinzufügen. Um Werte zu entfernen benutzen Sie den -=-Operator. Platzierung Am besten platzieren Sie die Defaultspezifikationen zwischen den Aliasen und Benutzerspezifikationen. Flags Tabelle 6.4 zeigt alle verfügbaren Flags und gibt zu jedem Punkt eine kleine Beschreibung. Flag Beschreibung long_otp_prompt Falls ein One Time Passwort verwendet wird (S/Key oder OPIE), wird die Abfrage in zwei Zeilen durchgeführt, um Cut and Paste leichter durchführen zu können. Dieses Flag ist per Default off. ignore_dot Mit dieser Option wird der Punkt (aktuelles Verzeichnis) in der PATH-Variablen ignoriert. Diese Flag ist per Default off. mail_always Schickt dem mailto-User jedes Mal eine Mail, wenn Sudo benutzt wird. Dieses Flag ist per Default off. mail_badpass Schickt dem mailto-User jedes Mal eine Mail, wenn der aktuelle User ein falsches Passwort benutzt hat. Dieses Flag ist per Default off. mail_no_user Schickt dem mailto-User jedes Mal eine Mail, wenn der User, der Sudo aufrufen will, nicht in der Konfigurationsdatei zu finden ist. Dieses Flag ist per Default on. mail_no_host Schickt dem mailto-User jedes Mal eine Mail, wenn der User, der Sudo aufruft, zwar in der Konfigurationsdatei zu finden ist, aber keine Befehle auf dem aktuellen Host ausführen darf. Dieses Flag ist per Default off. Tabelle 6.4 Verfügbare Flags Sandini Bib 312 6 Tools Flag Beschreibung mail_no_perms Schickt dem mailto-User jedes Mail eine Mail, wenn der User, der Sudo aufruft, dazu berechtigt ist, aber der Befehl, den er ausführen will, nicht in der Konfigurationsdatei gefunden werden kann. tty_tickets User müssen sich an einer tty-Basis authentifizieren. Normalerweise benutzt Sudo ein Verzeichnis im Ticketverzeichnis mit dem Namen des aktuellen Users. Wenn dieses Flag aktiviert ist, wird Sudo eine Datei mit dem Namen des tty, an dem der User angemeldet ist erstellen. Dieses Flag ist per Default off. lecture Der User erhält beim ersten Benutzen von Sudo einen kurzen Vortrag. Dieses Flag ist per Default on. authenticate Die User müssen sich mit einem Passwort authentifizieren, bevor sie Befehle ausführen dürfen. Dieser Defaultwert kann mit den Flags PASSWD und NOPASSWD überschrieben werden. Dieses Flag ist per Default on. root_sudo Root darf ebenfalls Sudo benutzen. Sie sollten diese Option deaktivieren, da sie es Usern ermöglicht, durch die Verkettung von Befehlen eine Rootshell zu bekommen: sudo sudo /bin/sh Dieses Flag ist per Default on. log_host Der Hostname wird im Sudologfile festgehalten. Dieses Flag ist per Default off. log_year Das Jahr (vierstellig) wird im Sudologfile festgehalten. Dieses Flag ist per Default off. shell_noargs Wenn Sudo mit keinen Argumenten aufgerufen wird, agiert es, als wäre das -s-Flag gesetzt. Das heißt Sudo öffnet eine Rootshell. Dieses Flag ist off per Default. set_home Wenn Sudo mit der –s-Option aufgerufen wird, setzt Sudo die HOME-Umgebungsvariable auf das Homeverzeichnis des Zielusers (root, außer es wurde die –u-Option benutzt). Dies bedeutet, dass die –s-Option die –H-Option impliziert. Dieses Flag ist per Default off. always_set_home Sudo setzt die HOME-Umgebungsvariable auf das Homeverzeichnis des Zielusers (root, außer es wurde die –u-Option benutzt). Dies bedeutet, dass die –s-Option die –H-Option impliziert. Dieses Flag ist per Default off. path_info Normalerweise teilt Sudo dem User mit, wenn ein Befehl nicht in der PATH-Umgebungsvariable zu finden ist. Sie können dies deaktivieren, das kann aber zu sehr verwirrenden Ergebnissen führen. Dieses Flag ist per Default off. Tabelle 6.4 Verfügbare Flags (Forts.) Sandini Bib 6.1 Superuser Do (sudo) 313 Flag Beschreibung preserve_groups Per Default initialisiert Sudo den Gruppenvektor zu der Liste der Gruppe, in der sich der Zieluser befindet. Falls Sie aber diese Flag setzen, wird der Gruppenvektor nicht verändert. Die richtigen Gruppen IDs werden jedoch weiterhin so gesetzt, dass sie der ID des Zielusers entsprechen. Dieses Flag ist per Default off. fqdn Sie können dieses Flag setzen, um vollständige Hostnamen anzugeben. Anstatt joey können Sie joey.testdomain2.de angeben. Es ist aber weiterhin erlaubt die Kurzform anzugeben, Sie können diese beiden Formen sogar mischen. Beachten Sie dabei aber, dass Sudo nicht mehr lauffähig ist, wenn der DNS stoppt. Weiter müssen Sie den offiziellen Hostnamen benutzen, den der DNS auch kennt. Das heißt, dass Sie keinen Hostaliase benutzen können! Dieses Flag ist per Default off. insults Sudo wird den User »beleidigen«, wenn Sie ein falsches Passwort eingeben. Dieses Flag ist per Default off. requiretty Sudo läuft nur dann, wenn der User in einen echten tty eingeloggt ist. Dies verhindert, dass User, die über bestimmte Remotedienste eingeloggt sind und dadurch keinen tty zugewiesen bekommen, Sudo ausführen können. Dieses Flag ist per Default off. env_editor Falls dieses Flag gesetzt ist, wird visudo den Editor, der in der Umgebungsvariable EDITOR oder VISUAL angegeben ist, benutzen. Beachten Sie, dass diese Option eine große Sicherheitslücke aufbricht, da der User jeden beliebigen Befehl als Root ausführen kann, ohne sich davor einloggen zu müssen. Wir werden dafür einen sichereren Weg kennen lernen. Dieses Flag ist per Default off. rootpw Sudo wird nach dem Rootpasswort fragen (normalerweise fragt Sudo nach dem Passwort des aktuellen Users). Dieses Flag ist per Default off. runaspw Sudo wird nach dem Passwort des in runas_default definierten Users fragen, anstatt nach dem Passwort des aktuellen Users. Dieses Flag ist per Default off. targetpw Sudo wird nach dem Passwort des mit der –u-Option angegebenen Users fragen (anstatt des Passwortes des aktuellen Users). Dieses Flag ist per Default off. set_logname Normalerweise setzt Sudo die LOGNAME- und USER-Umgebungsvariablen auf den Wert des Zielusers (meistens root, außer die – u-Option wurde benutzt). Es gibt jedoch einige Programme, die die Variable LOGNAME benutzen, um die Identität des Users festzustellen. Sie sollten daher diese Option deaktivieren, falls Sie solche Programme auf Ihrem System laufen haben. Tabelle 6.4 Verfügbare Flags (Forts.) Sandini Bib 314 6 Tools Flag Beschreibung stay_setuid Normalerweise setzt Sudo die UID des aktuellen Users auf die Ziel-Uid (zumeist root), wenn der User einen Befehl ausführt. Mit diesem Flag erreichen Sie, dass dies nicht mehr so gehandhabt wird. Die UID bleibt auf den Wert des aktuellen Users gesetzt. Sudo arbeitet also wie ein setuid-wrapper. env_reset Falls Sie dieses Flag setzen, wird Sudo die ENV (Umgebungsvariablen) so setzen, dass diese nur noch folgende Variablen beinhaltet: HOME LOGNAME PATH SHELL TERM USER Dabei müssen Sie weiter beachten, dass nur die Variable TERM unverändert aus der ursprünglichen ENV übernommen wird. Die anderen Variablen werden auf Defaultwerte gesetzt. Falls Sudo mit der SECURE_PATH-Option kompiliert wurde, wird dieser Wert für die PATH-Variable verwendet. Sie können weitere Umgebungsvariablen mit der env_keep-Option schützen. use_loginclass Falls dieses Flag gesetzt wird, wird der angegebene Defaultwert für die User Login Class angewendet (falls sie existiert). Diese Flag ist nur verfügbar, falls Sudo mit der --with-logincapOption kompiliert wurde. Dieses Flag ist per Default off. Tabelle 6.4 Verfügbare Flags (Forts.) Integerwerte Nachdem Sie nun alle verfügbaren Flags kennen, können wir uns den Integerwerten widmen. Sie finden alle dafür verfügbaren Integerwerte in Tabelle 6.5. Integerwert Beschreibung passwd_tries Gibt an, wie oft ein User sein Passwort falsch eingeben darf, bevor dies geloggt wird und Sudo beendet. loglinelen Gibt die Anzahl der Zeichen pro Zeile in einem Logfile an. Dies hat keine Auswirkungen auf das Syslogfile! Der Default liegt bei 80. Um diese Option zu deaktivieren, können Sie die 0 wählen. timestamp_timeout Gibt an, wie viele Minuten vergehen dürfen, bis Sudo den User erneut nach einem Passwort fragt. Der Defaultwert liegt bei 5 Minuten. Um immer nach einem Passwort zu fragen, setzen Sie diese Option auf 0. Falls Sie einen Wert kleiner als 0 angeben, wird der User niemals nach einem Passwort gefragt. Tabelle 6.5 Verfügbare Integerwerte Sandini Bib 6.1 Superuser Do (sudo) 315 Integerwert Beschreibung passwd_timeout Gibt an, wie lange der Passwortprompt angezeigt werden soll. Der Default liegt bei 5 (also 5 Minuten). Sie können diesen Wert auf 0 setzen, um keinen timeout zu definieren. umask Gibt die umask an, die benutzt werden soll, wenn ein Befehl ausgeführt wird. Setzen Sie den Wert 0777 um die umask des Users zu bewahren. Der Defaultwert liegt bei 022. Tabelle 6.5 Verfügbare Integerwerte (Forts.) Strings Werfen wir nun einen Blick auf die verfügbaren Strings. Tabelle 6.6 stellt uns alle verfügbaren Strings kurz anhand einer Beschreibung vor. String Beschreibung mailsub Gibt das Subject (Betreffzeile) der Mail an, die an den mailto User geschickt wird. badpass_message Gibt die Nachricht an, die angezeigt wird, wenn ein User ein falsches Passwort eingibt. Falls insults nicht aktiviert sind, liegt der Default bei: Sorry, try again. timestampdir Gibt das Verzeichnis an, in dem Sudo seine Timestampdateien aufbewahrt. Der Default liegt bei /var/run. passprompt Gibt den Defaultprompt an, der gezeigt wird, wenn nach einem Passwort gefragt werden soll. Dieser Wert kann mit der –p-Option oder mit der SUDO_PROMPT-Umgebungsvariable überschrieben werden. Sie können dabei auch zwei Sonderwerte benutzen: %u gibt den Usernamen an %h gibt den lokalen Hostnamen an Der Defaultwert liegt bei: Password: runas_default Gibt den User an, unter dem die Befehle ausgeführt werden (nur wenn die –u-Option nicht beim Start gewählt wurde). Der Defaultuser ist root. syslog_goodpri Gibt das Sysloglevel an, wenn sich der User erfolgreich angemeldet hat. Defaultwert liegt bei notice. Verfügbare Werte sind: debug info notice warning warn Tabelle 6.6 verfügbare Strings Sandini Bib 316 String 6 Tools Beschreibung err error crit alert emerg panic syslog_babpri Gibt das Sysloglevel an, wenn sich der User nicht erfolgreich angemeldet hat. Der Defaultwert liegt bei alert. Verfügbare Werte sind im vorherigen Punkt aufgeführt. editor Eine durch Doppelpunkt getrennte Liste von Editoren, die von visudo benutzt werden können. Falls in der Umgebungsvariable USER kein Editor vorhanden ist, der auch in der Liste vorhanden ist, wählt visudo den ersten Editor der angegebenen Liste. Per Default wird vi aufgerufen. logfile Gibt den Pfad zur Loggingdatei an. Falls ein Pfad angegeben wird, ist Logging aktiviert, falls nicht, ist es deaktiviert. syslog Gibt die Syslogfacility an, die für das Logging benutzt werden soll. Der Defaultwert liegt bei local2. Mögliche Wert hierfür sind: auth daemon user local0 local1 local2 local3 local4 local5 local6 local7 mailerpath Gibt den Pfad zum Mailprogramm an, das benutzt wird, um Warnungen zu verschicken. Defaultwerte werden während der Konfiguration gesucht. mailerflags Flags, die beim Aufruf des Mailprogramms gesetzt werden sollen. Default liegt bei -t. mailto Gibt die Adresse an, an die Warnungen und Fehlermeldungen geschickt werden sollen. Dieser Wert sollte in Anführungszeichen angegeben werden, damit Sudo das @-Zeichen nicht falsch interpretiert. Default User und Mailadresse ist root. Tabelle 6.6 verfügbare Strings (Forts.) Sandini Bib 6.1 Superuser Do (sudo) 317 String Beschreibung exempt_group User in dieser Gruppe sind von Passwort und PATH-Bedingungen befreit. Es ist kein Defaultwert gesetzt. verifypw Diese Option kontrolliert, wann ein Passwort benötigt wird, wenn ein User Sudo mit der –v-Option startet. Mögliche Werte hierfür sind: all Alle den aktuellen User betreffenden Einträge müssen das NOPASSWD-Flag gesetzt haben, um zu verhindern, dass ein Passwort eingegeben wird. Dies ist der Standardwert. any Mindestens einen den aktuellen User betreffenden Eintrag muss das NOPASSWD-Flag gesetzt haben, um zu verhindern, dass ein Passwort eingegeben wird. never Der User braucht niemals ein Passwort einzugeben, wenn er die –v-Option benutzt. always Der User muss immer ein Passwort eingeben, wenn er die -v-Option benutzt. listpw Diese Option kontrolliert, ob ein Passwort benötigt wird, wenn ein User Sudo mit der -l-Option startet. Mögliche Wert sind: all Alle den aktuellen User betreffenden Einträge müssen das NOPASSWD-Flag gesetzt haben, um zu verhindern, dass ein Passwort eingegeben wird. any Mindestens einen den aktuellen User betreffenden Eintrag muss das NOPASSWD-Flag gesetzt haben, um zu verhindern, dass ein Passwort eingegeben wird. Dies ist der Defaultwertnever Der User braucht niemals ein Passwort einzugeben, wenn er die –l-Option benutzt. always Der User muss immer ein Passwort eingeben, wenn er die –l-Option benutzt. env_check Gibt die Umgebungsvariablen an, die aus der Umgebung (ENV) des Users gelöscht werden sollen. Diese müssen eines der beiden Zeichen enthalten: % / Tabelle 6.6 verfügbare Strings (Forts.) Sandini Bib 318 String 6 Tools Beschreibung Trennen Sie mehrere Argumente mit der Leertaste und setzen Sie sie in Anführungszeichen. Sie können außerdem folgende Operatoren verwenden: = Ersetzt vorhandene Liste += Addiert Wert zur vorhandenen Liste -= Löscht Wert aus vorhandener Liste ! Deaktiviert Liste Die Defaultliste für die zu überprüfenden Variablen erhalten Sie, wenn Sie Sudo als root mit der Option -V starten. env_delete Gibt die Umgebungsvariablen an, die aus der Umgebung (ENV) des Users gelöscht werden sollen. Trennen Sie mehrere Argumente mit der Leertaste und setzen Sie sie in Anführungszeichen. Sie können außerdem folgende Operatoren verwenden: = Ersetzt vorhandene Liste += Addiert Wert zur vorhandenen Liste -= Löscht Wert aus vorhandener Liste ! Deaktiviert Liste Die Defaultliste für die zu überprüfenden Variablen erhalten Sie, wenn Sie Sudo als root mit der Option -V starten. env_keep Gibt die Umgebungsvariablen an, die bei der Initialisierung der env_reset-Option geschützt werden sollen. Sie können eine Liste von Variablen übergeben, diese müssen Sie dann allerdings in Anführungszeichen setzen und durch die Leertaste trennen. Tabelle 6.6 verfügbare Strings (Forts.) Benutzerspezifikationen Jetzt kennen Sie die Möglichkeiten und Tücken der verfügbaren Aliase und wir können uns den Benutzerspezifikationen widmen. Benutzerspezifikationen bestimmen, welcher User welchen Befehl unter der ID eines bestimmten Users auf einem bestimmten Host ausführen darf. Der allgemeine Aufruf in der Konfigurationsdatei erfolgt folgendermaßen: Sandini Bib 6.1 Superuser Do (sudo) 319 USER_ALIAS HOST_ALIAS = [NOPASSWD:] [Wildcards, Metazeichen, Reservierte Wörter] CMND_ALIAS RUNAS_SPEC Mit Hilfe des RUNAS_SPEC können Sie angeben, dass ein bestimmter User den Befehl CMND1 als TARGET1 und Befehl CMND2 als TARGET2 laufen lassen darf. Hierzu einige kurze Beispiele: joe host1 = (operator) /bin/ls, /bin/kill, /usr/bin/who Die eben gezeigte Syntax gibt an, dass der User joe die Befehle: /bin/ls /bin/kill /usr/bin/who mit den Rechten des Operators am Host host1 ausführen darf. Der User kann diese Befehle dann durch einen besonderen Aufruf von Sudo ausführen: Linux:~# sudo -u operator /usr/bin/who Sie können auch mehrere Targetuser in die Syntax einbauen: joe host1 = (operator) /bin/ls, (root) /bin/kill, /usr/bin/who Jetzt darf der User joe den Befehl /usr/ls mit den Rechten des Operators ausführen, die beiden weiteren aber als Root. PASSWD und NOPASSWD Bevor ein User einen bestimmten Befehl ausführen darf, muss er sich normalerweise via Passwort authentifizieren. Man kann diesen Mechanismus aber durch das Setzen des NOPASSWD-Flags abschalten. Die Initialisierung erfolgt dabei ähnlich zu der Syntax der RUNAS_SPEC. So sind nur die Befehle, die nach dem NOPASSWD-Flag aufgeführt sind, von diesem Mechanismus befreit. Durch Setzen des PASSWD-Flag wird der Mechanismus wieder aktiviert. Auch hierzu sollten wir uns ein Beispiel ansehen: joe host1 = NOPASSWD: /usr/bin/who Die eben vorgestellte Syntax bewirkt, dass der User joe auf dem Rechner host1 den Befehl /usr/bin/who ausführen darf, ohne dass er dabei nach einem Passwort gefragt wird. Die nächste Zeile einer Beispielkonfigurationsdatei besagt, dass der User joe den Befehl /usr/bin/who ohne Passworteingabe ausführen darf. Falls er aber den Befehl /bin/ls benutzt, wird er aufgefordert ein Passwort einzugeben. joe host1 =NOPASSWD:/usr/bin/who, PASSWD: /bin/ls Beachten Sie dabei aber, dass der User joe sich nicht in der exempt_group befinden darf, da das PASSWD-Flag nicht bei Usern in dieser Gruppe greift. Sandini Bib 320 6 Tools Wildcards und Metazeichen Sudo erlaubt shellähnliche Wildcards für den Aufruf von Pfadnamen genauso wie für Kommandozeilenargumente in der Konfigurationsdatei. Tabelle 6.7 zeigt die zusätzlich verfügbaren Sudo-Metazeichen (Wildcards): Metazeichen Beschreibung (Wildcard) * Trifft bei jeder möglichen Kombination von einen oder mehreren Zeichen zu ? Trifft bei einem einzelnen Zeichen zu [… ] Trifft auf jedes Zeichen in dem angegebenen Bereich zu [!...] Trifft auf jedes Zeichen zu, das sich nicht in dem angegebenen Bereich befindet \x Wird benutzt um besondere Zeichen zu escapen (wie zum Beispiel: *, ?...) Tabelle 6.7 Sudo Metazeichen Ausnahmen zu Wildcards und Metazeichen Falls der leere String als einziges Argument in der Kommandozeile in der Konfigurationsdatei übergeben wird, bedeutet dies, dass der Befehl mit keinen Argumenten aufgerufen werden darf. Beispielkonfigurationsdatei Zum Abschluss werden wir unser eben erlangtes Wissen umsetzen und eine Konfigurationsdatei erstellen. Ich werde die nötigen Erklärungen als Kommentare in die Datei einfügen. Das sollte Ihnen eine Menge Sucharbeit ersparen. Beachten Sie aber, dass diese Datei auf keinen Fall vollständig ist. # sudoers file # # This file MUST be edited with the ‚visudo’ command as root. # # See the sudoers man page for the details on how to write a sudoers file. # # Als Erstes definieren wir unsere Aliase # # Beginnen wir mit den USER Aliasen # User_Alias ENTWICKLER = brunnerj, neutatza, maiers, User_Alias SECURITY = dau, paddy User_Alias USERADMIN = goetzs, mosers, schmidtw User_Alias WEBMASTER = muellera, meiern User_Alias NETZTECHNIK = thomsonb, rueffelf . . . # Sandini Bib 6.1 Superuser Do (sudo) 321 # Nun definieren wir die RUNAS Aliase # Runas_Alias OP = root, operator Runas_Alias DB = oracle, sybase, mysql Runas_Alias RF = redfancy, ownuser Runas_Alias FW = firewall, sad . . . # # Jetzt kümmern wir uns um die Host Aliase # Host_Alias SOLARIS_SPARC = mail, firewall:\ LINUX_INTEL = net1, net2, net3, dev1, dev2, :\ LINUX_ALPHA = dev5, dev6, dev7, dev9, net6, net7, :\ SOLARIS_INTEL = backup1, backup2 Host_Alias ADMINS_WS= 10.209.100.0/255.255.255.0 Host_Alias TEST = 132.128.24.0/24 Host_Alias STORAGE = stor1, stor2, stor3, storback Host_Alias SEC_DATA = psst1, psst2 Host_Alias DIALIP = dial1, dial2 . . . # # Als Letztes definieren wir noch die Befehls-Aliase # Cmnd_Alias FILESHIP = /bin/chown, /bin/chmod Cmnd_Alias MOUNT = /bin/mount, /bin/umount Cmnd_Alias KILL = /usr/bin/kill Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown, /sbin/init Cmnd_Alias HALT = /usr/sbin/halt, /usr/sbin/fasthalt Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \ /usr/local/bin/tcsh, /usr/bin/rsh, /bin/ash, \ /usr/local/bin/zsh Cmnd_Alias SU = /usr/bin/su Cmnd_Alias DEL = /bin/rm, /bin/rmdir Cmnd_Alias COPY = /bin/mv, /bin/cp . . . # # Jetzt überschreiben wir einige Defaultwerte # Defaults syslog=auth Sandini Bib 322 6 Tools Defaults:WEBMASTER !lecture, mail_no_perms Defaults:joe !authenticate Defaults@LINUX_INTEL log_year, log_host, logfile=/var/log/ sudo.log . . . # # Jetzt machen wir uns an die eigentliche Arbeit und vergeben # bestimmte Rechte # # Benutzerspezifikationen # # Dieser erste Block bedeutet, dass wir dem User Root und jedem User # aus den Gruppen # fastroot und chef jeden Befehl unter jedem Usernamen auf jedem # Host erlauben. root ALL = (ALL) ALL %fastroot ALL = (ALL) ALL %chef ALL = (ALL) ALL # Jetzt beschäftigen wir uns mit den vorher definierten Gruppen # Diese Zeile besagt, dass die Benutzer aus # der Gruppe Security jeden Befehl # auf jedem Host ausführen dürfen, ohne dass sie dabei # ein Passwort angeben müssen. SECURITYALL = NOPASSWD: ALL # Für die USERADMIN gilt dasselbe mit dem Unterschied, # dass sie ein Passwort angeben müssen. USERADMINALL = ALL # Nun erlauben wir dem User inge auf jedem Host # der Gruppe LINUX_INTEL jeden Befehl auszuführen. ingeLINUX_INTEL = ALL # Jetzt erlauben wir, dass der User franz jedes Userpasswort auf # Rechnern # des Aliase Test ändern darf. franz TEST = /usr/bin/passwd [A-z]* # Nun erlauben wir den Usern tom und cherry noch, # dass sie auf ihren eigenen Rechnern Prozesse # killen dürfen. tom tom_ws = KILL cherry cherry_ws = KILL . . . # # Jetzt fügen wir noch eine Run_as Zeile ein. # # Diese Zeile gibt unserem Chef das Recht die aufgeführten Befehle Sandini Bib 6.1 Superuser Do (sudo) 323 # auf seinem Rechner auszuführen. Allerdings nur als Operator. chef chef_ws= (operator) /bin/ls, /bin/kill, /bin/mv . . . Wie Sie sehen, ist die Umsetzung der kennen gelernten Argumente und Optionen nicht schwer. Sie sollten sich aber einige Zeit nehmen, um die Bedürfnisse genauestens zu studieren, so dass Sie eine sichere Sudo-Umgebung schaffen können. 6.1.3 Sudo-Befehl Nun endlich kommen wir zum eigentlichen Sudo-Befehlsaufruf. Ich denke, wir brauchen an dieser Stelle nicht mehr allzu viel zu erklären und können sofort mit der Syntax beginnen: Linux:~# sudo [Optionen] Tabelle 6.8 enthält alle verfügbaren Optionen mit einer entsprechenden Beschreibung zu jedem Argument. Option Beschreibung -V Sudo gibt die Versionsnummer aus und beendet danach. Falls der Benutzer, der Sudo mit dieser Option aufruft, root ist, bekommt dieser eine Liste von Defaultwerten ausgegeben (wir haben dies bereits bei der Konfigurationsbesprechung gesehen). -l Diese Option gibt dem User eine Liste der erlaubten und verbotenen Befehle auf dem aktuellen Host aus. -L Durch Angabe dieser Option wird eine Parameterliste des Defaultabschnittes (siehe Konfiguration) mit einer kurzen Beschreibung ausgegeben. -h Sie können diese Option benutzen, um eine kurze Bedienungsanleitung zu bekommen. -v Hierbei wird der Timestamp des Users auf den neuesten Stand gebracht und – falls nötig – nach einem Passwort gefragt. -k Mit dieser Option neutralisieren Sie den Timestamp des Users. Beim nächsten Start von Sudo wird nach einem Passwort gefragt. Für die Durchführung dieser Option wird aber kein Passwort benötigt. -K Hiermit löschen Sie den Timestamp des Users vollkommen. Auch hier brauchen Sie kein Passwort anzugeben. -b Sudo wird den angegebenen Befehl im Hintergrund ausführen. -p Falls Sie den Defaultpasswortprompt ändern wollen, können Sie dies mit dieser Option erledigen. Sie können durch den Platzhalter %u den Usernamen angeben. Zum Beispiel ergibt dieser Aufruf: Hey %u, gib dein Passwort ein. Tabelle 6.8 Optionen Sandini Bib 324 Option 6 Tools Beschreibung folgenden Prompt für den User joe: Hey joe, gib dein Passwort ein. -c Dieser Option muss eine Loginklasse folgen. Danach wird Sudo mit den Limitationen dieser Klasse ausgeführt. Dieser Klassenname kann dabei entweder aus einem einzelnen Zeichen »-« bestehen (gibt an, dass der Befehl strikt nach den Möglichkeiten des Users, unter dem der Befehl ausgeführt wird, laufen sollen) oder einem Eintrag aus der Logindatei /etc/login.conf. Falls die angegebene Klasse eine vorhandene Usergruppe angibt, muss Sudo als root ausgeführt werden. Beachten Sie dabei, dass für dieses Argument Sudo mit der Option --withlogincab erstellt worden sein muss. -a Hierbei können Sie den Authentifizierungstyp auswählen, der benutzt wird um User zu verifizieren. Sie können eine Liste von möglichen Methoden in der Datei / ec/login.conf hinterlegen. Dabei leiten Sie diese Liste mit dem Schlüsselwort authsudo. Sudo muss dabei mit der --with-bsdauth-Option erstellt worden sein. -u Falls Sie diese Option benutzen, wird Sudo den spezifizierten Befehl nicht unter dem User root, sondern unter dem von Ihnen angegebenen User laufen lassen. -s Diese Option bringt Sudo dazu, die in der Umgebungsvariable SHELL angegebene Shell laufen zu lassen. Falls diese an dieser Stelle nicht verfügbar ist, wird die Shell aus /etc/passwd gestartet. -H Diese Option setzt die HOME-Umgebungsvariable auf das Homeverzeichnis des Zielusers (zumeist root). Dabei wird das Verzeichnis gewählt, das in der Passwortdatei /etc/passwd spezifiziert wurde. -P Hierbei wird der Groupvektor nicht verändert. -S Veranlasst Sudo das Passwort von der Standardeingabe (STDIN) zu lesen -- Gibt an, dass Sudo mit dem Bearbeiten von Kommandozeilenbefehlen aufhören soll. Ist sinnvoll in Kombination mit der Benutzung der –s-Option. Tabelle 6.8 Optionen (Forts.) Beispiele Nachdem wir nun fit im Umgang mit Sudo sind, sollten wir uns abschließend noch einige Befehle anschauen, um unser erlangtes Wissen noch zu vertiefen. Listing eines geschützten Verzeichnisses Nehmen wir an, ein User will das Listing eines (für ihn) nicht lesbaren Verzeichnisses erhalten, so muss er folgenden Befehl aufrufen: Linux:~# sudo ls /verzeichnis Datei als User root editieren Das nächste Beispiel zeigt den Befehl, der es einem User ermöglicht, die Passwortdatei als User root zu editieren. Linux:~# sudo -u root vi /etc/passwd Sandini Bib 7 Remoteadministration In diesem Kapitel werden wir uns mit Open-Source-Tools beschäftigen, die es uns erlauben, unser System remote zu administrieren. Remoteadministration hat in den letzten Jahren immer mehr an Beliebtheit gewonnen und ist bei der Verwaltung von Serversystemen kaum mehr wegzudenken. Dies hat unter anderem folgende Gründe: Ein Administrator kann Systeme von jedem Punkt in der Welt (solange es dort einen für ihn nutzbaren Internetanschluss gibt) verwalten. Serversysteme brauchen keine Ein- und Ausgabeperipherie wie Monitore, Tastaturen oder Mäuse mehr, da sie über das Netz konfiguriert werden können. Der Administrator muss unter Umständen nur das Passwort für das Remoteadministrationstool kennen, um das System zu verwalten. Wie Sie sehen können, bieten Remoteadministrationstools einige Vorteile gegenüber der normalen Administration vor Ort. 7.1 Webmin Webmin ist ein Programm, das Ihnen die Administration eines Serversystems über einen einfachen Browser ermöglicht. Dabei brauchen Sie nicht einmal einen eigenen Webserver laufen zu haben, da dieser bereits von Webmin gestellt wird. Die von Ihnen gewünschten Änderungen werden durch die von Webmin mitgelieferten CGI-Skripte ins System übernommen. Falls Sie einmal ein Problem haben, das Sie mit Webmin nicht lösen können oder nicht wissen, wie Sie es mit diesem Programm lösen können, haben Sie die Möglichkeit, auch direkt Befehle an die Shell auf dem Server zu geben (Dazu wird SSH benutzt). 7.1.1 Installation Als erstes sollten Sie sich Webmin von der offiziellen Webseite oder der Buchpage besorgen. Dabei stehen zwei Pakete zur Auswahl bereit, Tar und RPM. RPM Wir werden uns zuerst mit der Installation des RPM-Pakets beschäftigen. Nachdem Sie das Paket geladen haben, können Sie es mit folgendem Befehl installieren: Linux:~# rpm -iv webmin-version.rpm Sandini Bib 326 7 Remoteadministration Danach sollten die in Tabelle 7.1 gezeigten Module in Ihr System eingebunden sein. Modul Beschreibung Webmin Configuration Hiermit lassen sich die Einstellungen ändern, die die Operationen von Webmin steuern. Webmin Help Durchsuchbarer Index des Webmin-Hilfesystems Webmin Servers Index Lokalisiert und listet alle Webminservers im lokalen Netz Webmin Users Verwaltet Webminbenutzer und deren Rechte Bootup and Shutdown Kontrolliert die Startup- und Shutdown-Prozesse des Systems Disk and Network Filesystems Nimmt lokale gemountete Filesysteme in Betrieb und listet sie auf NFS Exports Editiert, löscht und fügt neue NFS-exportierte Dateisysteme ein Running Processes Gibt detaillierte Informationen über die laufenden Prozesse aus Scheduled Cron Jobs Zeigt und kontrolliert Cronjobs Software Packages Ein grafisches Interface zum RPM-System Users and Groups Verwaltet Benutzer und Gruppen Apache Webserver Konfiguriert den Apache Webserver BIND 8 DNS Server Konfiguriert den Bind 8 DNS FTP-Server Konfiguriert den Wu-FTPD Server Internet Services and Protocols Verwaltet Internetdienste Majordomo List Manager Verwaltet den Majordomo Listserver (grafisch) PPP Usernames and Passwords Kontrolliert den PPP Server Samba Windows File Sharing Bringt den SAMBA-Server und -Client zum Laufen Sendmail Configuration Editiert die Sendmail-Konfigurationsdatei Squid Proxy Server Konfiguriert Squid Linux Bootup Configuration Editiert lilo.conf Network Configuration Kontrolliert die Netzwerkkarten und das Netzwerk Partitions on Local Disks Editiert, löscht und fügt neue Plattenpartitionen ein Printer Administration Verwaltet Druckerwarteschlangen, lokale und RemoteDrucker System Time Setzt die Systemzeit und die Hardwareuhr Custom Commands Hiermit können Sie benutzerdefinierte Befehle spezifizieren, die Sie dann über Webmin ausführen können File Manager Java-basierender Dateimanager Tabelle 7.1 Perl 5-Module Sandini Bib 7.1 Webmin 327 Modul Beschreibung Telnet Login Java-basierendes Telnet-Applet DHCP Server Konfiguriert den DHCP-Server Tabelle 7.1 Perl 5-Module (Forts.) Wie Sie sehen können, bieten Ihnen die Webmin Perl 5-Module eine große Plattform an, die es Ihnen ermöglicht, ein System vollkommen remote zu verwalten. 7.1.2 Start Um Ihren Webmin-Server zu starten, geben Sie bitte folgenden Befehl ein: Linux:~# /etc/init.d/init.d/webmin start Zum Stoppen übergeben Sie stattdessen das Argument stop. Jetzt können Sie Ihren Webmin-Server über den Port 10000 erreichen. Wenn Sie sich das erste Mal einloggen, brauchen Sie zur Identifizierung das Rootpasswort. Später können Sie die Einstellungen abändern, so dass Sie auch ohne das Rootpasswort Zugang zu Ihrem Webmin-Server haben. Nachdem Sie nun einen laufenden Webmin-Server besitzen, können wir uns daran machen, die nun zur Verfügung stehenden Möglichkeiten ausführlich zu besprechen. Dabei werden wir auf jeden der vorhandenen sechs Oberpunkte genau eingehen: 1. Webmin 2. System 3. Servers 4. Hardware 5. Cluster 6. Other Bevor wir mit der Besprechung beginnen, möchte ich Sie darauf hinweisen, dass wir das Paket Usermin nicht installiert haben, da es dafür bessere Alternativen (auch in diesem Buch) gibt. Wir werden daher die wenigen Punkte, die Webmin mit Usermin verbinden, nicht besprechen. Login Nachdem Sie die URL Ihres Webminsystems eingegeben haben (IP:Port), haben Sie die Möglichkeit sich in das System einzuloggen. Da Sie sich das erste Mal anmelden, benötigen Sie dafür das Rootpasswort. Sandini Bib 328 7 Remoteadministration Abbildung 7.1 zeigt die Loginseite. Abbildung 7.1 Loginseite 7.1.3 Webmin Nachdem Sie sich erfolgreich eingeloggt haben, werden Sie zur Indexseite (Abbildung 7.2) des ersten Oberpunktes »Webmin« weitergeleitet, wo Sie nun die Möglichkeit haben, die folgenden Unterpunkte zu wählen: Usermin Configuration (Wie bereits erwähnt werden wir Punkte, die im Zusammenhang mit Usermin stehen, nicht besprechen) Webmin Actions Log Webmin Configuration Webmin Servers Index Webmin Users Sandini Bib 7.1 Webmin 329 Abbildung 7.2 Webmin Webmin Actions Log Dieser Punkt ermöglicht es Ihnen, nach Einträgen in der Logdatei zu suchen. Sie können die Suche dabei durch drei Angaben verfeinern. Abbildung 7.3 zeigt diese Seite. Benutzer Mit dieser Option können Sie folgende Parameter zur Suche festlegen: Suche nach bestimmten Usern Suche ist nicht auf einen bestimmten User begrenzt Alle User bis auf einen bestimmten Benutzer werden in der Suche mit aufgenommen Module Die nächste Möglichkeit die Suchtreffer einzuschränken bzw. ausweiten, besteht darin, die Module, nach denen gesucht werden soll, zu spezifizieren. Suche ist nicht auf bestimmte Module eingeschränkt Suche ist auf ein bestimmtes Modul begrenzt Sandini Bib 330 7 Remoteadministration Zeitrahmen Der letzte Parameter, den Sie für die Suche setzen können, ist der Zeitrahmen. Dabei stehen Ihnen folgende Auswahlmöglichkeiten zur Verfügung: Eintrag muss zu keiner bestimmten Zeit gemacht worden sein Eintrag muss von heute stammen Eintrag muss in einem bestimmten Zeitintervall gemacht worden sein Abbildung 7.3 Actionslog Webmin Konfiguration Dieser Abschnitt ermöglicht es Ihnen, Ihr Webmin-System Ihren Bedürfnissen entsprechend zu konfigurieren. Wir werden im Folgenden auf die einzelnen Punkte, die Ihnen dabei zur Verfügung stehen, eingehen. Abbildung 7.4 zeigt diese Seite. IP Access Control Mit Hilfe dieser Seite können Sie den Zugriff auf Ihr Webmin-Serversystem auf bestimmte Adressen einschränken. Sie sollten dieses Feature auf jeden Fall nutzen, besonders, wenn Ihr System über das Internet erreichbar ist. Sandini Bib 7.1 Webmin 331 Abbildung 7.4 Webmin Config Kriterien Es stehen Ihnen dabei folgende Kriterien zur Zugriffsbeschränkung zur Verfügung (Abbildung 7.5): Erlaube alle spezifizierten Adressen Verweigere den Zugriff für alle angegebenen Adressen Erlaube Zugriff von allen Adressen Dabei steht es Ihnen frei, eine IP-Adresse, ein Subnet oder einen Hostnamen zu übergeben. Port und Adressen Falls Sie den Standardport, auf dem Webmin horcht, ändern wollen (empfehlenswert), können Sie dies unter diesem Menüpunkt erledigen. Des Weiteren ist es möglich dem Server eine bestimmte IP-Adresse zuzuweisen. Wenn Sie dies nicht tun, wird Webmin auf allen IP-Adressen des Servers erreichbar sein (Abbildung 7.6). Sandini Bib 332 7 Remoteadministration Abbildung 7.5 IP Access Control Abbildung 7.6 Port and Addresses Sandini Bib 7.1 Webmin 333 Logging An dieser Stelle können Sie das Logging für bestimmte Aktionen (actions) aktivieren. Wenn Sie das Logging aktiviert haben, werden Sie die Einträge in den beiden folgenden Dateien finden (Abbildung 7.7): 1. /var/webmin/miniserv.log 2. /var/webmin/webmin.log Optionen Sie haben bei der Aktivierung des Loggings die Möglichkeit zwischen folgenden Optionen auszuwählen: Aufgelöste Hostnamen werden mitgeloggt Zeitdauer, nach der die Einträge gelöscht werden Aktionen eines bestimmten Users werden mitgeloggt Aktionen aller User werden mitgeloggt Alle Aktionen in allen Modulen werden geloggt Nur Aktionen in bestimmten Modulen werden mitgeloggt Abbildung 7.7 Logging Sandini Bib 334 7 Remoteadministration Proxy Server Falls der Webmin-Server hinter einer Firewall oder einem Proxy steht, können Sie an dieser Stelle die entsprechende Adresse angeben, so dass Module, die Zugriff auf Seiten im externen Netz haben müssen (Software Packages), fehlerfrei laufen können. Sie haben dabei die Möglichkeit folgende Angaben zu machen: HTTP Proxy FTP Proxy Kein Proxy für … Benutzername für den Proxyzugriff Passwort für den Proxyzugriff Sie finden diese Seite in Abbildung 7.8. User Interface Falls Sie mit der farblichen Gestaltung Ihres Webmin-Interfaces nicht zufrieden sind, können Sie hier für die folgenden Punkte andere RGB-Farben (Hexwerte von 00 bis ff sind erlaubt) definieren. Hintergrundfarbe der Seite Normaler Text Hintergrundfarbe von Tabellen Farbe für Tabellenüberschriften Farbe für Links Des Weiteren können Sie hierbei definieren, wo der Login- und Hostname erscheinen soll. Webmin-Module Diese, in Abbildung 7.9 zu sehende Seite erlaubt es Ihnen, Webmin-Module nach der Installation in das System einzubinden. Meistens haben diese Module die Endung .wbm, wobei eine Datei auch mehrere Module enthalten kann. Diese Dateien können Sie entweder vom internen oder vom externen Netzwerk beziehen. Daher ist es auch möglich, Dateien von einer http- oder FTP-Adresse ins System einzubinden. Weiter ist es möglich, ein Modul mit mehreren Konfigurationen in einem System unterzubringen, dabei muss sich lediglich der Name unterscheiden (diese Module nennt man Klone). Logischerweise können Sie Module auch aus Ihrem Webmin-System löschen. Dies ist aber nur dann möglich, wenn die betreffenden Module in keiner »Abhängigkeit« zu anderen Modulen stehen. Falls Sie ein Modul löschen, das vorher »geklont« wurde, so werden die Klone ebenfalls gelöscht. Sandini Bib 7.1 Webmin 335 Abbildung 7.8 Proxy Abbildung 7.9 Webmin Module Sandini Bib 336 7 Remoteadministration Operating System Die in Abbildung 7.10 gezeigte Seite ermöglicht es Ihnen, Webmin ein anderes Betriebssystem zu übergeben. Das heißt, dass ab dem Änderungsdatum Webmin das von Ihnen angegebene OS als vorhanden und aktuell ansieht. Sie können diese Option nutzen, wenn Sie Ihr Betriebssystem tatsächlich auf den neuesten Stand gebracht haben. Beachten Sie aber, dass die Konfigurationen der installierten Module sich dabei nicht ändern werden. Außerdem haben Sie hierbei die Möglichkeit den Pfad ($PATH), den Webmin bei der Ausführung von Programmen und Prozessen benutzt, zu ändern. Zusätzlich können Sie ebenfalls den Library Search Path ändern. Abbildung 7.10 Operating System Language Falls Sie die Sprache, die Webmin benutzt, ändern wollen, können Sie dies mit der in dieser Seite zur Verfügung gestellten Option machen (Abbildung 7.11). Wir werden bei unserer Besprechung Englisch verwenden, da viele Unternehmen international agieren. Sandini Bib 7.1 Webmin 337 Abbildung 7.11 Language Index Page Options Hiermit können Sie die Eigenschaften der Indexseite ändern. Zu diesem Zweck können Sie folgende Eigenschaften definieren: Anzahl der Spalten Module kategorisieren Defaultkategorie Alternativen Header benutzen Direkt zum Modul gehen, falls der User nur eines installiert hat Einen Screenshot der Seite zeigt Abbildung 7.12. Upgrade Webmin Mit dieser Seite, die Sie in Abbildung 7.13 sehen, können Sie Ihr Webmin-System auf den neuesten Stand bringen. Grundsätzlich bietet diese Seite drei Features, die wir nun besprechen werden: 1. Webmin aktualisieren 2. Module sofort aktualisieren 3. Module nach einem definierten Zeitplan aktualisieren Sandini Bib 338 7 Remoteadministration Abbildung 7.12 Index Page Options Webmin aktualisieren Diese Option erlaubt es Ihnen, mit der Upgradefunktion von RPM Ihr WebminSystem auf den neuesten Stand zu bringen. Dabei können Sie zwischen einer lokalen oder heraufgeladenen Datei wählen. Es ist auch möglich, die Aktualisierungsdateien direkt von der offiiziellen Webminseite zu beziehen. Module sofort aktualisieren Diese Seite erlaubt es Ihnen, bestimmte Module, die Sicherheitslöcher aufweisen oder nicht mehr aktuell sind, zu aktualisieren. Da das Update von der offiziellen Webminseite kommt, wird vor der Aktualisierung überprüft, für welche Module ein Update verfügbar ist. Sie können dabei auch angeben, dass Module, die zwar verfügbar sind, aber auf Ihrem System nicht installiert wurden, ebenfalls in Ihr System eingebunden werden. Module nach einem definierten Zeitplan aktualisieren Hiermit können Sie Webmin auffordern, dass es zu einem bestimmten wiederkehrenden Zeitpunkt überprüft, ob für die installierten Module ein Update verfügbar ist. Falls dies der Fall ist, wird dieses installiert. Auch hier haben Sie die Möglichkeit nicht installierte Module automatisch installieren zu lassen. Sandini Bib 7.1 Webmin 339 Wenn ein Modul aktualisiert wurde, bekommen Sie dies per E-Mail mitgeteilt (falls Sie diese Option aktiviert haben). Abbildung 7.13 Upgrade Webmin Authentication Hier können Sie Authentifizierungsoptionen und Timeouts für Passwörter definieren. Sie sollten dieses Feature unbedingt nutzen und einen solchen Timeout setzen, da Sie sich damit gut vor Brute-Force-Attacken schützen können. Abbildung 7.14 zeigt einen Screenshot. Timeout Für die eben beschriebenen Timeouts stehen folgende Optionen zur Verfügung: Passwort-Timouts deaktivieren Passwort-Timeouts aktivieren Rechner, die eine bestimmte Anzahl von Fehllogins verursacht haben, für eine bestimmte Zeitspanne blockieren. Geblockte Hosts, Logins und Authentifizierungsfehler loggen (syslog) Sandini Bib 340 7 Remoteadministration Authentifizierung Die Authentifizierungsmechanismen können Sie durch folgende Optionen an Ihre Bedürfnisse anpassen: Authentifizierung deaktivieren (absolut nicht empfehlenswert) Authentifizierung aktivieren Benutzer abmelden, falls er über einen bestimmten Zeitraum keine Eingaben gemacht hat. »Kennung speichern« anbieten. Den Hostnamen auf dem Loginbildschirm zeigen. Benutzername und Passwort immer fragen. Anmeldung ohne Passwort für Benutzer des Rechners »localhost«. Abbildung 7.14 Authentication Reassign Modules In dieser Seite (Abbildung 7.15) können Sie alle installierten Systeme nach Kategorien ordnen. Die verfügbaren Kategorien dafür lauten wie folgt: Sandini Bib 7.1 Webmin 341 Cluster Hardware Information Networking Others Servers Syslets System Webmin Abbildung 7.15 Reassign Modules Edit Categories Wie Sie in den vorhergegangenen Beschreibungen gesehen haben, können Sie die Webmin-Module in bestimmte Kategorien einteilen. Diese Seite (Abbildung 7.16) bietet Ihnen nun die Möglichkeit diese bereits vordefinierten Kategorien zu editieren oder neue hinzuzufügen. Sandini Bib 342 7 Remoteadministration Abbildung 7.16 Edit Categories Webmin Themes An dieser Stelle können Sie das Erscheinungsbild (die so genannten Themes) von Webmin ändern. Dabei haben Sie die Auswahl aus vier vordefinierten Themes: MSC.Linux Theme Caldera Theme KDE-style Icon Theme Standard Webmin Theme Falls Ihnen diese vier vorhandenen Erscheinungsbilder noch nicht ausreichen, können Sie neue Webmin-Themes installieren. Abbildung 7.17 zeigt die entsprechende Seite. Trusted Referers Auf dieser Seite (Abbildung 7.18) können Sie Weiterleitungen auf Ihr WebminSystem überprüfen lassen. Damit können Sie bösartige Links anderer Seiten abwehren, die Ihren Browser dazu veranlassen könnten, unkontrollierte Aktionen mit Webmin durchzuführen. Weiter können Sie Websites, denen Sie vertrauen (die zum Beispiel von Ihren Systemen kommen), als »vertrauenswürdig« definieren. Sandini Bib 7.1 Webmin 343 Abbildung 7.17 Webmin-Themes Abbildung 7.18 Trusted Referers Sandini Bib 344 7 Remoteadministration SSL Encryption Falls auf Ihrem Rechner das SSL-Perl-Modul installiert ist, können Sie SSL-Verschlüsselung für Ihr Webmin-System aktivieren. Sie sollten dieses Feature unbedingt nutzen, wenn Ihr Webmin-System Zugriff aus dem Internet erhalten kann, da ansonsten die Gefahr besteht, dass Angreifer bestimmte Daten (Kennwörter etc.) abfangen. Nachdem Sie SSL aktiviert haben, ist Ihr Server nicht mehr unter der gewohnten Adresse erreichbar. Die neue Adresse lautet nun: http://IP-Adresse | Hostname : Portnummer Abbildung 7.19 SSL Encryption Certificate Authority Hier können Sie Ihren Webmin-Server als Zertifizierungsauthorität einrichten. Falls Sie dies bereits getan haben, können Sie das erstellte Zertifikat bearbeiten oder ein neues erstellen. Dabei müssen Sie allerdings beachten, dass die Zertifikate, die Sie bereits an die Benutzer verteilt haben, nicht mehr funktionieren werden. Wenn Sie ein neues CA (Certificate Authority) erstellen wollen, müssen Sie folgende Angaben machen: Sandini Bib 7.1 Webmin 345 Autoritätsname E-Mailadresse Abteilung Organisation Bundesland Ländercode Abbildung 7.20 zeigt einen Screenshot des Fensters. Abbildung 7.20 Certificate Authority Webmin Servers Index Falls Sie einen neuen Server registrieren wollen, können Sie das hier tun. Dafür stehen Ihnen zwei Methoden zur Verfügung: Broadcast for servers Wenn Sie sich für diese Option entscheiden, wird Ihr gesamtes lokales Netzwerk nach Webminservern durchsucht. Scan for servers Um nur ein bestimmtes Netzwerk nach Webminservern zu durchsuchen, können Sie diese Option benutzen. Einen Screenshot des Fensters zeigt Abbildung 7.21. Sandini Bib 346 7 Remoteadministration Abbildung 7.21 Webmin Servers Index Webmin Users Diese Seite (Abbildung 7.22) bietet Ihnen folgende Möglichkeiten: Neue Webmin User zu erstellen Unix User in Webmin User zu konvertieren Unix User-Synchronisation zu konfigurieren Unix User-Authentifizierung zu konfigurieren Neue Webmin-Gruppen zu erstellen Modulkonfigurationen (benutzerdefiniert) zu ändern Neuen Webmin User anlegen Wie Sie aus Abbildung 7.23 erkennen können, müssen Sie, um einen neuen Benutzer anlegen zu können, folgende Angaben machen: Benutzername Gruppe Passwort PAM-Authentifizierung Unixpasswort Kein Passwort Sandini Bib 7.1 Webmin 347 SSL Zertifikatsname Sprache Sollen Module in Kategorien aufgeteilt werden? Benutzerdefiniertes Erscheinungsbild (Theme) IP-Zugangskontrolle Zugriff von allen Adressen gestatten Zugriff nur von aufgelisteten Adressen aus erlaubt Zugriff von aufgelisteten Adressen nicht erlaubt Sollen zu den Gruppenmodulen noch weitere benutzerdefinierte hinzugefügt werden? Abbildung 7.22 Webmin Users Neue Webmin-Gruppe anlegen Wenn Sie eine neue Gruppe anlegen möchten, müssen Sie den Gruppennamen spezifizieren und die Module für die Gruppe definieren. Danach können Sie Benutzer in diese Gruppe »verfrachten«. Sandini Bib 348 7 Remoteadministration Abbildung 7.23 Neuer User Abbildung 7.24 Neue Gruppe Sandini Bib 7.1 Webmin 349 Unix User zu Webmin User konvertieren Diese Seite erlaubt es Ihnen, bestehende Unixbenutzer in Webmin User zu konvertieren. Die Rechte eines Users werden dabei von der gewählten Gruppe bestimmt. Neben der Gruppenzugehörigkeit müssen Sie noch weitere Angaben machen: Sollen alle Benutzer konvertiert werden? Sollen nur bestimmte User konvertiert werden? Sollen alle User bis auf die angegebenen Ausnahmen konvertiert werden? Sollen alle Benutzer aus der angegebenen Gruppe konvertiert werden? Sollen alle User, die zwischen den definierten GIDs liegen, konvertiert werden? Soll das Unixpasswort verwendet werden? Abbildung 7.25 zeigt die Seite. Abbildung 7.25 Unix User konvertieren Unix User Synchronisation Falls Sie grundsätzlich jedem Unix User Zugriff auf Webmin geben wollen, kann es ziemlich mühselig sein, jeden neuen Unix User per Hand als Webmin User zu definieren. Mit dem in Abbildung 7.26 gezeigten Formular wird es möglich, jeden neu angelegten Unix User sofort in einen Webmin User zu konvertieren. Dieses Sandini Bib 350 7 Remoteadministration Feature kann Ihnen eine Menge Arbeit sparen, sollte aber mit Vorsicht genossen werden, da eigentlich nicht jeder Unix User sofort Zugriff auf Webmin haben sollte. Dieses Formular benötigt folgende Angaben von Ihnen: Soll jeder neue Unix User sofort in einen Webmin User konvertiert werden? Wenn ein Unix User gelöscht wird, soll dann auch der entsprechende Webmin User gelöscht werden? Welcher Gruppe sollen auf diese Weise entstandene Webmin User zugeteilt werden? Abbildung 7.26 User synchronisieren Modulkonfiguration ändern Um eine benutzerdefinierte Modulkonfiguration zu ändern, klicken Sie einfach auf das entsprechende Modul. User-Authentifizierung Falls Sie jedem Unix User Zugriff auf Ihr Webmin-System geben wollen und dieser dazu die Rechte eines bestimmten Benutzers bekommen soll, können Sie das mit dem Formular aus Abbildung 7.27 erreichen. Sandini Bib 7.1 Webmin 351 Abbildung 7.27 User Authentifizierung 7.1.4 System Nachdem wir nun den Menüpunkt »Webmin«, der sich mit der Konfiguration Ihres Webminservers auseinander setzt, ausführlich besprochen haben, können wir uns mit der Konfiguration Ihres Systems beschäftigen. Die dazu zur Verfügung stehenden Unterpunkte finden Sie unter dem Register SYSTEM (Abbildung 7.28). Bootup and Shutdown Um bestimmte Dienste beim Systemstart hochzufahren, können Sie dieses Formular benutzen (Abbildung 7.29). Die Startseite zeigt an, welche Dienste beim Start gestartet werden. Sie haben weiter die Möglichkeit das komplette System neu zu starten oder es einfach herunterzufahren. Sandini Bib 352 7 Remoteadministration Abbildung 7.28 Register System Wenn Sie auf den entsprechenden Link für einen bestimmten Serverdienst klicken, kommen Sie in ein neues Formular, das Ihnen die folgenden Möglichkeiten bietet: Name des Dienstes ändern Skript editieren Beim Systemstart starten Sofort starten Jetzt neu starten Status anzeigen Sofort stoppen Change Passwords Falls Sie das Unixpasswort eines Benutzers ändern wollen, können Sie dies unter diesem Menüpunkt machen. Dazu klicken Sie auf den entsprechenden User und übergeben danach zweimal das neue Passwort (Abbildung 7.30). Sandini Bib 7.1 Webmin 353 Abbildung 7.29 Bootup and Shutdown Abbildung 7.30 Change Passwords Sandini Bib 354 7 Remoteadministration Disk Quotas Unter diesem Punkt können Sie Ihr Quotasystem konfigurieren. Disk and Network Filesystems Hier bekommen Sie eine Übersicht über die in Ihrem System vorhandenen Platten- und Netzwerkdateisysteme. Sie können ebenfalls neue Dateisysteme mit den unterschiedlichsten Typen hinzufügen (Abbildung 7.31). Abbildung 7.31 Disk and Network Filesystems NFS Exports Dieser Unterpunkt erlaubt es Ihnen, Ihre NFS-Verzeichnisse zu verwalten oder neue anzulegen (Abbildung 7.32). Falls Sie ein neues NFS-Verzeichnis anlegen wollen, haben Sie folgende Angaben zu machen: Das zu exportierende Verzeichnis Soll der NFS-Export aktiv sein oder nicht? Wer soll auf das Verzeichnis zugreifen dürfen? Jeder, der sich mit Ihrem System verbinden kann Nur bestimmte Hosts Nur Clients, die WeBNFS Protokoll von Sun benutzen Sandini Bib 7.1 Webmin 355 Alle Mitglieder einer NIS-Netzgruppe Ein bestimmtes Netzwerk Sollen symbolische Links relativ gemacht werden? Soll der NFS Client einen UDP Port unter 1024 benutzen? Welcher Zugriffsmodus soll aktiviert werden? Schreibgeschützt Lese- und Schreibberechtigung Welchen Remoteusern soll vertraut werden? Jedem Jedem außer Root Niemandem Soll bestimmten Usern (spezifiziert durch ihre UID) nicht vertraut werden? Unter welcher UID sollen User, denen Sie nicht vertrauen wollen, in Webmin laufen? Zugriff auf Unterverzeichnisse verbieten Soll bestimmten Gruppen (spezifiziert durch ihre GID) nicht vertraut werden? Unter welche GID sollen Gruppen, denen Sie nicht vertrauen wollen, in Webmin laufen? Abbildung 7.32 NFS-Export Sandini Bib 356 7 Remoteadministration NIS Client and Server Unter diesem Menüpunkt finden Sie einige weitere Punkte, unter denen Sie Formulare finden, die Ihnen bei der Konfiguration Ihres NIS-Servers bzw. -Clients helfen können: NIS Client Client Services NIS Server NIS Tables Server Security PAM-Authentication Die hier enthaltenen Formulare können genutzt werden, um die vorhandenen PAM Dienste zu verwalten oder neue hinzuzufügen. Um einen bereits vorhandenen Dienst zu editieren, müssen Sie nur auf den entsprechenden Link klicken (Abbildung 7.33). Abbildung 7.33 PAM Authentication Sandini Bib 7.1 Webmin 357 Running Processes Dieses Registerblatt enthält Informationen über die gerade laufenden Prozesse auf Ihrem System. Wenn Sie auf einen der angezeigten Prozesse klicken, erhalten Sie folgende Informationen: Befehl Prozess-ID Besitzer Größe Nicelevel (Sie können das Nicelevel -also die Priorität- an dieser Stelle ändern) Gruppe Prozessgruppen-ID Echte Gruppe Übergeordneter Prozess CPU-Beanspruchung Laufzeit Echter Benutzer TTY Sie haben weiter die Möglichkeit den Prozess zu beenden oder zu killen. Außerdem können Sie einige verfügbare Signale an den Prozess schicken. Einen Screenshot zeigt Abbildung 7.34. Abbildung 7.34 Running Processes Sandini Bib 358 7 Remoteadministration Prozesse ordnen Falls Ihnen die vordefinierte Anzeige nicht gefällt, können Sie die laufenden Prozesse auch nach folgenden Kriterien ordnen: PID (Standard) Benutzer Speicher CPU Prozesse suchen Um einen bestimmten Prozess suchen zu lassen folgen Sie dem Link »suchen«. Danach erscheint ein neues Formular, das folgende Daten benötigt: Prozesse finden, die einem bestimmten User gehören Prozesse finden, die einen bestimmten String enthalten (z.B. ftpd) Prozesse finden, die mehr als einen bestimmten Prozentsatz an Rechenkapazität benötigen Prozesse finden, die eine Datei oder ein Verzeichnis in einem bestimmten Dateisystem benutzen Prozesse finden, die eine bestimmte Datei benutzen Prozesse finden, die einen bestimmten Port (protokollabhängig) benutzen Befehl ausführen Sie können in dieser Maske bestimmte Befehle ausführen, dazu müssen Sie dem Register »Ausführen« folgen. In der jetzt geöffneten Maske können Sie folgende Felder ausfüllen: Auszuführender Befehl Modus Soll Befehl im Hintergrund laufen? Soll bis zur Beendigung gewartet werden? Parameter, die an das Programm übergeben werden sollen (Wenn der Befehl vi war, können Sie in diesem Feld die zu öffnende Datei spezifizieren) Scheduled Commands Um zeitgesteuerte Befehle zu erstellen, können Sie die Maske aus Abbildung 7.35 benutzen (Falls Sie Befehle regelmäßig ausführen wollen, benutzen Sie bitte Cronjobs.), welche folgende Angaben von Ihnen benötigt: User, unter dem der Befehl ausgeführt werden soll An welchem Tag soll der Befehl ausgeführt werden? Wann soll der Befehl ausgeführt werden? In welchem Verzeichnis soll er ausgeführt werden? Welcher Befehl soll ausgeführt werden? Sandini Bib 7.1 Webmin 359 Abbildung 7.35 Scheduled Commands Scheduled CronJobs Mit dieser Maske können Sie die vorhandenen CronJobs überprüfen, neue erstellen oder den Benutzerzugriff regeln (Abbildung 7.36). Neuen CronJob erstellen Um einen neuen Job zu erstellen müssen Sie folgende Angaben machen: Unter welchem User soll der Job ausgeführt werden? Soll der Job aktiviert werden? Auszuführender Befehl? Parameter für den spezifizierten Befehl? Wann soll der Befehl ausgeführt werden? Minuten? Stunden? Tage? Monate? Wochentage? Sandini Bib 360 7 Remoteadministration Abbildung 7.36 Scheduled Cron Jobs Benutzerzugriff regeln Mit diesem Formular können Sie angeben, welche Benutzer Cron Jobs erstellen dürfen. Software Packages Sie können dieses Formular benutzen, um nach bereits installierten RPM Paketen zu suchen, neue zu installieren oder die RPM-Datenbank nach bestimmten Dateien zu durchsuchen (um Dateien zu identifizieren). SysV Init Configuration Um die vorhandenen Initprozesse zu verwalten oder neue zu erstellen, können Sie dieses Formular benutzen. Dabei werden die Einträge aus der Datei /etc/inittab entnommen (Abbildung 7.38). Wenn Sie einen neuen Prozess erstellen wollen, müssen Sie folgende Angaben machen: ID Runlevel Aktion Prozess Sandini Bib 7.1 Webmin 361 Abbildung 7.37 Software Packages Abbildung 7.38 SysV Init Sandini Bib 362 7 Remoteadministration System Documentation Dieses Formular erlaubt es Ihnen, die auf Ihrem System vorhandenen Manpages zu durchsuchen. Dafür stehen Ihnen folgende Filter zur Verfügung: Suchbegriff Nur nach Titel suchen Nach allem suchen Suchen in Manpages Webmin Hilfe Paketdokumentation Howto-Dokumente Perl-Modul-Dokumentation Google Abbildung 7.39 System Documentation Falls Sie nach Dokumenten in anderen Modulen suchen lassen wollen, können Sie ebenfalls festlegen, was alles durchsucht werden soll: Manpages Webmin Hilfe Sandini Bib 7.1 Webmin 363 Paketdokumentation Howto-Dokumente Perl-Modul-Dokumentation Google System Logs Dieser Menüpunkt erlaubt es Ihnen, die vorhandenen Logdateien zu verwalten und neue hinzuzufügen. Users and Groups Die hier zur Verfügung gestellte Maske erlaubt es Ihnen, die lokalen Benutzer und Gruppen zu verwalten und neue zu erstellen. Um die Konfiguration eines bestimmten Benutzers zu editieren, klicken Sie einfach auf den entsprechenden Benutzernamen (dasselbe gilt auch für lokale Gruppen). Neuer Benutzer Wenn Sie einen neuen User erstellen wollen, haben Sie folgende Angaben zu übergeben: Benutzername Echter Name Shell UID Homeverzeichnis Kennwort Kein Kennwort Keine Anmeldung erlaubt Klartextkennwort Verschlüsseltes Kennwort Zeit zwischen dem Ändern des Passworts (Minimum und Maximum) Tage, nach denen der User eine Warnung erhalten soll Inaktive Tage Ablaufdatum Primäre Gruppe Sekundäre Gruppe Soll Homeverzeichnis erstellt werden? Sollen Dateien ins Homeverzeichnis kopiert werden? Soll der Benutzer in anderen Modulen erstellt werden? Sandini Bib 364 7 Remoteadministration Benutzerverwaltung via Skript Falls Sie mehrere Benutzer auf einmal editieren (erstellen, verwalten oder löschen) wollen, kann die eben gezeigte Methode sehr zeitaufwändig und fehleranfällig sein. Webmin bietet Ihnen ein Feature an, das es Ihnen erlaubt, diesen Job von einem Skript erledigen zu lassen. Für dieses Skript stehen drei Schlüsselwörter zur Verfügung (Tabelle 7.2). Schlüsselwort Beschreibung Create Erstellt einen neuen Benutzer Modify Editiert einen bestehenden Benutzer Delete Löscht einen bestehenden Benutzer Tabelle 7.2 Schlüsselwörter für Benutzerverwaltungsskript Die Syntax für das Schlüsselwort create sieht wie folgt aus: create:username:passwd:uid:gid:realname:homedir:shell:min:max:warn :inactive:expire Tabelle 7.3 erklärt Ihnen die eben vorgestellten Argumente zum Schlüsselwort create anhand einer kurzen Beschreibung. Argument Beschreibung username Gibt an, welchen Benutzernamen der neue User haben soll passwd An dieser Stelle können Sie das Passwort für den neuen User übergeben (verschlüsselt oder noch nicht verschlüsselt). Wenn Sie kein Passwort übergeben, kann sich der User ohne Passwort einloggen. Falls Sie ein x übergeben, wird das Konto für Logins gesperrt. uid Spezifiziert die UID des entstehenden Benutzers Falls dieses Feld nicht ausgefüllt ist, wird Webmin eine UID zuweisen. gid Gibt an, in welcher Gruppe der neue Benutzer Mitglied sein soll Falls dieses Feld nicht ausgefüllt ist, wird Webmin eine neue Gruppe mit dem Namen des Benutzers erstellen und den User in diese Gruppe verfrachten. realname Wie lautet sein richtiger Name? shell Welche Shell soll ihm beim Login zur Verfügung gestellt werden? homedir Hier können Sie das Homeverzeichnis des Benutzers angeben (dieses Verzeichnis kann bereits existieren, muss aber nicht unbedingt). min Minimum der Tage bis zur Passwortänderung max Maximum der Tage bis zur Passwortänderung Tabelle 7.3 Argumente zu create Sandini Bib 7.1 Webmin 365 Argument Beschreibung warn Wann soll der User gewarnt werden? inactive Wann ist das neu erstellte Benutzerkonto inaktiv? expire Wann läuft es aus? Tabelle 7.3 Argumente zu create (Forts.) Um einen bereits bestehenden Benutzer zu modifizieren, können Sie das Schlüsselwort modify benutzen. Die Syntax hierzu lautet: modify:oldusername:username:passwd:uid:gid:realname:homedir:shell: min:max:warn:inactive:expire Tabelle 7.4 erläutert die im eben aufgeführten Listing vorkommenden Argumente anhand einer kurzen Beschreibung. Argument Beschreibung oldusername Um welchen User handelt es sich? username Welchen neuen Benutzernamen soll der User erhalten? passwd Gibt das neue verschlüsselte oder noch nicht verschlüsselte Passwort an uid Die neue UID gid Soll der User Mitglied in einer anderen Gruppe werden? realname Hat sich sein Name geändert (z.B. durch eine Hochzeit)? homedir Spezifiziert das neue Homeverzeichnis des Benutzers shell Hier können Sie dem User beim Login eine neue Shell zur Verfügung stellen. min Minimum an Tagen bis zur Passwortänderung max Maximum an Tagen bis zur Passwortänderung warn Nach wie vielen Tagen soll der Benutzer eine Warnung erhalten? inactive Wann soll das Benutzerkonto inaktiv sein? expire Wann läuft es aus? Tabelle 7.4 Argumente zu modify Falls Sie eines der in Tabelle 7.4 erwähnten Felder leer lassen, so wird der bereits vorhandene Wert weiterhin verwendet. Um einen User zu löschen, können Sie das Schlüsselwort delete benutzen. Die Verwendung ist – wie Sie sehen – äußerst einfach: delete:username Sandini Bib 366 7 Remoteadministration Sie brauchen lediglich den zu löschenden Benutzernamen an das Schlüsselwort zu übergeben. Abbildung 7.40 zeigt den Screenshot des Fensters. Abbildung 7.40 User and Groups Nachdem Sie das Skript erstellt haben, müssen Sie noch einige abschließende Angaben machen: Wo befindet sich das Skript? Sollen Benutzer in anderen Modulen bearbeitet werden? Soll das Homeverzeichnis erstellt werden? Sollen Dateien in das Homeverzeichnis kopiert werden? Soll der Name des Homeverzeichnisses geändert werden, wenn sich der Benutzername geändert hat? UID anpassen GID anpassen Soll das Homeverzeichnis gelöscht werden, wenn der Benutzer gelöscht worden ist? Sind die angegebenen Passwörter bereits verschlüsselt? Sandini Bib 7.1 Webmin 367 Neue Gruppe erstellen Um eine Gruppe anzulegen haben Sie wesentlich weniger Angaben zu übergeben. Welche genau zu übergeben sind, erfahren Sie im Folgenden: Gruppenname Kennwort (Sie können dieses Feld ignorieren, da Kennwörter für Gruppen nicht mehr aktuell sind) Gruppen-D Mitglieder 7.1.5 Server Das dritte Registerblatt, das wir jetzt besprechen werden, beschäftigt sich mit den Servern, die auf Ihrem System laufen. Sie erhalten dadurch die Möglichkeit Ihren Dienst schnell, sauber und einfach zu konfigurieren. Da ein Großteil der Konfiguration grafisch erfolgt, sind Tippfehler als Fehlerquelle nahezu ausgeschlossen. Die Startseite zeigt Abbildung 7.41. Sie werden in dieser Besprechen auf viele Tools treffen, die für Sie uninteressant sind (es werden zum Beispiel mehrere FTP und Mailserver besprochen, auf normalen Systemen hingegen werden Sie nur jeweils einen solchen Dienst finden). Abbildung 7.41 Servers Startseite Sandini Bib 368 7 Remoteadministration Es kann durchaus auch der Fall sein, dass Sie Dienste einsetzen, die per Default nicht über Webmin konfigurierbar sind. Wenn dies der Fall ist, ist es leider nicht so ohne weiteres möglich, diese Server über Webmin verfügbar zu machen. Wenn Sie dies wünschen -und die nötige Zeit mitbringen- können Sie aber die entsprechenden vorhandenen Perlmodule auf Ihre spezielle Software umschreiben. Bedenken Sie dabei aber den enormen Zeitaufwand und machen Sie auf jeden Fall zuvor eine Aufwand/Nutzen-Rechnung. Apache Webserver Wenn Sie Ihren Apache-Server nach der Installation von Webmin installieren und er noch nicht konfiguriert ist, werden Sie die in Abbildung 7.42 gezeigte Seite erhalten. Dort können Sie die unterstützenden und zu verwendenden Module auswählen und diese konfigurieren. Danach werden Sie auf die in Abbildung 7.43 gezeigte Seite weitergeleitet, die Sie ab jetzt immer hinter dem Link »Apache Webserver« finden werden. Wie Sie sehen stehen Ihnen dort zwei weitere Registerkarten zur Verfügung: 1. Modulkonfiguration 2. Apache starten Modulkonfiguration Hier können Sie grundsätzliche Einstellungen für Ihren Webserver treffen. Welche dies genau sind, erfahren Sie in der folgenden Aufzählung: Apache Server Root-Verzeichnis Pfad für ausführbare httpd-Datei Pfad zum apachectl-Kommando Kommando für Apachestart Kommando für Apachestopp Wie sollen virtuelle Server angezeigt werden? Wie sollen diese sortiert werden? Wie viele Server dürfen maximal angezeigt werden? Pfad zur Konfigurationsdatei httpd.conf Pfad zu srm.conf Pfad zu access.conf Pfad zu mime.types Datei, der virtuelle Server hinzugefügt werden sollen Soll die Konfigurationsdatei getestet werden, bevor die Werte übernommen werden? Sandini Bib 7.1 Webmin 369 Apache starten Startet logischerweise den Webserver. Nachdem Sie den Server gestartet haben, ändern sich die gezeigten Registerkarten in: 1. Änderungen zuweisen 2. Apache stoppen Änderungen zuweisen Dieser Punkt übergibt dem laufenden Apache Webserver die von Ihnen vorgenommenen Werte. Nachdem wir uns jetzt die vorhandenen Registerkarten angesehen und besprochen haben, können wir uns mit den Links zu den »großen« Konfigurationsformularen beschäftigen, die man grundsätzlich in zwei Teile unterteilen kann: 1. Globale Konfiguration 2. Virtuelle Server 3. Wir werden uns mit diesen beiden Oberpunkten nun ausführlich beschäftigen. Abbildung 7.42 Startseite beim erstmaligen Aufruf Sandini Bib 370 7 Remoteadministration Abbildung 7.43 Neue Apache Startseite Globale Konfiguration (Apache) Nun werden wir uns mit dem ersten Teil der Apache-Konfiguration genauer beschäftigen und zu diesem Zwecke die einzelnen verfügbaren Menüpunkte besprechen. Processes and Limits Über das Formular aus Abbildung 7.44 können Sie für folgende Prozesse Grenzwerte konfigurieren bzw. setzen: Maximum headers in request Maximum request header size Maximum request line size Maximum concurrent requests Maximum requests per server process Maximum spare server processes Minimum spare server processes Initial server processes Display extended status information Sandini Bib 7.1 Webmin 371 Abbildung 7.44 Processes and Limits Networking and Addresses Mit dieser Maske (Abbildung 7.45) können Sie Netzwerkeinstellungen für Ihren Apache spezifizieren. Wie zum Beispiel: Defaultport, auf dem Ihr Apache läuft und horcht Auf welchen Adressen und Ports Ihr Webserver verfügbar sein soll Wie viele Anfragen pro Verbindung erlaubt sind Länge der Warteschlange Die TCP »send buffer size« Request Timeouts Keep Alive Timeouts Apache Modules An dieser Stelle können Sie bestimmte Module aktivieren bzw. deaktivieren (Abbildung 7.46). Mime-Typen Hier können Sie allgemeine Angaben zu Ihren MIME-Typen machen, die bereits vorhandenen editieren oder neue hinzufügen (Abbildung 7.47). Um einen vorhandenen MIME-Typ zu ändern, klicken Sie auf den entsprechenden Typ. Sandini Bib 372 7 Remoteadministration Abbildung 7.45 Networking and Addresses Abbildung 7.46 Apache Modules Sandini Bib 7.1 Webmin 373 Abbildung 7.47 MIME Typen Miscellaneous Wie der Name schon sagt, können Sie an dieser Stelle verschiedene Konfigurationsangaben zu Ihrem Apache-Webserver machen (Abbildung 7.48): Core dump-Verzeichnis Server PID-Datei Angaben zum HTTP Header Lockdatei Scoreboarddatei Servertyp (Standalone oder vom Superserver gestartet) CGI Programs Diese Maske (Abbildung 7.49) nimmt bestimmte Angaben CGI-Programme betreffend entgegen. Dazu gehören: CGI Skriptlog Maximale Größe des CGI Skriptlogs Maximale Datensatzgröße für Skriptlogs Sandini Bib 374 7 Remoteadministration Abbildung 7.48 Miscellaneous Abbildung 7.49 CGI Programs Sandini Bib 7.1 Webmin 375 Per-Directory Options Files (.htaccess) Dieses Formular nimmt Werte für die berühmten .htaccess-Dateien, die zumeist für Passwortabfragen genutzt werden, aber zu weitaus mehr fähig sind, entgegen (Abbildung 7.50). Abbildung 7.50 Per-Directory Options Files Re-Configure Known Modules Wie aus Abbildung 7.51 hervorgeht, erhalten Sie in dieser Seite Informationen über die von Webmin unterstützten Apache-Module. Falls Sie dynamische Module verwenden, können Sie diese an dieser Stelle aktivieren. Diese Seite verfährt ähnlich wie die Startseite, die Sie beim ersten Aufruf der Apachekonfiguration über Webmin erhalten haben. Edit Defined Parameters An dieser Stelle können Sie dem Apache-Webserver eine Liste von Parametern, die beim Start berücksichtigt werden sollen, übergeben. Diese Parameter können mit den <IfDefine> und </IfDefine> Sektionen in der Konfigurationsdatei benutzt werden (Abbildung 7.52). Sandini Bib 376 7 Remoteadministration Abbildung 7.51 Re-Configure Known Modules Abbildung 7.52 Edit Defined Parameters Sandini Bib 7.1 Webmin 377 Edit Config Files Abbildung 7.53 Edit Config Files Diese Maske (Abbildung 7.53) erlaubt es Ihnen Änderungen, »per Hand« in den verschiedenen Konfigurationsdateien vorzunehmen. Virtuelle Server Der zweite Teil der Apache-Konfigurationsmaske ist für die Konfiguration und Verwaltung der virtuellen Server in Ihrem System vorgesehen. So können Sie hier sofort einen neuen virtuellen Server anlegen. Dazu müssen Sie folgende Argumente übergeben: Auf welcher Adresse bzw. auf welchen Adressen ist der Server erreichbar? Welcher Port soll benutzt werden? Wo liegt der Document Root? Servername? Wenn Sie das Logo für die »Virtual Server Options« anklicken, gelangen Sie auf eine neue Seite, die es Ihnen erlaubt, die Standardeinstellungen für Ihre virtuellen Server zu treffen (Abbildung 7.54). Sandini Bib 378 7 Remoteadministration Abbildung 7.54 Virtual Server Options Processes and Limits Folgende Grenzwerte und Prozesse können Sie als Standard für Ihre virtuellen Server spezifizieren: Maximum request body size bytes CPU resource limit Memory resource limit Process limit Abbildung 7.55 zeigt einen Screenshot. Networking and Addresses Diese Maske (Abbildung 7.56) erlaubt Ihnen folgende Defaultwerte zu setzen: Soll ein Lookup für Hostnamen gemacht werden? Soll ein RFC 1413 User Lookup gemacht werden? E-Mail-Adresse des Serververwalters Name des Servers Soll der Name, der vom Browser übergeben wird, benutzt werden? Sandini Bib 7.1 Webmin 379 Abbildung 7.55 Processes and Limits Abbildung 7.56 Networking and Addresses Sandini Bib 380 7 Remoteadministration Log Files In dieser Maske (Abbildung 7.57) können Sie die Angaben, die das Logging betreffen, machen. Folgende Argumente können Sie dabei zum Beispiel übergeben: Wo sollen die Fehler protokolliert werden? Wo befindet sich das Browserlogfile? Welches Format soll verwendet werden? Angaben zum Zugriffslogfile (access log file) Abbildung 7.57 Log Files Document Options Auch an dieser Stelle können Sie Angaben zu den Default-Einstellungen Ihres Servers machen. Diese Einstellungen beziehen sich hierbei hauptsächlich auf Dateien und Verzeichnisse und die dafür vorgesehenen Verwaltungs- und Sicherheitsmechanismen (Abbildung 7.58). Ein kleiner Auszug daraus: Document-Root Verzeichnis User WWW-Verzeichnis Zugriffsrechte auf dieses Verzeichnis Sandini Bib 7.1 Webmin 381 Per-Directory Options Datei (.htaccess) Optionen für diese Verzeichnisse Falsch geschriebene URLs korrigieren Abbildung 7.58 Document Options MIME-Typen Diese Maske (Abbildung 7.59) erlaubt die Konfiguration und Verwaltung der vorhandenen und verfügbaren MIME-Typen für die Standardeinstellungen Ihrer virtuellen Server. Sie können an dieser Stelle folgende Angaben machen (ein kleiner Auszug): Extra MIME Typen Content Encodings Content Handlers Content Sprachen Extra Zeichensatz Default MIME Typ usw. Sandini Bib 382 7 Remoteadministration Abbildung 7.59 MIME Types Error Handling In dieser Maske (Abbildung 7.60) können Sie die folgenden Werte für die Erzeugung einer Standardfehlermeldung übergeben: Error-Code Antwort URL Nachricht User and Groups Dieses Formular nimmt Werte entgegen, die dem Server angeben unter welchem User- und Gruppenname er laufen soll (Abbildung 7.61). Aliase and Redirects In diesem Formular können Sie die Weiterleitungen und Aliases für Ihre virtuellen Server spezifizieren (Abbildung 7.62). So können Sie hier zum Beispiel folgende Werte übergeben: Aliase für Verzeichnisse URL-Weiterleitungen permanent zeitlich begrenzt und so weiter Sandini Bib 7.1 Webmin 383 Abbildung 7.60 Error Handling Abbildung 7.61 User and Groups Sandini Bib 384 7 Remoteadministration Abbildung 7.62 Aliases and Redirects CGI Programs In diesem Formular können Sie die Spezifikationen für das Common Gateway Interface machen (Abbildung 7.63). Zum Beispiel: Aliase für CGI-Verzeichnis Umgebungsvariablen für CGI Skripts Browserabhängige Variablen und vieles mehr Directory Indexing Angaben zur Verzeichnisindizierung können Sie diesem Formular übergeben (Abbildung 7.64). Hierbei können Sie einige bekannte Werte spezifizieren: Verzeichnisindizierungsoptionen Verzeichnisindexdatei (zumeist index.html) Verzeichnisindexheader Verzeichnisindexstandardbild Wie soll das Verzeichnis sortiert werden? Verzeichnisindexbeschreibungen Sandini Bib 7.1 Webmin 385 Abbildung 7.63 CGI Programs Abbildung 7.64 Directory Indexing Sandini Bib 386 7 Remoteadministration Proxying Die Angaben zum Proxying für Ihren Defaultserver können Sie in dieser Maske machen (Abbildung 7.65). So werden hier zum Beispiel folgende Daten verlangt: Soll der Server als Proxy agieren? Wo liegt das Cacheverzeichnis? Sollen Anfragen zu bestimmten Domains geblockt werden? Sollen Anfragen an andere Proxy weitergeleitet werden? Sollen bestimmte Anfragen nicht weitergeleitet werden? Auf welchen Ports darf man sich verbinden? Größe des Cache? Welche Domains sollen nicht gecached werden? und noch einiges mehr Abbildung 7.65 Proxying Automatic Virtual Hosts In der Maske aus Abbildung 7.66 können Sie Angaben zum Root und zum CGIBIN-Verzeichnis machen und angeben, ob anstatt des Hostnamens die IPAdresse verwendet werden soll. Sandini Bib 7.1 Webmin 387 Abbildung 7.66 Automatic Virtual Hosts Show Directives An dieser Stelle erfahren Sie alles über die von Ihnen gemachten Direktiven in den verschiedenen Konfigurationsdateien (Abbildung 7.67). Per-Directory Options Im zweiten Abschnitt der »Virtual Server Options« können Sie weitere Angaben zu den Per-Directory Options machen. Da wir diese aber bereits besprochen haben, werden wir sie an dieser Stelle nicht besprechen. Bind 4 DNS Server Falls Sie Ihren Bind 4 DNS Server vor der Installation von Webmin noch nicht benutzt haben, werden Sie die in Abbildung 7.68 gezeigte Seite erhalten, die Sie daran erinnert, dass die Konfigurationsdatei noch nicht existiert. Sie haben dann die Möglichkeit diese unter verschiedenen Gesichtspunkten erstellen zu lassen. Danach werden Sie auf die in Abbildung 7.69 gezeigte Seite weitergeleitet, wo Sie folgende Optionen wählen können: Neue Masterzone erstellen Neue Slavezone erstellen Defaultwerte für die Masterzone ändern Sandini Bib 388 7 Remoteadministration Abbildung 7.67 Show Directives Abbildung 7.68 Bind 4 DNS beim erstmaligen Betreten Sandini Bib 7.1 Webmin 389 Abbildung 7.69 Seite, auf die Sie weitergeleitet werden Neue Masterzone erstellen Wenn Sie eine neue Masterzone erstellen wollen, müssen Sie folgende Angaben für die entstehende Zone machen: Zonentyp Domänenname/Netzwerk Aufzeichnungsdatei Masterserver E-Mail-Adresse des Besitzers Zeit bis zum Refresh Ablaufzeit Neue Slavezone erstellen Hier sind folgende Spezifikationen zu treffen: Zonentyp Domänenname / Netzwerk Aufzeichnungsdatei Masterserver Sandini Bib 390 7 Remoteadministration Defaultwerte für die Masterzone ändern Im unteren Abschnitt dieser Seite können Sie folgende Defaultwerte ändern: Zeit bis zum Refresh Zeit bis zum Ablauf Zeitspanne bis zu einem neuen Transferversuch Default ttl (time to live) Bind 8 DNS Server Wenn Sie die Seite zur Konfiguration des Bind 8 DNS Servers öffnen, erhalten Sie eine Seite, die in zwei Teile aufgeteilt ist (Abbildung 7.70): 1. Globale Servereinstellungen 2. Existierende DNS-Zonen Abbildung 7.70 Bind 8 DNS Server Other DNS Servers Dies ist der erste Punkt der globalen Serveroptionen und erlaubt Ihnen die Konfiguration weiterer DNS Server (Abbildung 7.71). Sandini Bib 7.1 Webmin 391 Abbildung 7.71 Other DNS Servers Logging and Errors 1. Unter diesem Menüpunkt können Sie alle vorhandenen Protokollierungskanäle einsehen und neue hinzufügen. Des Weiteren können Sie hier die Protokollierungskategorien verwalten (Abbildung 7.72). 2. Um einen neuen Protokollierungskanal hinzuzufügen müssen Sie folgende Angaben machen: Name des Kanals Protokolldatei Maximale Größe Syslog Level Minimale Meldestufe Soll die Kategorie in der Protokolldatei vermerkt werden? Sollen das Datum und die Uhrzeit in der Protokolldatei aufgeführt werden? usw. Sandini Bib 392 7 Remoteadministration Abbildung 7.72 Logging and Errors Access Control Lists Diese Maske (Abbildung 7.73) ist für die Einrichtung der so genannten Zugriffskontrollen zuständig. Um eine neue Zugriffskontrolle zu spezifizieren müssen Sie folgende Daten an das Formular übergeben: ACL-Name zutreffende Adressen, Netzwerke und Zugriffskontrollen Files and Directories Diesem Formular können Sie die globalen Datei- und Verzeichniseinstellungen übergeben (Abbildung 7.74). Die vier folgenden Felder können Sie dabei vom Standard abweichend definieren: Ausgabedatei für Statistiken Datenbanksicherungsdatei Prozess-ID-Datei Pfad zum Zonentransferprogramm Sandini Bib 7.1 Webmin 393 Abbildung 7.73 Access Control Lists Abbildung 7.74 Files and Directories Sandini Bib 394 7 Remoteadministration Forwarding and Transfers Um die globalen Weiterleitungs- und Transfereinstellungen zu definieren müssen Sie dieses Formular benutzen. So können Sie hier zum Beispiel folgende Parameter setzen: Server, an die Anfragen weitergeleitet werden sollen Direkter Lookup, wenn keine Antwort von der Weiterleitung erhalten wird Maximale Zonentransferzeit Zonentransferformat Maximale Anzahl gleichzeitiger Zonentransfers Einen Screenshot zeigt Abbildung 7.75. Abbildung 7.75 Forwarding and Transfers Addresses and Topology Hier können Sie die folgenden globalen Adressen- und Topologieeinstellungen vornehmen (Abbildung 7.76): Abzuhörende Anschlüsse und Adressen Quell-IP für Anfragen Quellanschluss für Anfragen Nameserver Wahltopologie Sandini Bib 7.1 Webmin 395 Abbildung 7.76 Addresses and Topology Miscellaneous Options Wie Sie aus der folgenden Auflistung und Abbildung 7.77 erkennen können, können Sie in dieser Maske weitere verschiedenartige Optionen setzen: Maximale Core-Dump-Größe Maximale Datenspeicherbenutzung Maximale Anzahl geöffneter Dateien Maximale Benutzung des Stapelspeichers Intervall zwischen Löschen abgelaufener Datensätze Intervall zwischen dem Überprüfen auf neue Schnittstellen Intervall zwischen der Protokollierung der Statistik Vollen rekursiven Lookup für die Clients ausführen? Mehrfache CNAME-Aliase für einen Namen erlauben? Glue-Datensätze holen? Maßgebliches AA-Bit bei Antworten einstellen? Sandini Bib 396 7 Remoteadministration Abbildung 7.77 Miscellaneous Options Control Interface Options Wie aus Abbildung 7.78 hervorgeht, können Sie in diesem Formular die so genannten »Control Interface«-Optionen setzen. Zone Defaults Dieses Formular ist in zwei Teile aufgeteilt: 1. Defaults für neue Masterzonen 2. Standardzoneneinstellungen 3. Im Bereich für neue Masterzonen können Sie folgende Werte setzen: Zeit aktualisieren Wiederholungszeit transferieren Ablaufzeit Standard-Time-To-Live Vorlagendatensätze Default-E-Mail-Adresse Sandini Bib 7.1 Webmin 397 Abbildung 7.78 Control Interface Options Folgende Felder können Sie im Bereich »Standardzoneneinstellungen« setzen: Erlaube Transfers von.. Erlaube Anfragen von.. Überprüfe Namen in Master-Zonen? Überprüfe Namen in Slave-Zonen? Überprüfe Namen in Antworten? Slaves über Änderungen benachrichtigen? Einen Screenshot zeigt Abbildung 7.79. Nun ist es an der Zeit, den zweiten Teil der Konfigurationsseite für den Bind DNS Server zu besprechen, der es Ihnen erlaubt, die bereits existierenden Zonen zu verwalten und neue Zonen anzulegen. Bereits existierende Zone verwalten Um eine existierende Zone zu editieren klicken Sie einfach auf das entsprechende Symbol und nehmen Sie in der darauf erscheinenden Seite die zu treffenden Änderungen vor. Sandini Bib 398 7 Remoteadministration Abbildung 7.79 Zone Defaults Dabei können Sie je nach Masterzonen folgende Werte abändern: Reverse-Adresse Nameserver Namensaliase Datensatzdatei Zonenparameter Zoneneinstellungen Mailserver Hostinformationen Text Bekannte Dienste Verantwortliche Person Location Sandini Bib 7.1 Webmin 399 Neue Masterzone anlegen Wenn Sie eine neue Masterzone anlegen wollen, klicken Sie auf den entsprechenden Link am unteren Ende der Seite und übergeben Sie dem dann aufgerufenen Formular folgende Werte: Zonentyp Domänenname/Netzwerk Datensatzdatei Master-Server E-Mail-Adresse Zonenvorlage benutzen? IP-Adresse für Vorlagendatensätze Zeit aktualisieren Wiederholungszeit transferieren Ablaufzeit Standard-Time-To-Live Neue Slavezone anlegen Nachdem Sie dem entsprechenden Link für die Erstellung einer neuen Slavezone gefolgt sind, müssen Sie die nun aufgelisteten Felder ausfüllen: Zonentyp Domänenname/Netzwerk Datensatzdatei Master-Server Serverport Neue Subzone anlegen Auch hier haben Sie vor der Erstellung der Zone noch einige Angaben zu treffen: Zonentyp Domänenname/Netzwerk Datensatzdatei Master-Server Serverport Neue Weiterleitungszone anlegen Hier haben Sie folgende Werte zu übergeben: Zonentyp Domänenname/Netzwerk Master-Server Sandini Bib 400 7 Remoteadministration DHCP Server Abbildung 7.80 DHCP Server Unter diesem Menüpunkt können Sie die Subnets und freigegebene Netzwerke konfigurieren und die Hosts und Hostgruppen verwalten (Abbildung 7.80). Des Weiteren stehen Ihnen folgende Features zur Verfügung: Clienteinstellungen bearbeiten Server starten Aktive Vergaben auflisten Neues Subnet hinzufügen Um ein neues Subnet hinzuzufügen müssen Sie dem entsprechenden Link folgen und diese Daten übergeben: Netzwerkadresse Netzmaske Adressbereiche Dynamisches BOOTP? Freigegebenes Netzwerk Sandini Bib 7.1 Webmin 401 Standardvergabezeit Boot-Dateiname Maximale Vergabezeit Boot-Datei-Server Server-Name Vergabelänge für BOOTP-Clients Vergabeende für BOOTP-Clients Hosts directly in this subnet Groups directly in this subnet Neues freigegebenes Netzwerk hinzufügen Wenn Sie ein neues freigegebenes Netzwerk hinzufügen wollen, braucht die dafür aufzurufende Maske folgende Angaben von Ihnen: Netzwerkname Standardvergabezeit Boot-Dateiname Maximale Vergabezeit Boot-Datei-Server Server-Name Vergabelänge für BOOTP-Clients Vergabeende für BOOTP-Clients Hosts directly in this shared network Groups directly in this shared network Subnets in this shared network Einen neuen Host hinzufügen Dafür müssen Sie folgende Felder ausfüllen: Host-Name Hardware Address Feste IP-Adresse Standardvergabezeit Boot-Dateiname Maximale Vergabezeit Boot-Datei-Server Server-Name Vergabelänge für BOOTP-Clients Vergabeende für BOOTP-Clients Sandini Bib 402 7 Remoteadministration Neue Hostgruppe hinzufügen Die Spezifizierung der Hostgruppendetails erfolgt über die aufgelisteten Parameter: Hosts in dieser Gruppe Benutze Name als Client-Host-Name? Standardvergabezeit Boot-Dateiname Maximale Vergabezeit Boot-Datei-Server Server-Name Vergabelänge für BOOTP-Clients Vergabeende für BOOTP-Clients Client-Einstellungen bearbeiten Unter diesem Menüpunkt finden Sie eine Maske, die es Ihnen erlaubt, die DHCP Client-Einstellungen zu ändern und diese auf alle Subnetze, alle freigegebenen Netzwerke, Hosts und Hostgruppen anzuwenden. Dafür sind folgende Angaben an das dafür zuständige Formular zu übergeben: Client-Host-Name Standard-Router Subnet-Maske Broadcast-Adresse Domänenname DNS-Server Zeit-Server Protokoll-Server Swap-Server Stammverzeichnispfad NIS-Domäne NIS-Server Font-Server XDM-Server Statische Routen NTP-Server NetBIOS-Nameserver NetBIOS-Scope Sandini Bib 7.1 Webmin 403 NetBIOS-Verbindungstyp Benutze Name als Client-Host-Name? Standardvergabezeit Boot-Dateiname Maximale Vergabezeit Boot-Datei-Server Server-Name Vergabelänge für BOOTP-Clients Vergabeende für BOOTP-Clients Aktive Vergaben auflisten Wenn Sie den Button »Liste aktive Verbindungen auf« drücken, werden alle Vergaben aus der Datei /var/lib/dhcp/dhcpd.leases aufgelistet. Server starten Sie können diesen Button benutzen, um den Server zu starten. Fetchmail Mail Retrieval Abbildung 7.81 Anfängliche Fetchmailseite Sandini Bib 404 7 Remoteadministration Falls Sie Fetchmail vor Ihrer Webmininstallation noch nicht genutzt haben (bzw. falls es von keinem User auf Ihrem Server genutzt wurde), erhalten Sie die in Abbildung 7.81 gezeigte Seite, die es Ihnen erlaubt, für einen bestimmten Benutzer die Datei .fetchmailrc anzulegen. Nachdem Sie den User, für den die Datei angelegt werden soll, spezifiziert haben, müssen Sie noch die folgenden Angaben übergeben: Mailserver-Optionen Mailservername Abholung aktiviert? Identisch mit Mailserver Name Protokoll Mailserver Port Mailserver Benutzerdetails Benutzername auf Mailserver Passwort auf Mailserver Lokaler Benutzer Nachrichten auf dem Server belassen? Alle Nachrichten abholen? Befehl, der vor dem Verbindungsaufbau ausgeführt werden soll Befehl, der nach dem Verbindungsaufbau ausgeführt werden soll Wenn Sie die von Ihnen übergebenen Angaben durch Drücken des Buttons »Erstellen« bestätigen, wird die Datei für den angegebenen Benutzer erstellt. Internet Services and Protocol Diese Maske ist in zwei Teile aufgeteilt: 1. Internetdienste 2. RPC-Programme Internetdienste Im ersten Teil der Seite können Sie die vorhandenen Internetdienste konfigurieren oder neue hinzufügen (Abbildung 7.82). Da die dabei zu treffenden Angaben für beide Features gleich sind, werden wir uns auf die Besprechung über das Hinzufügen neuer Internetdienste beschränken. Um neue Dienste hinzuzufügen sind folgende Angaben zu übergeben: Servicename Portnummer Protokolle Aliase Sandini Bib 7.1 Webmin 405 Serverprogramm Wartemodus Maximum pro Minute Unter welchen Usernamen soll das Programm ausgeführt werden? Unter welcher Gruppe soll das Programm ausgeführt werden? Abbildung 7.82 Internet Services and Protocols RPC-Programme Für die Erstellung eines neuen RPC-Programms müssen folgende Parameter übergeben werden: Programmname Programmnummer Aliase Serverprogramm RPC-Versionen Sockettyp Protokolle Serverprogramm Sandini Bib 406 7 Remoteadministration Kommando Wartemodus Ausführen als User Max pro Minute Ausführen als Gruppe Jabber IM Server Hier können Sie Ihre Jabber IM Server über Webmin konfigurieren. Leider unterstützt die von uns hier verwendete Version von Webmin den neuen Jabber Server nicht, so dass wir ihn an dieser Stelle leider nicht besprechen können. Wir werden dies aber auf der Buchseite nachholen. MySQL Database Server An dieser Stelle können Sie den MySQL Datenbankserver konfigurieren. Die Erfahrung hat aber gezeigt, dass es durchaus des Öfteren von Nöten ist, die MySQL Modulkonfiguration zu ändern, deshalb werden wir dies nun besprechen. Dafür haben Sie folgende Angaben zu übergeben: Pfad zum mysqlshow-Befehl Pfad zum mysqladmin-Befehl Pfad zum mysql-Befehl Pfad zum mysqldump-Befehl Pfad zum mysqlimport-Befehl Befehl zum Start des MySQL Servers Befehl um den Server zu stoppen Pfad zu den »mysql shared libraries«-Verzeichnissen Administration login Administration password Anzahl der Reihen, die auf einer Seite angezeigt werden sollen Wie sollen die Datenbanken und Tabellen dargestellt werden? Soll das »vertical row editing« Interface benutzt werden? Zu welchem Host soll verbunden werden? Socketdatei Soll zur Verbindung DBI genutzt werden? PPP Accounts Hinzufügen eines PPP-Kontos, wenn ein Unix-Benutzer für den nebenstehenden Server hinzugefügt wird: Ändern des PPP-Kontos, wenn ein Unix-Benutzer geändert wird Löschen des PPP-Kontos, wenn ein Unix-Benutzer gelöscht wird Sandini Bib 7.1 Webmin 407 Hier können Sie angeben, dass die Änderungen, die Sie an den Benutzerkonten der Linuxuser vorgenommen haben, direkt auf Ihr PPP-System übernommen werden. Postfix Configuration Hier können Sie die nötigen Einstellungen für Ihren Postfixserver treffen. General Options Unter dieser Maske (Abbildung 7.83) können Sie die nötigen allgemeinen Einstellungen für Ihren Server treffen. Dabei sei aber vorab gleich einmal darauf hingewiesen, dass Sie lange nicht alle Konfigurationsparameter über die Oberfläche von Webmin treffen können. Die wichtigsten und am häufigsten genutzten Parameter können Sie aber bequem über das Netz konfigurieren. Im Folgenden sehen Sie einige der Parameter, die Sie online setzen können: Domäne für ausgehende Mails Domänen für E-Mail-Empfang Probleme, die an den Postmaster gemeldet werden Soll bei der Auslieferung von Mails ein Host zwischengeschaltet werden? Sollen Kopien der Nachrichten an eine bestimmte Adresse geschickt werden? Timeout beim Bearbeiten von Anfragen und so weiter Abbildung 7.83 General Options Sandini Bib 408 7 Remoteadministration Address Rewriting and Masquerading Um die Adressumschreibung und Maskierung zu definieren können Sie die Maske aus Abbildung 7.84 verwenden. Somit lassen sich zum Beispiel folgende Angaben treffen: Soll »Benutzer%Domäne« in »Benutzer@Domäne« umgeschrieben werden? Soll »Benutzer« in »Benutzer@$MeineDomäne« geändert werden? Soll »Benutzer@Host« durch »Benutzer@Host.$MeineDomäne« ersetzt werden? Soll statt »Site!Benutzer« »Benutze@Site« verwendet werden? Sollen Mails ohne Empfänger an den Mailer Daemon geschickt werden? Adressmaskierung Maskierungsausnahmen Abbildung 7.84 Address Rewriting and Masquerading Mail Aliases Wenn Sie Ihre vorhandenen Mail Aliase bearbeiten oder neue hinzufügen wollen, können Sie dies mit dieser Maske erledigen (Abbildung 7.85). Diese Seite ist in zwei Teile unterteilt. Im oberen Teil sehen Sie die allgemeinen Einstellungen zu den Aliasen und im unteren die vorhandenen und bereits eingerichteten Mail Aliase, die Sie mit einem einfachen Klick konfigurieren können. Sandini Bib 7.1 Webmin 409 Abbildung 7.85 Mail Aliases Canonical Mapping In dieser Maske (Abbildung 7.86) können Sie folgende Punkte bearbeiten: Adressenverknüpfungstabellen Tabellen für Empfängeradressen Tabellen für Senderadressen Virtual Domains Hier können Sie die vorhandenen Verknüpfungen für virtuelle Domains einsehen, bearbeiten und neue hinzufügen (Abbildung 7.87). Transport Mapping Ähnlich zu den eben kennen gelernten virtuellen Domains können Sie hier die Verknüpfungstabellen für den Transport definieren (Abbildung 7.88). Relocated Mapping Falls sich Adressen bestimmter Hosts oder Personen etc. geändert haben, können Sie dies in dieser Maske mit den so genannten Lookup-Tabellen spezifizieren (Abbildung 7.89). Dabei ist es auch hier möglich, neue Tabellen anzulegen oder die vorhandene zu editieren. Normalerweise sollte dieses Feature deaktiviert bleiben. Sandini Bib 410 7 Remoteadministration Abbildung 7.86 Canonical Mapping Abbildung 7.87 Virtual Domains Sandini Bib 7.1 Webmin 411 Abbildung 7.88 Transport Mapping Abbildung 7.89 Relocated Mapping Sandini Bib 412 7 Remoteadministration Local Delivery Nachdem wir nun einige Formulare kennen gelernt haben, deren Bearbeitung eher simpel ist, können wir uns nun mit einer Maske beschäftigen, die etwas komplexer und umfangreicher ist. Abbildung 7.90 Local Delivery Wie Sie in Abbildung 7.90 sehen können, enthält dieses Formular die für die lokale Auslieferung von E-Mails nötigen Informationen. Um einen besseren Eindruck der zu treffenden Informationen zu bekommen, können Sie einen Blick in die folgende Aufzählung werfen: Name des Transports für lokale Lieferungen Shell, die bei Lieferung zu externem Befehl benutzt wird (keine direkte Ausführung von Befehlen) Suchliste zur Weiterleitung Auslieferung gültiger E-Mail an externe Befehle Gültige Mail in externe Datei schreiben Standardrechte des Auslieferungsagenten Pfadname der Mailbox-Datei relativ zum Home-Verzeichnis Zieladresse für unbekannte Empfänger Sandini Bib 7.1 Webmin 413 Verzeichnis für E-Mails in Warteschlange Externer Befehl, der anstelle Lieferung an Mailbox benutzt wird Optionaler tatsächlich zu benutzender Transport Optionaler Transport für unbekannte Empfänger Maximale Anzahl simultaner Auslieferungen an denselben lokalen Empfänger Maximale Anzahl von Empfängern je ausgelieferter lokaler Mail General Resource Control Hier können Sie Einstellungen zur allgemeinen Ressourcenkontrolle treffen. Einige der zu treffenden Einstellungen können Sie im folgenden Listing sehen. Die Maske zeigt Abbildung 7.91. Abbildung 7.91 General Resource Control Maximale Größe zurückgesandter Nachrichten Maximale Zeit bei Auslieferung an externe Programme Maximale Anzahl von untergeordneten Postfix-Prozessen Maximale Anzahl von Adressen, die der Duplikatfilter behält Maximale Anzahl Versuche, um Dateisperrung zu erhalten Sandini Bib 414 7 Remoteadministration Zeit in Sekunden zwischen Dateisperrungsversuchen Maximale Anzahl der Versuche, um einen Prozess zu erzeugen Maximale Zeit zwischen den Versuchen Maximal benutzter Speicher zur Bearbeitung von Headers Maximal benutzter Speicher zur Bearbeitung von Eingabezeilen Maximale Größe einer Nachricht Maximale Anzahl von Nachrichten in der aktiven Warteschlange Maximale Anzahl von Empfängern im Speicher Minimaler freier Speicher im Dateisystem der Warteschlange Maximale Zeit, nach der eine alte Sperrung freigegeben wird Zeit in Sekunden zwischen Versuchen, einen defekten MDT zu erreichen SMTP Server Options Sie können diesem Formular (Abbildung 7.92) folgende Parameter übergeben: SMTP-Grußbanner Maximale Anzahl der Empfänger für die Auslieferung Deaktiviere Befehl SMTP VRFY Timeout in Sekunden für SMTP-Transaktionen Timeout bis Senden von 4xx/5xx-Fehlerantwort Fehlerzahl, ab der ein Client vorübergehend ignoriert wird Fehlerzahl, nach der eine Verbindung getrennt wird Wird HELO benötigt? Erlaube nicht vertrauenswürdigen Benutzern das Routing Schränke Befehl ETRN ein auf ... Einschränkungen der Client-Host-Namen/-Adressen Einschränkungen beim Senden des Befehls HELO Einschränkungen der Absenderadressen Einschränkungen der Empfängeradressen DNS-Domänen, die auf einer schwarzen Liste nachgeschlagen werden Schränke Mail-Weiterleitung ein SMTP-Server-Antwort bei Zugangsverletzung SMTP-Server-Antwort bei Ablehnen eines ungültigen Host-Namen SMTP-Server-Antwort bei RBL-Domänenverletzung SMTP-Server-Antwort bei Ablehnen eines Clients SMTP-Server-Antwort bei verbotenem Weiterleiten SMTP-Server-Antwort bei Ablehnen einer unbekannten Domäne Sandini Bib 7.1 Webmin 415 SMTP-Server-Antwort bei Ablehnen eines unbekannten Clients SMTP-Server-Antwort bei Ablehnen wegen unbekanntem Host-Namen Abbildung 7.92 SMTP Server Options SMTP Client Options Das Gegenstück zu den gerade gezeigten SMTP Server Options bilden die SMTP Client Options, wo Sie folgende Optionen setzen können (Abbildung 7.93): SMTP-Server-Einstellungen Aktion, wenn aufgelistet als bester MX-Host Hosts/Domänen, an die Mail gegeben wird, falls Ziel ungültig Ignoriere MX-Lookup-Fehler Überspringe 4xx-Gruß Überspringe Warten auf Befehl QUIT Maximale Anzahl simultaner Auslieferungen an das gleiche Ziel Maximale Anzahl von Empfängern je Auslieferung Timeout um TCP-Verbindungen zu beenden Timeout beim Warten auf den Grußbanner Sandini Bib 416 7 Remoteadministration Timeout beim Warten auf Antwort auf MAIL FROM Timeout beim Warten auf Antwort auf RCPT TO Timeout beim Warten auf Antwort auf DATA Timeout für Antwort beim Senden des Nachrichteninhalts Timeout beim Warten auf Antwort auf beendenden "." Timeout beim Warten auf Antwort auf QUIT Abbildung 7.93 STMP Client Options Delivery Rates In dieser Maske (Abbildung 7.94) können Sie die zu treffenden Auslieferungsraten dazu setzen (siehe Aufzählung). Maximale Anzahl simultaner Auslieferungen an das gleiche Ziel Maximale Anzahl von Empfängern je Nachrichtenauslieferung Anfänglicher Übereinstimmungs-Level beim Liefern an gleiches Ziel Maximale Zeit (Tage), die eine Nachricht in der Warteschlange verbleibt, bevor sie nicht zustellbar ist Minimale Zeit (Sek) zwischen Versuchen, eine aufgeschobene Nachricht zu versenden Sandini Bib 7.1 Webmin 417 Maximale Zeit (Sek.) zwischen Versuchen, eine aufgeschobene Nachricht zu versenden Zeit (Sek) zwischen dem Scannen der Warteschlange für aufgeschobene Nachrichten Transporte, die nicht ausgeliefert werden sollen Abbildung 7.94 Delivery Rates Debugging Features Diese für die Fehlersuche enorm wichtigen Funktionen können Sie unter der in Abbildung 7.95 gezeigten Maske vornehmen. Liste von Domänen-/Netzwerkmustern, für die ausführliche Protokollierung aktiviert ist Ausführliche Protokollierung für Übereinstimmung mit oben angegebener Liste Sandini Bib 418 7 Remoteadministration Abbildung 7.95 Debugging Features ProFTPD Server Diese Maske ermöglicht die Konfiguration des ProFTPD-Servers und ist in 2 Teile unterteilt, die wir jeweils getrennt voneinander besprechen werden: 1. Globale Konfiguration 2. Virtuelle Server Globale Konfiguration (ProFTPD) Hier können Sie die globalen Einstellungen Ihren ProFTPD-Server betreffend spezifizieren. Networking Options In dieser Maske (Abbildung 7.96) können Sie die für Sie notwendigen Netzwerkoptionen setzen. Die folgende Aufzählung zeigt Ihnen einen Ausschnitt aus den verfügbaren Feldern dieser Maske: Anzahl der zur gleichen Zeit laufenden Sitzungen Sollen RFC 2228 Antworten geschickt werden? Leerlaufzeit, bevor die Verbindung beendet wird Zeit, die vor dem ersten Transfer gewartet werden soll Sandini Bib 7.1 Webmin 419 Servertyp Zeit bis zur Authentifizierung Transfermodus (ASCII oder binär) Maximale Länge des FTP-Befehls Soll der Willkommensgruß erst nach dem Login gezeigt werden? Anzahl der zur gleichen Zeit stattfindenden Logins und vieles mehr Abbildung 7.96 Networking Options Logging Options Dieses Formular (Abbildung 7.97) nimmt Einstellungen für Ihr Logging entgegen. So werden Sie hier zum Beispiel nach folgenden Parametern gefragt: System Log Facility Format Errorlogdatei System Log Level Sandini Bib 420 7 Remoteadministration Abbildung 7.97 Logging Options Files and Directories Um Einstellungen Dateien und Verzeichnisse betreffend zu übergeben, müssen Sie die Maske aus Abbildung 7.98 aufrufen. Dort haben Sie die Möglichkeit unter anderem folgende Optionen zu definieren: Loginverzeichnis Chroot-Verzeichnisse Sollen abgebrochene Uploads gelöscht werden? Sollen Uploads versteckt werden? Sollen symbolische Links gezeigt werden? Sollen Dateien, die mit einem Punkt beginnen, gezeigt werden? Zusätzliche ls-Optionen Sollen die Rechtsverhältnisse in einem Verzeichnis gefaked werden? Sandini Bib 7.1 Webmin 421 Abbildung 7.98 Files and Directories Access Control Um die Zugriffskontrollen für Ihren ProFTPD-Server zu definieren müssen Sie in diesem Formular (Abbildung 7.99) unter anderem die folgenden Werte spezifizieren: Wenn der Login nicht erlaubt ist, soll trotzdem nach einem Passwort gefragt werden Nachricht, die nach einem erfolgreichen Login erscheint Dürfen Dateien überschrieben werden? Ist der »chmod«-Befehl erlaubt? Nachricht, die nach einem nicht erfolgreichem Login erscheint Erlaubte FTP-Befehle Nicht erlaubte FTP-Befehle Sandini Bib 422 7 Remoteadministration Abbildung 7.99 Access Control Miscellaneous Hier können Sie verschiedene Werte für Ihr LDAP-Verzeichnis, die maximale CPU-Auslastung etc. definieren (Abbildung 7.100). Die folgende Auflistung gibt Ihnen einen kleinen Vorgeschmack auf die zu treffenden Parameter: PID-Datei CPU-Auslastungslimit Speicher-Auslastungslimit Maximum von geöffneten Dateien Zeitangabe LDAP-Informationen und vieles mehr Sandini Bib 7.1 Webmin 423 Abbildung 7.100 Miscellaneous Authentication Falls Sie die Standard-Authentifizierungsparameter ändern wollen, müssen Sie diese Seite aufrufen (Abbildung 7.101). Hier können Sie unter anderem folgende Werte setzen: Darf sich der Superuser einloggen? Gruppen, deren Mitglieder als »anonymous« behandelt werden sollen Datei, in der die Nachricht, die vor dem Login gezeigt werden soll, steht Datei, in der die Nachricht, die gezeigt werden soll, wenn zu viele Verbindungen bestehen, steht Nachricht, die nach dem Login gezeigt werden soll Logoutnachricht Gruppenpasswörter Maximum der missglückten Loginversuche pro Sitzung Soll nur denjenigen Usern der Login erlaubt werden, die eine gültige Shell besitzen Soll Usern, die in der Datei /etc/fptusers stehen, der Zugriff verweigert werden? Sandini Bib 424 7 Remoteadministration Soll PAM für die Authentifizierung genutzt werden? Alternative Unixgruppendatei Alternative Unixpasswortdatei Abbildung 7.101 Authentication Per-Directory Options File Sie können diese Maske (Abbildung 7.102) benutzen um eine .ftpaccess-Datei zu erzeugen, welche weitere Parameter für das betreffende Verzeichnis spezifiziert. Beachten Sie dabei, dass alle Restriktionen, die Sie mit dieser Datei definieren, auch auf alle Unterverzeichnisse übergreifen. Denied FTP Users Wie Sie sich vielleicht noch erinnern können, hatten Sie unter dem Menüpunkt Authentication die Möglichkeit zu spezifizieren, ob Usern in der Datei /etc/ftpusers der Login verwehrt wird. Unter dieser Maske haben Sie nun die Möglichkeit Einträge in dieser Datei vorzunehmen und somit bestimmten Benutzern den Zugriff auf Ihr System zu verwehren (falls Sie die entsprechenden Parameter in der Authentication-Maske richtig gesetzt haben). Sandini Bib 7.1 Webmin 425 Abbildung 7.102 Per-Directory Options File Dabei brauchen Sie eigentlich auf nichts Besonderes zu achten, löschen Sie einfach die Kommentarzeilen aus der Datei (optional) und fügen Sie die vorgesehenen Benutzer ohne weitere Parameter ein. Sie sollten Benutzern wie den Superusern etc. den Zugriff auf Ihr System definitiv verwehren. Die Maske zeigt Abbildung 7.103. Virtuelle Server (ProFTPD) Im zweiten Teil der Startseite haben Sie die Möglichkeit Einstellungen zu den vorhandenen virtuellen Servern zu treffen oder einfach einen neuen virtuellen Server hinzuzufügen. Um einen neuen Server hinzuzufügen haben Sie folgende Angaben zu machen: Adresse FTP Port Servername Nachdem Sie den Link zu den Einstellungen für Ihren virtuellen Defaultserver gefolgt sind, kommen Sie zu der in Abbildung 7.104 gezeigten Seite. Wie Sie unschwer erkennen können, haben wir die meisten der dort zu konfigurierenden Punkte bereits in der globalen Konfiguration besprochen. Wir werden daher nur die für Sie im Moment neuen Oberpunkte kurz erläutern. Sandini Bib 426 7 Remoteadministration Abbildung 7.103 Denied FTP Users Abbildung 7.104 Virtuelle Server Sandini Bib 7.1 Webmin 427 Users and Groups Hier können Sie spezifizieren, unter welchem User und unter welcher Gruppe die virtuellen Server grundsätzlich laufen sollen (Abbildung 7.105). Abbildung 7.105 Users and Groups Anonymous FTP Um einen Anonymous-FTP-Server einzurichten, bedarf es etwas Konfigurationsarbeit. Diese Konfigurationen können Sie problemlos unter diesem Menüpunkt vornehmen. Da die meisten dort zu findenden Unterpunkte jedoch den bereits vorgestellten Punkten sehr ähneln, werden wir an dieser Stelle nur eine weitere (neue) Maske besprechen (Abbildung 7.106). Configure FTP Options Wie Sie in Abbildung 7.107 sehen können, müssen Sie hier lediglich die drei folgenden Punkte spezifizieren: Chroot-Verzeichnis Unter welchem Usernamen soll der Dateizugriff stattfinden? Unter welchem Gruppennamen soll der Dateizugriff stattfinden? Sandini Bib 428 7 Remoteadministration Abbildung 7.106 Anonymous FTP Abbildung 7.107 Configure Anonymous FTP Sandini Bib 7.1 Webmin 429 SSH Server Auch hier bietet Webmin ein Webinterface zur Konfiguration, das Ihnen das Leben wirklich erleichtern kann. Wir werden uns nun mit den in Abbildung 7.108 zu sehenden Unterpunkten auseinander setzen. Abbildung 7.108 Start Authentication Um die Optionen für Anmeldung und Echtheitsbestätigung zu treffen, können Sie dieser Maske (Abbildung 7.109) folgende Werte übergeben: Benachrichtigung, wenn neue Mails vorhanden sind Erlaube Echtheitsbestätigung durch Passwort Erlaube das Anmelden mit leerem Passwort Erlaube Anmeldung als root? Erlaube RSA Echtheitsbestätigung? Prüfe Berechtigungen auf Dateien der Schlüssel Anzeigen von /etc/motd beim Anmelden Ignoriere Datei known_hosts des Benutzers Meldungsdatei vor dem Anmelden Sandini Bib 430 7 Remoteadministration Erlaube das Anmelden nur durch hosts.equiv und .rhosts Prüfe hosts.equiv und .rhosts für RSA-Echtheitsbestätigung Ignoriere .rhosts-Datei Abbildung 7.109 Authentication Networking In dieser Maske (Abbildung 7.110) können Sie folgende Parameter für Ihr Netzwerk setzen: Adresse, auf der Verbindungen angenommen werden sollen Port, auf dem Verbindungen angenommen werden sollen Akzeptierte Protokolle Verbindung trennen, wenn Client abgestürzt ist? Wartezeit für Anmeldung TCP-Weiterleitung erlauben? Verbindung auf weitergeleiteten Ports erlauben? Sandini Bib 7.1 Webmin 431 Abbildung 7.110 Networking Access Control Zur Kontrolle der Zugriffssteuerung stehen Ihnen folgende vier Felder zur Konfiguration zur Verfügung (Abbildung 7.111): Nur bestimmte Benutzer erlauben Nur bestimmte Gruppen erlauben Bestimmte Benutzer verbieten Bestimmte Gruppen verbieten Miscellaneous Options Weitere nicht zuordenbare Optionen können Sie in diesem Feld setzen (Abbildung 7.112): Erlaube Weiterleitung von X11-Verbindungen X11 display offset Vollständiger Pfad zum xauth-Programm Syslog-Möglichkeiten Protokoll Level Schlüssellänge Server Erneuerungsinterval für Serverschlüssel PID-Datei Sandini Bib 432 7 Remoteadministration Abbildung 7.111 Access Control Abbildung 7.112 Miscellaneous Options Sandini Bib 7.1 Webmin 433 Client Host Options In diesem Formular können Sie für jeden Client unterschiedliche Optionen setzen. Um einen bereits vorhandenen Client zu bearbeiten, folgen Sie einfach dem Link im Namen des Hosts. Falls Sie einen neuen Client anlegen wollen, benutzen Sie den Button »Optionen für Client-Rechner hinzufügen« (Abbildung 7.113). Egal welche dieser beiden Konfigurationsmöglichkeiten Sie nutzen, Sie können auf jeden Fall folgende Felder neu definieren: Optionen für Host (Adresse, Name) Anmelden als Benutzer Verbindung trennen, wenn Server abgestürzt ist Echter Hostname, zu dem verbunden werden soll Frage nach einem Passwort, falls benötigt Port, zu dem verbunden werden soll SSH-Verkehr komprimieren? Escape-Zeichen Grad der Kompression Anzahl Versuche eine Verbindung herzustellen Benutze privilegierten Quell-Port? Versuche RSH, falls SSH fehlschlägt? Nur RSH-Verbindungen herstellen? Forward authentication agent? X11-Verbindungen weiterleiten? Host zur known_hosts-Datei hinzufügen? Prüfe IP-Adressen in known_hosts-Datei? SSH-Protokolle Lokale Ports, die an den Server weitergeleitet werden Server Ports, die nach lokal weitergeleitet werden Using SSH Key Setup In dieser Maske (Abbildung 7.114) können Sie die Einstellungen für neue Unix User im Zusammenhang mit SSH KEYGEN (siehe Kapitel 5) vornehmen. Änderungen annehmen Wie bei jedem Serverdienst, den Sie über Webmin konfigurieren, können Sie auch hier Ihre Änderungen sofort wirksam machen, indem Sie auf den entsprechenden Link klicken (»Apply Changes«). Sandini Bib 434 7 Remoteadministration Abbildung 7.113 Client Host Options Abbildung 7.114 Using SSH Key Setup Sandini Bib 7.1 Webmin 435 SSL Tunnels Bevor wir uns an die Besprechung dieser Maske machen, möchte ich SuSE-Benutzer darauf hinweisen, dass sie höchstwahrscheinlich ihre Modulkonfiguration von /usr/local/sbin/stunnel auf /usr/sbin/stunnel zu ändern haben (falls sie das Paket über den Paketmanager installieren). Wenn Sie diese Seite betreten, erhalten Sie eine Übersicht aller von Ihnen angelegten SSL-Tunnels und können diese dann konfigurieren oder aber auch neue hinzufügen (Abbildung 7.115). Neue Tunnel hinzufügen Nachdem Sie dem Link zum Erstellen neuer SSL-Tunnels gefolgt sind, müssen Sie der darauf folgenden Maske die nun aufgelisteten Optionen übergeben: Name des Dienstes Ist dieser aktiv oder nicht TCP Port Zieldefinitionen für den Tunnel SSL-Zertifikat und Schlüssellänge TCP Wrappers Tunnelmodus Ausgehende Quelladresse Samba Windows File Sharing Ich bin mir sicher, dass die meisten Leser das Problem der Windowsintegration in ein Unixnetzwerk kennen werden. Dank Samba hat sich die Lösung dieses Problems in den letzten Jahren zwar stark vereinfacht, aber es ist immer noch eine Menge Arbeit Windows Rechner geschickt in das Netzwerk einzubinden. Um diese Arbeit etwas zu vereinfachen, können Sie die Konfigurationsmasken von Webmin benutzen, welche wir im Folgenden beschreiben werden (siehe Abbildung 7.116). Wie Sie in Abbildung 7.116 sehen können, ist die Startseite in zwei Teile aufgeteilt. Der Teil vor der »globalen Konfiguration« beschäftigt sich mit den vorhandenen Homeverzeichnissen und den verfügbaren Druckern. Sie haben dabei die Möglichkeit folgende Aktionen durchzuführen: Neue Dateifreigabe erstellen Neue Druckerfreigabe definieren Freigaben kopieren Geöffnete Verbindungen anzeigen lassen Sandini Bib 436 7 Remoteadministration Abbildung 7.115 SSL Tunnels Abbildung 7.116 Samba Startseite Sandini Bib 7.1 Webmin 437 Neue Dateifreigabe erstellen Um eine neue Dateifreigabe zu erstellen, müssen Sie dem dafür vorgesehenen Link folgen und in der danach erscheinenden Maske folgende Optionen definieren: Freigabename Freigegebenes Verzeichnis Verfügbar? Sichtbar (im Netz)? Freigabekommentar Neue Druckerfreigabe erstellen Wenn Sie eine neue Druckerfreigabe erstellen, werden Sie merken, dass die dafür zu übergebenden Parameter denen der Dateifreigaben sehr ähneln: Freigabename Unix-Drucker Spoolverzeichnis Verfügbar? Sichtbar (im Netz)? Freigabekommentar Freigabe kopieren Oftmals ist es notwendig (oder schlichtweg einfacher), eine bereits vorhandene Freigabe einfach zu kopieren. Beachten Sie dabei aber, dass alle Änderungen, die Sie am Original vornehmen, auch an der Kopie angewandt werden. Um eine Freigabe zu kopieren, müssen Sie lediglich den Namen der zu kopierenden Freigabe und den Namen der dabei neu entstehenden Freigabe spezifizieren. Geöffnete Verbindungen Unter dieser Rubrik können Sie alle angemeldeten Benutzer auflisten lassen. Unix Networking Der erste Menüpunkt der globalen Einstellungen erlaubt es Ihnen, die Einstellungen für Ihr Unixsystem/Netzwerk zu treffen (Abbildung 7.117). Im Folgenden sehen Sie eine kleine Aufstellung der anzugebenden Optionen: Inaktivität bis zum Verbindungsabbau Datei mit vertrauenswürdigen Rechnern/Benutzern Netzwerkschnittstelle Schnittstelle Netzwerkmaske Keepalive-Pakete Maximale Paketgröße Sandini Bib 438 7 Remoteadministration Verwende Addresse Socket-Optionen Abbildung 7.117 Unix Networking Windows Networking Das Gegenstück zur eben kennen gelernten Maske bilden die Einstellungen für Ihr Windowssystem bzw. Netzwerk. Auch hier haben wir einen Screenshot (Abbildung 7.118) und eine Auflistung der Felder für Sie bereitgestellt: Arbeitsgruppe WINS Modus Serverbeschreibung Servername(n) Standardfreigabe Freigaben, die immer anzeigt werden sollen Maximale Festplattengröße (aus Clientsicht) Winpopup-Befehl Master browser-Priorität Protokolllevel Master Browser Sandini Bib 7.1 Webmin 439 Sicherheit Password Server An wen sollen die Browserlisten weitergegeben werden? Abbildung 7.118 Windows Networking Authentication Wie so oft stellt Webmin auch hier wieder eine Maske zur Verfügung, in der Sie alle wichtigen Parameter für die Authentifizierung (besonders Passwörter betreffend) spezifizieren können (Abbildung 7.119): Verschlüsselte Passwörter verwenden? Leere Passwörter erlauben? Programm zum Ändern des Passwortes Soll auf Groß-/Kleinschreibung geachtet werden? Aufforderung zur Passwortänderung Umsetzung der Benutzernamen Windows to Unix Printing Da in den wenigsten Fällen eine Firma ohne Papier und die dafür nötigen Drucker auskommt, ist diese Maske, in der Sie die Druckereinstellungen regeln können, eine der wichtigsten (Abbildung 7.120). Sandini Bib 440 7 Remoteadministration Abbildung 7.119 Authentication Abbildung 7.120 Windows to Unix Printing Sandini Bib 7.1 Webmin 441 Folgende Werte können in diesem Formular gesetzt werden: Unix-Druckverfahren Alle Drucker freigeben? Druckerdefinitionsdatei Druckerstatus zwischenspeichern Miscellaneous Options Die allgemeinen und erweiterten Einstellungen können Sie diesem Formular übergeben (Abbildung 7.121). Die folgende Auflistung zeigt die zu treffenden Optionen: Debug Level getwd()-Systemaufrufe zwischenspeichern? Verzeichnis sperren Logdatei Maximale Logdateigröße Direkte Lesezugriffe erlauben? Direkte Schreibzugriffe erlauben? Größe der überlappenden Lesevorgänge chroot()-Verzeichnis Pfad zu smbrun Zeitversatz (für Clients) in Minuten Vorausschauendes Lesen? File Share Defaults Wie Sie in Abbildung 7.122 sehen können, können Sie in dieser Maske bestimmte Verzeichnisse freigeben. Dabei können Sie die folgenden Werte setzen: Freigegebenes Verzeichnis Verfügbar? Sichtbar (im Netz)? Freigabekommentar Sandini Bib 442 7 Remoteadministration Abbildung 7.121 Miscellaneous Options Abbildung 7.122 File Share Defaults Sandini Bib 7.1 Webmin 443 Des Weiteren haben Sie noch die Möglichkeit folgende Untermenüpunkte aufzurufen und Ihre Freigaben dort weiter zu definieren und zu konfigurieren: Sicherheit und Zugriffskontrolle Um die in Abbildung 7.123 und der folgenden Liste gezeigten Zugriffskontrollen zu setzen, können Sie diese Maske benutzen: Beschreibbar? Gastzugang? Unix-Gastbenutzer Berechtigte Rechner Nicht zugelassene Benutzerauthentifizierung erneut durchführen? Berechtigte Benutzer Berechtigte Gruppen Nicht berechtigte Benutzer Nicht berechtigte Gruppen Mögliche Benutzer Mögliche Gruppen Nur lesende Berechtigung (Benutzer) Nur lesende Berechtigung (Gruppe) Lese-/Schreibberechtigung (Benutzer) Lese-/Schreibberechtigung (Gruppe) Einstellungen für Dateiberechtigungen Wie Sie sich sicher denken können, sind dieser Maske (Abbildung 7.124) die Verzeichnis- und Dateimodi zu übergeben: Unix-Dateimodus Unix-Verzeichnismodus Nicht angezeigte Verzeichnisse Verwende Unix-Benutzer Verwende Unix-Gruppe Symbolischen Links folgen? Schreibgeschütze Dateien löschen? Sandini Bib 444 7 Remoteadministration Abbildung 7.123 Sicherheit und Zugriffskontrolle Abbildung 7.124 Einstellungen für Dateiberechtigungen Sandini Bib 7.1 Webmin 445 Dateinamenskonventionen Für die Einstellungen für Ihre Dateinamenskonventionen stehen Ihnen folgende Felder zur Verfügung (Abbildung 7.125): Groß-/Kleinschreibung umsetzen? Groß-/Kleinschreibung? Standardschreibweise? Groß-/Kleinschreibung beibehalten? Groß-/Kleinschreibung (8.3)? Verstecke Dateien mit führendem Punkt? DOS Archivbit beibehalten? DOS Hiddenbit beibehalten? DOS Systembit beibehalten? Abbildung 7.125 Dateinamenskonventionen Sandini Bib 446 7 Remoteadministration Erweiterte Einstellungen Alle Einstellungen, die noch zu treffen sind, die aber nicht in die bereits aufgeführten Menüpunkte einzuordnen sind, können hier definiert werden (Abbildung 7.126): Dateisperren verwenden? Maximale Verbindungen Dateisperrungen simulieren? Freigabemodi verwenden? Unbedingte Dateisperren verwenden? Synchronisieren nach Schreibaktion? Datenträgername Wie Freigabe Unix-DOS Dateinamenumsetzung Ausführen bei Verbindungsaufbau Ausführen bei Verbindungsabbau Ausführen bei Verbindungsaufbau als root Ausführen bei Verbindungsabbau als root Abbildung 7.126 Erweiterte Einstellungen Sandini Bib 7.1 Webmin 447 Printer Share Defaults Auch hier finden Sie ein Pendant zu einem bereits kennen gelernten Link (siehe neue Druckerfreigabe). Neben den gleich gezeigten Feldern können Sie in zwei weiteren Menüpunkten weitere Angaben treffen (Abbildung 7.127): Unix-Drucker Spoolverzeichnis Verfügbar? Sichtbar (im Netz)? Freigabekommentar Abbildung 7.127 Printer Share Defaults Sicherheit und Zugriffskontrolle Folgende Punkte können für die Sicherheitseinstellungen Ihrer Druckerfreigaben getroffen werden (Abbildung 7.128): Beschreibbar? Gastzugang? Unix-Gastbenutzer Berechtigte Rechner Sandini Bib 448 7 Remoteadministration Nicht zugelassene Rechner Benutzerauthentifizierung erneut durchführen? Berechtigte Benutzer Berechtigte Gruppen Nicht berechtigte Benutzer Nicht berechtigte Gruppen Mögliche Benutzer Mögliche Gruppen Nur lesende Berechtigung (Benutzer) Nur lesende Berechtigung (Gruppe) Lese-/Schreibberechtigung (Benutzer) Lese-/Schreibberechtigung (Gruppe) Abbildung 7.128 Sicherheit und Zugriffskontrolle Druckereinstellungen In dieser Maske (Abbildung 7.129) können Sie die Einstellungen rund um Ihren Drucker setzen. Falls Sie sich nicht sicher sind, sollten Sie die Optionen auf »Default« stehen lassen: Sandini Bib 7.1 Webmin 449 Minimaler freier Plattenplatz Postscriptdrucken erzwingen Druckbefehl Spoolverzeichnis anzeigen Druckauftrag löschen Druckauftrag anhalten Druckauftrag fortsetzen Druckertreiber Abbildung 7.129 Druckereinstellungen SWAT SWAT ist eigentlich kein Webmin-Modul und wird standardmäßig mit SAMBA ausgeliefert. Nichtsdestotrotz hat es dieselben guten Eigenschaften wie die bereits vorgestellten Webmin-Module und ermöglicht es dem Administrator, seine Konfigurationsaufgaben über einen Webbrowser durchzuführen. Nachdem Sie sich über den in Abbildung 7.130 gezeigten SWAT-Login eingeloggt haben, werden Sie automatisch zu SWAT weitergeleitet. Wir werden SWAT an dieser Stelle nicht besprechen, da dies definitiv den Rahmen dieses Buches sprengen würde. Da die Konfigurationspunkte aber alle gut geordnet auf der ers- Sandini Bib 450 7 Remoteadministration ten Seite liegen und eine ausführliche Manpage (swat) vorliegt, sollte die Arbeit damit kein Problem darstellen. Abbildung 7.130 SWAT-Login Encrypted Passwords Nachdem Sie nun Ihren Sambaserver »perfekt« konfiguriert haben, steht Ihnen ein letzter Abschnitt der Sambastartseite zur Verfügung um die Sambabenutzer und deren Passwörter zu ändern. Grundsätzlich können Sie folgende Verwaltungen und Konfigurationen erledigen: Samba-Benutzer und Passwörter konfigurieren, verwalten, bearbeiten Unix-Benutzer zu Samba-Benutzern konvertieren Automatische Unix- und Samba-Benutzer-Synchronisation konfigurieren Sendmail Configuration Ich denke, jeder, der einmal ein Sendmailsystem aufgesetzt und konfiguriert hat, weiß, wie viel Arbeitsaufwand das darstellt. Mit Webmin bekommen Sie nun die Möglichkeit geboten, die berüchtigte Konfiguration von Sendmail über ein Webmodul zu erledigen, und sparen damit eine Menge Zeit, Arbeit und Nerven. Sandini Bib 7.1 Webmin 451 Außerdem wird die Fehleranfälligkeit Ihrer Konfigurationsdateien drastisch gesenkt (Abbildung 7.131). Abbildung 7.131 Sendmail Sendmail Options (O) Hier können Sie die verschiedensten globalen Einstellungen für Ihr Sendmailsystem spezifizieren (Abbildung 7.132). Sende ausgehende Mail durch einen bestimmten Host Leite unqualifizierte Benutzernamen weiter zu einem bestimmten Host Leite Mail für lokale Benutzer weiter zum Host X Auslieferungsmodus SMTP Portoptionen Maximaler Load-Durchschnitt für das Senden Maximaler Load-Durchschnitt für das Empfangen Maximale Anzahl von untergeordneten Prozessen Maximale Anzahl von Verbindungen/Sekunde Minimale Zeit vor dem erneuten Sendeversuch Maximale Warteschlangenlänge Sandini Bib 452 7 Remoteadministration Zeit, bevor aufgegeben wird Zeit, bevor eine Warnung gesendet wird Verzeichnis der Warteschlange An wen sollen Fehlermeldungen geschickt werden? Benutzerweiterleitungsdateien Minimaler freier Speicherplatz Maximale Nachrichtengröße Protokoll-Level MIME-kodierte Bounce-Nachrichten? Accept mail for users real names? Dateisicherheitseinstellungen Abbildung 7.132 Sendmail Options (O) Mail Aliases (aliases) Wie Sie aus Abbildung 7.133 erkennen können, bietet Ihnen diese Maske die Möglichkeit neue Aliase anzulegen oder die bereits vorhandenen zu verwalten. Sandini Bib 7.1 Webmin 453 Um die Einstellungen eines bereits vorhandenen Mail Aliases zu ändern, klicken Sie einfach auf den entsprechenden Namen. Sie werden dadurch automatisch zu der entsprechenden Seite weitergeleitet. Abbildung 7.133 Mail Aliases (aliases) Um einen neuen Alias zu definieren müssen Sie lediglich folgende Angaben machen: Die Adresse ohne Domainnamen (z.B. max.mustermann) Weiter müssen Sie angeben, ob der Alias aktiviert werden soll Wohin soll der Alias gehen (E-Mail-Adresse, Datei … ) Local Domains (Cw) Falls Sie wollen, dass Ihr Mailserver mehrere Domainnamen verwaltet, müssen Sie diese Domains in der in Abbildung 7.134 gezeigten Maske definieren. Domain Masquerading (CM) Falls Sie wünschen, dass alle E-Mails, egal mit welcher Domainendung, die Ihr System verlassen, als Absenderadresse eine bestimmte Domain zugewiesen bekommen, können Sie dies in der Maske aus Abbildung 7.135 definieren. Beachten Sie dabei aber, dass Sie diese Funktion für einzelne Benutzer im Menüpunkt »Outgoing Addresses« ändern können. Sandini Bib 454 7 Remoteadministration Abbildung 7.134 Local Domains (Cw) Abbildung 7.135 Domain Masquerading (CM) Sandini Bib 7.1 Webmin 455 Trusted Users (T) Um einen Benutzer die Erlaubnis zu erteilen, die Absenderadresse seiner E-Mails zu ändern (From Feld), muss er den Status »Trusted Users« bekommen. Seien Sie mit dieser Funktion äußerst vorsichtig, da damit logischerweise E-Mail-Adressen gefälscht werden können. Diese Option kann für Webdienste (wie zum Beispiel Apache) sehr nützlich und hilfreich sein. Address Mapping (virtuser) Hier können Sie eine Art »besseren Alias« erstellen. Diese Methode hat im Gegensatz zu Mail Aliases folgende Vorteile: Es können ganze Domains zu einer einzigen Adresse umgeleitet werden Benutzer können mit einem Namen in mehreren Domains behandelt werden E-Mails können von einer Domain zu einer anderen umgeleitet werden Abbildung 7.136 Address Mapping Um eine Verknüpfung zu erstellen, müssen Sie folgende Angaben machen: Mail für Adresse Sandini Bib 456 7 Remoteadministration Domain Senden an: Adresse Domain Fehler werden zu einer bestimmten Adresse geschickt Sie können die dafür zuständige Konfigurationsdatei /etc/mail/virtusertable auch manuell über Webmin konfigurieren. Domain Routing (mailertable) Hier können Sie verschiedene Auslieferungen für bestimmte Domains, die nicht in der Liste der lokalen Domains aufgeführt sind, definieren (Abbildung 7.136). Dabei stehen folgende Auslieferungsmodi zur Verfügung: SMTP Erweitertes SMTP 8-bit SMTP dsmtp SMTP-Weiterleitung Procmail UUCP uucp-old suucp uucp-new uucp-dom uucp-uudom bsmtp fido Neben dem Auslieferungsmodus müssen Sie noch angeben, ob die Mail für Hosts oder für Domains bestimmt ist und an wen sie geschickt werden soll. Outgoing Addresses (generics) Wie wir bereits wissen, können Sie hierbei die Angaben, die Sie global im Menüpunkt »Domain Masquerading (CM)« definiert haben, überschreiben. Das heißt, dass Sie auch hier das »From«-Feld einer ausgehenden E-Mail verändern können. Die hier erstellten »Verknüpfungen« funktionieren aber nicht für Mails, die an lokalen Benutzer ausgeliefert werden sollen. Weiter müssen Sie für jede Domain, die Sie hier verknüpfen wollen, einen Eintrag in der Tabelle für ausgehende Domänen haben (Outgoing Domains). Außerdem muss im DNS-Eintrag für jede Domäne ein MX-Eintrag eingetragen werden, welcher auf Ihr System verweist. Sandini Bib 7.1 Webmin 457 Abbildung 7.137 Domain Routing (mailertable) Sie können die dafür zuständige Konfigurationsdatei /etc/mail/genericstable auch per Hand über ein Webmin-Modul konfigurieren. Um die Verknüpfung zu erstellen, müssen Sie lediglich zwei Felder ausfüllen: 1. Mail von <Adresse> 2. Ändern zu <Adresse> Einen Screenshot zeigt Abbildung 7.138. Outgoing Domains (CG) Hier müssen Sie für jede Domain, die Sie unter dem Menüpunkt »Outgoing Addresses« verknüpfen wollen, einen Eintrag definieren. Das heißt, dass die Domain des »From«-Feldes in dem in Abbildung 7.139 gezeigten Screenshot aufgelistet sein muss. Domain Mapping (domaintable) Falls Ihre Sendmailkonfiguration über die nötige Direktive für Domänenverknüpfung verfügt, können Sie diese Verknüpfungen mit diesem Formular realisieren. Sandini Bib 458 7 Remoteadministration Abbildung 7.138 Outgoing Addresses (generics) Abbildung 7.139 Outgoing Domains Sandini Bib 7.1 Webmin 459 Spam Control (access) Mit diesem Formular können Sie so genannte Anti-Spam-Regeln definieren, die verhindern, dass Sie Mails von bestimmten Absendern bekommen. Sie sollten dieses Feature auf jeden Fall nützen, da dies eine Menge Traffic erspart und die Einschleusung von Viren und Trojanern stark einschränken kann (Abbildung 7.140). Abbildung 7.140 Spam Control (access) Um solche Anti-Spam-Regeln einzurichten müssen Sie folgende Angaben an das Formular übergeben: Quelle der Mail (Domain, Benutzer, Netzwerk … ) Aktion (abweisen, weiterleiten, leise löschen, akzeptiere … ) Relay Domains (CR) In der in Abbildung 7.141 gezeigten Seite können Sie bestimmte Domains angeben, die weitergeleitet werden dürfen. Achten Sie aber darauf, dass dieses Feature nicht mit den Spamregeln kollidiert. Mail Queue (mailq) Hier finden Sie die Nachrichten, die noch nicht ausgeliefert wurden und sich somit in der Warteschlange befinden. Sandini Bib 460 7 Remoteadministration Abbildung 7.141 Relay Domains (CR) User Mailboxes Unter diesem Menüpunkt befindet sich eine Seite, die alle vorhandenen Mailboxen inklusive Größenanzeige auflistet. Von dort aus haben Sie eine gute Übersicht über die einzelnen Mailboxen und können diese konfigurieren und einsehen. Weiter ist es sogar möglich, vorhandene Mails weiterzuleiten oder neue Nachrichten zu erstellen (Abbildung 7.142). Squid Proxy Server Der Squid Proxy ist wohl der bekannteste Proxyserver, den man in der Linuxwelt so finden kann. Daher verwundert es kaum, dass Sie auch hier die Möglichkeit haben, diesen Dienst bequem über ein Webmin-Modul zu konfigurieren. Wenn Sie Ihren Squid Server noch nicht initialisiert haben (vermeiden Sie eine Initialisierung durch den Superuser), können Sie dies über die Startseite (Abbildung 7.143) tun. Nachdem dies erledigt ist, stehen Ihnen für die Konfiguration elf verschiedene Menüpunkte zur Verfügung, die wir alle im Laufe dieses Abschnittes besprechen werden. Sandini Bib 7.1 Webmin 461 Abbildung 7.142 User Mailboxes Abbildung 7.143 Squid Sandini Bib 462 7 Remoteadministration Ports and Networking In diesem Formular (Abbildung 7.144) können Sie Ihre Netzwerkeinstellungen und verfügbaren Anschlüsse mit den folgenden Feldern konfigurieren: Proxy-Adressen und -Anschlüsse ICP-Anschluss Ausgehende TCP-Adresse Ausgehende UDP-Adresse Eingehende UDP-Adresse Multicast-Gruppen TCP-Empfangspuffer Abbildung 7.144 Ports and Networking Other Caches Diese Maske (Abbildung 7.145) ermöglicht Ihnen folgende Features: 1. Caches hinzufügen 2. Cache-Auswahleinstellungen definieren 3. ACLs für Direktabholungen definieren Sandini Bib 7.1 Webmin 463 4. ACLs für indirekte Abholung definieren 5. Wenn Sie einen neuen Cachehost hinzufügen wollen, müssen Sie – nachdem Sie dem entsprechenden Link gefolgt sind – folgende Parameter definieren: Host-Name Typ Proxy-Anschluss ICP-Anschluss Nur Proxy? Sende ICP-Anfragen? Standard-Cache? Round-Robin-Cache? ICP-Time-To-Live Cache-Gewichtung Nur nächsten? Keine Auswahl? Kein NetDB-Austausch? Keine Verzögerung? Anmeldung (User und Pass) auf Proxy Multicast-Responder? Frage bei Host an für Domänen Frage nicht an für Domänen Die Felder, die Sie ausfüllen müssen, um die Auswahlsequenzen zu definieren, finden Sie in der angefügten Liste (ACLs werden im Anschluss besprochen): Hole URLs direkt, die bestimmte Zeichen enthalten ICP-Anfrage-Timeout (in ms) Multicase-ICP-Timeout (in ms) Timeout für abgebrochenen Kontakt (in sec) Um ACLs für Direktabholung hinzuzufügen, müssen Sie einige Felder spezifizieren: Aktion Übereinstimmende ACLs Nicht übereinstimmende ACLs Das Gegenstück hierzu (indirekte Abholung) verlangt dieselben Eingaben. Sandini Bib 464 7 Remoteadministration Abbildung 7.145 Other Caches Memory Usage Wenn Ihr Proxy viele Zugriffe zu regeln hat und er mit viel Traffic umgehen muss, sollten Sie unbedingt die Speichernutzung regeln, da es ansonsten durchaus passieren kann, dass die Performance Ihres Systems spürbar sinkt. Um dies zu verhindern können Sie die folgenden Parameter setzen (Abbildung 7.146): Speichernutzungsgrenzwert FQDN-Cache-Größe Oberer Schwellenwert für Speicher Unterer Schwellenwert für Speicher Oberer Schwellenwert für Festplatte Unterer Schwellenwert für Festplatte Maximale Größe zwischengespeicherter Objekte IP-Adressen-Cache-Größe Oberer Schwellenwert für IP-Cache Unterer Schwellenwert für IP-Cache Sandini Bib 7.1 Webmin 465 Abbildung 7.146 Memory Usage Logging Um die allgemeinen Einstellungen für die Protokollierung und die dazu verwendeten Dateien weg vom Standard zu definieren können Sie die Optionen in der angeschlossenen Liste benutzen (Abbildung 7.147): Zugriffsprotokolldatei Debug-Protokolldatei Speicherprotokolldatei Cache-Metadata-Datei Benutze HTTPD-Protokollformat? MIME-Header protokollieren? Benutzeragent-Protokolldatei PID-Date Führe RFC931-Ident-Lookups für ACLs aus RFC931-Ident-Timeout Vollen Host-Namen protokollieren? Protokollierung der Netzmaske Sandini Bib 466 7 Remoteadministration Debug-Einstellungen MIME-Header-Tabelle Abbildung 7.147 Logging Cache Options Hier können Sie Einstellungen für alle Anfragen und den Cache an sich durch folgende Parameter treffen: Cache-Verzeichnisse Durchschnittliche Objektgröße Objekte pro Verzeichnis URLs für bestimmte ACLs nicht zwischenspeichern Maximale Cache-Zeit Maximale Anfragedateigröße Maximale Anfrage-Header-Größe Maximale Antwortdateigröße Verweildauer von Fehlerantworten im Cache DNS-Lookup-Cache-Dauer Fehlgeschlagene DNS-Lookup-Cache-Dauer Sandini Bib 7.1 Webmin 467 Verbindungs-Timeout Lese-Timeout Seitenauswahl-Timeout Client-Anfrage-Timeout Maximale Verbindungszeit für Clients Maximale Shutdown-Zeit Halb-geschlossene Clients? Ständiger Timeout WAIS-Relay-Host Helper Programs Um die vorhandenen Squid-Hilfsprogramme oder neue Hilfsprogramme und deren Einstellungen zu definieren, müssen Sie dieses Formular aufrufen, in dem Sie folgende Felder füllen können (Abbildung 7.148): Anon. FTP-Anmeldung FTP-Spaltenbreite Squid DNS-Programm Anzahl von DNS-Programmen Hänge Domäne an Anfragen an Von wo werden DNS-Server-Adressen bezogen? Cache-Reinigungsprogramm Squid-Ping-Programm Eigenes Weiterleitungsprogramm Anzahl von Weiterleitungsprogrammen Eigenes Authentifizierungsprogramm Anzahl von Authentifizierungsprogrammen Access Control Wie Sie sicherlich schon bemerkt haben, konnten Sie in den bereits vorgestellten Masken bestimmte Aktionen für bestimmte ACLs definieren. In dieser Maske (Abbildung 7.149) finden Sie alle bereits vordefinierten Zugriffslisten, welche Sie natürlich nach Ihren Bedürfnissen verändern können (oder neue hinzufügen). Dabei können Sie diese drei Regelarten definieren oder verwalten: 1. Zugriffskontrolllisten (ACLs) 2. Proxy-Beschränkungen 3. ICP-Beschränkungen Sandini Bib 468 7 Remoteadministration Abbildung 7.148 Helper Programs Abbildung 7.149 Access Control Sandini Bib 7.1 Webmin 469 Miscellaneous Options Alle Einstellungen, für die kein eigener Menüpunkt entworfen wurde und die nicht in einen bereits vorhandenen Punkt eingefügt werden können, können Sie an dieser Stelle konfigurieren (Abbildung 7.150). Wie zum Beispiel: Startup-DNS-Testadressen SIGUSR1-Protokolldateirotationen Standarddomäne Fehlermeldungstext Statistiken pro Client? X-Forwarded-For Header? ICP-Anfragen protokollieren? Minimale direkte Hops Reserviere Speicher für zukünftige Nutzung? Größe des zu reservierenden Speichers? Header, die durchgehen Falscher Benutzeragent HTTP-Accel-Host HTTP-Accel-Anschluss HTTP-Accel mit Proxy Soll HTTP-Accel Host-Header benutzen? Administrative Options Dieses Formular übernimmt die Administration Ihres Proxys. Das heißt, Sie können durch die hier verfassten Einstellungen Ihren Proxyserver konfigurieren (Abbildung 7.151). Folgende Parameter können gesetzt werden: Unix-Benutzer Unix-Gruppe Proxy-Authentifizierungs-Umgebung Cache-Manager-E-Mail-Adresse Angezeigter Host-Name Eindeutiger Host-Name Cache-Bekanntmachungs-Host Cache-Bekanntmachungs-Anschluss Cache-Bekanntmachungs-Datei Bekanntmachungs-Intervall Sandini Bib 470 7 Remoteadministration Abbildung 7.150 Miscellaneous Options Abbildung 7.151 Administrative Options Sandini Bib 7.1 Webmin 471 Clear and Rebuild Cache Um den Cache zu leeren und neu aufzubauen, müssen Sie den dafür vorgesehenen Button in dieser Maske (Abbildung 7.152) drücken. Abbildung 7.152 Clear Cache WU-FTP-Server Der letzte FTP-Server, den wir in unserer Webminreihe besprechen, ist der WUFTP-Server. Ob und wie Sie ihn auf Grund des aktuellen Sicherheitsrisikos einsetzen, bleibt Ihnen überlassen. Falls Sie sich aber nicht ganz sicher sind, sollten Sie jedoch einen anderen FTP-Server vorziehen. Dieses Webmin-Modul bietet Ihnen die Möglichkeit Ihren FTP-Server durch neun verschiedene Menüpunkte zu konfigurieren. Dabei wird (fast) das komplette Konfigurationsspektrum abgedeckt, das heißt, dass normalerweise die volle Konfiguration über das Netz vorgenommen werden kann. Abbildung 7.153 zeigt die Startseite der WU-FTP-Serverkonfiguration. Sandini Bib 472 7 Remoteadministration Abbildung 7.153 WU-FTP-Server Users and Classes In dieser Maske (Abbildung 7.154) können Sie bestimmte Benutzerklassen definieren und die Standardeinstellungen zu den FTP-Benutzern abändern. Folgende Werte können gesetzt werden: Unix-Benutzer und UIDs, die als Gäste behandelt werden sollen Unix-Gruppen und GIDs, die als Gäste behandelt werden sollen Unix-Benutzer und UIDs, die nicht als Gäste behandelt werden sollen Unix-Gruppen und GIDs, die nicht als Gäste behandelt werden sollen Unix-Benutzer, denen der Zugriff verweigert werden soll (von /etc/ftpusers) Unix-Benutzer und UIDs, denen der Zugriff verweigert werden soll Unix-Gruppen und GIDs, denen der Zugriff verweigert werden soll Unix-Benutzer und UIDs, denen der Zugriff nicht verweigert werden soll Unix-Gruppen und GIDs, denen der Zugriff nicht verweigert werden soll Messages and Banners Manchmal kann es durchaus sinnvoll sein, die FTP-Meldungen, Banner und ReadMe-Dateien abzuändern, so dass diese entweder der Sicherheitspolicy entsprechen oder auf Ihr System zugeschnitten sind. Sandini Bib 7.1 Webmin 473 Abbildung 7.154 Users and Classes Diese Maske ermöglicht Ihnen dies zum Beispiel durch das Setzen bestimmten Grußlevel, Banner vor der Anmeldung, Hostnamen für Meldungen und so weiter (Abbildung 7.155). Außerdem können Sie hier die E-Mail-Adresse des FTP-Besitzers abändern. Limits and Access Control In diesem Formular (Abbildung 7.156) können Sie folgende Grenzwerte definieren: Zugriffsverweigerung von bestimmten Adressen Grenzwerte gleichzeitiger Benutzer Datei- und Transfergrenzwerte Dateizugriffsverweigerung Zugriff auf zugriffsverweigerte Dateien Grenzwerte für anonyme Sitzungen Maximale Anzahl von fehlgeschlagenen Anmeldeversuchen Sandini Bib 474 7 Remoteadministration Abbildung 7.155 Messages and Banners Abbildung 7.156 Limits and Access Control Sandini Bib 7.1 Webmin 475 Networking Hier können Sie diese drei Netzwerkgrundeinstellungen definieren (Abbildung 7.157): TCP-Fenstergrößen Adressen für PASV-Verbindungen Anschlüsse für PASV-Verbindungen Abbildung 7.157 Networking Logging Sie können diesem Formular die (wenigen) Protokollierungsparameter für Ihren WU-FTP-Server übergeben (Abbildung 7.158): Für bestimmte User alle Befehle protokollieren Für bestimmte User alle Transfers protokollieren Wohin sollen Transfers protokolliert werden? Für bestimmte User Sicherheitsverletzungen protokollieren Sandini Bib 476 7 Remoteadministration Abbildung 7.158 Logging Aliases and Paths Hier können Sie bestimmte Aliase anlegen, welche wiederum auf bestimmte Verzeichnisse »zeigen«. Außerdem können Sie den Verzeichnissuchpfad definieren (Abbildung 7.159). Anonymous FTP Wenn Sie einen anonymen FTP-Zugang erlauben wollen, können Sie hier die folgenden Werte definieren, um diesen Zugang zu konfigurieren (Abbildung 7.160): Root-Verzeichnis für anonymes FTP Gast-Root-Verzeichnis Unix-Gruppen für anonyme Benutzer W Kennwortüberprüfung für anonymes FTP Kennwörter für anonymes FTP, die verweigert werden sollen Permissions In diesen Einstellungen (Abbildung 7.161) können Sie bezüglich Zugriffsrechten bestimmte Befehle einschränken oder sperren. Des Weiteren ist es möglich, den Upload bestimmter Dateinamen zu unterbinden (z.B. /etc/shadow). Sandini Bib 7.1 Webmin 477 Abbildung 7.159 Aliases and Paths Abbildung 7.160 Anonymous FTP Sandini Bib 478 7 Remoteadministration Abbildung 7.161 Permissions Miscellaneous Options Auch hier sind die Parameter, die in keine Rubrik eingeordnet werden konnten, in einem eingenen Unterpunkt zusammengefasst (Abbildung 7.162): Langer Listing-Befehl Kurzer Listing-Befehl Normaler Listing-Befehl Shutdown-Benachrichtigungsdatei Serviceprozess-Nicelevel Standard-Umask für hochgeladene Dateien Sandini Bib 7.1 Webmin 479 Abbildung 7.162 Miscellaneous Options 7.1.6 Hardware Neben Ihrer Software ist es auch möglich, die wichtigsten Hardwarebestandteile Ihres Rechners mit Webmin zu konfigurieren. Wir werden im Folgenden kurz auf die einzelnen Menüpunkte eingehen, so dass Sie keine Probleme bei der Umsetzung haben sollten. CD Burner Wie Sie in Abbildung 7.163 erkennen können, können Sie in dieser Maske neue Brennprofile anlegen oder die bereits vorhandenen konfigurieren. Linux Bootup Configuration Hier können Sie vorhandene Bootkonfigurationen (Kernel mit oder ohne bestimmten Optionen) einsehen und konfigurieren. Sie können auch neue Bootsequenzen hinzufügen (Abbildung 7.164). Sandini Bib 480 7 Remoteadministration Abbildung 7.163 CD Burner Abbildung 7.164 Linux Bootup Configuration Sandini Bib 7.1 Webmin 481 Dabei müssen folgende Werte übergeben und gegebenenfalls gesetzt werden: Name Zu bootender Kernel Kernel-Parameter Root-Gerät Anfängliche RAM-Disk-Datei Root-Mount-Modus VGA-Textmodus Benutzer-Kernel-Optionen merken? Sollen Kernel, die nicht existieren, übersprungen werden? Boot-Kennwort Kennwort benötigt für... Wenn Sie jedoch eine neue Bootpartition erstellen wollen, sind folgende Angaben zu treffen: Name Zu bootende Partition Übergebe die Partitionstabelle an das Betriebsystem Boot-Kennwort Linux RAID Um neue RAID-Geräte hinzuzufügen oder die bereits vorhandenen zu konfigurieren, können Sie diese Maske benutzen (Abbildung 7.165). Es stehen Ihnen folgende RAID Level zur Verfügung: Zusammengefügt (Linear) Striped (RAID0) Gespiegelt (RAID1) Parität (RAID4) Redundant (RAID5) Network Configuration Die Konfiguration Ihres Netzwerks ist in vier Teile aufgesplittet (Abbildung 7.166). Der erste Teil »Netzwerkschnittstellen« (Abbildung 7.167) befasst sich mit den folgenden Punkten: zurzeit aktive Schnittstellen beim Booten geladene Schnittstellen Hinzufügen neuer Schnittstellen Sandini Bib 482 7 Remoteadministration Abbildung 7.165 Linux RAID Abbildung 7.166 Networking Configuration Sandini Bib 7.1 Webmin 483 Abbildung 7.167 Netzwerkschnittstellen Die zweite Registerkarte (Abbildung 7.168) beschäftigt sich mit den Routingeinstellungen, die zur Bootzeit aktiviert werden, und erlaubt es Ihnen, die folgenden Konfigurationen vorzunehmen: Soll als Router gearbeitet werden? Was ist der Standardrouter? Was sind die lokalen Routen? Was sind die statischen Routen? Um Ihren DNS Client zu konfigurieren, müssen Sie die dritte Registerkarte (Abbildung 7.169) aufrufen, welche die folgenden Felder für die Konfiguration Ihrer DNS Client-Optionen bereitstellt: Hostname DNS Server Auflösungsreihenfolge Suchdomänen Sandini Bib 484 7 Remoteadministration Abbildung 7.168 Routing und Gateways Abbildung 7.169 DNS Client Sandini Bib 7.1 Webmin 485 Der letzte Menüpunkt befasst sich mit den vorhandenen IP-Adressen und den dazugehörigen Hostnamen. Sie können an dieser Stelle neue Hosts hinzufügen und ihnen eine IP-Adresse zuweisen (Sie können einer IP-Adresse dabei auch mehrere Hostnamen zuteilen). Die Einstellungen in dieser Maske werden aus der Konfigurationsdatei /etc/hosts entnommen und hinzugefügt. Dieses Formular ist in Abbildung 7.170 zu sehen. Abbildung 7.170 Hostnamen Partitions on Local Disks Wenn Sie diesen Menüpunkt aufrufen, bedient sich Webmin des Programms fdisk und stellt Ihnen somit einen mächtigen, webfähigen Festplattenmanager zur Verfügung, der Ihnen Informationen über Ihre Festplatten, die genutzten Partitionen und den Speicherplatz auf den einzelnen Partitionen liefert. Des Weiteren ist es möglich, sowohl primäre als auch erweiterte Partitionen hinzuzufügen (Abbildung 7.171). Sandini Bib 486 7 Remoteadministration Abbildung 7.171 Partitionsmanager Printer Administration Die von Webmin zur Verfügung gestellte Druckerverwaltung (Abbildung 7.172) zeigt Ihnen beim Aufruf alle installierten Drucker auf und gibt Ihnen die Möglichkeit diese Drucker zu konfigurieren oder neue hinzuzufügen. Drucker hinzufügen Wenn Sie sich dazu entschieden haben, einen neuen Drucker hinzuzufügen, müssen Sie folgende Informationen spezifizieren, um den Drucker einrichten zu können: Name Akzeptiert Anfragen? Beschreibung Drucken aktiviert? Drucke Banner? Maximale Größe eines Druckauftrags Alternative Druckernamen Schnittstelle (seriell, USB etc.) Lokale Datei Sandini Bib 7.1 Webmin 487 Entfernter-Unix-Server und dazugehöriger Drucker Entfernter-Windows-Server und dazugehöriger Drucker Benutzer Kennwort Arbeitsgruppe für die Windowsumgebung Test, ob entfernter Server aktiv ist? Soll ein Druckertreiber verwendet werden (nicht notwendig bei Text- und PostScript-Druckern) APSfilter-Treiber Druckertyp Auflösung in DPI Papiergröße Handelt es sich um einen Farbdrucker? Filtermethode? Außerdem können Sie die Warteschlange beenden. Abbildung 7.172 Printer Administration Sandini Bib 488 7 Remoteadministration System Time Wenn Sie die Systemzeit oder die Hardwarezeit ändern wollen, können Sie das in dieser Maske machen. Außerdem können Sie hier einen eigenen Zeitserver definieren und die Zeit mit diesem Server synchronisieren (Abbildung 7.173). Abbildung 7.173 System Time 7.1.7 Cluster Wenn Sie diese Seite das erste Mal aufrufen, werden Sie darauf aufmerksam gemacht, dass noch kein Webmin-Server für das Softwaremanagement registriert wurde, und Sie müssen einen Server dafür bereitstellen (Abbildung 7.174). Danach wird dieser Server mit allen Paketen, die bereits installiert sind, hinzugefügt. Alle weiteren Aufrufe dieser Seite bringen nun eine andere Maske, welche Ihnen die »Managed Server« Liste zeigt, Ihnen die Möglichkeit gibt nach bestimmten Paketen zu suchen und diese zu konfigurieren oder sogar neue Pakete hinzuzufügen. Siehe Abbildung 7.175. Sandini Bib 7.1 Webmin 489 Abbildung 7.174 Cluster Software Packages (1. Aufruf) Cluster Users and Groups Auch hier spielt sich dasselbe Szenario wie bei den Softwarepaketen ab. Sie müssen zuerst einen Server für das Usermanagement registrieren, bevor Sie mit der Arbeit beginnen können. Nachdem Sie einen Server registriert haben, können Sie ab sofort über diese Maske Ihre Cluster User und Gruppen verwalten. Folgende Funktionen stehen Ihnen dabei zur Verfügung: User mit bestimmten Merkmalen finden Gruppen mit bestimmten Merkmalen finden User und Gruppen hinzufügen Synchronisation Heartbeat-Monitor Da kein Linuxhochverfügbarkeitssystem ohne einen Heartbeat-Monitor laufen sollte, ist dieses Webmin-Modul sehr wichtig und sollte dementsprechend auch genutzt werden (Abbildung 7.177). Sandini Bib 490 7 Remoteadministration Abbildung 7.175 Cluster Software Packages (weitere Aufrufe) Dieses Formular ist in drei Unterpunkte unterteilt, die wir im Folgenden kurz ansprechen werden. Configuration Options Hier können Sie die folgenden Konfigurationsoptionen für Ihr Heartbeat-System definieren (Abbildung 7.178): Serieller Port Baudrate für den seriellen Port Ethernetdevice Zeitintervalle zwischen den einzelnen Heartbeats Watchdogdevicedatei Hosts im Cluster Logdatei Syslog Logging Facility UDP Heartbeatport Zeit, bis ein Knoten als »tot« betrachtet wird Sandini Bib 7.1 Webmin 491 Abbildung 7.176 Cluster Users and Groups Abbildung 7.177 Heartbeat-Monitor Sandini Bib 492 7 Remoteadministration Abbildung 7.178 Configuration Options Cluster Resources Wenn Sie noch keine Clusterressourcen für Ihr System definiert haben, können Sie das an dieser Stelle machen (Abbildung 7.179). Dabei müssen Sie folgende Werte übergeben: Primärer Knoten (Rechner) für die Ressource IP Adressen dafür Dienste dafür Authentication Keys Hier können Sie den Authentifizierungsmodus für die Knoten spezifizieren (Abbildung 7.180). Sie haben dabei die Auswahl aus folgenden Algorithmen: CRC SHA1 MD5 7.1.8 Others Die letzte Registerkarte, die Ihnen unter Webmin zur Verfügung steht, behandelt die zum Großteil »Befehlsoperationen«, die es Ihnen ermöglichen, Ihre Befehle Sandini Bib 7.1 Webmin 493 Abbildung 7.179 Cluster Ressourcen hinzufügen Abbildung 7.180 Authentication Keys Sandini Bib 494 7 Remoteadministration wie gewohnt anstatt über die Konsole über Webmin an Ihr Betriebssystem zu übergeben (Abbildung 7.181). Abbildung 7.181 Others Startbildschirm Command Shell Um einen Befehl an die Konsole weiterzuleiten, können Sie diesen Menüpunkt benutzen, der es Ihnen erlaubt, jeden Unixbefehl über Webmin zu realisieren (Falls Sie dieses Feature nützen wollen, sollten Sie unbedingt SSL aktivieren.). Einen Screenshot zeigt Abbildung 7.182. Wie Sie im folgenden Listing erkennen können, sind auch die Ausgaben von Webmin äquivalent zur Shell: > ps ax | egrep webmin 981 ? S 0:03 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1389 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1584 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf Sandini Bib 7.1 Webmin 495 1585 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1589 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1594 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1595 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1596 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1597 ? S 0:00 /usr/bin/perl /usr/libexec/webmin/ miniserv.pl /etc/webmin/miniserv.conf 1601 ? S 0:03 /usr/libexec/webmin/shell/index.cgi 1604 ? S 0:00 sh -c (ps ax | egrep webmin) 2>&1 1605 ? S 0:00 sh -c (ps ax | egrep webmin) 2>&1 1607 ? S 0:00 egrep webmin Abbildung 7.182 Command Shell Sandini Bib 496 7 Remoteadministration Custom Commands Sie haben hier die Möglichkeit, benutzerdefinierte Befehle oder Dateieditoren anzulegen oder zu verwalten. Dies kann bei langen Befehlsketten (zum Beispiel bei einem Backup über die Konsole mit cpio etc.) sehr hilfreich sein, da Sie diesen Befehl dann durch einen einfach »Klick« übergeben können. Befehl hinzufügen oder editieren Wenn Sie einen neuen Befehl hinzufügen oder verwalten wollen, müssen Sie folgende Felder ausfüllen (Abbildung 7.183): Beschreibung des Befehls (Der Inhalt dieses Feldes wird gleichzeitig der Titel des Buttons, über den Sie den Befehl aufrufen werden.) Befehl User, unter dem der Befehl ausgeführt werden soll (Webmin bedient sich dazu des in Kapitel 6 besprochenen Tools »sudo«). Soll die Ausgabe in das HTML-Format umgewandelt werden? Wann soll der Befehl erscheinen (Anordnung)? Parameter Parametertyp Abbildung 7.183 Custom Commands Sandini Bib 7.1 Webmin 497 Dateieditor hinzufügen oder editieren Falls Sie des Öfteren Änderungen an bestimmten Dateien vorzunehmen haben, können Sie dies ebenfalls über Webmin beschleunigen. Sie haben hier die Möglichkeit einen Button anzulegen, der bei Aufruf die entsprechend vorher definierte Datei in den Editor lädt, wo Sie ihn bequem bearbeiten können. Um einen solchen »Schnellzugriff auf Dateien« zu realisieren, müssen Sie folgende Felder ausfüllen: Beschreibung (Der Inhalt dieses Feldes wird gleichzeitig der Titel des Buttons über den Sie den Befehl aufrufen werden.) Datei, die bearbeitet werden soll Eigentümer Zugriffsrechte Befehl, der vor dem Speichern ausgeführt werden soll (optional) Befehl, der nach dem Speichern ausgeführt werden soll (optional) Anordnung File Manager Hinter diesem Menüpunkt verbirgt sich ein mächtiges Java-Applet, das als eine Art Mischung zwischen Dateibrowser, Uploadmanager und Editor fungiert (Abbildung 7.184). Sie können mit diesem Filemanager durch Ihr gesamtes Dateisystem browsen, bestimmte Dateien uploaden oder verändern, nach Dateien suchen, Dateien löschen oder umbenennen und noch vieles mehr. Perl Modules Wenn Sie ein neues Perl-Modul installieren und kompilieren wollen, können Sie dies hier unter Angabe der Quelle machen (Abbildung 7.185). Es sind u.a. folgenden Quellen möglich: CPAN Lokale Datei Heraufgeladene Datei FTP Adresse HTTP Adresse SSH/Telnet Login Wenn Sie eine Telnet- oder SSH-Sitzung über Ihren Browser aufbauen wollen (falls Sie zum Beispiel an einem Thin-Client sitzen und nur Webzugriff initialisieren können), können Sie das mit diesem Formular erledigen (Abbildung 7.186). Sandini Bib 498 7 Remoteadministration Abbildung 7.184 File Manager Abbildung 7.185 Perl Modules Sandini Bib 7.1 Webmin 499 Beachten Sie dabei aber bitte, dass Telnetsitzungen nicht verschlüsselt werden und somit nicht sicher sind. Benutzen Sie ausschließlich SSH, um über ein unsicheres Netzwerk (wie das Internet) mit Ihrem Server zu kommunizieren. Abbildung 7.186 SSH/Telnet Login System and Server Status Wenn Sie den Status Ihres Systems oder der einzelnen Dienste darauf bequem und einfach über das Web überprüfen, wollen, können Sie das mit diesem Formular erreichen. Wie Sie in Abbildung 7.187 sehen können, haben Sie die Möglichkeit bestimmte Dienste bei der Überwachung ein- bzw. auszuschließen. Außerdem können Sie eine zeitgesteuerte Überwachung einrichten. Dienst in die Überwachung aufnehmen Um einen neuen Dienst in die Überwachung mit aufzunehmen müssen Sie folgende Felder ausfüllen: Beschreibung (meistens schon vorgegeben durch das Pulldownmenü, welches Ihnen die verschiedenen zu überwachenden Dienste vorgibt) Rechner, auf dem der Dienst gestartet wird Programm, das gestartet werden soll, wenn der Prozess beendet wird Programm, das gestartet werden soll, wenn der Prozess gestartet wird Dienstabhängige Angaben Sandini Bib 500 7 Remoteadministration Abbildung 7.187 System and Server Status Zeitgesteuerte Überwachung einrichten Um zeitgesteuerte Überwachung einzurichten, müssen Sie folgende Angaben spezifizieren: Soll die zeitgesteuerte Überwachung aktiviert werden? In welchen Intervallen soll überprüft werden? Wann (unter welchen Voraussetzungen) soll eine E-Mail versendet werden? An wen soll der Statusbericht gemailt werden? Absenderadresse der E-Mail Soll der Statusbericht auch einen Pager gehen, wenn ja, an welche Nummer? Soll pro Dienst eine E-Mail verschickt werden? 7.1.9 Fazit Wie Sie sehen, können Sie mit Webmin Ihr komplettes System bequem und weniger fehleranfällig konfigurieren, ohne dabei Abstriche bei der Sicherheit machen zu müssen. Auch die Konfiguration mehrerer oder sogar verteilter Systeme ist für dieses Programm kein Hindernis, sondern eher ein Feature. Ich könnte jetzt seitenweise über die Vorteile von Webmin sprechen, aber ich denke, Sie werden selbst darauf kommen und für sich persönlich die richtige Entscheidung treffen. Sandini Bib Stichwortverzeichnis Symbols ! 303 && 213 --allow-non-selfsigned-uid 259 --always-trust 254 --armor 253 --batch 254 --charset 255 --check-sigs 248 --cipher-algo 257 --clearsign 247 --comment 256 --completes-needed 257 --compress-algo 258 --debug 256 --decrypt 248 --default-comment 256 --default-key 253 --default-recipient 253 --default-recipient-self 253 --delete-key 251 --delete-secret-and-public-key 251 --delete-secret-key 251 --detach-sign 247 --digest-algo 257 --disable-cipher-algo 258 --disable-pubkey-algo 258 --dry-run 254 --edit-key 248 --emit-version 256 --encrypt 247 --encrypt-to 253 --escape-from-lines 258 --export 251, 252 --export-all 251 --export-secret-keys 251 --export-secret-subkeys 251 --fast-import 252 --fast-list-mode 260 --fingerprint 248 --force-mdc 259 --force-v3-sigs 259 --gen-key 248 --gen-prime 252 --gen-random 252 --gen-revoke 251 --help 252 --homedir 255 --honor-http-proxy 254 --ignore-time-conflict 259 --import 251 --import-ownertrust 252 --interactive 254 --keyring 255 --keyserver 254 --list-keys 248 --list-only 260 --list-packets 248 --list-public-keys 248 --list-secret-keys 248 --list-sigs 248 --load-extension 256 --local-user 253 --lock-multiple 259 --lock-never 259 --lock-once 259 --logger-fd 256 --lsign-key 250 --marginals-needed 257 --max-cert-depth 257 --no 254 --no-armor 260 --no-auto-key-retrieve 254 --no-batch 254 --no-comment 256 --no-default-keyring 260 --no-default-recipient 253 --no-encrypt-to 253 --no-greeting 259 --no-options 255 --no-random-seed-file 259 --no-secmem-warning 259 --no-tty 254 --no-utf8-strings 255 --no-verbose 259 --no-version 256 --not-dash-escaped 258 --notation-data 256 --openpgp 259 --optionsfile 255 --output 253 --passphrase-fd 258 --print-md 252 --quiet 253 --recipient 253 --recv-keys 252 Sandini Bib 502 --rfc1991 258 --s2k-cipher-algo 257 --s2k-digest-algo 257 --s2k-mode 257 --secret-keyring 255 --send-keys 251 --sign 247 --sign-key 250 --skip-verify 260 --status-fd 256 --store 248 --symmetric 247 --textmode 254 --throw-keyid 258 --trusted-key 251 --use-embedded-filename 257 --utf8-strings 255 --verbose 253 --verify 248 --verify-files 248 --version 252 --warranty 252 --with-colons 260 --with-fingerprint 260 --with-key-data 260 --yes 254 @@define 213, 224 @@else 213 @@endif 213 @@ifdef Variable 213 @@ifhost hostname 213 @@ifndef Variable 213 @@ifnhost hostname 213 @@include 213 @@undef 213 || 213 Numerics 13. Oketett 141 A Academic-Source-Release 205 Access timestamp 209 Ack 21, 25 ACK-Scan 152 ACL 462, 467 Actions Log 329 Activity mode 80 Add User 118 addkey 242 adduid 242 Stichwortverzeichnis AFS 146, 288 AFSTokenPassing 266, 286 Alarmsystem 158 Alert_fast 38 Alert_full 38 Alert_smb 39 Alert_syslog 37 Alert_unisock 39 Algorithmus 210, 231 AllowGroups 266 AllowTcpForwarding 266 AllowUsers 266 Alternative Datenbank 223 Alternative Konfigurationsdatei 224 always_set_home 312 Anzeigefilter 70 Apache Webserver 368 Appletalk 146 APSfilter 487 Archivbit 445 ask 290 ASR 205, 211 Attack-Signature-Scanner 205 Ausführungsmodi 209 Auswahlmasken 212, 216 authenticate 312 Authentication 339 Authentifizierungsoptionen 339 Authentifizierungspaar 260 B badpass_message 315 Banner 266 BatchMode 286 Befehl ausführen 358 Benutzbarkeit 149 Benutzerzugriff regeln 360 Beweissicherung 206 Binär zu dezimal 141 Binärwerte 141 Bind 387, 390 BOOTP 401, 402, 403 Bootpartition 481 Bootup 351 Bootup Configuration 479 Brute-Force 339 Bufferoverflow 188 Byte count 59 Sandini Bib Stichwortverzeichnis C C-Shell 127 CA 344 CAP_CHOWN 11 CAP_DAC_READ_SEARCH 11 CAP_DEC_OVERRIDE 11 CAP_FOWNER 11 CAP_FSETID 11 CAP_KILL 11 CAP_SETGID 11 Capabilities 10 CarriageReturn 189 cd 302 CD Burner 479 CERT 40 Certificate Authority 344 CGI 325, 373, 384, 386 CGI-Angriffe 14 CGI-Dateien 176 ChallengeResponseAuthentication 267, 290 Change Passwords 352 check 242 CheckHostIP 286 CheckMail 267 Checksumme 52 chgrp 302 Chiffren 262 chmod 302 chown 302 Chroot 420, 427 Cipher 267, 286 Classtype 21 classtype 29 ClientAliveCountMax 267 ClientAliveInterval 267 Cluster 488 Heartbeat-Monitor 489 Users and Groups 489 Cluster Users and Groups 489 Code Bits 139 Color 79 Command Shell 494 Compression 286 CompressionLevel 287 ConnectionAttempts 287 Content 21, 24 Content_list 21 Copyright 192 cpio 496 crack 202 cracklib 202 crap() 188 503 CRC 492 CRC-16 211 CRC-32 211 Cronjobs 326, 358, 360 CSV 44 Custom Commands 496 CWR 141 D Data Link Header 68 Data Rcvd 97 Data Sent 103 Database 43 Datei entschlüsseln 244 Dateien verschlüsseln 243 Dateiformat 176 Dateimodus 145 Datenaustausch 261 Datenübertragung 51 Datenzone 209 DDP 146 Debugmodus 264 DECNET 128 Defrag 33 delkey 242 delsig 242 deluid 242 Denial-of-Service 153 DenyGroups 267 DenyUser 267 Depth 21 depth 24 Detailed Interface Statistics 65 DHCP Server 400 diff 238, 244 disable 242 Disk Quotas 354 DISPLAY 291 display() 171 Displayfilter 52 Displaynummer 273 DNS 313, 466 DNS Spoofing 286 Documentation 362 DoS 153 Druckerwarteschlangen 326 Dsize 21 dsize 23 dump_ip_packet() 179 Durchschnittliche Bandbreite 107 –Dvar 224 Sandini Bib 504 E EBNF 308 ECE 141 Echtheitsbestätigung 429 Edit Categories 341 editor 316 egrep() 187 Empfänger 243 enable 242 ENV 276, 280, 314 env_check 317 env_delete 318 env_editor 313 env_keep 318 env_reset 314 ereg() 186 Erreichbarkeit 50 Error-Code 382 Erscheinungbild 342 Escape Character 281 EscapeChar 287 ESP/AH 122 Eugene Spafford 205 exempt_group 317 Exit 302 expire 242 Exportmöglichkeiten 238 EXT2 208 Extended Backus Naur Form 308 F FallBackToRsh 287 FDDI 125 Fehlersuche 179 Fetchmail 403, 404 File Descriptor 224 File Manager 497 Filesystem Integrity Checker 205 Filesystems 354 Fingerabdruck 240 Firewall 231, 334 Firewallregeln auslesen 152 Flags 21, 25 Flow 86 For-Schleife 170 forge_icmp_packet() 182 forge_igmp_packet() 183 forge_ip_packet() 178 forge_tcp_packet() 180 forge_udp_packet() 181 ForwardArgent 287 Stichwortverzeichnis Forwardingtool 273 ForwardX11 287 fpr 242 FQDN 464 fqdn 313 Frag2 33 Fragbits 21, 23 FTP 261, 476 FTP-Bounce-Attack 153 FTP-Meldungen 472 ftp_get_pasv_port() 175 ftp_log_in() 175 G GatewayPorts 268, 287 Gateways 51 Gene Kim 205 General Interface Statistics 64 Gerätetreibernummer 210 Gericht 206 Gespiegelt 481 get 302 get_host_ip() 177 get_host_name() 177 get_host_open_port() 177 get_icmp_element() 183 get_igmp_element() 183 get_ip_element() 179 get_port_state() 177, 190 get_tcp_element() 181 get_udp_elements() 182 getrpcport() 177 Globale Konfiguration (ProFTPD) 418 GlobalKnownHostsFile 287 GlobalKnownHostsFile2 287 GNUPGP 233 GPG 231, 232, 234, 241 Aufruf 247 Befehle 241, 247 Benutzer-ID 236 Datei entschlüsseln 244 Dateien verschlüsseln 243 Installation 232 Optionen 252 Optionsdatei 252 Schlüsselpaar erzeugen 234 Signatur prüfen 246 Signieren 242, 244 Verschlüsseln und Signieren 246 Sandini Bib Stichwortverzeichnis GPGME 231 Grenzwerte 370 grep 155 Gruppenbeschränkung 267 H Handshake 139 Hardlinks 209, 212 Hardware 479 Bootup Configuration 479 CD Burner 479 Network Configuration 481 Partitions on Local Disks 485 Printer Administration 486 RAID 481 System Time 488 Hashed 231 Haval 211 Heartbeat-Monitor 489 HELO 414 Help 302 help 242 Hiddenbit 445 Hilfesystem 326 Hintergrund 282 Hochverfügbarkeitssystem 489 HOME 291 Hops 51 Host 286 Hostaliase 313 HostbasedAuthentication 268, 287 HostKey 262, 263, 268 HostKeyAlgorithms 288 HostKeyAlias 288 HostName 288 Hostschlüssel 263, 278, 286, 290, 295 HTTP Decode 32 I ICMP 62 ICMP destination unreachable 151 ICMP port-unreachable 151 icmp_id 26 Icmp_ip 21 Icmp_seq 21 icmp_seq 26 Icode 21 icode 26 Id 21 id 22 IdentityFile 288 505 IDS hostbasierend 1 LIDS 1 ignore 223 ignore_dot 311 IgnoreRhosts 268 IgnoreUserKnownHosts 268 Includes 168 Index Page Options 337 inetd 154, 265 Initialisierung 224 Initprozesse 360 Inkonsistenz 217 Inkrement 170 Inodenummer 209 insults 313, 315 Integrität 205 Integritätstest 216, 217, 220, 226 Intrusion Detection Systems 1 IP Access Control 330 IP Traffic-Monitor Counts 58 IP-Protocol-Scan 152 IP-Protos 116 Ip_proto 22 ip_proto 31 Ipoption 21 IPTraf 52 Anzeigefilter 70 Basics 55 Counts 55 Farbcode 61 Filterdefinition 73 Funktionsumfang 52 Hintergrund 82 Host-Statistiken 81 Installation 53 Managementsystem 70 Netzwerkinterfaces 57 Protokollarten 76 Protokolle 53 Schnittstellen 53 Sortieren 60 TCP-Einträge 67 USR1 79 is_cgi_installed() 176 ISO-Datagramm 132 Itype 21, 26 Sandini Bib 506 J Jabber 406 Jabber IM Server 406 john the ripper 202 K KDC 269 KeepAlive 268, 288 Keepalive 267, 269, 288, 437 Kerberos 269, 288 KerberosAuthentication 269, 288 KerberosOrLocalPassword 269 KerberosTgtPassing 269, 288 KerberosTicketCleanup 269 Key 242 KeyRegenerationInterval 269 keyring 251 Klone 334 Kompressionslevel 254 Konfigurationsaufwand 206 L LAN Station Statistics 68 LAN Statistik 52 Language 336 Last Line of Defense 1 Lauschangriff 121 lcd 302 LDAP 422 lecture 312 LFS 12 libpcap 15 LIDS 1 Append Only 3 Capabilities 10 Dateien 2 Dateisysteme 2 deaktivieren 12 Exception 3 Filesystem 1 Inodes 2 Installation 3 Interaktion 2 Kernel konfigurieren 5 Kerneloptionen 5 Konfiguration 7 lidsadm 7 Passwort 12 Protection Mounting 3 Read Only 3 System anpassen 12 Worst Case 13 Stichwortverzeichnis LIDS Free Session 12 LIDS-Passwort 5 lidsadm Befehlsübersicht 7 Lilo 13 Linear 481 list 242 ListenAddress 269 Listkommandos 260 listpw 317 lls 302 lmkdir 303 ln 303 LocalForward 288 Log Null 46 log_host 312 Log_tcpdump 39 log_year 312 logfile 316 Logging 79, 333 Loginberechtigung 266 LoginGraceTime 269 LogLevel 270, 289 loglinelen 314 LOGNAME 291 Logs 363 Logto 21, 22 long_otp_prompt 311 loosedir 223 Lpwd 303 ls 303 lsign 242 lumask 303 M Mac-Adresse 68 MACs 270, 289 MAIL 291 mail_always 311 mail_badpass 311 mail_no_host 311 mail_no_perms 312 mail_no_user 311 mailerflags 316 mailerpath 316 mailsub 315 mailto 316 Mantra 236, 242 manuelle Überprüfung 216 Masterzone 387, 389, 396, 397, 398, 399 MaxStartups 270 MD2 211 Sandini Bib Stichwortverzeichnis MD4 211 MD5 205, 210, 226, 492 MD5Sum 230 Aufruf 230 Optionen 230 MIB 122 Minfrag 32 mkdir 303 Msg 21 msg 22 MTU 66 Multicaststatistiken 106 Mustervergleiche 186, 187 MySQL Database Server 406 N Nachrichtenverschlüsselung 205 Namesauflösung 163 NASL 161, 166 Nasl Operatoren 171 Skriptfamilie 192 Skriptkategorie 192 NBP 147 Nessus 161 Attack Scripting Language 166 Authentication Method 163 Benutzer anlegen 163 Konfiguration 165 Konfigurationsdatei 165 rule set 164 Nessus-Server 163 NETBIOS 39 netgroups 280 Network Configuration 481 Network Intrusion Detection System 13 Netzwerkplan 50 Netzwerkscanner 149 Netzwerkschnittstellen 64 Netzwerktool 49 Netzwerküberwachungssystem 158 Neuen CronJob erstellen 359 NewLine 189 NFS 326, 354 NFS Exports 354 NFS-Verzeichnisse 354 NIDS 13 NIS Client 356 NIS-Server 356 NMap 84, 149 Optionen 153 507 Nocase 21 nocase 25 Non Anonymous Funktion 168 NOPASSWD 319 NTop 83 DBPATH 85 Domain 99 Filterregeln 83 Format 86 HTTPS 85 interaktiv 83 Netzwerkschnittstellen 91 Optionen 83 Zusatzprogramme 89 Null-Scan 151 NumberOfPasswordPrompts 289 O Öffentlicher Schlüssel 231 Offset 21 offset 24 open_sock_tcp() 175 open_sock_udp() 173, 174 OpenSSH 260 Installation 261 Operating System 336 Operatoren 171, 180, 185 OPIE 311 OS-Detection 149 OSPF-Protokoll 63 Others 492 Command Shell 494 Custom Commands 496 File Manager 497 Perl Modules 497 SSH/Telnet Login 497 Status 499 Outgoing Domains 456 Output-Module 37 Ownership 272 Ownertrust 242, 250, 252 P Packet count 59 Paket Matching 121 Paketdatenbank 120 Paketdurchsatz 101 Paketgröße 59 Paketlogger 13 Paketsniffer 13 Paketverfolgung 47 Sandini Bib 508 PAM-Authentication 356 PAMAuthenticationViaKbdInt 270 Parität 481 Partitions on Local Disks 485 passprompt 315 PASSWD 319 passwd 242 passwd_timeout 315 passwd_tries 314 PasswordAuthentication 271, 289 Passwortänderung 364, 365 PASV 475 path_info 312 pcap 169 pcap_next() 180, 184 Performance 149, 210 Performanceverlust 235 Perl Modules 497 PermitEmptyPasswords 271 PermitRootLogin 271 PGP 231 PidFile 271 Ping-Scanning 151 Pingdurchlauf 151 Port 271, 289 Port und Adressen 331 Portscan Detector 33 Portscan Ignorehosts 33 Postfix Configuration 407 PPP 326, 406 pref 242 PreferredAuthentications 289 preprocess 227 Preprocessor 32, 213 Preprocessor-Syntax 213 preserve_groups 313 Primitives 125 Printer Administration 486 PrintLastLog 271 PrintMotd 271 Priority 22 ProFTPD Server 418 promiscuous mode 79 Protocol 271, 289 Protokolllistenspezifikation 85 Protokollschichten 130 Providertest 49 Proxy 334, 469 Proxy Server 334 ProxyCommand 289 Prozesse ordnen 358 Stichwortverzeichnis Prozesse suchen 358 Prüfsumme 179 pty 276, 281 PubkeyAuthentication 272, 290 Public Key 231, 275 put 303 Pwd 303 Q Quell Mac-Adresse 59 Quelladresse 59 Quellport 59 quit 241, 303 Quotasystem 354 R RAID 481 Raw Sockets 150 RAW-Paket 121, 178 raw_string() 189 rcp 26, 299 React 21, 28 Reassign Modules 340 recv() 174 recv_line() 174 Redundant 481 Reference 21, 28 Referenz 247, 278 Referenzdatenbank 216 Regex 22, 32 Reinitialisierung 217 remote procedure call 152 Remoteadministration 325 RemoteForward 290 rename 303 Reply-Pakete 151 requiretty 313 Resp 21 resp 27 return() 173 Rev 21 Reverse Ident Scanning 154 ReverseMappingCheck 272 revkey 242 revsig 242 Rhostsauthentication 290 RhostsRSAAuthentication 272 rm 303 rmdir 303 root_sudo 312 rootpw 313 Sandini Bib Stichwortverzeichnis RPC 405 Rpc 21 RPC Call 145 RPC-Scan 152 RSAAuthentication 272, 290 RST 150 Rüstungsgut 232 runas_default 315 RUNAS_SPEC 319 runaspw 313 Running Processes 357 S Samba 326 Samba Windows File Sharing 435 Sameip 22 sameip 31 sanatize 41 save 241 Scandurchläufe 158, 159, 219, 295 Scanmöglichkeiten 149 Scheduled Commands 358 Scheduled CronJobs 359 Schleifenkörper 170 Schlüssel-ID 251 Schlüsseländerung 235 Schlüsselbund 239, 240, 251 Schlüsselgröße 265 Schlüssellänge 235 Schlüsselpaar 234, 237 Schlüsselserver 238, 251 Schlüsselwörter 266 scp 299 Securityscanner 149 Selection Masks 205 Selection masks 208 send_packet() 180, 183 Sendmail Configuration 450 Seq 21, 25 Server 367 Apache Webserver 368 Server-Authentifizierung 282 ServerKeyBits 272 Serverschlüssel 265 Session 21, 26 Session Key 263 set-filename 256 set-policy-url 256 set_home 312 set_icmp_packet() 182 set_igmp_element() 183 509 Set_ip_elements() 179 set_logname 313 set_udp_elements() 182 SHA 211 SHA1 492 shell_noargs 312 showpref 242 Shutdown 351 Sicherheitsbarrieren 260 Sicherheitskopie 205 Sid 21, 29 siggen 228 sign 242 Signatur prüfen 246 Signaturbestimmung 226 Signaturen 242 Signieren 242, 244 Sitzungsschlüssel 263 Skript Kiddie 155 Skriptfamilie 192 Skriptkategorie 192 Slavezone 387, 397, 399 SMB 14, 15 SMI 122 SMTP VRFY 414 SNAP 132 Snefru 211 snefru 226 Snifferattacken 261 SNMP Trap 45 Snort 13 Alert_fast 38 Alert_full 38 Alert_smb 39 Alert_syslog 37 Alert_unisock 39 Beispiele 18 CSV 44 Database 43 Defrag 33 Detection-Routine 14 Frag2 33 Funktionsweise 13 High-Level_Details 45 HTTP Decode 32 Installation 14 Klassennamen 29 Log Null 46 Log_tcpdump 39 Loggingdatei 38 Minfrag 32 Sandini Bib 510 Optionen 15, 16 Output-Module 37 Portscan 33 Portscan Detector 33 Preprocessors 32 Regeln 18 Regeltypen 46 SNMP Trap 45 snort.conf 35 Stream 34 Stream4 34 Unified 45 XML 39 Zusatzlibs 15 Snortregel Adressen und Ports 20 Bestandteile 18 Entwerfen 18 Formatierung 18 Header 19 Optionen 20 Protokoll 20 Socket 173, 175, 406 Socketfunktionen 173 Sockets 158, 294 Software Packages 360 SOHO 13 Source MAC addrs 80 Sourceforge 207 Spoofingschutz 272 Squid 467 Squid Proxy Server 460 SSH Alle Dateien 278 Authentifizierungsagent 292 Client 281 Schlüssel generieren 296 Umgebungsvariablen 291 Wichtige Dateien 274 SSH Server 429 SSH-ADD 294 ssh-add 293, 295 ssh-agent 261, 292 SSH-Client Aufruf 283 Konfigurationsdatei 285 Optionen 283 Sitzung 281 ssh-keygen 296, 298 ssh-keyscan 295 Stichwortverzeichnis SSH-Server Konfiguration 264, 266 Konfigurationsdatei 266 Schlüsselwörter 266 SSH/Telnet Login 497 SSH_AUTH_SOCK 292 SSH_CLIENT 292 SSH_ORIGINAL_COMMAND 292 SSH_TTY 292 sshd 175 SSL Tunnels 435 SSL-Verschlüsselung 344 Stateless 22 stateless 32 Statistical Breakdown 66 Packet Sizes 66 TCP and UDP Traffic Statistics 66 Status 499 Statusänderung 209 stay_setuid 314 STDERR 264 Stealth FIN-Scan 150 Stream 34 Stream4 34 StrictHostKeyChecking 290 StrictModes 272 strings 168 Striped 481 strlen() 189 strtoint() 189 Subnet-Matrix 111 Subnet-Verwendung 114 Subsystem 272 SuDo 305, 306 Aliase 309 Optionen 323 Superserver 154, 265 Superuser Do 305 SuSE 435 SWAT 449 symlink 303 syslog 316 syslog_babpri 316 syslog_goodpri 315 SyslogFacility 272 System 351 Bootup 351 Change Passwords 352 Disk Quotas 354 Documentation 362 Sandini Bib Stichwortverzeichnis Filesystems 354 Logs 363 NFS Exports 354 NIS Client 356 NIS-Server 356 PAM-Authentication 356 Running Processes 357 Scheduled Commands 358 Scheduled CronJobs 359 Shutdown 351 Software Packages 360 SysV Init Configuration 360 Users and Groups 363 System Time 488 Systembid 445 systemkritische Dateien 216 Systemzustand 205 SysV Init Configuration 360 T Tag 22, 30 targetpw 313 TCP connect()-Scan 150 TCP Flag-Status 59 TCP Header 135 TCP SYN-Scan 150 TCP-Verbindungseintrag 60 TCP-Weiterleitung 282 tcp_ping() 177 TCP_Wrapper 175 Tcpdump 13, 121 Telnet 261 telnet_init() 177 Telnetsitzung 81 Telnetverbindung 177 TGT 269 Themes 342 this_host() 177 Timeout 339 timeout 315 Timeoutwert 160 Timers 80 timestamp_timeout 314 timestampdir 315 toggle 242 Toolbox 161 Tos 21 Traceroute 47 Einsatzmöglichkeiten 49 Funktionsweise 49, 51 Optionen 48 511 Transaktionsanfrage 145 triple-des 283 Tripwire 205 Befehle 217 Tripwireseiten 206 Tripwiresystem 218 Trojanisches Pferd 290 trust 242 Trusted Referers 342 Trusted Users 455 Ttl 21 ttl 22 tto 22 tty 312, 313 tty_tickets 312 tw.config 207 TZ 292 U UDP Scan 151 uid 242 umask 315 Unified 45 Unix-Domain-Socket 292 Unixdomainsocket 39 Upgrade 337 Uricontent 22, 30 use_loginclass 314 UseLogin 273 UsePrivilegedPort 291 USER 292 User 291 User Interface 334 UserKnownHostsFile 291 UserKnownHostsFile2 291 Usermin 327 Users and Groups 363 UseRsh 291 UTF-8 255, 256 UTMP 265 –Uvar 225 V Verbindungsversuche 287 Verbose Mode 155 Verbose Modus 228 Verfallsdatum 199, 242 verifypw 317 Verknüpfungsarten 131 Vermittlungsstelle 51 Verschlüsseln und Signieren 246 Sandini Bib 512 Verschlüsselung 224, 231, 243 VFS 2 Virendatenbank 205 Virenscanner 205 Virtuelle Server 377 Virtuelle Server (ProFTPD) 425 visudo 306, 313, 320 Fehlermeldungen 307 Optionen 307 Syntax 307 vpass 202 W Webmin 325 Actions Log 329 Aktualisieren 338 Authentication 339 Authentifizierung 339 Betriebssystem 336 Certificate Authority 344 Cluster 488 Edit Categories 341 Hardware 479 Index Page Options 337 Indexseite 337 Installation 325 IP Access Control 330 Konfiguration 330 Language 336 Logging 333 Login 327 Module 326, 334 Module aktualisieren 338 Operating System 336 Others 492 Port und Adressen 331 Proxy Server 334 Reassign Modules 340 Server 367 Server Index 345 Sprache 336 Stichwortverzeichnis SSL-Verschlüsselung 344 Starten 327 Stoppen 327 System 351 Themes 342 Trusted Referers 342 Upgrade 337 User Interface 334 Users 346 Webmin-Module 334 Webmin-Serversystem 330 while-Schleife 169 Widerrufszertifikat 251 Window-Größe 59 Window-Scan 152 WU-FTP Server 471 WU-FTPD 326 X X11-Weiterleitung 282 X11DisplayOffset 273 X11Forwarding 273 xauth 273, 281, 291 XAuthLocation 273, 291 Xmas Tree-Scan 151 XML 39 XML Format 155 XO 148 Y YAPS 39 yaps 221 Z Zahlensystem 55 Zeichenketten 185, 188 Zeichensatz 255 Zertifizierungsauthorität 344 Zufallsscan 156 Zufallswerte 237 Zugriffsbeschränkung 331 Sandini Bib Copyright Daten, Texte, Design und Grafiken dieses eBooks, sowie die eventuell angebotenen eBook-Zusatzdaten sind urheberrechtlich geschützt. Dieses eBook stellen wir lediglich als Einzelplatz-Lizenz zur Verfügung! Jede andere Verwendung dieses eBooks oder zugehöriger Materialien und Informationen, einschliesslich der Reproduktion, der Weitergabe, des Weitervertriebs, der Platzierung im Internet, in Intranets, in Extranets anderen Websites, der Veränderung, des Weiterverkaufs und der Veröffentlichung bedarf der schriftlichen Genehmigung des Verlags. Bei Fragen zu diesem Thema wenden Sie sich bitte an: mailto:info@pearson.de Zusatzdaten Möglicherweise liegt dem gedruckten Buch eine CD-ROM mit Zusatzdaten bei. Die Zurverfügungstellung dieser Daten auf der Website ist eine freiwillige Leistung des Verlags. Der Rechtsweg ist ausgeschlossen. Hinweis Dieses und andere eBooks können Sie rund um die Uhr und legal auf unserer Website (http://www.informit.de) herunterladen