SSH-Keys generieren und verwenden

Normalerweise erstellt der Befehl ssh-keygen einen Schlüssel id_rsa unter dem Home Verzeichnis. Was aber, wenn wir mehrere SSH-Keys verwenden wollen? Den SSH-Key erstellen wir hier für einen normalen Benutzer und niemals für root!

Server IP: 123.45.678.90
Benutzer: USER
SSH-Key: id_rsa_local

auf dem Server (hier die IP 123.45.678.90)

Erstelle mittels ssh-keygen den Schlüssel (hier id_rsa_local) und kopiere diesen mittels cat nach ~/.ssh/authorized_keys

$ ssh-keygen -m PEM -t rsa -b 4096
$ cat ~/.ssh/KEYNAME.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

läuft der Server auf einem anderen Port als 22, ist der Port (hier 1004) anzugeben:

$ cat ~/.ssh/KEYNAME.pub | ssh USER@123.45.678.90 -p 1004 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
$ ssh-keygen -m PEM -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/USER/.ssh/id_rsa): /home/USER/.ssh/id_rsa_local
  (...)
  (...)
  (...)
$ cat ~/.ssh/id_rsa_local.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
The authenticity of host '123.45.678.90 (123.45.678.90)' can't be established.
ED25519 key fingerprint is SHA256:bL8trr2HdSSw777CXIanpYeXvo1826v1Kj78UMa5NtE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '123.45.678.90' (ED25519) to the list of known hosts.
USER@123.45.678.90's password: DEIN USER PASSWORT

Nun lassen wir uns den SSH-Key anzeigen und kopieren diesen Schlüssel auf unseren Client-PC:

$ less ~/id_rsa_local
diesen Key kopierst du nun vom Server auf den Client-PC unter ~/.ssh

Client PC

auf dem Client PC benötigen wir den ssh-key und ein config-File. Der ssh-key (hier id_rsa_local) muss die Berechtigung 600 haben. Diese Berechtigung ist per root zu setzen:

# chmod 600 /home/BENUTZER/.ssh/id_rsa_local

Erstelle unter ~.ssh ein config File mit:

$ nano ~/.ssh/config

# ssh configuration file
# BEISPIEL / EXAMPLE
# HostName = IP Adresse des Servers, z.B. 123.45.67.890

Host local
HostName 123.45.678.90
Port 123456
User USER
IdentityFile ~/.ssh/id_rsa

Host mailserver
HostName 25.10.200.4
Port 22
User dana
IdentityFile ~/.ssh/id_rsa_mailserver

Host backupserver
HostName 9.12.200.5
Port 22
User annalena
IdentityFile ~/.ssh/id_rsa_backupserver

Auf den Client-PC benötigen wir ein config-File unter ~/.ssh/config und natürlich den SSH-Schlüssel. Hier id_rsa_local

Nun reicht die Übergabe des Host nach ssh:

$ ssh local

root-Login und Passwort verbieten

Vorsicht! Mach dies nur, wenn mit der Anmeldung SSH-Key wirklich alles klappt. An sonst kannst du dich vom System aussperren. Editiere dazu die /etc/ssh/sshd_config

# nano /etc/ssh/sshd_config

Setze nun PasswordAuthentication und PermitRootLogin auf den Wert no
PermitRootLogin no
PasswordAuthentication no

starte den Dienst neu:

# systemctl restart sshd

weitere Verschlüsselungen

Erstellen wir den Schlüssel mittels ED25519 oder ECDSA ist das Vorgehen analog! Der öffentliche Schlüssel (z.B. id_ecdsa.pub) muss nach ~/.ssh/known_hosts kopiert werden, während der geheime Schlüssel (z.B. id_ecdsa) auf dem Client-PC landen muss.

$ ssh-keygen -t ed25519
$ cat ~/.ssh/id_ed25519.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

oder alternativ

$ ssh-keygen -t ecdsa -b 521
$ cat ~/.ssh/id_ecdsa.pub | ssh USER@123.45.678.90 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Windows

Nun übertragen/kopieren wir den privaten Schlüssel id_rsa nach: C:\Users\BENUTZER\.ssh

