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


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] ?

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. Im Bootmenü muss «e» für edit gedrückt werden:

 

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


Klartextpasswort verbieten

Nachdem ein ssh-key generiert wurde und die Anmeldung geklappt hat, können wir noch einen Schritt weitergehen und verbieten die Anmeldung mittels Passwort. Öffne die sshd-Konfigurationsdatei:

# nano /etc/ssh/sshd_config

und kommentiere die Passwort-Authentifizierung aus und setze den Wert auf Nein:

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

Vorsicht: Damit kannst Du dich vom gesamten System aussperren. Mache dies nur, wenn Du sicher bist, was du hier genau tust!

Hinweis

es kann vorkommen, dass dies nicht auf Anhin klappt. Dann beginnen wir mit der Fehlersuche:

# ls -la /etc/ssh/sshd_config.d/*.conf
# sshd -T | grep -iE 'KbdInteractiveAuthentication|password|usepam'

der erste Befehl kann u.a. ausgeben:

# ls -la /etc/ssh/sshd_config.d/*.conf
-rw------- 1 root root 27 13. Jun 09:58 /etc/ssh/sshd_config.d/50-cloud-init.conf

der zweite Befehl kann u.a. ausgeben:

# sshd -T | grep -iE 'KbdInteractiveAuthentication|password|usepam'
usepam yes
passwordauthentication yes
kbdinteractiveauthentication no
permitemptypasswords no

Bedeutet: /etc/ssh/sshd_config.d/50-cloud-init.conf übersteuert unseren Befehl in sshd_config. Ein:

nano /etc/ssh/sshd_config.d/50-cloud-init.conf

mit dem Eintrag:
PasswordAuthentication no
bringt hier Abhilfe.

einen externen Server einbinden

sshfs lässt zu, einen entfernten Server in Debian einzubinden. Dieser Server wird als normales Laufwerk in Debian angezeigt und kann auch als solches verwendet werden. Dazu benötigen wir lediglich einen Debian-Server in der Minimalinstallation. Port 22 ist der einzige Port, der geöffnet werden muss. Falls der Server zusätzlich unter Windows 11 verfügbar sein soll, ist die Installation eines Samba-Servers notwendig.

Installiere nun auf der Workstation (nicht auf dem Server) das Paket sshfs:

# apt install sshfs

Auf dem Server, welcher Du nun einbinden möchtest, erstellst Du unter /home/benutzer einen Ordner share. Dasselbe gilt für Deine Workstation:

$ mkdir share

Das war’s bereits. Eingehängt wird der entfernte Server mittels sshfs und dem Zielpfad auf deinem Debiansystem.

$ sshfs benutzer@12.345.678.90:/home/benutzer/share /home/benutzer/share

Dabei gilt:

benutzer = Benutzername auf dem entfernten Server.
benutzer = Benutzername deines aktuellen Systems.
12.345.678.90 = IP-Adresse vom Server.

Hinweis

Das Einhängen vom Server niemals mit root-Rechten ausführen. Es ist ausreichend, einen normalen Benutzer zu erstellen und diesen Benutzer zu verwenden.

# adduser BENUTZER
# adduser share
Lege Benutzer »share« an ...
Lege neue Gruppe »share« (1001) an ...
Lege neuen Benutzer »share« (1001) mit Gruppe »share« an ...
Erstelle Home-Verzeichnis »/home/share« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues Passwort ein: 
Geben Sie das neue Passwort erneut ein: 
passwd: Passwort erfolgreich geändert
Benutzerinformationen für share werden geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
	Vollständiger Name []: Server_share
	Zimmernummer []: 
	Telefon geschäftlich []: 
	Telefon privat []: 
	Sonstiges []: 
Sind die Informationen korrekt? [J/n] J
root@debian:~# 

Midnight Commander (Dateimanager)

Der Midnight Commander gehört zu den «nice to have» Paketen auf einem Debianserver. Installiere ihn mittels:

# apt install mc

Der Midnight Commander erleichtert das Navigieren und Editieren der Dateien enorm. Während hier z.B. links die Ordnerstruktur ersichtlich ist, wird der Dateiinhalt rechts ausgegeben. Für mich zählt der Midnight Commander zu den nützlichsten Server-Tools überhaupt:

eigenes, kleines Netzwerk erstellen

Vorbereitung: ssh-Server

Mit Debian lässt sich ein kleines Netzwerk recht schnell realisieren. Hier wird das Grundprinzip eines einfachen Heimnetzwerk erklärt. Ein in die Jahre gekommener Laptop kann als ssh-Server eingesetzt werden. In meinem Beispiel entschied ich mich für einen HP Pavilion dv6 und dem Betriebssystem Debian GNU/Linux Bullseye.

Auf dem Laptop/Tower setzen wir nun unseren ssh-Server auf. Falls auf dem Laptop bereits ein Debian läuft, kann per

