TCPD und Firewalls unter Verwendung von IPFWADM

ArticleCategory: [Choose a category for your article]

System Administration

AuthorImage:[Here we need a little image form you]

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in es Javi Polo

es to en Miguel Angel Sepulveda 

en to de Harald Radke 

AboutTheAuthor:[A small biography about the author]

Ich bin 18 Jahre alt und leidender Gymnasiast, dessen Prüfung in Katalanisch im September ansteht. Mein Hobby is die Informatik. Ich hoffe darauf, dass ich an der UIB mein Studium der Informatik (mit Nebenfach Telekommunikationstechnik) beginnen kann. Daneben mag ich Hardcore Musik und spiele in einer Band namens Niko-Chan's Kingdom. Ansonsten gibt es nicht viel zu sagen, außer, dass ich eine wirklich großartige Freundin namens Xiska habe. 0:)

Abstract:[Here you write a little summary]

Dieser Artikel erläutert grob, wie durch die Konfigurierung der durch inetd gesteuerten Dienste die Systemsicherheit erhöht werden kann. Das Hauptaugenmerk gilt dabei ipfwadm zur Verwaltung und Konfiguration der inetd Dienste.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Einführung

Zuerst sollte erstmal klargestellt werden, was inetd eigentlich ist. Im Prinzip handelt es sich dabei um einen Daemon, der die Dienste steuert, die von dem System für Rechner, die über ein Netzwerk mit diesem verbunden sind, bereitgestellt werden. Es ist durchaus möglich, dass per Grundeinstellung nicht alle Dienste eines Systemes durch inetd kontrolliert werden. Deswegen sollte als Erstes in der Datei /etc/inetd.conf nachgeschaut werden, welche Dienste zur Zeit kontrolliert werden (alle Zeilen, die nicht mittels "#" auskommentiert sind). Der erste Rat, der beherzigt werden sollte, ist, dass nicht mehr Dienste aktiviert werden sollten, als unbedingt notwendig sind. So werden schonmal einige Schwachstellen beseitigt, da es durchaus sein kann, dass einige Daemons ausnutzbare Programmfehler aufweisen. Umso schlimmer, wenn diese Programme dann auch noch ohne jeglichen Sinn laufen und das System so unnötig gefährden.

inetd Konfiguration

Es wird angenommen, dass der Leser über eine Kopie der Datei inetd.conf verfügt.
Nun ein paar Erklärungen zum Inhalt der Datei:

Als Beispiel wird folgende Zeile betrachtet:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

Das erste Wort ist der Name des bereitgestellten Dienstes (in diesem Fall "ftp", man kann in der Datei /etc/services nachschauen, auf welchem Port er läuft).

Der zweite Eintrag der Zeile gibt an, von welchem Typ der geöffnete Socket ist, mögliche Werte sind: stream (wie hier), dgram,raw, rdm und seqpacket.

Als Nächstes folgt das verwendete Protokoll. Dieses muss in der Datei /etc/protocols stehen, wie das im Beispiel verwendete TCP, dass bereits in besagter Datei aufgeführt sein sollte.

Nach dem Protokolleintrag muss wait bzw. nowait angegeben werden. Hier sollte fast immer nowait stehen, es sei denn, man arbeitet mit Sockets vom Typ dgram (Datagramm). Für letztgenannten Socketypen muss nowait angegeben werden, falls der Server multithreading fähig ist, oder wait, falls er nur Singlethreading unterstützt. In einem Multithreadingsystem startet der Server bei einer Anfrage auf dem entsprechenden Socket einen neuen Prozess für die Kommunikation und gibt den Socket wieder frei, sodass inetd auf weitere Anfragen warten kann. In einer Singelthreadedumbegung dagegen kann der Server nicht für jede Verbindung einen separaten Prozess starten, sondern führt die Kommunikation über den Socket durch und belegt in solange.
Es gibt noch eine Variante: nowait.xx, wobei xx für eine Zahl (z.B. 50) steht. Dadurch wird festgesetzt, wieviele Daemons maximal pro Minute für diesen Dienst gestartet werden können (bzw. wieviele Verbindungen akzeptiert werden...je nachdem, wie man es sieht). Der Standardwert hier ist 40.

Im fünften Feld steht der Name des Benutzer, unter dem der Daemon laufen soll, in dem Beispiel läuft ftp als root.