Achte darauf, bei Windows die Dateierweiterung .txt zu entfernen. Die Datei heisst hier id_rsa und nicht id_rsa.txt

Bei einem Login wird nun der private Schlüssel auf Deinem PC mit dem Schlüssel auf dem Server abgeglichen. Passen die zusammen, wird die Verbindung akzeptiert.

Linux

Hier muss zwingend die Berechtigung vom id_rsa Schlüssel unter ~/.ssh/id_rsa auf 600 gesetzt werden. Ansonst kommt es zu diesem Vorfall:

$ ssh yuna@192.168.0.81 -p 22
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0770 for '/home/BENUTZER/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/BENUTZER/.ssh/id_rsa": bad permissions
yuna@192.168.0.81's password: 
(...)

Die korrekte Berechtigung setzen wir mittels:

# chmod 600 /home/BENUTZER/.ssh/id_rsa

crontab in Debian

crontab erstellen

Mittels crontab lassen sich auf deinem Server Prozesse automatisieren. Angenommen, ich möchte jeden Tag um 00:10 Uhr die gesamte Datenbank sichern.

Starte crontab:

$ crontab -e

Im Editorfenster geben wir nun den gewünschten crontab ein:
# sichere die Datenbank alle Tage um 00:10. Überschreibe das aktuelle File jeweils:
10 0 * * * /usr/bin/mysqldump --all-databases --single-transaction --quick --lock-tables=false -r /opt/dbfull.sql

crontab sorgt dafür, dass die jeweiligen Files zum angegebenen Zeitpunkt auf dem Server liegen.

root darf alles, wirklich alles!

Dabei spielt es eine wesentliche Rolle, ob wir crontab als normalen Benutzer oder als root ausführen. root darf alles!
Editiere in diesem Fall die /etc/crontab – hier kannst du den Benutzer, welcher den Befehl ausführen soll auch gleich mitgeben. Doch Vorsicht! root kann wirklich alles. Du kannst hier auf Kommando auch dein gesamtes System zerstören!

# crontab -e

Zeitstempel

Geben wir der Zielatei keinen Zeitstempel mit, überschreibt crontab das jeweilige File. Einen Zeitstempel geben wir mittels date an:

example_$(date +"\%Y-\%m-\%d_\%H-\%M").sql

wird z. B. zu:
example_2004-03-05_09-58.sql
In diesem Beispiel entspricht dies dem 05. März 2004 um 09:58 Uhr. (YYYY/mm/DD/HH/MM)

Zeit bestimmen (Beispiele)

# Zeitbeispiele
.---------------- Minuten (0 - 59)
| .------------- Stunden (0 - 23)
| | .---------- Tag im Monat (1 - 31)
| | | .------- Monat (1 - 12) oder jan,feb,mar,apr ...
| | | | .---- Tag der Woche (0 - 6) (Sonntag=0 oder 7) oder mon,tue,wed,thu,fri,sat
| | | | |
* * * * *
# sendet jeden Tag um 12:00 Uhr einen ping an example.com
0 12 * * * ping -c1 example.com

# sendet jeden Montag, Mittwoch und Freitag um 04:05 Uhr einen ping an example.com
5 4 * * mon,wed,fri ping -c1 example.com

# sendet alle 20 Minuten einen ping an example.com
*/20 * * * * ping -c1 example.com

Damit lässt sich z. B. eine einfache Backuplösung realisieren.

USB Stick verschlüsseln

Um einen USB-Stick zu verschlüsseln, reichen die Bordmittel von Debian bei weitem aus. Hier erstellen wir einen leeren, verschlüsselten USB-Stick unter: Example/Beispiel =>  /dev/sdb

Hinweis: der Stick ist nur auf einem Linuxsystem verwendbar. Windows 10 oder Windows 11 erkennt das Dateisystem ext4 nicht und verlangt eine Formatierung, sobald der Stick eingesteckt wird.

Installiere das Paket cryptsetup (falls nicht schon installiert und geladen) und lade das Modul:

# apt install cryptsetup
# modprobe dm_crypt