# apt install openssh-server

das nötige Paket nachinstalliert werden. Setzen wir Debian frisch auf, wählen wir bei der Softwareauswahl lediglich
[*] SSH Server
[*] Standard-Systemwerkzeuge

aus. Ein Desktopenvironment ist in diesem Fall nicht nötig. Alle anderen Dienste wie apache2, php und MariaDB lassen sich nachträglich installieren.

Melde Dich beim Server an und überprüfe den Status vom ssh Server. Der ssh-Server ist in diesem Beispiel gestartet und lauscht auf Port 22 (Standard).

# systemctl status ssh

Jetzt benötigen wir die IP-Adresse vom Server:

# ip address
(...)
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 98:4b:e1:9b:48:0d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.172/24 brd 192.168.0.255 scope global dynamic enp3s0
       valid_lft 2557sec preferred_lft 2557sec
    inet6 2a02:aa10:4201:8a80:9a4b:e1ff:fe9b:480d/64 scope global dynamic mngtmpaddr 
       valid_lft 936435sec preferred_lft 331635sec
    inet6 fe80::9a4b:e1ff:fe9b:480d/64 scope link 
       valid_lft forever preferred_lft forever
(...)

Von der Workstation aus können wir per ssh auf den Server zugreifen. Der allgemeine Befehl lautet:

$ ssh USERNAME@IPADRESS -p PORTNUMMER

Bei deiner allerersten Anmeldung wird der Fingerabdruck überprüft:

$ ssh lightning@192.168.0.172 -p 22
The authenticity of host '192.168.0.172 (192.168.0.172)' can't be established.
ECDSA key fingerprint is SHA256:VO+yY396S/SxMxo/VQDx55ZVLKpC2idiVSvQKu+6qrE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

HINWEIS
Nicht jede Fehlermeldung muss gleich auf einen Angriff hinweisen. Im Beispiel unten hat sich beim Server lediglich der Fingerabdruck geändert und stimmt mit dem gespeicherten Fingerabdruck auf der Workstation nicht überein. Dies ist der Fall, wenn Du deinen ssh-Server z. B. neu aufgesetzt hast und nun versuchst, mit dem alten Fingerabdruck den neuen Server zu erreichen. Entferne den Schlüssel mit:

# ssh-keygen -f "/home/BENUTZERNAME/.ssh/known_hosts" -R "192.168.0.172"

oder lösche die Datei unter:

# rm ~/.ssh/known_hosts
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:VO+yY396S/SxMxo/VQDx55ZVLKpC2idiVSvQKu+6qrE.
Please contact your system administrator.
Add correct host key in /home/yuna/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/yuna/.ssh/known_hosts:5
  remove with:
  ssh-keygen -f "/home/yuna/.ssh/known_hosts" -R "192.168.0.172"
ECDSA host key for 192.168.0.172 has changed and you have requested strict checking.
Host key verification failed.

Netzwerk verbinden (samba)

Client-PC
Hier läuft Windows 11 und es muss nichts weiteres unternommen werden. Prüfe lediglich, ob unter der Systemsteuerung die Netzwerkkennung eingeschaltet ist. PuTTY als SSH und Telnet Client ist optional, jedoch nicht nötig. Alle Einstellungen können auch direkt am Server vorgenommen werden.

Server
Hier läuft Debian GNU/Linux. Bevor samba installiert wird, kläre folgendes ab:

  • IP-Adresse vom Server (ip address)
  • Welcher Ordner bzw. Mountpunkt wird geteilt? Hier ist es /pfad/zum/mountpunkt

Installiere das Paket samba. Damit später auch ntfs-Dateisysteme (Partitionen) eingebunden werden können, ist das Paket ntfs-3g nötig. Werden ext4-Datesysteme eingebunden, kann auf das Paket verzichtet werden.

# apt install samba
# apt install ntfs-3g

Optional kann jetzt die Konfigurationsdatei gesichert werden. Dazu genügt ein:

# cp /etc/samba/smb.conf /etc/samba/samba.original

Öffne das Konfigurationsfile:

# nano /etc/samba/smb.conf

Editiere nun die smb.conf wie in diesem Beispiel.
# ======================= Global Settings ======================= #

[global]

## Browsing/Identification ###

# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = smb

####### Authentication #######

security = user

# This option controls how unsuccessful authentication attempts are mapped
# to anonymous connections
map to guest = bad password

# ======================= Share Definitions ===================== #

[homes]
comment = Home Directories
browseable = no

# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
read only = no
create mode = 0750

[public]
path = /pfad/zum/Ordner
public = yes
writable = yes
comment = smb share
printable = no
guest ok = yes

Starte den Samba-Server neu:

# systemctl restart smbd.service

