Product SiteDocumentation Site

4.18. Absicherung des Netzwerkzugangs

FIXME: mehr (für Debian spezifischer) Inhalt benötigt

4.18.1. Konfiguration der Netzwerkfähigkeiten des Kernels

Many features of the kernel can be modified while running by echoing something into the /proc file system or by using sysctl. By entering /sbin/sysctl -A you can see what you can configure and what the options are, and it can be modified running
/sbin/sysctl -w variable=value
(vergleiche sysctl(8)) Nur in seltenen Fällen müssen Sie hier etwas bearbeiten. Aber auch hier können Sie die Sicherheit erhöhen. Zum Beispiel:
net/ipv4/icmp_echo_ignore_broadcasts = 1
Dies ist ein Windows-Emulator, weil es sich wie Windows bei Rundrufen (Broadcast-Ping) verhält, wenn es auf 1 gesetzt wird. Das bedeutet, dass ICMP-Echo-Anfragen, die an die Rundrufadresse geschickt werden, ignoriert werden. Anderenfalls macht es gar nichts.
Falls Sie verhindern wollen, dass Ihr System auf ICMP-Echo-Anfragen antwortet, müssen Sie nur diese Konfigurationsoption anschalten:
net/ipv4/icmp_echo_ignore_all = 1
Verwenden Sie Folgendes, um Pakete mit unmöglichen Adressen (erzeugt durch falsche Routen) in Ihrem Netzwerk zu protokollieren:
/proc/sys/net/ipv4/conf/all/log_martians = 1
Für weiterführende Informationen, welche Sachen mit /proc/sys/net/ipv4/* angestellt werden können, sollten Sie /usr/src/linux/Documentation/filesystems/proc.txt lesen. Alle Optionen werden gründlich in /usr/src/linux/Documentation/networking/ip-sysctl.txt [39] beschrieben.

4.18.2. Konfiguration von Syncookies

Diese Option ist ein zweischneidiges Schwert. Auf der einen Seite schützt es Ihr System vor dem Überfluten mit syn-Paketen. Auf der anderen Seite verletzt es definierte Standards (RFCs).
net/ipv4/tcp_syncookies = 1
Wenn Sie das dauerhaft für den Kernel festlegen wollen, müssen Sie in /etc/network/options syncookies=yes festlegen. Jedes Mal, wenn /etc/init.d/networking ausgeführt wird (was typischerweise beim Booten geschieht), wird diese Option wirksam. Dagegen wird folgendes nur eine einmalige Wirkung bis zum nächsten Neustart haben:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
Diese Option ist nur verfügbar, wenn der Kernel mit CONFIG_SYNCOOKIES übersetzt wurde. Alle Kernel von Debian wurden mit dieser Option kompiliert. Sie können das folgendermaßen überprüfen:
$ sysctl -A |grep syncookies
net/ipv4/tcp_syncookies = 1
Weitere Informationen zu TCP-Syncookies finden Sie unter http://cr.yp.to/syncookies.html.

4.18.3. Absicherung des Netzwerks beim Hochfahren

Wenn Sie die Netzwerkoptionen des Kernels konfigurieren, müssen Sie dafür sorgen, dass sie bei jedem Neustart des Systems geladen werden. Das nachfolgende Beispiel aktiviert neben vielen der oben vorgestellten Optionen auch noch ein paar andere nützliche Optionen.
Tatsächlich gibt es zwei Möglichkeiten, Ihr Netzwerk beim Booten einzurichten. Sie können entweder /etc/sysctl.conf konfigurieren (siehe sysctl.conf(5)) oder ein Skript einsetzen, das beim Aktivieren der Netzwerkschnittstellen aufgerufen wird. Die erste Möglichkeit wird auf alle Schnittstellen angewendet, die zweite erlaubt es Ihnen, die Konfiguration für jede Schnittstelle separat zu wählen.
Ein Beispiel einer Konfiguration von /etc/sysctl.conf, die einige Netzwerkoptionen auf der Kernelebene absichert, wird unten gezeigt. Beachten Sie darin den Kommentar, dass /etc/network/options beim Ausführen von /etc/init.d/networking (dies ist in der Startsequenz nach procps) einige Werte überschreiben könnte, wenn sich Werte in dieser Datei widersprechen.
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See sysctl.conf (5) for information. Also see the files under
# Documentation/sysctl/, Documentation/filesystems/proc.txt, and
# Documentation/networking/ip-sysctl.txt in the kernel sources 
# (/usr/src/kernel-$version if you have a kernel-package installed)
# for more information of the values that can be defined here.

#
# Be warned that /etc/init.d/procps is executed to set the following
# variables.  However, after that, /etc/init.d/networking sets some
# network options with builtin values.  These values may be overridden
# using /etc/network/options.
#
#kernel.domainname = example.com

# Additional settings - adapted from the script contributed
# by Dariusz Puchala (see below)
# Ignore ICMP broadcasts
net/ipv4/icmp_echo_ignore_broadcasts = 1
#
# Ignore bogus ICMP errors
net/ipv4/icmp_ignore_bogus_error_responses = 1
# 
# Do not accept ICMP redirects (prevent MITM attacks)
net/ipv4/conf/all/accept_redirects = 0
# _or_
# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net/ipv4/conf/all/secure_redirects = 1
#
# Do not send ICMP redirects (we are not a router)
net/ipv4/conf/all/send_redirects = 0
#
# Do not forward IP packets (we are not a router)
# Note: Make sure that /etc/network/options has 'ip_forward=no'
net/ipv4/conf/all/forwarding = 0
#
# Enable TCP Syn Cookies
# Note: Make sure that /etc/network/options has 'syncookies=yes'
net/ipv4/tcp_syncookies = 1
#
# Log Martian Packets
net/ipv4/conf/all/log_martians = 1
#
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
# Note: Make sure that /etc/network/options has 'spoofprotect=yes'
net/ipv4/conf/all/rp_filter = 1
#
# Do not accept IP source route packets (we are not a router)
net/ipv4/conf/all/accept_source_route = 0
Um dieses Skript verwenden zu können, müssen Sie es zuerst unter z.B. /etc/network/interface-secure (der Name ist nur ein Beispiel) erstellen und es wie folgt aus /etc/network/interfaces aufrufen:
auto eth0
iface eth0 inet static
        address xxx.xxx.xxx.xxx
        netmask 255.255.255.xxx
        broadcast xxx.xxx.xxx.xxx
        gateway xxx.xxx.xxx.xxx
        pre-up /etc/network/interface-secure
In diesem Beispiel wird das Skript aufgerufen, um alle Netzwerkschnittstellen abzusichern, wie unten gezeigt wird, bevor die Schnittstelle eth0 aktiviert wird.
#!/bin/sh -e
# Skriptname: /etc/network/interface-secure
#
# Verändert das Standardverhalten für alle Schnittstellen in einigen Bereichen,
# um vor TCP/IP-Spoofing und Angriffen zu schützen.
#
# Wurde von Dariusz Puchalak beigesteuert
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 
                                           # Broadcast echo protection enabled.
echo 0 > /proc/sys/net/ipv4/conf/all/forwarding
                                           # IP forwarding disabled.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies # TCP syn cookies protection enabled.
echo 1 >/proc/sys/net/ipv4/conf/all/log_martians # Log strange packets.
# (this includes spoofed packets, source routed packets, redirect packets)
# but be careful with this on heavy loaded web servers.
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 
                                           # Bad error message protection enabled.

# IP spoofing protection.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# Disable ICMP redirect acceptance.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# Disable source routed packets.
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

exit 0
Beachten Sie, dass Sie auch verschiedene Netzwerkoptionen für verschiedene Schnittstellen (falls Sie mehr als eine haben) setzten können, indem Sie die pre-up-Zeile verändern:
pre-up /etc/network/interface-secure $IFACE
Zusätzlich müssen Sie ein Skript verwenden, das Änderungen nur auf eine bestimmte Schnittstelle anwendet und nicht auf alle Schnittstellen. Beachten Sie aber, dass einige Netzwerkoptionen nur global gesetzt werden können. Dies ist ein Beispielsskript:
#!/bin/sh -e
# Skriptname: /etc/network/interface-secure
#
# Verändert das Standardverhalten für alle Schnittstellen in einigen Bereichen,
# um vor TCP/IP-Spoofing und Angriffen zu schützen.
#
# Wurde von Dariusz Puchalak beigesteuert
#

IFACE=$1
if [ -z "$IFACE" ] ; then
   echo "$0: Must give an interface name as argument!"
   echo "Usage: $0 <interface>"
   exit 1
fi

if [ ! -e /proc/sys/net/ipv4/conf/$IFACE/ ]; then
   echo "$0: Interface $IFACE does not exit (cannot find /proc/sys/net/ipv4/conf/)"
   exit 1
fi

echo 0 > /proc/sys/net/ipv4/conf/$IFACE/forwarding  # IP forwarding disabled.
echo 1 >/proc/sys/net/ipv4/conf/$IFACE/log_martians # Log strange packets.
# (this includes spoofed packets, source routed packets, redirect packets)
# but be careful with this on heavy loaded web servers.

# IP spoofing protection.
echo 1 > /proc/sys/net/ipv4/conf/$IFACE/rp_filter

# Disable ICMP redirect acceptance.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/send_redirects

# Disable source routed packets.
echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_source_route

exit 0
Eine andere Lösungsmöglichkeit ist es, ein init.d-Skript zu erstellen und es beim Booten auszuführen (verwenden Sie update-rc.d, um die passenden rc.d-Links herzustellen).

4.18.4. Konfiguration der Firewall

Um die Möglichkeiten einer Firewall zu haben, damit entweder das lokale System oder andere dahinter beschützt werden, muss der Kernel mit Firewall-Unterstützung kompiliert worden sein. Der Standardkernel von Debian 2.2 (Linux 2.2) stellt die Paketfilter-Firewall ipchains zur Verfügung. Der Standardkernel von Debian 3.0 (Linux 2.4) enthält die stateful Paketfilter-Firewall iptables (netfilter).
In jedem Fall ist es recht einfach, einen anderen als den mit Debian gelieferten Kernel zu benutzen. Sie finden vorkompilierte Kernel als Pakete vor, die Sie leicht auf Ihrem Debian-System installieren können. Mit Hilfe des Pakets kernel-source-X können Sie auch die Kernelquellen herunterladen und einen maßgeschneiderten Kernel kompilieren, indem Sie make-kpkg aus dem Paket kernel-package benutzen.
Auf das Aufsetzen einer Firewall unter Debian wird unter Abschnitt 5.14, „Hinzufgen von Firewall-Fhigkeiten“ ausführlich eingegangen.

4.18.5. Lösung des Problems der Weak-End-Hosts

Auf Systemen mit mehr als einer Schnittstelle zu verschiedenen Netzwerken können Dienste so eingerichtet werden, dass sie Verbindungen nur zu einer bestimmten IP-Adresse zulassen. Normalerweise verhindert das den Zugang zu diesen Diensten, wenn an sie Anfragen über andere Adressen gestellt werden. Allerdings bedeutet das nicht, dass der Dienst an eine bestimmte Hardware-Adresse (Netzwerkkarte) gebunden ist (ein verbreiteter Irrtum). [40]
Das scheint allerdings nicht mit Diensten zu funktionieren, die mit 127.0.0.1 verbunden sind. Sie sollten vielleicht für die Tests raw sockets verwenden.
Das ist kein Problem von ARP und auch keine Verletzung eines RFCs (es wird in ftp://ftp.isi.edu/in-notes/rfc1122.txt, Abschnitt 3.3.4.2 als weak end host bezeichnet). Vergessen Sie nicht, dass IP-Adressen nichts mit dem physischen Schnittstellen zu tun haben.
Im Kernel 2.2 (und davor) konnte dieses Problem so gelöst werden:
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
# echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden
.....
Bei späteren Kernel kann das folgendermaßen gelöst werden:
  • Regeln für iptables
  • richtig konfiguriertes Routing [41] oder
  • Patchen des Kernels [42]
In diesem Text finden sich viele Fälle, in denen gezeigt wird, wie man einige Dienste (sshd-Server, apache, Druckserver, ...) so konfiguriert, dass sie nur auf einer bestimmten Adresse lauschen. Der Leser sollte in Betracht ziehen, dass das den Zugang aus dem gleichen (lokalen) Netzwerk nicht verhindern kann, wenn nicht die in diesem Abschnitt vorgeschlagenen Schritte ergriffen werden. [43]
FIXME: Comments on Bugtraq indicate there is a Linux specific method to bind to a given interface.
FIXME: Submit a bug against netbase so that the routing fix is standard behavior in Debian?

4.18.6. Schutz vor ARP-Angriffen

Wenn Sie den anderen Kisten in Ihrem LAN nicht trauen (das sollte immer so sein, da es die sicherste Einstellung ist), sollten Sie sich vor den verschiedenen ARP-Angriffen schützen.
Wie Sie wissen, wird das ARP-Protokoll dazu verwendet, IP-Adressen mit MAC-Adressen zu verknüpfen (für alle Details siehe ftp://ftp.isi.edu/in-notes/rfc826.txt). Jedes Mal, wenn Sie ein Paket an eine IP-Adresse schicken, wird eine ARP-Auflösung vorgenommen (zuerst wird in den lokalen ARP-Speicher geschaut, und falls die IP nicht im Speicher ist, wird ein Rundruf (Broadcast) mit der ARP-Anfrage verschickt), um die Hardware-Adresse des Ziels zu finden. Alle ARP-Angriffe zielen darauf ab, Ihrem Rechner vorzugaukeln, dass die IP-Adresse des Rechners B mit der MAC-Adresse des Computers des Angreifers verbunden ist. Dadurch wird jedes Paket, das Sie an den Rechner B, der mit der IP-Adresse verbunden ist, schicken wollen, an den Computer des Eindringlings umgeleitet ...
Diese Angriffe (Verfälschung des ARP-Speichers, ARP-Spoofing, ...) ermöglichen dem Angreifer, auf Netzwerken den Verkehr abzuhören (selbst bei Netzwerken, die über einen Switch laufen). Er kann sich leicht in eine Verbindung einschleusen oder einen Host vom Netzwerk nehmen oder ... ARP-Angriffe sind leistungsfähig und einfach durchzuführen. Es gibt dafür auch einige Werkzeuge wie arpspoof aus dem Paket dsniff oder http://arpoison.sourceforge.net/.
Allerdings gibt es immer eine Lösung:
  • Verwenden Sie einen statischen ARP-Speicher. So erstellen Sie »statische« Einträge in Ihrem ARP-Speicher:
      arp -s host_name hdwr_addr
    Indem Sie statische Einträge für jeden wichtigen Host in Ihrem Netzwerk vergeben, stellen Sie sicher, dass niemand einen (falschen) Eintrag für diese Hosts erstellen oder verändern kann (statische Einträge verfallen nicht und können nicht verändert werden). Auch gefälschte ARP-Antworten werden ignoriert.
  • Entdecken Sie verdächtigen ARP-Verkehr. Sie können dazu arpwatch, karpski oder allgemeinere IDS, die auch verdächtigen ARP-Verkehr entdecken können wie snort oder http://www.prelude-ids.org, einsetzen.
  • Verwenden Sie einen IP-Filter, der die MAC-Adressen überprüft.


[39] In Debian kopiert das Paket kernel-source-version die Kernelquellen nach /usr/src/kernel-source-version.tar.bz2. Ersetzen Sie einfach version mit der installierten Kernelversion.
[40] Um das nachzuvollziehen folgendes Beispiel, das von Felix von Leitner auf der Bugtraq-Mailingliste vorgestellt wurde:
   host a (eth0 connected to eth0 of host b):      ifconfig eth0 10.0.0.1      ifconfig eth1 23.0.0.1      tcpserver -RHl localhost 23.0.0.1 8000 echo fnord     host b:      ifconfig eth0 10.0.0.2      route add 23.0.0.1 gw 10.0.0.1      telnet 23.0.0.1 8000
Das scheint allerdings nicht mit Diensten zu funktionieren, die mit 127.0.0.1 verbunden sind. Sie sollten vielleicht für die Tests raw sockets verwenden.
[41] Die Tatsache, dass dieses Verhalten durch Routing geändert werden kann, wurde von Matthew G. Marsh in dem Bugtraq-Thread beschrieben:
   eth0 = 1.1.1.1/24   eth1 = 2.2.2.2/24   ip rule add from 1.1.1.1/32 dev lo table 1 prio 15000   ip rule add from 2.2.2.2/32 dev lo table 2 prio 16000   ip route add default dev eth0 table 1   ip route add default dev eth1 table 2
[42] Wie im Bugtraq-Thread beschrieben, gibt es dafür einige Patches auf http://www.linuxvirtualserver.org/~julian/#hidden und http://www.fefe.de/linux-eth-forwarding.diff.
[43] Ein Angreifer, der nicht in der gleichen Broadcast-Domain (also dem gleichen Netzwerk) wie der angegriffene Host ist, kann auf viele Probleme bei Zugang stoßen, nachdem die Anbindung der IP-Adressen konfiguriert wurde. Wenn der Angriff über einen Router läuft, kann es sich als ziemlich schwer herausstellen, die Antworten zurückzubekommen.