Rocky Linux ist ein Open-Source-Betriebssystem auf Enterprise-Niveau. Seine wichtigste Besonderheit ist, dass es im Gleichschritt mit Red Hat Enterprise Linux entwickelt und gepflegt wird, also zu 100 % Bug-für-Bug-kompatibel ist. In dieser Anleitung führen wir eine erste, grundlegende Absicherung eines frisch installierten Rocky-Linux-VPS durch. Diese ersten einfachen Schritte sollten anschließend durch weitere Sicherheitsmechanismen ergänzt werden, je nachdem, welche Dienste Sie installieren möchten.
Aufgrund des gemeinsamen Ursprungs (Red Hat) gilt diese Anleitung auch für die Betriebssysteme CentOS 7 und 8.
Voraussetzungen
- Ein Rocky-Linux-VPS
- Ein Benutzer mit angemessenen Rechten, also root
- Ein Texteditor, in unserem Beispiel verwenden wir nano
- Der Paketmanager dnf, normalerweise im Betriebssystem enthalten
- [Empfohlen] Eine Firewall, in unserem Beispiel verwenden wir firewalld
Prüfen wir, welches Betriebssystem installiert ist
Da es sich um eine Linux-Distribution handelt, die Red Hat EL folgt, sollte man im Problemfall genau wissen, mit welcher Version man arbeitet. Dazu können wir den Befehl ausführen:
# cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.0 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.0"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.0 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.0"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.0"
In unserem Beispiel ist es die Version 9.0 mit dem Namen Blue Onyx.
Aktualisieren Sie Ihr Betriebssystem
Um nach verfügbaren Updates zu suchen, verwenden wir den Befehl dnf mit dem Parameter check-update:
# dnf check-update
Dieser Befehl zeigt die Liste aller zu aktualisierenden Pakete an. Nun können Sie wählen, ob Sie alles Vorgeschlagene aktualisieren oder selektiv nur einzelne Pakete. Im ersten Fall genügt der Befehl:
# dnf -y update
Der Parameter -y dient lediglich dazu, das Update aller Pakete vorab zu bestätigen, ohne dass eine Rückfrage erfolgt. Möchten wir stattdessen selektiv vorgehen, also ein bestimmtes Paket aktualisieren, genügt der Befehl:
# dnf update cockpit.x86_64
In unserem Beispiel aktualisieren wir das Paket cockpit und lassen die übrigen außen vor.
Anlegen eines Benutzers mit eingeschränkten Privilegien
Als allgemeine Sicherheitsregel gilt: Verwenden Sie den Benutzer root nicht für die täglichen Arbeiten auf dem VPS. Zu diesem Zweck legen wir einen Benutzer mit eingeschränkten Privilegien an, der bei Bedarf vorübergehend die Rolle des Benutzers root übernehmen kann. Einen neuen Benutzer legt man mit dem Befehl useradd an:
# useradd mio_utente
Nachdem der Benutzer angelegt ist, vergeben wir mit dem Befehl passwd ein Passwort:
# passwd mio_utente
Changing password for user mio_utente
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Auch wenn der neu angelegte Benutzer kaum Möglichkeiten hat, im System Schaden anzurichten, verzichten wir auf schwache Passwörter (mindestens 8 alphanumerische Zeichen, Sonderzeichen eingeschlossen). Nun können wir uns mit dem neu angelegten Benutzer am VPS anmelden, sind aber vorerst nicht in der Lage, Befehle auszuführen, die die Privilegien des Benutzers root erfordern.
Um Befehle auszuführen, die Root-Privilegien erfordern, gibt es zwei Wege:
- den Befehl
$ su rootverwenden, um den Benutzer root zu übernehmen; - den neu angelegten Benutzer in die Gruppe der Sudoer aufnehmen (die Benutzer, die Befehle mit Root-Privilegien ausführen können): Bei Bedarf genügt dann
$ sudo comando_con_privilegi(Beispiel$ sudo dnf update).
Während der unprivilegierte Benutzer im ersten Fall das Root-Passwort kennen muss, um arbeiten zu können, ist er im zweiten Fall vorab autorisiert — umso weniger sollte man die Qualität des gewählten Passworts unterschätzen. Besser wäre es, SSH nicht auf dem Standard-Port zu exponieren, und noch besser, sich mit kryptografischen Schlüsseln statt mit dem bloßen Benutzer/Passwort-Verfahren zu verbinden.
Um den angelegten Benutzer in die Gruppe der Sudoer aufzunehmen, melden wir uns als Benutzer root am VPS an und verwenden den Befehl:
# usermod -aG wheel mio_utente
Die Gruppe „wheel“ ist eine spezielle Gruppe, die auf einigen Linux-Systemen steuert, welche Benutzer den Befehl sudo verwenden dürfen. Wenn wir uns nun per SSH mit dem unprivilegierten Benutzer am VPS anmelden, können wir mit sudo, gefolgt vom privilegierten Befehl, Tätigkeiten ausführen, die normalerweise Root-Rechte erfordern, zum Beispiel:
$ sudo dnf check-update
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for mio_utente:
Das abgefragte Passwort ist natürlich das des zuvor angelegten Benutzers, nicht das von root. Auf diese Weise können wir Benutzer für externe Mitarbeiter anlegen, ohne das Root-Passwort weiterzugeben.
Verwaltung der Firewall
Ein wichtiger Aspekt für die Sicherheit des VPS ist die Verwaltung der Firewall. In Rocky Linux ist die Firewall standardmäßig aktiv, mit einer Grundkonfiguration, die Verbindungen per SSH (Standard-Port TCP 22) und zur Web-Konsole Cockpit (Port TCP 9090) erlaubt; letzterer Dienst ist nicht aktiv — wenn Sie also versuchen, die Adresse https://ip_vps:9090 aufzurufen, erhalten Sie keine Antwort. Anders als die von Debian abgeleiteten Betriebssysteme (etwa Ubuntu Server) verwendet Rocky Linux firewalld: Die Befehle für seine Konfiguration unterscheiden sich daher von ufw (wer üblicherweise mit Ubuntu arbeitet, weiß, wovon wir sprechen).
Stellen wir als ersten Schritt sicher, dass die Firewall läuft:
$ sudo firewall-cmd --state
Da Sie einen Nicht-Root-Benutzer verwenden, werden Sie nach dem Passwort gefragt. Wenn alles wie erhofft verläuft, lautet die Ausgabe schlicht „running“.
Die aktuelle Firewall-Konfiguration prüfen wir mit dem Befehl:
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Hier sehen wir, dass die aktive Zone public (active) heißt, dass ihr die Netzwerkschnittstelle eth0 zugewiesen ist, dass eingehende Verbindungen für die Dienste cockpit, dhcpv6-client und ssh erlaubt sind und dass ICMP-Antworten zugelassen werden — icmp-block-inversion: no (Beispiel: die Antworten auf den Befehl ping).
Die Zone public blockiert standardmäßig jede eingehende Kommunikation, sofern nichts anderes festgelegt ist. Ein grundlegendes Konzept von firewalld ist, dass alle Änderungen an der Konfiguration temporär sind, sofern nicht der Parameter --permanent vor dem Befehl verwendet wird. Das heißt: Würden wir beispielsweise den Port 443 öffnen, um den Zugriff per HTTPS zu erlauben, mit folgendem Befehl:
$ sudo firewall-cmd --zone=public --add-service=https
wäre diese Regel beim nächsten Neustart des VPS nicht mehr vorhanden. Möchten wir sie hingegen permanent machen, genügt — wie gesagt:
$ sudo firewall-cmd --permanent --zone=public --add-service=https
Den Port des SSH-Dienstes ändern
Wie der geniale zeitgenössische Schriftsteller Ken Follett über das Vertrauen sagen würde: „Jemandem zu vertrauen ist, als hielte man Wasser in den zur Schale geformten Händen …“; wenn wir über IT-Sicherheit sprechen, stellen Sie sich vor, das Wasser mit völlig gespreizten Fingern zu halten. Da wir den „Jemand“ nicht kennen können, der versuchen wird, sich mit Ihrem VPS zu verbinden, schenken wir ihm keinerlei Vertrauen. Ein bereits in anderen Artikeln gegebener Tipp ist, den Standard-Port des SSH-Dienstes zu ändern: Dieser einfache Schritt verringert die unautorisierten Zugriffsversuche von Skripten, die automatisch eine Verbindung über den Port 22 versuchen.
Bevor wir mit der Konfiguration beginnen, legen wir fest, welchen Port wir verwenden: In diesem Beispiel haben wir den Port 4322/TCP gewählt.
Schritt 1 — Wir konfigurieren die Firewall. Wir fügen der Firewall-Konfiguration den Port 4322/TCP hinzu:
$ sudo firewall-cmd --permanent --zone=public --add-port=4322/tcp
Wie Sie sehen, haben wir den Parameter verwendet, um die Konfiguration permanent zu machen. Nun laden wir alle Parameter neu und vergewissern uns, dass keine Fehler vorliegen:
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports
In der Ausgabe erscheint unser 4322/tcp.
Schritt 2 — Wir konfigurieren den SSH-Dienst. Das Vorgehen zum Ändern des Standard-Ports ist recht einfach: Es genügt, in der Datei /etc/ssh/sshd_config die Portnummer zu ändern und anschließend den Dienst neu zu starten. Zum Bearbeiten der Datei verwenden wir den Editor nano:
$ sudo nano /etc/ssh/sshd_config
Alles, was in dieser Datei mit „#“ beginnt, ist ein Kommentar und wird vom System nicht berücksichtigt; zugleich verrät es uns aber den Standardwert. Wir suchen die Zeile, die mit #Port 22 beginnt, entfernen das Zeichen „#“ und ändern den Wert des Ports — oder wir fügen direkt unter dem Kommentar eine Zeile mit unserem neuen SSH-Port hinzu: Port 4322. Bleibt nur noch, die Änderung mit STRG+X zu speichern und mit Y zu bestätigen.
Damit die Änderungen wirksam werden, muss der Dienst neu gestartet werden:
$ sudo systemctl restart sshd.service
Wenn Sie jetzt versuchen, sich per SSH mit Ihrem VPS zu verbinden, erhalten Sie die Meldung ssh: connect to host IP_VPS port 22: Connection refused. Um sich verbinden zu können, muss dem Befehl die Option -p gefolgt vom neuen Port hinzugefügt werden:
ssh mio_utente@IP_VPS -p 4322
Den Root-Zugriff per SSH deaktivieren
Für mehr Sicherheit Ihres VPS wird dringend empfohlen, dem Benutzer root den Zugriff per SSH nicht zu erlauben: Zu diesem Zweck haben wir zuvor einen Benutzer mit eingeschränkten Privilegien angelegt, der bei Bedarf root werden kann. Nun unterbinden wir den SSH-Zugriff für root. Auch in diesem Fall müssen wir die Konfigurationsdatei des SSH-Dienstes bearbeiten, wie schon beim Wechsel des Standard-Ports.
Wir öffnen die Datei /etc/ssh/sshd_config mit dem Editor nano ($ sudo nano /etc/ssh/sshd_config), suchen die Zeichenfolge „PermitRootLogin yes“ und setzen sie auf „no“:
# Authentication:
#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
Wir speichern die Änderung mit STRG+X und bestätigen mit Y. Anschließend starten wir den Dienst neu, damit die Änderungen wirksam werden:
$ sudo systemctl restart sshd.service
Auch wenn es unbequem erscheinen mag, root die Verbindung per SSH zu verwehren, ist dies ein wichtiger Schritt, um das Sicherheitsniveau des VPS zu erhöhen. Sollten Sie sich direkt mit dem Benutzer root an der Maschine anmelden müssen, können Sie jederzeit die Web-Konsole im Dashboard Ihres VPS GREEN-Kontos verwenden.
Diese Anleitung erschien ursprünglich im Blog von VPS GREEN, dem VPS-Dienst auf unserer grünen Private Cloud.