möchtes du vorab sicher gehen, kann der Stick vorab mit zufälligen Daten überschriben werden. Vorsicht: das kann durchaus ein paar Stunden dauern, falls der Stick > 128 GB hat! Für meinen 32 GB Stick dauerte es 1200 Sekunden oder rund 20 Minuten.

# dd bs=4K if=/dev/urandom of=/dev/sdb1

01. mittels fdisk formatieren wir unseren Stick. Vorsicht! Überprufe lieber 3x ob du die richtige Partition/Laufwerk angibst. Gibst du hier irrtümlich die Windows-Partition an, führt dies unweigerlich zu einem Datenverlust. Partitionen können mittels blkid angezeigt werden:

# blkid
# fdisk /dev/sdb

02. erstelle mittels cryptsetup die verschlüsselte Partition und vergib ein sicheres Passwort:

# cryptsetup -yvh sha256 -c aes-xts-plain -s 256 luksFormat /dev/sdb1

WARNUNG!
========
Hiermit werden die Daten auf »/dev/sdb1« unwiderruflich überschrieben.

Sind Sie sicher? (Tippen Sie 'yes' in Großbuchstaben): YES
Geben Sie die Passphrase für »/dev/sdb1« ein: starkes passwort
Passphrase bestätigen: starkes passwort
Schlüsselfach 0 erstellt.
Befehl erfolgreich.

03. öffne nur die Partition mittels cryptsetup und gib das vorhin definierte Passwort ein:

# cryptsetup luksOpen /dev/sdb1 crypto
Geben Sie die Passphrase für »/dev/sdb1« ein: dein starkes passwort

04. erstellen das Dateisystem (hier: ext4)

# mkfs.ext4 /dev/mapper/crypto
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 7506688 4k blocks and 1876800 inodes
Filesystem UUID: cf1b244e-f206-4cc9-964e-7dfe965045c2
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

05. nun hängen wir den Stick nach /mnt ein und ändern die Zugriffsrechte auf den normalen Benutzer (BENUTZER), da wir hier ja immer noch mit root arbeiten:

# mount /dev/mapper/crypto /mnt
# chown -R BENUTZER:BENUTZER /mnt

06. fertig! Hänge den Stick aus:

# umount /mnt

Wird der Stick jetzt erneut eingestöpselt, verlangt Debian das Passwort:

Übersicht der Laufwerke: der Stick ist am geöffneten Schlosssymbol zu erkennen.

Gratuliere zu 2.85%

StatCounter erhebt die Daten anhand von über 16,3 Milliarden Page Views pro Monat und eruierte daraus wie viele Linuxuser im weltweiten Netz unterwegs sind. Microsofts Windows-Betriebssystem erzielte im März 2023 einen Marktanteil an den weltweiten Page Views von rund 69,4 Prozent. Apples macOS kam im selben Monat auf einen Wert von rund 17,2 Prozent, die Linux-Betriebssysteme erzielten 2,85 Prozent. Die Daten wurden anhand der Internetnutzung mit Desktop- und Notebook-PCs (ohne Smartphones und Tablets) erhoben. [Quelle]

Steam auf Debian

Steam lässt sich in Debian installieren. Sind die Grafiktreiber installiert, steht dem Spielvergnügen fast nichts mehr im Weg. Warum fast? – SteamOS + Linux unterstütz nur einen sehr kleinen Teil der gesamten Steamspiele.

# dpkg --add-architecture i386
# apt update
# apt install steam

Store > Categories
filtere die Spiele nach SteamOS + Linux. Jetzt werden dir die kompatiblem Spiele angezeigt. Sind die Grafiktreiber installiert, lässt sich unter Steam kompatible Spiele sogar in 4k spielen.

 

Let’s encrypt (certbot) um eine Domain erweitern

Let’s encrypt bietet kostenlose Zertifikate zur Verschlüsselung an. In diesem Beispiel erweitern wir unser bestehendes Zertifikat um die Domain newexample.com. Das Vorgehen für eine Subdomain ist dasselbe. Mittels:

# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: example.com
    Serial Number: 1234567890acb1234567890abc1234567890
    Key Type: ECDSA
    Domains: example.com test.example.com example2.com example3.com
    Expiry Date: 2023-07-28 17:09:45+00:00 (VALID: 87 days)
    Certificate Path: /etc/letsencrypt/live/nyx7.ch/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/nyx7.ch/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

