original in es Javi Polo
es to en Miguel Angel Sepulveda
en to de Harald Radke
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.
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 |
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.
#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.
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:-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.1hiermit werden alle Pakete der Rechner 123.34.22.XXX abgelehnt:
ipfwadm -I -a d -S 123.34.22.0/255.255.255.0Soll 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 139Das war alles, ein wenig kurz, aber mein Wissen ist halt auch recht begrenzt 0:)