Kategorie: Linux
Erstellt: 28.11.2019
Aktualisiert: 31.08.2020
Dieses Dokument beschreibt einige bewährte Empfehlungen, um die Sicherheit eines Linux-Servers zu erhöhen.
Bei der Installation eines neuen Servers können Sie die Sicherheit des Servers verbessern, wenn Sie bei der Partitionierung ein paar Dinge beachten:
Richten Sie (mindestens) eine separate Partition für alle von Benutzern beschreibbaren Verzeichnisse ein. Damit soll verhindert werden, dass Benutzer (absichtlich oder unabsichtlich) den Speicherplatz “volllaufen” lassen und der Server somit ausfällt.
Zumindest sollte sich /var/www
auf einer eigenen Partition befinden. Auf dieser sollte die Mount-Option nodev
und nach Möglichkeit auch noexec
aktiviert sein, sowie Gruppen-Quota eingerichtet werden.
Richten Sie eine separate Partition für /tmp
ein, und aktivieren Sie hierfür die Mount-Optionen nodev
und nosetuid
.
Setzen Sie optional auch die Option noexec
für das /tmp
-Verzeichnis. Damit kann die Gefahr von Exploits ein wenig reduziert werden.
Auf Debian-/Ubuntu-basierten System sollten Sie aber eine Datei /etc/apt/apt.conf.d/10noexec
anlegen, welche folgende Zeilen enthält:
DPkg::Pre-Invoke { "mount -o remount,exec /tmp"; };
DPkg::Post-Invoke { "mount -o remount /tmp"; };
Zugriff auf MySQL/MariaDB beschränken
Die Standardinstallation von MySQL und MariaDB enthält eine Datenbank namens test
und erlaubt anonymen Zugriff auf diese. Zudem ist kein Passwort für den Datenbank-Admin-Benutzer (root
) gesetzt.
Um das zu korrigieren, führen Sie das Script mysql_secure_installation
aus:
root@srv:~# mysql_secure_installation
Ihnen werden dann einige Fragen gestellt und Sie werden nach einem root-Passwort gefragt. Die Fragen können Sie normalerweise alle mit ihrem Standardwert (ja) beantworten.
Portmapper-Dienst deaktivieren
Häufig ist der Portmapper-Dienst standardmäßig installiert und aktiviert. Wenn dieser Dienst von außen erreichbar ist, dann ist das ein Sicherheitsrisiko (der Portmapper könnte von Angreifern für DDoS-Zwecke mißbraucht werden).
Mit dem Tool rpcinfo
können Sie prüfen ob der Portmapper aktiv ist:
root@srv:~# rpcinfo
program version netid address service owner
100000 4 tcp6 ::.0.111 portmapper superuser
100000 3 tcp6 ::.0.111 portmapper superuser
100000 4 udp6 ::.0.111 portmapper superuser
100000 3 udp6 ::.0.111 portmapper superuser
100000 4 tcp 0.0.0.0.0.111 portmapper superuser
100000 3 tcp 0.0.0.0.0.111 portmapper superuser
100000 2 tcp 0.0.0.0.0.111 portmapper superuser
100000 4 udp 0.0.0.0.0.111 portmapper superuser
100000 3 udp 0.0.0.0.0.111 portmapper superuser
100000 2 udp 0.0.0.0.0.111 portmapper superuser
100000 4 local /var/run/rpcbind.sock portmapper superuser
100000 3 local /var/run/rpcbind.sock portmapper superuser
In vielen Fällen können Sie den Portmapper nicht deinstallieren, weil andere Dienste wie das Quota-System davon abhängen. Also deaktivieren Sie den Dienst einfach dauerhaft:
root@srv:~# systemctl stop rpcbind
Warning: Stopping rpcbind.service, but it can still be activated by:
rpcbind.socket
root@srv:~# systemctl stop rpcbind.socket
root@srv:~# systemctl disable rpcbind
Removed symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service.
Zugriff auf den su
-Befehl beschränken
Hosting-Benutzer sollten niemals Zugriff auf den su
-Befehl haben. Wir empfehlen daher nur Mitgliedern der Gruppe adm
die Verwendung des su
-Befehls zu erlauben.
fügen Sie die Admin-Benutzer (nicht-root-Benutzer!) der adm
-Gruppe hinzu, z.B.:
root@srv:~# usermod -aG adm admin-user
fügen Sie die folgende Zeile in /etc/pam.d/su
hinzu:
auth required pam_wheel.so group=adm
testen Sie ob die Ausführung von su
für Ihren Admin-Benutzer nun noch möglich ist
testen Sie, ob “normale” Benutzer nicht mehr su
ausführen können
begrenzen Sie den Zugriff auf die Prozessliste (ps
)
Normale Benutzer sollten nicht sehen dürfen welche Prozesse auf einem Server laufen (außer natürlich ihre eigenen Prozesse). Beschränken Sie daher den Zugriff auf die Prozessliste indem Sie hidepid=2
zum /proc
-Eintrag in /etc/fstab
hinzufügen:
proc /proc proc defaults,hidepid=2 0 0
Mounten Sie das /proc
-Dateisystem anschließend neu:
root@srv:~# mount /proc -o remount
Alle nicht-root-Benutzer sollten nun beim Aufruf von ps aux
nur noch ihre eigenen Prozesse sehen.
SSH-Zugriff beschränken
Der Zugriff auf SSH sollte ebenfalls eingeschränkt werden. Bearbeiten Sie /etc/ssh/sshd_config
und setzen Sie die folgenden Einstellungen:
PermitRootLogin no
(oder: PermitRootLogin without-password
) um Brute-Force-Angriffe auf Ihren root-Account zu verhindern (stellen Sie vorher sicher dass Sie einen normalen Benutzer zur SSH-Anmeldung eingerichtet haben, am besten mit Public-Key-Authentifizierung!)AllowTcpForwarding no
und X11Forwarding no
um Ihren Server nicht als TCP-Tunnel ins Internet zu verwendenDebianBanner no
(nur Debian/Ubuntu) um die Debian-/Ubuntu-Version nicht schon vor der Anmeldung anzuzeigen (die OpenSSH-Version wird dennoch angezeigt, das lässt sich fast nicht verhindern)Starten Sie anschließend den SSH-Daemon neu (service sshd restart
).
Viele Anleitungen empfehlen zudem den Standard-Port von SSH (Port 22) auf irgendeinen zufälligen anderen Port zu ändern. Das hilft allerdings nicht viel - im Gegenteil, das ist eher ein Sicherheitsrisiko. Nur Anwendungen mit root-Berechtigungen dürfen sich an einen privilegierten Port <1024 binden. Wenn Sie SSH nun beispielsweise an Port 12345 laufen lassen, könnte jeder Benutzer ein Programm erstellen welches versucht sich an diesen Port zu binden. Beim nächsten SSH-Neustart könnte das erfolgreich sein, und so könnte ein normaler (unprivilegierter) Benutzer Ihren SSH-Zugriff kapern. Binden Sie SSH also ggf. an einen Port <1024, oder lassen Sie diesen besser an dessen Standard-Port.
Die folgenden Tuningeinstellungen basieren auf dem Kernel sysctl configuration file for Linux von Michiel Klaver.
Erstellen/bearbeiten Sie die Datei /etc/sysctl.d/security.conf
(oder herunterladen):
# Controls the System Request debugging functionality of the kernel
# Default: 438
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
# Default: 0
kernel.core_uses_pid = 1
# Allow for more PIDs
# Default: 32768
kernel.pid_max = 65535
# Controls the maximum size of a message, in bytes
# Default: 16384
kernel.msgmnb = 65535
# Controls the default maxmimum size of a mesage queue
# Default: 8192
kernel.msgmax = 65535
# Hide exposed kernel pointers
# Default: 0
kernel.kptr_restrict = 1
Erstellen/bearbeiten Sie die Datei /etc/sysctl.d/network-security.conf
(oder herunterladen):
# Prevent SYN attack, enable SYNcookies (they will kick-in when the max_syn_backlog reached)
# Default: tcp_syncookies=1, tcp_syn_retries=6, tcp_synack_retries=5, tcp_max_syn_backlog=1024
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 4096
# Disables IP source routing
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# Enable IP spoofing protection, turn on source route verification
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Enable Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# Enable a fix for RFC1337 - time-wait assassination hazards in TCP
net.ipv4.tcp_rfc1337 = 1
Um die neuen Einstellungen anzuwenden, führen Sie folgenden Befehl aus:
sysctl --system
Diese Liste erhebt keinen Anspruch auf Vollständigkeit. Wenn Sie weitere Vorschläge oder Kommentare haben, kontaktieren Sie uns gerne.