wird uns der Zertifikatsname mit allen zugehörenden Domains angezeigt. Möchten wir nun das bestehende Zertikikat um eine Domain oder Subdomain (newexample.com) erweitern, müssen wir das Zertifikat example.com für alle Domains und Subdomains erweitern. Die Erweiterung des Zertifikates machen wir per expand:

# certbot --expand -d example.com,test.example.com,example2.com,example3.com,newexample.com
# certbot --expand -d example.com,test.example.com,example2.com,example3.com,newexample.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Renewing an existing certificate for example.com and 4 more domains

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2023-07-30.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for example.com to /etc/apache2/sites-enabled/000-default-le-ssl.conf
Successfully deployed certificate for test.example.com to /etc/apache2/sites-enabled/000-default-le-ssl.conf
Successfully deployed certificate for example2.com to /etc/apache2/sites-enabled/000-default-le-ssl.conf
Successfully deployed certificate for example3.com to /etc/apache2/sites-enabled/000-default-le-ssl.conf

We were unable to find a vhost with a ServerName or Address of newexample.com.
Which virtual host would you like to choose?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: 000-default-le-ssl.conf        | Multiple Names        | HTTPS | Enabled
2: 000-default.conf               |                       |       | Enabled
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Successfully deployed certificate for newexample.com to /etc/apache2/sites-enabled/000-default-le-ssl.conf
Your existing certificate has been successfully renewed, and the new certificate has been installed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Upgrade von Debian

Debian ist bekannt für seine enorme Stabilität. Einmal installiert, steht diesem Betriebssystem nichts mehr im Weg und es funktioniert. Stabilität geht jedoch meist auf Kosten von Aktualität. Die neuste Version von Typo3 (12.3.0) läuft nur unter PHP 8.2. Auf einem Debian 11 kann Typo3 somit nicht installiert werden. Entweder weicht man auf die Version Typo3 Version 11 aus, oder installiert gleich ein Debian 12 auf dem Server. Hier wird beschrieben, wie ein Debian 11 auf ein Debian 12 angehoben werden kann.

Übersicht (Stand April 2023)

DEBIAN 12 (testing/bookworm)
– Apache/2.4.56 (Debian)
– Server-Version: 10.11.2-MariaDB-1 – Debian 12
– PHP-Version: 8.2.4

DEBIAN 11 (bullseye)
– Apache/2.4.56 (Debian)
– Server-Version: 10.5.18-MariaDB-0+deb11u1 – Debian 11
– PHP-Version: 7.4.33

Bearbeite die /etc/apt/sources.list und ersetzte alle bullseye mit bookworm.
Ab Debian 12 ist die Paketquelle non-free bereits in den Repos enthalten. Ergänze die Paketquelle ggf. mit non-free-firmware:

deb http://deb.debian.org/debian bookworm main contrib non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free-firmware

Hinweis: einige Anbieter von Cloud-Server betreiben unter /etc/apt/sources.list.d noch eigene Paketdateien. Hier muss die Anpassung auch erfolgen, ansonst kann es zu einem unschönen Versionmix kommen!

Editiere somit die /etc/apt/sources.list und aktuallisiere das gesamte System mittels apt:

# nano /etc/apt/sources.list
# apt update
# apt upgrade
# apt dist-upgrade
mit der Option JA vermeiden wir die Abfrage aller neu zu startenden Dienste. NEIN stoppt bei jeden Dienst und fragt uns anschliessend danach.

Konfigurationsdateien

Normalerweise ist es ratsam, die lokal installierte Version einer Konfigurationsdatei zu behalten. sshd_config regelt unter anderem den eigenen ssh-Port oder das Verbieten eines Klartextpasswortes. Sind eigene Anpassungen in der sshd_conf gemacht worden, sollte die lokal installierte Version beibehalten werden. Alternativ installiert man hier die Version vom Paketbetreuer und ändert die Werte dann manuell nach. Auch unter der apache2.conf sind eigene Anpassungen keine Seltenheit.