Client-PC (hier Windows 11)
Auf dem Client-PC kann nun ein Netzlaufwerk verbunden werden. Wähle dazu in Windows 11 «Dieser PC»  > weitere Optionen anzeigen > Netzlaufwerk verbinden… und vergib einen Laufwerkbuchstaben und die IP des Servers, gefolgt von \public

Je nach Mountpunkt gibst du nach public noch die exakte Bezeichnung ein.
Einhängepunkte findest du bei Debian mittels df -h

# df -h
Dateisystem    Größe Benutzt Verf. Verw% Eingehängt auf
udev            3.9G       0  3.9G    0% /dev
tmpfs           790M    7.4M  783M    1% /run
/dev/sdb2        19G    4.5G   13G   26% /
tmpfs           3.9G       0  3.9G    0% /dev/shm
tmpfs           5.0M    4.0K  5.0M    1% /run/lock
/dev/sdb3       205G    121G   85G   59% /home/yuna/share/VMs
/dev/sdb1       240M    3.4M  236M    2% /boot/efi
/dev/sda1       932G    153G  780G   17% /home/yuna/share/BACKUP
tmpfs           790M     36K  790M    1% /run/user/112
tmpfs           790M     68K  790M    1% /run/user/1000

Partition /dev/sda1 wird in diesem Fall per
\\192.168.0.172\public\BACKUP
eingebunden.

Bei einem # apt upgrade werden auch die Pakete von deinem Sama-Server berücksichtig:

Die Installationsroutine von apt fragt danach, was mit deiner eigenen smb.conf geschehen soll. In der Regel ist es immer eine gute Idee, die lokal installierte Version zu behalten.

Sprache und Zeitzone einstellen (Debian GNU/Linux)

timedatectl gibt dir nähere Angaben zur Zeitzone und der locale:

# timedatectl
               Local time: Sun 2022-10-02 11:09:03 UTC
           Universal time: Sun 2022-10-02 11:09:03 UTC
                 RTC time: Sun 2022-10-02 11:09:03
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Für mein Beispiel stimmen gleich zwei Angaben nicht. Die lokale Zeit und die Zeitzone. Höchste Zeit, dies zu ändern.

locale

# dpkg-reconfigure locales

Generiere danach die locale neu:

# locale-gen

Zeitzone

die Zeitzone ändern wir mit:

# dpkg-reconfigure tzdata

Setze einen symbolischen Link mit:

# ls -l /etc/localtime
lrwxrwxrwx 1 root root 33  2. Okt 13:22 /etc/localtime -> /usr/share/zoneinfo/Europe/Zurich

Ab jetzt stimmt Localzeit und Zeitzone:

# timedatectl
               Local time: So 2022-10-02 13:29:30 CEST
           Universal time: So 2022-10-02 11:29:30 UTC
                 RTC time: So 2022-10-02 11:29:31
                Time zone: Europe/Zurich (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Tastaturlayout einstellen (Keyboard)

Falls das falsche Keyboard gewählt wurde, kann dies geändert werden.

# dpkg-reconfigure keyboard-configuration
# service keyboard-setup restart

Archiv erstellen

Mittels tar oder zip lassen sich Archive unter einem Linux-Server erstellen. Angenommen du möchtest den Theme-Ordner deiner WordPress Installation sichern, geht dies mit tar, gz, gzip, bz2, bzip2 oder eben zip. gzip und bzip2 sind sich sehr ähnlich, verwenden aber einen anderen Algorithmus. Ein reines tar-Archiv ist unkomprimiert. Der Theme-Ordner von WordPress findet sich in der Regel unter /var/www/html/wp-content/themes

mittels zip

Der Zip-Befehl kann rekursiv (-r) ausgeführ werden. Dabei werden alle Unterordner mit einbezogen. Vereinfacht lautet der Befehl:
zip -r zieldatei.zip /pfad/zum/Ordner

$ zip -r themes.zip /var/www/html/wp-content/themes/

mittels tar

Anders verhält sich hier tar und erstellt eine unkomprimierte Datei. Die ausgegebene Datei themes.tar kann jetzt noch mit gz komprimiert werden. Auch hier gilt allgemein:
tar cfv zieldatei.zip /pfad/zum/Ordner

$ tar cfv themes.tar /var/www/html/wp-content/themes/
$ gzip themes.tar

so lässt sich schnell und einfach ein Archiv erstellen. Als Ausgabe bekommst Du die Datei themes.tar.gz

Die Archiv-Datei kann mittels proftpd heruntergeladen werden. Alternativ kannst Du sie (falls ein Webserver wie apache2 läuft) nach /var/www/html verschieben und per wget oder im Browser herunterladen:

$ wget example.com/themes.tar.gz

Vergiss am Ende nicht, die Archiv-Datei auf dem Server zu löschen.

Entpackt wird die tar.gz mittels:

tar -xvzf DATEINAME.tar.gz