Server absichern

Hat die Installation geklappt, wird es Zeit den Server zu schützen. Mit nur wenigen Tools kannst du Deinen Server bereits gegen die wichtigsten Attacken abwehren:


SSL-Zertifikat für apache2 oder nginx

Ein SSL-Zertifikat verschlüsselt sämtlichen Datenverkehr zwischen dem Benutzer und deiner Webseite. Der einfachste Weg für einen Debianserver geht via Certbot.

diese Webseite (IP-Adresse) ist noch nicht geschützt. Dies ist in der Regel am durchgestrichenen Schlosssymbol erkennbar. Da es sich in diesem Beispiel jedoch um einen lokalen Server handelt, ist dies nicht so relevant. Betreibst du jedoch einen vServer welcher von überall erreichbar ist, muss auf jeden Fall ein Zertifikat vorhanden sein, da gewisse Software (CMS; Cloud) sich gar nicht mehr ohne SSL-Zertifikat installieren lässt. Zudem sollte dringend das directory listing bei apache2 deaktiviert werden.

um https systemweit anzuwenden, ergänze die .htaccess mit:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Damit das URL-rewrite auch klappt, muss das apache2-Modul aktiviert werden:

# a2enmod rewrite

ufw

ufw wird per

# apt install ufw

installiert. Dannach können per Terminalbefehl Regeln hinzugefügt oder entfernt werden. Vorsicht! Die Firewall ist gnadenlos und es kann durchaus vorkommen, dass du dich selbst vom gesamten Server aussperrst, falls du z.B. vergisst, den Zugang via ssh und den dazugehörenden Port offen zu halten.

Starten von der Firewall: (ausschalten mit disable)

# ufw enable

Alle einkommenden Befehle ignorieren, alle ausgehenden erlauben:

# ufw default deny incoming
# ufw default allow outgoing

Erlaube ssh auf Port [12345]:

# ufw allow ssh
# ufw allow 12345

Erlaube apache2 mit https:

# ufw allow 443

Erlauf der IP 12.34.567.89 den Zugriff:

# ufw allow from 12.34.567.89

Zeige aller Reglen (Beispiel)

# ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 12345                      ALLOW IN    Anywhere
[ 3] 443                        ALLOW IN    Anywhere
[ 4] Anywhere                   ALLOW IN    12.34.567.89
[ 5] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 12345 (v6)                 ALLOW IN    Anywhere (v6)
[ 7] 443 (v6)                   ALLOW IN    Anywhere (v6)

lösche eine Regel mit:

# ufw delete NUMMER

starte den Dienst neu mit:

/etc/init.d/ufw restart

fail2ban

fail2ban gibt dir die Möglichkeit, nach ein paar missglückten Versuchen den ssh-Zugang für eine gewisse Zeit komplett zu sperren. Auch hier gilt wieder einmal Vorsicht! Es kann durchaus vorkommen, dass auch du dich unfreiweillig für ein paar Stunden selbst aussperrst. fail2ban gibt es direkt aus den Paketquellen:

$ apt search fail2ban
Sortierung… Fertig
Volltextsuche… Fertig
   (...)
fail2ban/stable,now 0.11.2-2 all  [installiert]
  Sperrt Rechner, die wiederholt Authentifikationsfehler verursachen
# apt install fail2ban

Das nötige Konfigurationsfile findet man unter:
/etc/fail2ban/jail.conf

Erstelle eine Kopie vom Originalfile:

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

die verhindert, dass bei einem Update die eigenen Regeln überschrieben werden.

fail2ban – nach 5 Versuchen ist Schluss und fail2ban sperrt den Host für 10 Minuten. fail2ban liest beide Konfigurationsfile aus: jail.conf und jail.local – es macht jedoch Sinn, die jail.local zu bearbeiten, da diese bei einem Update nicht versehentlich überschrieben wird und die eigenen Regeln verworfen werden.

Hast Du alle Konfigurationen vorgenommen, starte den Dienst neu:

# /etc/init.d/fail2ban restart

Den aktuellen Status von fail2ban ruftst du per systemctl auf:

$ systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2021-11-26 10:14:43 CET; 1 weeks 1 days ago
       Docs: man:fail2ban(1)
   Main PID: 655 (fail2ban-server)
      Tasks: 5 (limit: 4678)
     Memory: 21.2M
        CPU: 6min 15.308s
     CGroup: /system.slice/fail2ban.service
             └─655 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Warning: some journal files were not opened due to insufficient permissions.

root-Zugang sperren

Das direkte Login via ssh für den User root ist in Debian 11 standardmässig bereits deaktiviert. Falls nicht, rufe

# nano /etc/ssh/sshd_config

auf und ändere

PermitRootLogin yes

in

PermitRootLogin no

Starte anschliessend der Service neu:

# /etc/init.d/ssh restart


Portwechsel vom ssh-Server

Standardmässig lauscht unser ssh-Server auf Port 22. Um diesen Port zu wechseln, rufe:

# nano /etc/ssh/sshd_config

auf und entferne das Kommentarzeichen (#) und setze den Port neu.
Include /etc/ssh/sshd_config.d/*.conf
Port 12345
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Speichere die Datei ab und starte den ssh-Server neu. Falls eine Firewall wie ufw läuft, unbedingt den neuen Port offen halten.

# /etc/init.d/ssh restart

directory-listing abschalten (apache2)

Standardmässig listet apache2 Verzeichniss unter /var/www auf. Dies ist jedoch nur bei einem lokalen Server erwünscht.

Um dies dauerhaft abzustellen, editiere die Datei

# nano -w /etc/apache2/apache2.conf

und ersetze None mit all:
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>

erstelle anschliessend eine .htaccess (falls die nicht schon existiert) und füge folgende Zeilen ein:
# schalte das directory-listing aus
Options -Indexes

Falls nicht schon aktiviert, schalte mod_rewrite ein:

# a2enmod rewrite

Starte anschliessend der apache2 neu:

# /etc/init.d/apache2 restart