Konfigurationsdatei »/etc/apache2/apache2.conf«
 ==> Geändert (von Ihnen oder von einem Skript) seit der Installation.
 ==> Paketverteiler hat eine aktualisierte Version herausgegeben.
   Wie möchten Sie vorgehen? Ihre Wahlmöglichkeiten sind:
    Y oder I : Die Version des Paket-Betreuers installieren
    N oder O : Die momentan installierte Version beibehalten
       D     : Die Unterschiede zwischen den Versionen anzeigen
       Z     : Eine Shell starten, um die Situation zu begutachten
 Der Standardweg ist das Beibehalten der momentanen Version.
*** apache2.conf (Y/I/N/O/D/Z) [Vorgabe=N] ?
hier behalten wir unsere lokale Datei

root-Passwort zurücksetzen

Mittels dem Bootparameter init=/bin/bash lässt sich das root-Passwort zurücksetzen, falls dies vergessen wurde. Das funktioniert jedoch nur, wenn das System nicht verschlüsselt ist und der grub-Bootloader nicht abgesichert ist. Physischer Zugang ist ebenfalls Voraussetzung.

drücke hier die Taste e
tippe hier den Bootparameter init=/bin/bash ein und drücke F10, um zu booten.

Hinweis
In diesem Modus ist die Tastatur auf das US-Keyboard eingestellt.
Wähle hier ein sehr einfaches Passwort wie passwd 123456 und ändere dies nach dem reboot ab. Damit verhinderst du Sonderzeichen, welche nach dem reboot auf anderen Tasten liegen.

Folgende Zeichen findest Du auf loadkeys de_CH-latin1 Tastatur.

- auf dem ?
/ auf dem -
_ auf SHIFT + ?
, auf dem ,
= auf dem ` (rechts vom ?)

In der gestarteten Bash kann nun das root-Passwort zurückgesetzt werden:

init=/bin/bash
# mount -o remount,rw /
# passwd
# mount -n -o remount,ro /
# reboot -f

WordPress-Login mittels fail2ban schützen

fail2ban schützt dein WordPress-Login nach mehreren, fehlgeschlagen Versuchen und sperrt die entsprechende IP-Adresse aus. Installiere das Paket fail2ban:

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

Den aktuellen Status von fail2ban rufst 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.

1. Erstelle nun einen Filter unter

# nano /etc/fail2ban/filter.d/wordpress.conf

[Definition]
failregex = ^<HOST> .* "POST .*wp-login.php
^<HOST> .* "POST .*xmlrpc.php
ignoreregex =

2. Anschliessend erstellen oder ergänzen wir noch die entsprechende jail-Datei unter:

# nano /etc/fail2ban/jail.local

[wordpress]
enabled = true
port = http,https
filter = wordpress
action = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
logpath = /var/log/apache2*/access*log
maxretry = 3
findtime = 60m

3. Starte fail2ban neu:

# /etc/init.d/fail2ban restart

Mittels fail2ban-client -i kann der Status vom jail wordpress abgefragt werden. Hier z. B. wurde die IP 12.34.567.89 nach mehreren, fehlgeschlagen Versuchen gesperrt.

# fail2ban-client -i
fail2ban> status wordpress
Status for the jail: wordpress
|- Filter
|  |- Currently failed: 9
|  |- Total failed:     12
|  `- File list:        /var/log/apache2/access.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   12.34.567.89

Falls du dich versehentlich selbst aus WordPress ausgesperrt hast, kann die IP wieder entsperrt werden.

fail2ban> set wordpress unbanip 12.34.567.89

Bootparameter GRUB / Debian

Bootoptionen oder Bootparameter können bei Debian direkt manuell eingegeben werden. Falls der aktuelle Kernel beim Booten stehen bleibt, können wir versuchen, mit verschiedenen Bootoptionen dies zu verhindern. Hier ein Beispiel mittels acpi=off:

Um die Einstellungen permanent zu übernehmen, editiere die Datei grub:

# nano /etc/default/grub

die Zeile dazu lautet: GRUB_CMDLINE_LINUX_DEFAULT="quiet acpi=off"

aktuallisiere anschliessend den Bootloader mit:

# update-grub
drücke hier die Taste e