(31) Was zu tun mit einem frisch Installiertem Ubuntu Server

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)

Dieser Beitrag wurde unter HomeLab, Weblinks abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.