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
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
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.
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).
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
oder
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.
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: