Einleitung
Hier folgen nun meine persönlichen Einstellungen wie ich meine Ubuntu Server einrichte, damit diese abgesichert sind, sich selber updaten und bei Bedarf automatisch eigene Scripts starten.
Ein How to mit best practices für einen sicheren Server
Das Setup von Docker und die Einrichtung von einem Portainer bzw. Portainer Agent (hiermit kann man den Docker zentral von einer anderen Docker/Portainer Instanz verwalten). Alles mit automatischen Updates der Docker Container und der Einrichtung eines Reverse Proxy, der Einrichtung von Authelia um eine zusätzliche Passwort Absicherung hinzuzufügen ergänzen das ganze perfekt.
Installationen und Updates
Nach einer frischen Installation erst einmal alles auf neuesten Stand bringen:
sudo apt-get -y update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get autoremove -y
sudo apt install curl -y
Zeitzone einstellen / korrigieren
sudo timedatectl set-timezone Europe/Berlin
Benutzer neben dem Root anlegen
Ich richte auf jeden Fall einen nicht Root User an, diesen füge ich dann aber auch in eine Gruppe wo man bei sudo Befehlen nicht immer das Passwort neu eingeben muss. Das ist erst einmal eine unsichere Sache, aber die Abschirmung erfolgt an andere Stelle.
adduser <DEIN NAME>
Gebe ein Passwort und den vollen Namen ein, den Rest kannst du mit Enter bestätigen
sudo nano /etc/sudoers
Dort unten anhängen:
%sudo ALL=NOPASSWD: ALL
Weiter geht es mit
sudo usermod -aG sudo <DEIN NAME>
SSH Zugang mit Keys absichern
Startsystem
Als erstes erstellt Ihr Euch auf allen Systemen einen Private und Public Key.
Der Private Key verbleibt unbedingt immer auf diesem Rechner und wird NIE weiter gegeben. Der Public Key kann entweder verteilt werden oder auf allen Rechnern installiert werden auf denen dieser Rechner mit diesen Benutzer Zugriff per SSH Zugang haben darf.
Ich benutze dazu das „ed25519“ Format, momentan einer der sichersten Schlüssel.
Die Anweisung beschränkt sich hier auf einem Linux Rechner bzw Mac, die Befehle werden über die Konsole eingegeben. Sie Funktionieren aber auf allen Plattformen die es gibt, auch Windows -> Hier muss man evtl. etwas googeln um die korrekten Befehle zu bekommen.
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/<KEY NAME> -C "<Benuter>@<Rechner>" eval "$(ssh-agent -s)" ssh-add ssh-add -k ~/.ssh/<KEY NAME>
Der <KEY NAME> ist wichtig um diesen wieder zu finden, die Bezeichnung <Benuter>@<Rechner> nutze ich um die Unterschiedlichen Public Key später identifizieren zu können.
Es gibt jetzt mehrere Möglichkeiten diesen Key an ein Zielsystem zu verteilen, einmal mit:
ssh-copy-id -f -i ~/.ssh/<KEY NAME> benutzer@ZielSystem
Ich mache das aber noch anders, da ich mehrere Keys habe, schreibe ich sie mir heraus in eine eigene Datei, so habe ich die Public Keys immer zur Hand
cd ~/.ssh ls
dieser Befehl wechselt in das ssh Verzeichnis und listet die Dateien auf.
Es sollten dort liegen
authorized_keys -> Hier kommen die Public Keys rein, welche Rechner Zugriff haben dürfen
<KEY NAME> -> Hier liegt der Private Key, am besten geht Ihr hier nicht dran und haltet ihn Geheim
<KEY NAME>.pub -> Hier liegt der Public Key, das ist die Info die wir haben wollen:
cat <KEY NAME>.pub
Dieser Befehl gibt Euch den Key aus, speichert ihn in eine Text Datei mit der Beschreibung von welchem Benutzer / Rechner er stammt, zb „<Benuter>@<Rechner>.txt“
Zielsystem
Dazu aus dem root Benutzer ausloggen und nun mit dem neu angelegtem Benutzer wieder einloggen. Ihr seit nun im „/home/<DEIN NAME>/“ Verzeichnis.
mkdir ~/.ssh && chmod 700 ~/.ssh cd .ssh nano authorized_keys
Fügt nun hier unten in der Datei den Public Key ein aus „<Benuter>@<Rechner>.txt“
sudo chmod 700 ~/.ssh && sudo chmod 600 ~/.ssh/*
Der Befehl setzt noch schnell die korrekten Rechte auf die Dateien, falls diese nicht schon korrekt sind.
SSH Zugang beschränken auf KEY Inhaber
sudo nano /etc/ssh/sshd_config
Hier müssen folgende Zeilen aktiviert oder mit # auskommentiert werden:
#PermitRootLogin prohibit-password PasswordAuthentication no PermitRootLogin no
Dieser Befehl startet das SSH neu
sudo service ssh restart
ACHTUNG: Danach kommt Ihr nicht mehr mit einem Passwort oder Root Benutzer auf den Server, testet es im Zweifel vorher aus ob der KEY korrekt funktioniert .
Weiterer Remote Zugang (Optional)
Ich benutze teilweise auch Meshcentral, das ist ein guter Zeitpunkt den LINK zur Anbindung an Meshcentral hier einzugeben. Eine Anleitung wie man diesen Installiert und nutzt folgt
FIREWALL (Optional)
Zeige alle offenen Ports im System
sudo ss -tupln
Installiere die Linux Firewall UFW
sudo apt install ufw
Schaue Dir den Firewall Status an
sudo ufw status
Öffne eingehende Ports in der Firewall mit
sudo ufw allow {port number}
sudo ufw allow 22
Der letzte Befehl mit Port 22 ist äusserst wichtig, wenn du diesen nicht freigibst und die Firewall aktivierst, dann kommst du nicht mehr mit SSH auf den Server!
-> Ob man das braucht hängt vom eigenem Setup ab, je nachdem wie das eigene Netzwerk abgesichert kann es Sinn machen oder nicht. Andersherum vergißt man, gerade in einem Docker Setup, gerne die Freigabe einer der Ports, dann wundert man sich, warum der Container nicht erreichbar ist.
Löschen von Rules
sudo ufw status numbered sudo ufw delete {Nummer}
Aktiviere Firewall
sudo ufw enable
Deaktiviere Firewall
sudo ufw disable
Firewall neu laden (nach hinzufügen neuer Port)
sudo ufw reload
Automatische Updates, Scripts und mehr
Enable Automatic Updates
sudo apt install unattended-upgrades sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Die Abfrage mit „yes“ bestätigen und in der Datei folgendes Eingeben:
Unattended-Upgrade::Automatic-Reboot "false"; Unattended-Upgrade::Mail "<DEINE EMAIL ADRESSEY>";
Updates werden zwar installiert später, aber der Rechner nicht sofort neu gestartet, eine Email wird bei jedem Event geschickt an die Adresse
sudo dpkg-reconfigure --priority=low unattended-upgrades
Erstelle Script folder
Alle Scripts sollen sich in einem Verzeichnis befinden später
sudo mkdir /script sudo nano /script/restart.sh
In die Datei eingeben:
#!/bin/bash if [ -f /var/run/reboot-required ]; then /sbin/reboot now fi
Es wird nur neu gestartet, falls es updates gibt, welche dieses auch verlangen
sudo nano /script/update.sh
In die Datei eingeben:
#!/bin/bash
sudo apt-get -y update && sudo apt-get -y upgrade && sudo apt-get autoremove -y
# Weiterer Befehl für Software Update auf diesem Server
Hinter weiterer Befehl kann man zb Script eintragen welche direkt mit abgearbeitet werden sollen, zb ein Update des Iobroker, das Laden der Pihole Server und und und
Dieser Befehl macht die Dateien ausführbar
sudo chmod +x /script/restart.sh sudo chmod +x /script/update.sh
sudo crontab -e
Beim ersten Start z.b. nano wählen und unten folgende Zeilen anhängen
0 0 * * * sudo /script/update.sh 0 1 * * 6 sudo /script/restart.sh
Der Crontab macht jede Nacht um 0:00h ein Update, einmal die Woche Woche, am Samstag Nacht 1:00h wird entschieden ob der Rechner neu zu starten ist.
fail2ban installieren (optional)
Mit fail2ban kann man erfolglose Angriffsversuche stoppen, in dem der Angreifer (IP) für eine bestimmte Zeit gesperrt wird, da die Einstellung aber Je nach Programm recht schwer ist für ungeübte, mache ich die Anleitung nur zum Sperren erfolgloser SSH Angriffe.
sudo apt install fail2ban -y sudo systemctl enable fail2ban sudo systemctl status fail2ban
Bevor wir starten erstellen wir eine Kopie der original Konfiguration
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jailORIG.local
Wir öffnen die Datei mit
sudo nano /etc/fail2ban/jail.conf
wir suchen dann (mit ^W bzw Steuerung W ) zb. nach dem Eintrag für Nginx „[nginx-http-auth]“ oder SSH Zugang [sshd]
Bei [sshd] aktiviert man
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
Alle Einstellungen und Optionen zu Zeigen würde eine eigene Anleitung werden, diese Befehle sind noch ganz interessant:
Neustart Fail2ban nach Änderung
sudo systemctl restart fail2ban
Anzeige der Aktivierten Ports
sudo fail2ban-client status
Anzeige der Details zu einem der Ports
sudo fail2ban-client status sshd
Mail einrichten
Es gibt viele Wege Email zu aktivieren, ich möchte aber nur Emails gesendet bekommen und keine Empfangen, diese Methode ist zumindest schnell zu installieren und funktioniert!
sudo apt update sudo apt install msmtp msmtp-mta -y sudo nano /etc/msmtprc
Dort gebt Ihr die Einstellungen eines Eurer Mailprovider an, am besten einen, der nicht prüft woher gesendet wird, ich nutze Allinkl als Domain und Email Provider, der ist einfach gut, ich kann sogar einstellen in welchem Namen ich etwas versenden möchte ohne die Adresse direkt zu besitzen (zb. Benutzer@Rechnername)
# Set defaults. defaults # Map local users to mail addresses (for crontab) aliases /etc/aliases # Syslog logging with facility LOG_MAIL instead of the default LOG_USER syslog LOG_MAIL # Enable or disable TLS/SSL encryption. tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt # Setup Provider to send emails via SMTP account Providername host <Mein Mailserver> port 587 auth login user <Benutzername> from server@%H.MeineDomain.de password <MeinPasswort> # Set a default account account default : Providername # Mail Header set_from_header on
Die Daten sind auszutauschen und funktionieren mit Ubuntu 22.04, falls Ihr hier noch Ubuntu 20.04 habt, dann müsst ihr das „set_from_header on“ auskommentieren mit # und den Absender Namen server@%H.MeineDomain.de das „%H.“ weg nehmen, dieses setzt den Rechnernamen in der Absender Adresse, damit sieht man sofort welcher Rechner eine Mail sendet
sudo chown root:msmtp /etc/msmtprc sudo chmod 640 /etc/msmtprc sudo nano /etc/mailrc
Hier eintragen
set sendmail="/usr/bin/msmtp -t"
Dann:
sudo nano /etc/aliases
Hier eintragen
# /etc/aliases
root: Meine@EmpfangsMailAdresse.de
default: Meine@EmpfangsMailAdresse.de
Dann:
sudo newaliases sudo apt install mailutils -y
Testen der Email Funktion mit
echo "Test Nachricht von meinem Server" | msmtp Meine@EmpfangsMailAdresse.de
Mehr TO DO …. (folgt noch)