Serversicherheit

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.

Partitionierung

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"; };

Grundeinstellungen

  1. 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.

  2. 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.
  3. 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.

    1. fügen Sie die Admin-Benutzer (nicht-root-Benutzer!) der adm-Gruppe hinzu, z.B.:

      root@srv:~# usermod -aG adm admin-user
    2. fügen Sie die folgende Zeile in /etc/pam.d/su hinzu:

      auth   required   pam_wheel.so group=adm
    3. testen Sie ob die Ausführung von su für Ihren Admin-Benutzer nun noch möglich ist

    4. testen Sie, ob “normale” Benutzer nicht mehr su ausführen können

  4. 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.

  5. 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 verwenden
    • DebianBanner 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.

sysctl-Tuning

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.