Das sechste Feld und dessen Nachfolger beinhalten den Namen des zu startenden Programmes, sowie dessen mögliche Parameter. In obigem Beispiel wird der Daemon tcpd gestartet. Als Argumente erhält das Program den Namen in.ftpd (FTP Daemon), sowie die Parameter -l -a. Hiermit ist nun der interessanteste Aspekt dieses Abschnittes erreicht worden, der Einsatz von tcpd.

tcpd ist ein Daemon, der eingehende Anfragen filtern kann und, abhängig von dem zu startenden Daemon und der IP Adresse, von der die Anfrage kommt, noch bestimmte Dinge tun kann. Grundlage dieser Entscheidungen bilden die Dateien /etc/hosts.allow und /etc/hosts.deny.

Prinzipiell steht in /etc/hosts.deny, wem welche Dienste verweigert und in /etc/hosts.allow wem die Nutzung welcher Dienste gestattet wird.

Der Inhalt beider Dateien sieht schematisch wie folgt aus:
DAEMON: IP[: OPTION1 [: OPTION2 ]]

wobei DAEMON der zu startende Daemon sein kann, im obigen Beispiel wäre dies in.ftpd. Alternativ kann mit der Konstante ALL angezeigt werden, dass alle Dienste betroffen sind.

IP kann eine bestimmte IP Adresse oder eine URL, ein Bereich von IP Adressen (oder URLs) oder beliebige, weiter unten beschriebene Wildcards sein.

Bereiche von IP Adressen werden wie folgt angegeben:
123.32.
Durch diese Schreibweise werden alle Adressen der Form 123.32.XXX.YYY abgedeckt. Ähnlich werden URL Bereiche spezifiziert: .ml.org deckt alle Teildomänen von ml.org ab.

Eine etwas traditionellere Form der IP Bereichs Beschreibung folgt der Konvention IP/MASKM. Sollen zum Beispiel alle Adressen von 127.0.0.0 bis 127.0.255.255 abgedeckt werden, so wird dies durch 127.0.0.0/255.255.0.0 erreicht.

Hier nun die sogenannten Wildcards:
ALL steht für alle möglichen zugelassenen Werte
LOCAL deckt alle Namen ab, die keinen Punkt "." beinhalten
UNKNOWN erfasst alle Rechner, deren Namen oder IP Adresse unbekannt sind
KNOWN erfasst alle Rechner, deren Namen oder IP Adressen bekannt sind
PARANOID erfasst alle Rechner, deren Namen nicht mit den entsprechenden IP Adressen übereinstimmen

Mögliche Optionen sind:
allow deutet an, dass eine Verbindung zugelassen werden muss, zu allen Rechnern, die dem Eintrag entsprechen, unabhängig davon, was in hosts.allow und hosts.deny eingetragen ist. Diese Option sollte als Letztes in der Zeile auftauchen.
deny analog zu allow, nur dass die Verbindung verboten wird.
spawn führt ein Shell Kommando aus, sobald eine Anfrage empfangen wird, z.B. falls gewünscht wird, dass bei bei jedem Verbindungsversuch der Lautsprecher piepsen soll
twist ähnlich zu spawn, ausser, dass die Verbidung unterbrochen wird, sobald das Shell Kommando ausgeführt worden ist. Auch diese Option muss als letzter Eitrag in der Zeile stehen.

Die letzten beiden Optionen ermöglichen den Einsatz folgender Platzhalterzeichen für tcpd:

%a Adresse des Clientrechners
%c Informationen über den Client (sei es user@machine, oder etwas der Art, abhängig vom Client)
%d Name des Daemon
%h falls verfügbar Name oder IP Adresse des Client
%n Name des Client
%p PID des Daemons (Process ID)
%s Informationen über den Server (daemon@machine oder nur daemon, das variiert)
%u Name des Benutzer des Clients
%% Das Zeichen "%"

Mit diesen Platzhaltern und letzteren Optionen kann man bereits einiges bewerkstelligen, zum Beispiel gibt es Leute, die automatisch eine Teardrop Attacke starten, falls jemand versucht, mittels telnet Zugang zu ihrem System zu erhalten :)

