Einige Hinweise für den sicheren Betrieb von Systemen unter Linux in Verbindung mit dem Internet: Die standardmaeszige Installation einer Linux-Distribution resultiert meist nicht in einem sehr abgesicherten System. Deshalb hier einige Tipps, wie durch den Einsatz einfacher Mittel Zeit und Tools) Linux sicherer gemacht werden kann.
Einspielen aller Updates
Meist ist seit der Pressung der CD einer Distribution bzw. des Download der Installationsdateien aus dem Internet etwas Zeit vergangen. Vielleicht genug, um inzwischen ein bereits bekanntes Sicherheitsloch mitzuinstallieren…deshalb ist dringend zu empfehlen (insbesondere bevor der Server an das Internet angeschlossen wird), alle Updates via Download sich besorgen und installieren. Bei Distributionen basierend auf Red Hat package management system RPM ist das relativ einfach: Ausgabe einer Liste, welche Pakete ein Update benötigen:
find /mnt/tmp/somewhere/ -name '*.rpm' | while read i; do \ name=`rpm -q --queryformat "%{NAME}\n" -p $i`; \ rpm -q $name >/dev/null 2>&1 && echo -n "$name "; done; echo
Installation der Pakete:
find /mnt/tmp/somewhere/ -name '*.rpm' | while read i; do name=`rpm -q \ --queryformat "%{NAME}\n" -p $i`; rpm -q $name >/dev/null 2>&1 && rpm -Fhv \ --nodeps $i; done; echo
Ersatz von Telnet-Daemon und R-Tools durch SecureSHell
Der Einsatz Telnet als Zugang über das Netz und den R-Tools ist nur in den wenigsten Fällen notwendig: Verwendung von X-Server auf Hosts, die kein X-Tunneln durch SSH unterstützen können Backup auf Bandlaufwerke via rmt (Remote Magnetic Tape) - Tunneln durch SSH ist möglich, allerdings performance-raubend (Ver- und Entschlüsselung des Datenstroms) Falls oben genannte Punkte nicht zum Einsatz kommen, kann der Telnet-Daemon deaktiviert werden (auskommentieren in /etc/inetd.conf und Senden des Signals HUP an den inetd) und Installation von z.B. OpenSSH.
Deaktivieren aller nicht benötigter Internetdienste:
Haeufig sind viel mehr Internetdienste aktiviert, als notwendig sind. Welche Dienste aktiv sind, zeigt folgendes Kommando
- netstat -lnp --ip
-
IPv4-Services
- netstat -lnp --inet6
-
IPv6-Services
Alle nicht benoetigten Dienste können abgeschaltet werden durch direkt gestarteter Daemon durch Deaktivieren des Runlevel-Scripts (bei Red Hat Linux z.B. mit chkconfig oder linuxconf) alle vom inetd gestarteter Daemon durch Auskommentieren der entsprechenden Zeile in /etc/inetd.conf
Deinstallation nicht benutzter Programme:
Jedes installierte Programm, welches nie benoetigt wird, stellt ein zusaetzliches Sicherheitsrisiko dar, insbesondere, wenn es das SUID (set user id on execution) oder SGID (set group id on execution) Bit gesetzt sind. Auflistung aller Dateien mit gesetztem SUID oder SGID Bit:
find / -perm +06000 -type f -ls
Bei RPM ist es relativ einfach, ein Programmpaket zu deinstallieren, wenn man es nicht benoetigt. Eventuelle nichtbeachtete Abhaengigkeiten werden einem angezeigt. Man kann sich dann entscheiden, entweder das Paket auf die harte Tour (--nodeps) oder gleich die Abhaengigkeiten mit zu deinstallieren.
Hilfreiche "Schalter" im Linux-Kernel
- Syncookie Support
-
echo "1" >/proc/sys/net/ipv4/tcp_syncookies
- Limitierung der Rate an ausgesendeten speziellen ICMP-Paketen
-
-
echo "100">/proc/sys/net/ipv4/icmp_destunreach_rate
-
echo "100">/proc/sys/net/ipv4/icmp_echoreply_rate
-
echo "100">/proc/sys/net/ipv4/icmp_paramprob_rate
-
echo "100">/proc/sys/net/ipv4/icmp_timeexceed_rate
-
- Abschalten von ICMP echo-reply auf Broadcast-Adressen
-
echo "1">/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
- Abschalten von ICMP echo-reply generell
-
echo "1">/proc/sys/net/ipv4/icmp_echo_ignore_all
- Verwerfen von IP-Paketen mit Source-Route-Option
-
echo "0">/proc/sys/net/ipv4/conf/*/accept_source_route
- Verwerfen von ICMP redirect Paketen
-
echo "0">/proc/sys/net/ipv4/conf/*/accept_redirects
- Defragmentiere eingehende IP-Pakete immer
-
echo "1">/proc/sys/net/ipv4/conf/*/ip_always_defrag
- Loggen von allen Paketen mit unmoeglichen IP-Adressen
-
echo "1">/proc/sys/net/ipv4/conf/*/log_martians
- Abschalten des ICMP Address mask replies
-
echo "0">/proc/sys/net/ipv4/ip_addrmask_agent
- Deaktivieren von IP-forwarding
-
echo "0">/proc/sys/net/ipv4/ip_forward
- Deaktivieren von IP-forwarding per Interface
-
echo "0">/proc/sys/net/ipv4/conf/*/forwarding
Um die Aenderungen rueckgaengig zu machen, musz man lediglich die Werte vertauschen.
Die inetd.conf
Wenn man diese Datei oeffnet, sieht man anhand der Kommentare welcher Dienst gestartet wird. Wird z. B. der telnet-"Server" gestartet, sieht die Zeile folgendermaßen aus:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
Will man verhindern, dasz dieser Dienst gestartet wird, setzt man einfach ein Kommentar ("#") am Anfang der Zeile und startet die inetd neu. Danach sollte die Zeile so aussehen:
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
Der Neustart der Datei wird wie folgt erledigt. Zuerst braucht man die PID (das ist die Nummer, die der Prozess hat); dazu recht das Command ps ax | grep inetd damit man die PID findet. Die Ausgabe sieht dann etwa so aus:
root@dreckskind:~ > ps ax | grep inetd 3344 ? S 0:00 inetd 21431 pts/1 S 0:00 grep inetd root@dreckskind:~ >
Hier hat der inetd die PID 3344 und kann mit kill -HUP 3344 neu eingelesen werden. Wenn man sich danach nochmal mit nmap scannt, sollte telnet nicht mehr laufen. Mit den anderen Diensten (bis auf einige Ausnahmen) wird genauso verfahren.
Die Ausnahmen
Einige Dienste werden nicht ueber den inetd gestartet, sondern von der rc.config aufgerufen. Dazu gehoeren z. B. httpd, sshd, portmap, Printer, ..