Linux Netzwerk-Dienste absichern

Angreifbar ist ein Netzwerk-Dienst nur, wenn er erreichbar ist und erreichbar ist er nur, wenn er an die entsprechende IP-Adresse gebunden ist. Somit sollte eine Absicherung eines Systems darin bestehen, alle nicht benötigten Netzwerk-Dienste zu deaktivieren (z.B. durch Entfernen der entsprechenden Links in den Runlevelverzeichnissen), alle nur lokal benötigten Netzwerk-Dienste je nach Bedarf an eine interne IP-Adresse (hier als Beispiel 10.0.0.1), der Loopback-Adresse (127.0.0.1) oder den Unix-Socket zu binden und nur die von außen unbedingt benötigten Dienste (z.B. SSH) an eine externe IP-Adresse zu binden.

Was alles an Ports auf einem System offen ist, kann auf diesem System mittels netstat -lnptu festgestellt werden. Hierbei werden alle offenen TCP und UDP Ports mit den jeweiligen IP-Adressen, PIDs und Programmnamen angezeigt. Weitere Informationen sind der Manpage von „netstat“ zu entnehmen.

Mittels Portscannern können auch andere Rechner nach offenen Ports untersucht werden oder der eigene Rechner von außen. Ein einfach Scan wäre z.B. mittels telnet möglich, indem versucht wird, sich mit jedem einzelnen interessanten Port zu verbinden. Moderne Scanner (wie z.B. nmap) sind darüber hinaus in der Lage einen so genannten Stealth-Scan durch zuführen, wobei der Verbindungsaufbau nicht komplett durch geführt wird und somit evtl. nicht in den Logfiles gespeichert wird. Oft ist es mit diesen Tools möglich, weitere Informationen über das gescannte System zu erhalten, wie z.B. das jeweils verwendete Betriebssysteme oder die Uptime.

  • Webserver Apache: In der Datei „httpd.conf“ der Eintrag Listen 10.0.0.1:80 für jeden (Name)VirtualHost.
  • DNS-Server Bind: In der Datei „named.conf“ der Eintrag listen-on { 10.0.0.1; 127.0.0.1; }.
  • Common UNIX Printing System (CUPS): In der Datei „cupsd.conf“ muss für jede IP-Adresse ein Eintrag in der Form Port 10.0.0.1:631 erstellt werden.Zusätzlich gibt es neben der Interface-Bindung bei CUPS ein eigenes System von Zugriffsberechtigungen, die für jedes einzelne Verzeichnis (z.B. admin, printers oder printer/name) gesetzt werden können. Diese sollten für ein internes Berechtigungskonzept verwendet werden.
  • Cyrus IMAP: Ab Version 2.0 wird der Cyrus IMAP Server über einen eigenständigen Dienst „cyrmaster“ gestartet, der über die Datei „cyrus.conf“ für jeden Cyrus Dienst (IMAP, POP3, Sieve, etc.) eine eigenständige Bindung an bestimmte IP-Adressen oder einen UNIX-Sockets ermöglicht (zuvor wurde dieser Server über den inetd gestartet).Für die verwendeten Dienste muss dort unter „SERVICES“ der „listen“-Eintrag um den Hostnamen (z.B. localhost) oder die IP-Adresse ergänzt werden. Für den IMAP sähen die Einträge z.B. wie folgt aus:
    imap cmd=“imapd -U 30″ listen=“localhost:imap“ prefork=0 maxchild=100
    imaps cmd=“imapd -s -U 30″ listen=“10.0.0.1:imaps“ prefork=0 maxchild=100.
    Hierbei wird der IMAP-Dienst an das Loopback-Interface gebunden und der IMAP over SSL an die gewünschte Netzwerkkarte.
  • DHCP Server: Auch hier kann im Runlevel-Startscript bei den Start-Optionen die Bindung an eine oder mehrer Netzwerkkarten festgelegt werden. Hierfür muss dem DHCP-Daemon einfach das entsprechende Interface übergeben werden, also z.B. dhcpd eth0 lo.Da DHCP teilweise über Broadcast-Anfragen abläuft, ist dieser Dienst zwar weiter an die IP-Adresse 0.0.0.0 gebunden, es werden aber Anfragen, die nicht über die angebenen Interfaces ankommen verworfen.
  • Newsserver INN: In der Datei „inn.conf“ der Eintrag bindaddress: 10.0.0.1.
  • Datenbank MySQL: Im Runlevel-Startscript kann bei den Start-Optionen die Bindung festgelegt werden. Es gibt dort zwei Möglichkeiten:Wenn nur lokal auf die Datenbank zugegriffen werden soll, kann der Zugriff auf UNIX-Sockets reduziert werden: –skip-networking.Ansonsten kann MySQL an die interne Netzwerk-Adresse gebunden werden: –bind-address=10.0.0.1.
  • Verzeichnisdienst OpenLDAP: Im Runlevel-Startscript kann als Start-Option mittels des Parameters -h URL-Liste eine Liste von URLs übergeben werden, an die der „Standalone LDAP Daemon – slapd“ gebuden werden soll.Die URL-Liste besteht aus mittels Leerzeichen getrennten einzelnen URLs in der Form ldap://127.0.0.1/ oder ldap://127.0.0.1:9009/, womit „slapd“ entweder an seinen Standardport 389 auf Locelhost oder aber an einen beliebigen anderen Port (in dem Beispiel 9009) auf Locelhost gebunden wird. Ebenso ist es möglich, mittels ldapi:/// den LDAP-Server an Unix-Sockets (IPC) zu binden.
  • Mailserver Postfix: In der Konfigurationsdatei „main.cf“ den Parameter inet_interfaces = loopback-only eintragen.
  • PostgreSQL Datenbank: In der Konfigurationsdatei „postgresql.conf“ kann mittels des Eintrags virtual_host = ‚127.0.0.1‘ die Bindung an eine IP-Adresse erfolgen oder mittels des Eintrags virtual_host = localhost die Bindung an den Hostname erfolgen.Ebenso ist es möglich, den PostgreSQL Server direkt mittels der Startoptionen postmaster -h 127.0.0.1 oder postmaster -h localhost zu starten.
  • SaMBa-Server: In der Datei „smb.conf“ die Einträge interfaces = 10.0.0.1/24 und bind interfaces only = yes.Hierbei werden der Fileservice „smbd“ und der Nameservice „nmbd“ unterschiedlich behandelt. „smbd“ wird auf der angegebene IP-Adresse an Port 139 gebunden während „nmbd“ zum einen an diese IP-Adresse auf den Ports 137 und 138 gebunden wird und zusätzlich noch einmal an diese Ports auf der IP-Adresse 0.0.0.0, um Broadcast-Anfragen entgegen nehmen zu können. Damit kann dieser Dienst zwar von überall Broadcast-Anfragen entgegen nehmen, er verwirft sie aber, wenn sie nicht aus dem mit interfaces angegebenen Absendebereich kommen (siehe aber auch IP-Spoofing). Wenn eine Einbindung des Rechners nicht in den Windows-Nameservice benötigt wird, kann aber im Startscript der Start des „nmbd“ komplett deaktiviert werden.
  • Mailserver Sendmail: Bei Sendmail hat sich zwischen den Versionen 8.10.0 und 8.12.0 die Funktionsweise für die Verarbeitung lokal erstellter Mails geändert. Ab 8.10.0 bietet Sendmail hierfür die Funktion Message Submission Agent (MSA), nach RFC2476, an. Diese ist ab Version 8.12.0 zwingend, da der nicht standardgemäße SMTP-Befehl XUSR nicht mehr unterstützt wird.Für die Konfiguration von Sendmail gibt es unterschiedlich Möglichkeiten. Einmal über Konfigurationsmakros und einmal über die mittels dieser erstellten Konfigurationsdatei.
    • In der m4 Konfigurationsdatei „sendmail.mc“ kann mittels der Einträge DAEMON_OPTIONS(‘Addr=10.0.0.1, Name=MTA’)dnl und DAEMON_OPTIONS(‘Addr=127.0.0.1, Port=587, Name=MSA, M=E’)dnl eine Bindung an eine IP-Adresse erfolgen. Hierbei wird Sendmail als MSA für die Mails vom lokalem Rechner an die Loopback-Adresse gebunden und als MTA für das interne Netz an die interne IP-Adresse.Bei älteren Sendmail Versionen (vor 8.10.0) erfolgt dies mittels des Eintrags define(‘confDAEMON_OPTIONS’,‘Addr=10.0.0.1’). Einen MSA gibt es hier, wie oben erwähnt, noch nicht.Zu Beachten ist hierbei, dass oft schon mittels der zentralen Makros der Eintrag für den MSA gesetzt wird. Hier ist es dann notwendig, diesen mittels des Eintrags FEATURE(`no_default_msa‘)dnl erst einmal zu deaktivieren und dann, wie zuvor beschrieben, zu setzen. Da Sendmail nur den ersten Wert ausführt, würde ansonsten evtl. die Einstellung wirkungslos. Deshalb muss ein vorhandener Eintrag auch immer geändert werden und nicht mittels eines zweiten Eintrags ergänzt werden.
    • In der Konfigurationsdatei „sendmail.cf“ können die Werte O DaemonPortOptions=Addr=10.0.0.1, Name=MTA und O DaemonPortOptions=Addr=127.0.0.1, Port=587, Name=MSA, M=E gesetzt werden. Falls es schon Einträge für MTA und MSA gibt, müssen diese entsprechend ergänzt werden, da ansonsten immer der erste Eintrag verwendet wird. Bei älteren Sendmail Versionen gilt dies entsprechend nur für den MTA-Eintrag.
  • Squid Web Proxy Cache: In der Datei „squid.conf“ der Eintrag http_port 10.0.0.1:3128 (oder ein anderer gewünschter Port wie z.b. 8080). Es sind hier mehrere Einträge möglich, um Squid an unterschiedliche IP-Adressen/Ports zu binden.Um die Verständigung des Squid mit anderen Nachbar-Caches über ICP (Interprocess Comunication Protocoll) auf eine IP-Adresse zu binden, kann der Eintrag udp_incoming_address 10.0.0.1 verwendet werden. Diese kann im Standalone-Betrieb aber auch mittels icp_port 0 gleich ganz deaktiviert werden.Ältere Versionen des Squid (<2.3) kennen die Bindung mittels des Eintrags http_port nicht. Hier kann mittels des Eintrags tcp_incoming_address 10.0.0.1 dies erreicht werden (wobei auch über ein Update mal nachgedacht werden sollte).
  • SSH Daemon: In der Datei „sshd_config“ der Eintrag ListenAddress 10.0.0.1.
  • X-Server: Beim Aufruf des X-Servers kann mittels des Aufrufparameters -nolisten tcp die Bindung an IP-Sockets deaktiviert werden. Es erfolgt nur noch eine Bindung an die die UNIX-Sockets, was nicht nur für den lokalen Betrieb ausreicht, sondern auch die schnellere Verbindung ist. Im Allgemeinen wird der X-Server über den X Display Manager (xdm) gestartet. Dort sind die Aufrufparameter für den X-Server in der Datei „Xservers“ oder „xserverrc“ (je nach Distribution) zu finden.Wenn aber ein Remote-Zugriff für den X-Server benötigt wird, kann diese Einstellung nicht verwendet werden. Hier kann als Alternative in der Datei Xaccess eine detaillierte Zugriffsgewährung für einzelne Clients erfolgen oder, als sinnvollere da sichere Alternative, die Anbindung über SSH.