INFO: Teardrop ist ein DoS (Denial of Service, ein Angriff, der das System zu einem Reboot oder zu einer Reinitialisierung zwingt). Dieser Angriff nutzt einen Fehler in der Zusammensetzungsroutine von TCP Paketen vieler Betriebssysteme aus (allerdings sollten mittlereweile die meisten Systeme entsprechend gepatched worden sein). Daten, die über das Internet versendet werden, benutzen meist das TCP/IP Protokoll (welches auch innerhalb anderer Netzwerktypen, etwa Intranets verwendet wird). Das Protokoll besteht eigentlich aus zwei Protokollen: TCP ist für das Zerlegen der Information in Pakete zuständig und gibt diese dann an das IP Protokoll weiter, welches diese dann an den Zielrechner schickt. Auf der Empfängerseite überprüft TCP, ob alle Pakete angekommen sind und setzt die Informationen wieder zusammen. Der oben genannte Angriff (und viele auf ihm basierende) nutzen die Tatsache aus, dass viele Betriebssystems vor dem Zusammensetzen nicht überprüfen, ob die Pakete zu klein sind. Ist dies aber der Fall, wird der Rechner bei der Zusammensetzung der Pakete überfordert. Offensichtlich bin ich mir nicht so ganz sicher, wie das ganze nun im Detail aussieht. Jegliche Kritik wird deshalb begrüßt. Nach diesem kleinen Exkurs, geht es nun weiter...

Beispiele:
#hosts.allow 

ALL: 127.0.0.1 # localhost darf jeden Dienst nutzen

in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# es darf jeder den ftp Dienst nutzen, aber bei jeder Verbindung wird 
#eine WAVE Datei gespielt (als Warnung)

in.telnetd:  ALL: twist ( teardrop %h %h )
# Teardrop Angriff als Reaktion auf einen
# Verbindungsversuch mittels telnet (gegen jeden Rechner von aussen)

#fin
#hosts.deny

ALL: `.bsa.org'   # Jeder Verbindungsversuch aus der Domain bsa.org wird untersagt

in.fingerd: ALL	  # kein finger Dienst für niemanden:)

#fin

Dies ist alles, was über tcpd zu sagen ist. Jedoch hab ich schon vorher angedeutet, dass mein Wissen so groß nicht ist. Wer Interesse hat, möge doch ein wenig mit verschiedenen Konfigurationen experimentieren und die Man-Pages studieren (tcpd, host_access(5)). Auf diese Art wird der Leser sicherlich mehr lernen, als aus dem, was hier gezeigt worden ist.

Firewalls mit ipfwadm

Nun wird ein wenig das Programm ipfwadm beleuchtet

Zuerst muss man im Kernel die Unterstützung für das IP Firwalling aktiviert haben (Networking -> Network firewalls + IP: firewalling). Nach der Neuübersetzung und der Reinitialisierung des Systems kann das Programm eingesetzt werden.

ipfwadm ermöglicht die Kontrolle von ein- und ausgehenden TCP, UDP und ICMP Paketen, sowie einige andere Dinge mehr (nur die gerade genannten Einsatzgebiete werden hier diskutiert). Vereinfacht gesagt kann ein Administrator festlegen, welche Pakete durchgelassen werden, sogar, von welcher IP Adresse oder aus welchem IP Bereich, zu welchem Port Pakete gesendet werden dürfen, welche Protokoll verwendet werden darf und beliebige Kombinationen dieser Möglichkeiten... Ähnliches gilt für ausgehende Pakete.

ipfwadm kann mehrere Parameter übergeben bekommen:

In diesem Artikel werden nur die Parameter -I und -O besprochen. Beide haben die gleiche Syntax.

Die Optionen für beide Parameter sind:
Die nun wichtigen Parameter sind:
-P gibt das Protokol an, auf welches die Regelliste zutreffen soll. Mögliche Werte sind: TCP, UDP, ICMP oder all (für alle Protokolle)
-S gibt die Ursprungsadresse des Paketes an. Format: ADDRESS[/MASK][PORT]   Zum Beispiel wäre folgende Adresse gültig 123.32.34.0/255.255.255.250 25, wodurch der Bereich der IP Adressen von 123.32.34.0 bis 123.32.34.5 abgedeckt ist
-D gibt die Zieladresse an. Das Format ist identisch zu dem der Option -S

Dies waren im Wesentlichen die wichtigen Parameter. Um alle Pakete durchzulassen, die vom eigenen Rechner, zum eigenen Rechner gehen, wird folgende Regel hinzugefügt:

ipfwadm -I -i a -S 127.0.0.1

hiermit werden alle Pakete der Rechner 123.34.22.XXX abgelehnt:

ipfwadm -I -a d -S 123.34.22.0/255.255.255.0

Soll jeglicher Zugriff auf den Netbios Port, abgesehen von Adresse 111.222.123.221, verboten werden:

ipfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139

Das war alles, ein wenig kurz, aber mein Wissen ist halt auch recht begrenzt 0:)