Schlagwort-Archive: osbn

Tag OSBN

GNU/LinuxDay in Vorarlberg – am 16. Okt. 2021 (nur online)

Am 16. Oktober 2021 findet zum zweiten Mal ein reiner Online-LinuxDay AT statt.

LinuxDay 2021 am 16. Oktober

Noch immer hat uns die Covid-Pandemie im Griff und so findet auch dieser LinuxDay wieder online statt.

Dennoch hat sich die Linux User Group Vorarlberg wieder tüchtig ins Zeug gelegt und ein abwechslungsreiches Programm mit 12 Vorträgen zusammengestellt. Informationen für Besucherinnen und Besucher stellt die LUG unter „Was wie wo – 2021“ bereit.

Ich freue mich, wenn wir uns im virtuellen Raum treffen und einen schönen LinuxDay verbringen. Hoffentlich können wir uns im nächsten Jahr wieder vor Ort treffen und ein schönes Wochenende in Dornbirn verbringen.

Zwei Bash-Skripte zur Analyse der NGINX Access Logs

Beim Durchwühlen des Internets bin ich auf eine Perle gestoßen, die ich hier festhalten möchte. In „Bash Script to Parse and Analyze Nginx Access Logs“ stellt Ruan Bekker ein kurzes Bash-Skript vor, welches die NGINX Access Logs analysiert, um einen Bericht mit folgenden Sektionen auszugeben:

  • Top 10 Request IPs (aus dem aktuellen Access Log)
  • Top Request Methods (aus dem aktuellen Access Log)
  • Top 10 Request Pages (aus dem aktuellen Access Log)
  • Top 10 Request Pages (aus dem aktuellen und Gzipten Logs)
  • Top 10 HTTP 404 Page Responses (aus dem aktuellen und Gzipten Logs)

Ich selbst nutze aktuell den Fork von Marc Brunet, welchen ich meinen My-IT-Scripts hinzugefügt habe:

#!/bin/bash

# URL: https://github.com/Tronde/My-IT-Scripts/blob/master/bash/analyze_nginx_access_logs.sh

# variables
LOGFILE="/var/www/jkastning/sites/logs/www.my-it-brain.de_access.log"
LOGFILE_GZ="/var/www/jkastning/sites/logs/www.my-it-brain.de_access.log.*"
RESPONSE_CODE="200"

# functions
filters(){
grep -w $RESPONSE_CODE \
| grep -v "\/rss\/" \
| grep -v robots.txt \
| grep -v "\.css" \
| grep -v "\.jss*" \
| grep -v "\.png" \
| grep -v "\.ico"
}

filters_404(){
grep -w "404"
}

request_ips(){
awk '{print $1}'
}

request_method(){
awk '{print $6}' \
| cut -d'"' -f2
}

request_pages(){
awk '{print $7}'
}

wordcount(){
sort \
| uniq -c
}

sort_desc(){
sort -rn
}

return_kv(){
awk '{print $1, $2}'
}

request_pages(){
awk '{print $7}'
}

return_top_ten(){
head -10
}

## actions
get_request_ips(){
echo ""
echo "Top 10 Request IP's:"
echo "===================="

cat $LOGFILE \
| filters \
| request_ips \
| wordcount \
| sort_desc \
| return_kv \
| return_top_ten
echo ""
}

get_request_methods(){
echo "Top Request Methods:"
echo "===================="
cat $LOGFILE \
| filters \
| request_method \
| wordcount \
| return_kv
echo ""
}

get_request_pages_404(){
echo "Top 10: 404 Page Responses:"
echo "==========================="
zgrep '-' $LOGFILE $LOGFILE_GZ\
| filters_404 \
| request_pages \
| wordcount \
| sort_desc \
| return_kv \
| return_top_ten
echo ""
}


get_request_pages(){
echo "Top 10 Request Pages:"
echo "====================="
cat $LOGFILE \
| filters \
| request_pages \
| wordcount \
| sort_desc \
| return_kv \
| return_top_ten
echo ""
}

get_request_pages_all(){
echo "Top 10 Request Pages from All Logs:"
echo "==================================="
zgrep '-' --no-filename $LOGFILE $LOGFILE_GZ \
| filters \
| request_pages \
| wordcount \
| sort_desc \
| return_kv \
| return_top_ten
echo ""
}

# executing
get_request_ips
get_request_methods
get_request_pages
get_request_pages_all
get_request_pages_404

Selbstverständlich erhalte ich damit keine genauen Statistiken, da meine Logs nach einem Monat automatisch gelöscht werden. Für einen kurzen Rückblick und der Erstellung eines monatlichen Berichts scheint das kleine Skript jedoch gut geeignet zu sein. Ich probiere es gerade aus, um zu sehen, wie gut es mir auf Dauer gefällt.

Auf Basis des ersten Skripts habe ich ein zweites geschrieben, mit dessen Hilfe ich die Requests für einen spezifischen Beitrag abfragen kann (Quelle):

#!/bin/bash

# variables
LOGFILE="/var/www/jkastning/sites/logs/www.my-it-brain.de_access.log"
LOGFILE_GZ="/var/www/jkastning/sites/logs/www.my-it-brain.de_access.log.*"
RESPONSE_CODE="200"
ARG1=$1

# functions
filters(){
grep -w $RESPONSE_CODE \
| grep -v "\/rss\/" \
| grep -v robots.txt \
| grep -v "\.css" \
| grep -v "\.jss*" \
| grep -v "\.png" \
| grep -v "\.ico"
}

request_ips(){
awk '{print $1}'
}

request_page(){
awk '{print $7}' \
| grep -w $ARG1
}

wordcount(){
sort \
| uniq -c
}

return_kv(){
awk '{print $1, $2}'
}

get_request_page(){
echo "Page requests in current log:"
echo "====================="
cat $LOGFILE \
| filters \
| request_page \
| wordcount \
| return_kv
echo ""
}

get_request_page_all(){
echo "Page requests in all logs (last month):"
echo "==================================="
zgrep '-' --no-filename $LOGFILE $LOGFILE_GZ \
| filters \
| request_page \
| wordcount \
| return_kv
echo ""
}

# execute
get_request_page
get_request_page_all

Der folgende Code-Block zeigt ein Beispiel, wie das Skript angewendet wird. Dabei wird der Permalink als Argument übergeben:

:~/bin$ sh get_page_requests_from_nginx_access_logs.sh kommentar-linux-container-spreu-und-weizen
Page requests in current log:
=====================
262 /wordpress/kommentar-linux-container-spreu-und-weizen/
6 /wordpress/kommentar-linux-container-spreu-und-weizen/feed/

Page requests in all logs (last month):
===================================
5124 /wordpress/kommentar-linux-container-spreu-und-weizen/
49 /wordpress/kommentar-linux-container-spreu-und-weizen/feed/
2 /wordpress/wp-json/oembed/1.0/embed?url=https://www.my-it-brain.de/wordpress/kommentar-linux-container-spreu-und-weizen/

Noch nicht schön, aber zweckmäßig.

Was haltet ihr davon? Falls ihr beim Drübergucken zufällig noch einen Fehler in den Skripten entdeckt, freue ich mich, wenn ihr mir einen Kommentar hinterlasst.

In-Place-Upgrade für Red Hat Enterprise Linux (RHEL)

In diesem Beitrag beschreibe ich exemplarisch, wie ein In-Place-Upgrade von RHEL 7 auf RHEL 8 durchgeführt werden kann. Dabei beschreibe ich zuerst, was ein In-Place-Upgrade ist und in welchen Fällen es sinnvoll sein kann, bevor ich im Hauptteil anhand einer Test-VM die Durchführung demonstriere.

Was ist ein In-Place-Upgrade?

Als In-Place-Upgrade wird der Vorgang bezeichnet, bei dem ein Betriebssystem auf ein neues Major-Release aktualisiert wird, ohne das System dabei neuinstallieren zu müssen. Statt dessen werden alle zum Betriebssystem gehörenden Dateien gegen die entsprechende Version des neuen Release ausgetauscht.

Nutzer von Debian und Ubuntu kennen dieses Verfahren unter dem Begriff Distributions-Upgrade.

In-Place-Upgrade vs. Neuinstallation

Grundsätzlich bevorzuge ich die Neuinstallation eines Systems. Da man sich üblicherweise mit Backups und Deployment-Skripten darauf vorbereitet hat, einen Dienst bzw. eine Anwendung nach einem Verlust des laufenden Systems wiederherstellen zu können, kann man sich dies auch zu Nutze machen und den Dienst bzw. die Anwendung auf einem frisch installierten System wiederherzustellen. Auf diese Weise werden keine Altlasten über mehrere Betriebssystemversionen mitgeschleppt.

Gleichzeitig kann man die Downtime verkürzen, indem das neue System parallel zum alten aufgebaut wird und man nach dem Abschluss aller Arbeiten und Tests umschaltet. Das Altsystem kann im Nachgang in Ruhe abgebaut werden.

Es gibt jedoch auch Gründe, die für ein In-Place-Upgrade sprechen. Verfügt man nur über einen einzigen Host und kann kein Parallelsystem aufbauen, kann ein In-Place-Upgrade die Lösung sein.

Evtl. verfügt man selbst zwar über ausreichend Berechtigungen, um das vorhandene System zu aktualisieren, für die Provisionierung neuer Systeme ist man jedoch auf die Unterstützung weiterer Stellen angewiesen. Die Abhängigkeitskette lässt sich hier zum Teil deutlich reduzieren.

Dabei muss stets bedacht werden, dass bei einem In-Place-Upgrade auch ein katastrophaler Fehler eintreten kann, welcher zum Verlust des Systems führt. Es ist daher dringend angeraten, eine Datensicherung zu haben, aus welcher das System wiederhergestellt werden kann. Besitzt man ein Backup, auf das man sich verlassen kann, kann es auch schon losgehen.

Das Upgrade von RHEL 7 auf RHEL 8

Laut Kapitel 1 der unter [0] verlinkten Dokumentation stellt das In-Place-Upgrade den von Red Hat unterstützten und empfohlenen Weg dar, um auf das nächste Major-Release zu aktualisieren. Dabei kann man stets nur von der letzten Verfügbaren RHEL 7 Version auf das jeweils letzte gerade RHEL 8 Release (z.B. 8.4) aktualisieren. Details hierzu können im Artikel unter [1] nachgelesen werden.

Die folgenden Abschnitte können die Dokumentation unter [0] nicht ersetzen. Sie sollen lediglich einen kompakten Überblick über den Prozess geben.

Limitierungen

Zum Zeitpunkt der Artikelerstellung , kann das In-Place-Upgrade nicht auf Systemen mit verschlüsselten Dateisystemen durchgeführt werden.

Netzwerkspeicher, wie z.B. iSCSI oder NAS, werden nicht unterstützt und müssen während des Upgrades ausgehängt werden. Die dazugehörigen Dienste, wie z.B. autofs müssen vorübergehend deaktiviert werden.

Weitere bekannte Probleme sind Kapitel 8 in [0] zu entnehmen.

Vorbereitung

Bevor man mit dem Upgrade beginnen kann, sind folgende Voraussetzungen zu schaffen:

  • Das System erfüllt die minimalen Systemvoraussetzungen für RHEL 8 (siehe [2]).
  • Zugriff auf Repos mit aktuellen Paketen für RHEL 7.9 und RHEL 8.4.
  • Korrekte Registrierung des Systems am Red Hat Content Delivery Network (CDN) oder den Red Hat Satellite Server mittels Red Hat Subscription Manager (RHSM).

Wichtig: Ich empfehle ausdrücklich, vor Beginn der Arbeiten ein aktuelles Backup bzw. einen Snapshot zu erstellen, um auf den Ausgangszustand vor der Upgrade-Prozedur zurückkehren zu können.

Kapitel 2 in [0] bietet eine ausführliche Schritt-für-Schritt-Anleitung zur Vorbereitung des Upgrades. Der folgende Codeblock bietet eine kompakte Übersicht der einzelnen Schritte. Als Zielsystem dient eine aktuelle RHEL 7.9 Minimal-Installation.

[tronde@rhel7-t1 ~]$ # Überprüfung, ob eine RHEL-Subskription abonniert wurde
[tronde@rhel7-t1 ~]$ sudo subscription-manager list --installed
[sudo] password for tronde: 
+-------------------------------------------+
    Installed Product Status
+-------------------------------------------+
Product Name:   Red Hat Enterprise Linux Server
Product ID:     69
Version:        7.9
Arch:           x86_64
Status:         Subscribed
Status Details: 
Starts:         06.10.2020
Ends:           06.10.2021

[tronde@rhel7-t1 ~]$ # Aktivierung des RHEL 7 Basis- und Extras-Repo
[tronde@rhel7-t1 ~]$ sudo subscription-manager repos --enable rhel-7-server-rpms
Repository 'rhel-7-server-rpms' is enabled for this system.
[tronde@rhel7-t1 ~]$ sudo subscription-manager repos --enable rhel-7-server-extras-rpms
Repository 'rhel-7-server-extras-rpms' is enabled for this system.

[tronde@rhel7-t1 ~]$ # Ist locale auf en_US.UTF-8 gesetzt?
[tronde@rhel7-t1 ~]$ cat /etc/locale.conf
LANG="en_US.UTF-8"

[tronde@rhel7-t1 ~]$ sudo yum install leapp leapp-repository
# Ausgabe gekürtzt
Transaction Summary
================================================================================
Install  2 Packages (+24 Dependent packages)

Total download size: 5.3 M
Installed size: 19 M
Is this ok [y/d/N]: y
# Ausgabe gekürtzt

Pre-Upgrade-Bericht erstellen

Bevor das eigentliche Upgrade durchgeführt wird, führe ich auf meinem Testsystem das Kommando leapp preupgrade aus. Dieses sammelt Informationen über das System, um die Upgradefähigkeit zu bewerten und erstellt einen detaillierten Bericht, welcher im Pfad /var/log/leapp/leapp-report.txt abgelegt wird.

[tronde@rhel7-t1 ~]$ sudo leapp preupgrade
# Ausgabe gekürzt
============================================================
                           ERRORS                           
============================================================

2021-08-31 06:33:26.035495 [ERROR] Actor: repository_mapping
Message: Data file /etc/leapp/files/repomap.csv is invalid or could not be retrieved.
Summary:
    Details: Could not fetch repomap.csv from https://cert.cloud.redhat.com/api/pes/repomap.csv (unreachable address).
    Hint: Read documentation at: https://access.redhat.com/articles/3664871 for more information about how to retrieve the file.
2021-08-31 06:35:22.415297 [ERROR] Actor: restricted_pcis_scanner
Message: Data file /etc/leapp/files/unsupported_driver_names.json is invalid or could not be retrieved.
Summary:
    Details: Could not fetch unsupported_driver_names.json from https://cert.cloud.redhat.com/api/pes/unsupported_driver_names.json (unreachable address).
    Hint: Read documentation at: https://access.redhat.com/articles/3664871 for more information about how to retrieve the file.
2021-08-31 06:35:47.800140 [ERROR] Actor: pes_events_scanner
Message: Data file /etc/leapp/files/pes-events.json is invalid or could not be retrieved.
Summary:
    Details: Could not fetch pes-events.json from https://cert.cloud.redhat.com/api/pes/pes-events.json (unreachable address).
    Hint: Read documentation at: https://access.redhat.com/articles/3664871 for more information about how to retrieve the file.

============================================================
                       END OF ERRORS                        
============================================================


Debug output written to /var/log/leapp/leapp-preupgrade.log

============================================================
                           REPORT                           
============================================================

A report has been generated at /var/log/leapp/leapp-report.json
A report has been generated at /var/log/leapp/leapp-report.txt

============================================================
                       END OF REPORT                        
============================================================

Answerfile has been generated at /var/log/leapp/answerfile
[tronde@rhel7-t1 ~]$

Dem obigen Codeblock ist zu entnehmen, dass der Pre-Upgrade-Check Fehler festgestellt hat, die behoben werden müssen, bevor ein In-Place-Upgrade durchgeführt werden kann. Dankenswerter Weise ist sowohl in der Ausgabe auf STDOUT als auch in /var/log/leapp/leapp-report.txt der Knowledge-Base-Artikel [3] verlinkt, welcher die Lösung parat hält.

Ist dieser Fehler behoben, lässt man leapp preupgrade ein weiteres Mal laufen und prüft die Ausgabe erneut. Auf meinem Testsystem erhalte ich nun folgende Ausgabe:

[root@rhel7-t1 ~]# leapp preupgrade
# Ausgabe gekürzt
============================================================
                     UPGRADE INHIBITED                      
============================================================

Upgrade has been inhibited due to the following problems:
    1. Inhibitor: Missing required answers in the answer file
Consult the pre-upgrade report for details and possible remediation.

============================================================
                     UPGRADE INHIBITED                      
============================================================


Debug output written to /var/log/leapp/leapp-preupgrade.log

============================================================
                           REPORT                           
============================================================

A report has been generated at /var/log/leapp/leapp-report.json
A report has been generated at /var/log/leapp/leapp-report.txt

============================================================
                       END OF REPORT                        
============================================================

Answerfile has been generated at /var/log/leapp/answerfile

Diesmal weist die Ausgabe darauf hin, dass ein Upgrade durch fehlende Antworten in /var/log/leapp/answerfile verhindert wird. Die genannte Datei kann mit einem Editor geöffnet und entsprechend bearbeitet werden:

[remove_pam_pkcs11_module_check]
# Title:              None
# Reason:             Confirmation
# =================== remove_pam_pkcs11_module_check.confirm ==================
# Label:              Disable pam_pkcs11 module in PAM configuration? If no, the upgrade process will be interrupted.
# Description:        PAM module pam_pkcs11 is no longer available in RHEL-8 since it was replaced by SSSD.
# Type:               bool
# Default:            None
# Available choices: True/False
# Unanswered question. Uncomment the following line with your answer
confirm = True

Die Datei enthält direkt eine Erklärung, warum das erwähnte Modul zu entfernen ist und wie dies zu geschehen hat.

Anschließend empfiehlt sich ein Blick in den Bericht unter /var/log/leapp/leapp-report.txt, um zu prüfen, ob einem Upgrade evtl. weitere Gründe entgegen stehen. Auf die Ausgabe des Berichts in diesem Artikel wird aus Platzgründen verzichtet. Da der Inhalt auf jedem System unterschiedlich ausfallen kann, ist sein Nutzen an dieser Stelle ohnehin stark begrenzt.

Durchführung des In-Place-Upgrade

An dieser Stelle wird es ernst. Man sollte sich noch einmal vergewissern, dass man einen Snapshot bzw. ein geeignetes Backup des Systems hat. Dann wird das Upgrade mit folgendem Befehl gestartet:

# leapp upgrade
# Ausgabe gekürzt
============================================================
                           REPORT                           
============================================================

A report has been generated at /var/log/leapp/leapp-report.json
A report has been generated at /var/log/leapp/leapp-report.txt

============================================================
                       END OF REPORT                        
============================================================

Answerfile has been generated at /var/log/leapp/answerfile

Dieser Vorgang kann mehrere Minuten dauern. Leapp lädt notwendige Daten herunter und bereitet die RPM-Transaktionen für das Upgrade vor. Dabei wird erneut geprüft, ob Gründe vorliegen, die ein Upgrade verhindern können. Sollte dies der Fall sein, bricht leapp den Vorgang ab und erzeugt einen neuen Bericht.

Ist das Upgrade erfolgreich durchgelaufen, muss das System manuell neugestartet werden. Das System startet anschließend in eine RAM-Disk und aktualisiert alle Pakete des Systems. Anschließend wird automatisch ein Neustart ausgeführt. Dieser Vorgang lässt sich am besten an einer (virtuellen) Konsole beobachten.

Nachdem das Upgrade abgeschlossen ist, kann man sich wieder am System anmelden und mit folgenden Kommandos prüfen, ob das System den gewünschten Status hat (vgl. Kapitel 5 in [0]):

[root@rhel7-t1 ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.4 (Ootpa)

[root@rhel7-t1 ~]# uname -r
4.18.0-305.12.1.el8_4.x86_64

[root@rhel7-t1 ~]# subscription-manager list --installed
+-------------------------------------------+
    Installed Product Status
+-------------------------------------------+
Product Name:   Red Hat Enterprise Linux for x86_64
Product ID:     479
Version:        8.4
Arch:           x86_64
Status:         Subscribed
Status Details: 
Starts:         06.10.2020
Ends:           06.10.2021

[root@rhel7-t1 ~]# subscription-manager release
Release: 8.4

Hier sieht alles gut aus.

Post-Upgrade-Tasks

Kapitel 6 in [0] beschreibt detailliert, welche Aufgaben nach einem erfolgreichen In-Place-Upgrade noch auszuführen sind, um ein möglichst sauberes System zu erhalten.

Auf meinem Testsystem sind einige RHEL 7 Pakete zurückgeblieben, welche ich mit folgendem Kommando entferne:

# dnf remove `rpm -qa | grep -e '\.el[67]' | grep -vE '^(gpg-pubkey|libmodulemd|katello-ca-consumer)' | sort`
Updating Subscription Management repositories.
Dependencies resolved.
===============================================================================
 Package              Arch       Version                     Repository   Size
===============================================================================
Removing:
 doxygen              x86_64     1:1.8.5-4.el7               @System      15 M
 kernel               x86_64     3.10.0-1160.31.1.el7        @System      64 M
 kernel               x86_64     3.10.0-1160.36.2.el7        @System      64 M
 leapp                noarch     0.12.1-1.el7_9              @System      93 k
 leapp-repository     noarch     0.14.0-4.el7_9              @System     1.7 M
 python2-leapp        noarch     0.12.1-1.el7_9              @System     618 k
 ustr                 x86_64     1.0.4-16.el7                @System     279 k

Transaction Summary
===============================================================================
Remove  7 Packages

Freed space: 146 M
Is this ok [y/N]:

# cd /lib/modules && ls -d *.el7*
3.10.0-1160.25.1.el7.x86_64  3.10.0-1160.36.2.el7.x86_64
3.10.0-1160.31.1.el7.x86_64

# /bin/kernel-install remove 3.10.0-1160.36.2.el7.x86_64 /lib/modules/3.10.0-1160.36.2.el7.x86_64/vmlinuz
# /bin/kernel-install remove 3.10.0-1160.25.1.el7.x86_64 /lib/modules/3.10.0-1160.25.1.el7.x86_64/vmlinuz
# /bin/kernel-install remove 3.10.0-1160.31.1.el7.x86_64 /lib/modules/3.10.0-1160.31.1.el7.x86_64/vmlinuz

Damit ist es geschafft. Das System wurde erfolgreich auf RHEL 8 aktualisiert.

Fazit

Dieser Artikel stellt das RHEL-In-Place-Upgrade vor und nennt kurz einige Gründe, wann dies gegenüber einer Neuinstallation Vorteile bietet. Anschließend wurde das Upgrade an einem Testsystem demonstriert mit dem Ziel, einen Überblick über den Upgrade-Prozess zu geben.

Für In-Place-Upgrades von Produktionssystemen ist ein Blick in die Hersteller-Dokumentation, Backups und sorgfältige Planung unerlässlich.

Das für diesen Artikel verwendete Testsystem besteht lediglich aus einer Minimal-Installation ohne Anwendungen von Dritten. Ob ein In-Place-Upgrade auch mit installierten Anwendungen Dritter funktioniert, hängt vom Einzelfall ab und ist sorgfältig zu prüfen und zu testen.

Erste Versuche mit Web- und Anwendungsservern aus unserer Umgebung konnten mit positivem Ergebnis abgeschlossen worden.

Es gibt Anwendungsfälle, wo ein In-Place-Upgrade vorteilhaft ist. Ich persönlich bevorzuge, wenn möglich und vom Aufwand vertretbar, jedoch die Neuinstallation inkl. Migration der Daten auf einem neuen System. So kann sichergestellt werden, dass keine unentdeckten Altlasten mitgeschleppt werden.

[0] Upgrading from RHEL 7 to RHEL 8. Instructions for an in-place upgrade from Red Hat Enterprise Linux 7 to Red Hat Enterprise Linux 8. Red Hat Enterprise Linux 8. Red Hat Customer Content Services.

[1] Supported in-place upgrade paths for Red Hat Enterprise Linux (Login required)

[2] Red Hat Enterprise Linux technology capabilities and limits

[3] Data required by the Leapp utility for an in-place upgrade from RHEL 7 to RHEL 8 (Login required)

Kommentar: Linux-Container — Spreu und Weizen

In diesem Beitrag möchte ich meine persönliche Meinung zu und über Linux-Container mit euch teilen. Ich freue mich, wenn sich daraus eine Diskussion entwickelt, in der ihr eure Erfahrungen und Gedanken zum Thema einbringt.

Mir geht es dabei ausschließlich um Linux-Container, welche ich von ähnlichen Konzepten wie z.B. den LDOMs und Kernel-Zones unter Solaris, etc. bewusst abgrenzen möchte.

Was habe ich mit Containern zu tun?

Nun, Container haben in vielen Branchen Fuß gefasst, in denen IT/EDV eine Rolle spielt und werden voraussichtlich nicht mehr verschwinden. Ich selbst bin als Sysadmin und Nerd sowohl aus privatem Interesse, als auch beruflich mit dem Thema in Berührung gekommen.

Mit den Konzepten und der Architektur bin ich vertraut. Mit dem Wochenendprojekt „Kanboard im Container…“ verfüge ich über wenig praktische Erfahrung.

Wie lautet das Versprechen der Container-Technologie?

Alles wird agiler, schneller, effizienter, sicherer UND einfacher. Das Übliche halt.

Im Wesentlichen bieten Container die Chance, dass Anwendungen mit all ihren Abhängigkeiten ausgeliefert werden können.

Damit könnte das Ende der Zeit eingeläutet werden, wo einer Anwendung eine Installationsanleitung mit dem Kapitel „Systemvoraussetzungen“ beiliegt, mit welcher der Administrator sich auf die Suche nach den benötigten Bibliotheken und Paketen macht, welche in seiner konkreten Umgebung zu installieren und zu konfigurieren sind, bevor die eigentliche Anwendung installiert werden kann.

In der schönen neuen Welt verpacken Entwickler alles, was ihre Anwendung braucht, in einen Container, welchen sie anschließend in den Versand geben (deployen) können. Auf dem Zielsystem wird nur noch eine kompatible Container-Engine benötigt und die Anwendung läuft.

Dabei sind Szenarien realistisch, in denen Anwendungen z.B. in einem Ubuntu-Userland auf einem RHEL-Kern laufen und umgekehrt.

Auch Update-Szenarien können deutlich vereinfacht werden. Ein neues Release kommt in Form eines neuen Container-Images, welches instanziiert wird. Gibt es Probleme, bringt man die laufende Instanz um und startet eine Instanz vom vorherigen Container-Image. Vorausgesetzt die Container beinhalten keine persistent zu speichernden Daten (was sie laut Konzept nicht sollen), kann das wirklich gut funktionieren.

Und wie fühlt sich das bis jetzt in der Praxis an?

Die kurze Antwort auf diese Frage lautet: „Sehr unterschiedlich. Das Spektrum reicht von gut bis durchwachsen.“

Ich möchte noch einmal erwähnen, dass ich Systemadministrator und kein Anwendungsentwickler bin. Ich entwickle also keine Software, welche dann mit CI/CD-Pipelines verarbeitet und ausgerollt wird. Meine Aufgabe ist eher die Bereitstellung und der Betrieb von Umgebungen, in denen Container ausgeführt werden können. Zu möglichen Kunden/Nutzern zählen dabei Teams, die eigene Anwendungen entwickeln, aber auch Teams, welche Anwendungen in Form von Container-Repositorien bzw. -Images geliefert bekommen und diese dann betreiben müssen.

Insbesondere in dem Bereich, wo uns die Aufgabe des Betriebs von extern erstellten Anwendungen obliegt, machen wir gerade ein paar Erfahrungen, die ich hier gerne aus meiner persönlichen Sicht teilen möchte.

Beginnen möchte ich mit der insgesamt positiven Erfahrung, die ich mit meinem Wochenendprojekt „Kanboard im Container…“ gemacht habe. Hier laufen eine Anwendung und eine Datenbank jeweils als Container in einem Pod auf einem RHEL 8 Host mit einer Rootless-Podman-Installation und einem Reverse-Proxy. Die Dokumentation von Red Hat und dem Kanboard-Projekt sind hinreichend genau und verständlich, um diese Anwendung ohne große Mühe zu betreiben. Ohne große Verrenkungen kann ich unterschiedliche Versionen aus dem Postgres-Container-Repo ausprobieren und verschiedene Releases der Anwendungen testen.

Leider hat man nicht immer soviel Glück. Ein anderes Software-Projekt, dessen Namen ich hier bewusst nicht nenne, liefert eine kleine Sammlung von Bash-Skripten aus, welche in einer bestimmten Reihenfolge auszuführen sind, um zur Laufzeit eine Docker-Compose-Datei zu generieren, auf deren Basis dann entsprechende Container gestartet werden. Wenn nun ein Update ansteht, ist der ganze Prozess mit der Ausführung der Bash-Skripte in wohldefinierter Reihenfolge erneut durchzuturnen. Das ganze lässt sich ausschließlich auf einem Host mit einer Docker-Installation ausführen und ist zu Podman inkompatibel. Ob es auch mit einer Rootless-Docker-Installtion läuft, ist noch zu testen. Ein Deployment auf einem Kubernetes-Cluster ist undenkbar. Das Projekt stellt keinerlei Informationen dazu bereit.

Übrigens handelt es sich bei diesem Projekt nicht um ein 1-2 Personen FOSS-Projekt, sondern um eines, hinter dem ein Unternehmen steht, welches kostenpflichtige Support-Verträge für seine Anwendung vertreibt.

Es bleibt also wieder mal nur, die eigene Umgebung der Anwendung anzupassen, die sich andernfalls nur mit extrem hohen Aufwand integrieren lässt. Das kennen wir schon aus dem Zeitalter vor der Container-Erscheinung. Es ist in diesem Fall halt etwas anders, aber nicht besser.

In einem anderen Fall blieb das Erfolgserlebnis aus ähnlichen Gründen aus. Der Container mit der gewünschten Anwendung lies sich nicht in die Zielumgebung integrieren, da ein für die Kommunikation benötigtes Software-Modul fehlt. Erste Aussage des Herstellers: „Da müssen sie noch Paket XY im Container nachinstallieren.“

Halt Stopp! Sollten mit dem Container nicht alle notwendigen Abhängigkeiten mit ausgeliefert werden? Jetzt sollen wir Software im Container nachinstallieren, was zur Folge hat, dass wir damit ein neues Image erzeugen, welches wir zukünftig wieder selbst weiterpflegen dürfen? So habe ich mir die schöne neue Welt aber nicht vorgestellt. Den Aufwand mit den eigenen Anpassungen haben wir ohne Container auch. Auch hier wird es erstmal nur anders, aber nicht besser.

Allerdings möchte ich zur Ehrenrettung des Anbieters hinzufügen, dass er das fehlende Modul in sein Image einbauen und zukünftig selbst pflegen und ausliefern möchte und uns hier lediglich um Unterstützung beim Test bittet. Dies ist für mich im Sinne von FOSS und vollkommen akzeptabel. Wir wissen allerdings noch nicht, ob der Anbieter sein Versprechen hält.

Wo ist nun das Dilemma?

Ich persönlich habe eine Präferenz, wie Betriebsplattformen für Container aussehen sollten. So sehe ich die Nutzung von Rootless-Podman für einfache Anwendungen und Kubernetes bzw. Kubernetes-kompatible Lösungen für die Orchestrierung als sinnvoll an.

Leider kann ich mir nicht immer aussuchen, welche Software es zu betreiben gilt. Allzu oft muss mit dem gearbeitet werden, was bestellt bzw. geliefert wurde. Und hier sind die Probleme fast so zahlreich wie außerhalb der Container-Welt. Die einen laufen nur mit Docker, aber nicht im Rootless-Modus. Die anderen verlangen eine Docker-Swarm-Umgebung und Kubernetes mögen sie beide nicht. Das ist halt Pech.

Manchmal lassen sich die gelieferten Container auch ganz einfach starten, dafür aber überhaupt nicht in bestehende Umgebungen integrieren. So kann es schon in Arbeit ausarten, wenn man den voreingestellten Datenbank-Container herausoperieren muss, um den vorhandenen Datenbank-Cluster nutzen zu können.

Ein wenig neidisch blicke ich dabei zu Berufskollegen, die eigene Softwareentwicklung betreiben und von den Vorzügen ihrer Kubernetes-Cluster schwärmen.

Allerdings stehe ich mit meinen Erfahrungen noch ganz am Anfang und lasse mich gerne überraschen, was die Zukunft noch bringt.

Was habt ihr für Erfahrungen im Umgang und mit dem Betrieb von Containern gemacht? Könnt ihr hier Geschriebenes in Teilen nachvollziehen oder sind eure Erfahrungen völlig anderer Natur? Ich freue mich auf eure Beiträge in den Kommentaren und per E-Mail.

Bis bald im schönen neuen Container-Land.

Neue Schwachstelle in Linux(-Paket) gefunden! Bin ich betroffen?

Es ist nur eine Frage der Zeit, bis die Fachpresse oder ein CERT über eine neue Schwachstelle im Linux-Kern oder einem der anderen für Linux verfügbaren Pakete berichtet. Diese Schwachstellen werden meist unter einer sogenannten CVE-Nummer geführt, welche die jeweilige Schwachstelle eindeutig referenziert.

In diesem Artikel beschreibe ich, wie ihr mit Hilfe der CVE-Nummer herausfinden könnt, ob euer System betroffen ist und wie ihr die aktualisierte Paketversion identifiziert, welche gegen die beschriebene Schwachstelle abgesichert ist. Der Text ist in Abschnitte gegliedert, welche die entsprechende Vorgehensweise für die Distributionen Debian (Link zum Abschnitt), RHEL (Link zum Abschnitt) und Ubuntu (Link zum Abschnitt) beschreiben.

Debian Security Bug Tracker

Unter der URL https://security-tracker.debian.org/tracker/ befindet sich der Security Bug Tracker des Debian-Projekts. Am Ende der Bug-Tracking-Seite gibt es ein Suchfeld, über welches man nach einer CVE-Nummer suchen kann.

screenshot-debian-security-bug-tracker
Screenshot: Security Bug Tracker

Der folgende Screenshot zeigt das Suchergebnis für CVE-2021-33909.

screenshot-search-result-cve-2021-33909
Screenshot: Ergebnis der Suche nach CVE-2021-33909

In der unter der Überschrift „Vulnerable and fixed Packages“ dargestellten Tabelle werden die verwundbaren und abgesicherten Paketversionen für die aktuell unterstützten Debian-Releases aufgeführt. So ist in diesem Fall das Paket für den Linux-Kern in Version 4.19.194-1 verwundbar, während mit der aktualisierten Version 4.19.194-3 eine abgesicherte Version bereitsteht.

Um nun zu sehen, welche Version auf dem eigenen System läuft, kann man z.B. das folgende Kommando verwenden, welches die Version des laufenden Kernels ausgibt:

tronde@host:~$ uname -v
#1 SMP Debian 4.19.194-2 (2021-06-21)

Da es sich bei der laufenden Version nicht um die abgesicherte Version handelt, ist davon auszugehen, dass das System verwundbar ist. Ein Update ist hier also angeraten.

Der folgende Code-Block zeigt, dass ein entsprechendes Update auch bereits angeboten wird (Ausgabe gekürzt):

tronde@host:~$ apt list --upgradable
Auflistung... Fertig
[...]
linux-image-4.19.0-17-amd64/stable 4.19.194-3 amd64 [aktualisierbar von: 4.19.194-2]
[...]

Für ein Nicht-Kernel-Paket sieht der Ablauf ein wenig anders aus. Nehmen wir dazu beispielhaft eine Schwachstelle im Paket systemd. Dazu suchen wir im Security Bug Tracker nach CVE-2021-33910.

screenshot-search-result-cve-2021-33910
Screenshot: Suchergebnis zu CVE-2021-33910

Die systemd-Paketversion 241-7~deb10u7 ist also gegen diese Schwachstelle verwundbar, während Version 241-7~deb10u8 abgesichert ist. Eine Möglichkeit, sich die installierte Version anzeigen zu lassen, besteht mit dem Befehl dpkg -l <PAKETNAME>, wobei die Spalte „Version“ die relevante Versionsnummer enthält:

tronde@host:~$ dpkg -l systemd
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Vollständig Löschen/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/halb konFiguriert/
         Halb installiert/Trigger erWartet/Trigger anhängig
|/ Fehler?=(kein)/R=Neuinstallation notwendig (Status, Fehler: GROSS=schlecht)
||/ Name           Version       Architektur  Beschreibung
+++-==============-=============-============-=================================
ii  systemd        241-7~deb10u7 amd64        system and service manager

Der Ausgabe ist zu entnehmen, dass auch in diesem Fall die verwundbare Version installiert ist. Auch hier stehen Updates für mehrere Pakete zur Verfügung:

tronde@host:~$ apt list --upgradable | grep systemd

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libpam-systemd/stable 241-7~deb10u8 amd64 [aktualisierbar von: 241-7~deb10u7]
libsystemd0/stable 241-7~deb10u8 amd64 [aktualisierbar von: 241-7~deb10u7]
systemd-sysv/stable 241-7~deb10u8 amd64 [aktualisierbar von: 241-7~deb10u7]
systemd/stable 241-7~deb10u8 amd64 [aktualisierbar von: 241-7~deb10u7]

Ich empfehle an dieser Stelle, alle angebotenen Updates zu installieren, da diese in aller Regel mehr Vorteile als Nachteile für das aktuelle System bedeuten.

Red Hat CVE Database

Red Hat bietet unter der URL https://access.redhat.com/security/security-updates/#/cve eine Datenbank zur Suche nach CVEs an. Ruft man die URL auf, so werden existierende CVEs in umgekehrt chronologischer Reihenfolge angezeigt. Über das Suchfeld kann gezielt nach CVE-Nummern gesucht werden. Die Ergebnisse werden anschließend in tabellarischer Form präsentiert.

rh-cve-database
Screenshot: Red Hat CVE Database

Mit einem Klick auf die CVE-Nummer gelangt man auf eine Seite, welche die Schwachstelle im Detail beschreibt und darüber hinaus Informationen zur Mitigation und abgesicherten Paketen bietet. Der folgende Screenshot zeigt einen Auszug dieser Seite für CVE-2021-33909. Darin ist eine Tabelle dargestellt, welcher die betroffenen Plattformen und die jeweiligen Paketnamen zu entnehmen sind. Die Tabelle lässt sich über das Suchfeld weiter filtern und nach Spalten sortieren. So kann man leichter einen Überblick über alle von der Schwachstelle betroffenen Pakete der eigenen Plattform bekommen.

screenshot-affected-pkgs-and-issued-errata
Screenshot: Affected Packages and Issued Red Hat Security Errata for CVE-2021-33909

Red Hat behebt sicherheitsrelevante Probleme mit Hilfe sogenannter Red Hat Security Advisories (RHSA). Der Spalte Errata der obigen Tabelle ist das jeweilige RHSA zu entnehmen. Ein Klick darauf führt zur jeweiligen Beschreibung des RHSA. Es ist nicht unüblich, dass ein RHSA mehrere Schwachstellen adressiert, wie das Beispiel RHSA-2021:2725 zeigt. Darüber hinaus bieten die RHSA Informationen, welche Pakete aktualisiert wurden und ob ein Neustart des Systems erforderlich ist, um eine Schwachstelle zu schließen.

In dem hier gewählten Beispiel ist das RHEL7-Kernel-Paket kernel-3.10.0-1160.36.2.el7.x86_64.rpm gegen CVE-2021-33909 abgesichert. Folgender Befehl zeigt mir, dass dieses Paket auf meinem RHEL7-System noch nicht verwendet wird:

[tronde@rhel7 ~]$ uname -r
3.10.0-1160.31.1.el7.x86_64

Alternativ kann man die Paketversion auch mit dem Kommando rpm -qa | grep <PAKETNAME> ermitteln. Dieses Kommando funktioniert auch für Nicht-Kernel-Pakete.

[tronde@rhel7 ~]$ rpm -qa | grep kernel
kernel-3.10.0-1160.31.1.el7.x86_64
kernel-devel-3.10.0-1160.24.1.el7.x86_64
kernel-devel-3.10.0-1160.31.1.el7.x86_64
kernel-3.10.0-1160.24.1.el7.x86_64
texlive-l3kernel-svn29409.SVN_4469-45.el7.noarch
kernel-headers-3.10.0-1160.31.1.el7.x86_64
kernel-3.10.0-1160.21.1.el7.x86_64
abrt-addon-kerneloops-2.1.11-60.el7.x86_64
kernel-devel-3.10.0-1160.21.1.el7.x86_64
kernel-tools-libs-3.10.0-1160.31.1.el7.x86_64
kernel-tools-3.10.0-1160.31.1.el7.x86_64

Dank des RHEL-Paket-Managers YUM bzw. DNF und der in den Repositories bereitgestellten Metainformationen, müssen jedoch nicht mühsam Versionsnummern manuell abgeglichen werden. Die Kenntnis der CVE-Nummer oder des RHSA genügen. Der erste Code-Block zeigt, wie ein RHEL7-System gegen CVE-2021-33909 abgesichert werden kann (Ausgabe gekürzt):

[tronde@rhel7 ~]$ sudo yum --cves=CVE-2021-33909 update
[sudo] Passwort für tronde: 
Geladene Plugins: langpacks, nvidia, product-id, search-disabled-repos,
                : subscription-manager
[...]
7 package(s) needed (+0 related) for security, out of 27 available
Abhängigkeiten werden aufgelöst
--> Transaktionsprüfung wird ausgeführt
---> Paket bpftool.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket bpftool.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket kernel.x86_64 0:3.10.0-1160.36.2.el7 markiert, um installiert zu werden
---> Paket kernel-devel.x86_64 0:3.10.0-1160.36.2.el7 markiert, um installiert zu werden
---> Paket kernel-headers.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket kernel-headers.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket kernel-tools.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket kernel-tools.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket kernel-tools-libs.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket kernel-tools-libs.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket python-perf.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket python-perf.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
--> Abhängigkeitsauflösung beendet
--> Transaktionsprüfung wird ausgeführt
---> Paket kernel.x86_64 0:3.10.0-1160.21.1.el7 markiert, um gelöscht zu werden
---> Paket kernel-devel.x86_64 0:3.10.0-1160.21.1.el7 markiert, um gelöscht zu werden
--> Abhängigkeitsauflösung beendet

Abhängigkeiten aufgelöst

================================================================================
 Package            Arch    Version                  Paketquelle          Größe
================================================================================
Installieren:
 kernel             x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms    50 M
 kernel-devel       x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms    18 M
Aktualisieren:
 bpftool            x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.5 M
 kernel-headers     x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   9.0 M
 kernel-tools       x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.1 M
 kernel-tools-libs  x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.0 M
 python-perf        x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.1 M
Entfernen:
 kernel             x86_64  3.10.0-1160.21.1.el7     @rhel-7-server-rpms   64 M
 kernel-devel       x86_64  3.10.0-1160.21.1.el7     @rhel-7-server-rpms   38 M

Transaktionsübersicht
================================================================================
Installieren   2 Pakete
Aktualisieren  5 Pakete
Entfernen      2 Pakete

Gesamtgröße: 110 M
Is this ok [y/d/N]:

Mit diesem einen Befehl ist es möglich, gezielt alle betroffenen Pakete zu aktualisieren, um die Schwachstelle zu schließen. Sollen in einem Durchgang mehrere CVEs geschlossen werden, so können mehrere CVE-Nummern durch Kommata getrennt angegeben werden.

Ebenso ist es möglich, mit den RHSA-Nummern zu arbeiten, wie der folgende Code-Block zeigt (Ausgabe gekürzt):

[tronde@rhel7 ~]$ sudo yum --advisory=RHSA-2021:2725 update
Geladene Plugins: langpacks, nvidia, product-id, search-disabled-repos,
                : subscription-manager
[...]
7 package(s) needed (+0 related) for security, out of 27 available
Abhängigkeiten werden aufgelöst
--> Transaktionsprüfung wird ausgeführt
---> Paket bpftool.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket bpftool.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket kernel.x86_64 0:3.10.0-1160.36.2.el7 markiert, um installiert zu werden
---> Paket kernel-devel.x86_64 0:3.10.0-1160.36.2.el7 markiert, um installiert zu werden
---> Paket kernel-headers.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket kernel-headers.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket kernel-tools.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket kernel-tools.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket kernel-tools-libs.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket kernel-tools-libs.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
---> Paket python-perf.x86_64 0:3.10.0-1160.31.1.el7 markiert, um aktualisiert zu werden
---> Paket python-perf.x86_64 0:3.10.0-1160.36.2.el7 markiert, um eine Aktualisierung zu werden
--> Abhängigkeitsauflösung beendet
--> Transaktionsprüfung wird ausgeführt
---> Paket kernel.x86_64 0:3.10.0-1160.21.1.el7 markiert, um gelöscht zu werden
---> Paket kernel-devel.x86_64 0:3.10.0-1160.21.1.el7 markiert, um gelöscht zu werden
--> Abhängigkeitsauflösung beendet

Abhängigkeiten aufgelöst

================================================================================
 Package            Arch    Version                  Paketquelle          Größe
================================================================================
Installieren:
 kernel             x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms    50 M
 kernel-devel       x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms    18 M
Aktualisieren:
 bpftool            x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.5 M
 kernel-headers     x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   9.0 M
 kernel-tools       x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.1 M
 kernel-tools-libs  x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.0 M
 python-perf        x86_64  3.10.0-1160.36.2.el7     rhel-7-server-rpms   8.1 M
Entfernen:
 kernel             x86_64  3.10.0-1160.21.1.el7     @rhel-7-server-rpms   64 M
 kernel-devel       x86_64  3.10.0-1160.21.1.el7     @rhel-7-server-rpms   38 M

Transaktionsübersicht
================================================================================
Installieren   2 Pakete
Aktualisieren  5 Pakete
Entfernen      2 Pakete

Gesamtgröße: 110 M
Is this ok [y/d/N]:

Auch hier können mehrere RHSA (oder auch RHBA und RHEA) durch Kommata getrennt angegeben werden. Die dargestellten Kommandos funktionieren selbstverständlich auch unter RHEL 8.

Damit ist es möglich, Schwachstellen gezielt und mit minimalen Auswirkungen auf das System zu schließen. Ich persönlich empfehle jedoch, das Patch-Fenster zu nutzen und sofern möglich alle verfügbaren Updates zu installieren. Denn in der Regel ist der Nutzen durch aktualisierte Pakete größer, als das Risiko eines potenziellen Schadens.

Die Paketmanager YUM und DNF bieten, Dank der von Red Hat bereitgestellten Metainformationen in den Repos, vielfältige Möglichkeiten, um die Installation oder Aktualisierung von Paketen granular zu steuern. Weiterführende Informationen finden sich den Manpages yum(8) und dnf(8).

In wie weit sich die hier beschriebene Vorgehensweise auch für CentOS Stream bzw. Fedora eignet, kann ich nicht sagen, da ich diese noch nicht untersucht habe.

Ubuntu CVE reports

Canonical stellt für Ubuntu unter der URL https://ubuntu.com/security/cve eine CVE-Datenbank bereit, in der sich der Status von Schwachstellen über deren CVE-Nummer recherchieren lässt.

screenshot-ubuntu-cve-reports-search
Screenshot: Ubuntu CVE reports search

Eine Suche nach einer CVE-Nummer führt zu einer Seiten mit einen Statusreport, welcher betroffene Pakete in den jeweiligen Releases und deren Status aufführt. Der folgende Screenshot zeigt dies beispielhaft für den CVE-2021-33909 und das Paket linux:

status-cve-2021-33909
Screenshot: Status des Paket ‚linux‘ zum CVE-2021-33909

Der Spalte „Status“ ist die Versionsnummer der abgesicherten Paketversion zu entnehmen. Die Vorgehensweise, um herauszufinden, welche Paketversion aktuell auf dem eigenen System installiert ist, entspricht der für Debian und kann im dortigen Abschnitt nachgelesen werden.

Zusammenfassung

Zumindest die im Rahmen dieses Artikels getesteten Distributionen bieten Webseiten, auf denen man sich zum Stand von Schwachstellen informieren kann. Dabei kann die in der Fachpresse oder vom CERT kommunizierte CVE-Nummer für eine gezielte Suche nach Informationen zur jeweiligen Schwachstelle verwendet werden.

Mir persönlich haben die Möglichkeiten von YUM und DNF zur granularen Steuerung und gezielten Mitigation von Schwachstellen am besten gefallen. Dabei sei jedoch erwähnt, dass ich längst nicht alle Distributionen und deren Paketwerkzeuge betrachtet habe.

Vorstellung: Red Hat Accelerators Program

In diesem Beitrag möchte ich euch das Red Hat Accelerators Programm vorstellen und einige Beispiele geben, was wir dort so tun. Ich selbst bin seit 2019 Mitglied dieser Gemeinschaft und freue mich, mit IT-Experten aus verschiedensten Branchen und Red Hat selbst austauschen zu können. Dieser Artikel gibt meine persönliche Meinung und Sicht auf die Red Hat Accelerators wieder. Diese kann mit der von Red Hat übereinstimmen, muss es aber nicht.

Das Programm selbst beschreibt sich als globale Gemeinschaft, bestehend aus IT-Experten unter den Red Hat Kunden/Partnern, welche ihr Wissen und ihre Leidenschaft für Red Hat Produkte und Open Source Projekte mit Fachkollegen und Red Hat teilen und sich darüber austauschen mögen. Dem Einzelnen verspricht das Programm dabei folgenden Nutzen.

Netzwerken

Kurz gesprochen sind die Red Hat Accelerators ein Slack Channel voller interessanter Menschen. Diese stammen aus den verschiedensten Branchen, wie z.B. dem Gesundheitswesen, der Automobilindustrie, Versicherungen und Banken, um nur einige zu nennen. Dazu gesellen sich auch einige „Rote Hüte“, darunter Technical Account Manager, Mitarbeiter:innen aus verschiedenen Produkt-Teams und selbstverständlich die Community-Managerinnen Andi und Lili.

Wenn man seit vielen Jahren im gleichen Unternehmen arbeitet und stets nur zu den eigenen Kollegen Kontakt hat, stellt sich häufig eine gewisse Betriebsblindheit ein. Bei den Red Hat Accelerators bietet sich die Gelegenheit, mit Fachkollegen aus der gleichen, aber vor allem auch aus anderen Branchen in Kontakt zu treten und sich auszutauschen, um über den Tellerrand schauen zu können und der Betriebsblindheit entgegen zu wirken.

Ganz nebenbei lernt man neue Anwendungsfälle für bekannte oder weniger bekannte Produkte kennen. Gleiches gilt für Fehler in bzw. Probleme mit eben diesen Produkten. So bilden sich im Chat häufig so etwas wie spontane Arbeitskreise, die Probleme in der allerneusten Version eines Produktes adressieren. Hier wird sich gegenseitig geholfen. Und sollte einmal noch keine Lösung existieren, nimmt meist einer der anwesenden TAMs (steht wahlweise für Technical Account Manager oder The Almighty Moderator) das Problem/die Frage mit, um eine Lösung zu finden.

Mir hat sich durch diesen Austausch schon einige Male ein neuer Blickwinkel eröffnet, wodurch sich neue Lösungswege auftaten. Und das selbst über Red Hat Produkte hinaus.

Zugang zu Produkt-Teams und zukünftigen Releases

Für mich persönlich ist dies der größte Nutzen, den ich aus dem Red Hat Accelerators Programm ziehe. Ich habe hier die Möglichkeit, frühzeitig Kenntnis über (geplante) Neuerungen in Red Hat Produkten zu erlangen und durch qualifizierte Beiträge die Produktentwicklung mit zu beeinflussen.

Die Produkt-Teams stellen ihre Ideen und Pläne in gemeinsamen Videokonferenzen mit den Accelerators vor und diskutieren mit uns über Anwendungsfälle sowie Vor- und Nachteile der Änderungen.

Diese Form der Kommunikation hat Vorteile sowohl für Red Hat selbst, als auch für uns Kunden. Red Hat erfährt von seinen Kunden, wo der Schuh drückt, was sich diese wünschen, um ihren Arbeitsalltag effizienter zu gestalten. Als Kund erfährt man frühzeitig von geplanten Entwicklungen und Ideen und kann diese in gewissem Rahmen mit beeinflussen. Dazu möchte ich drei Beispiele geben.

Umfragen

Regelmäßig werden Umfragen zu Produkten aus dem Red Hat Portfolio und IT-Themen durchgeführt, die viele von uns im Arbeitsalltag betreffen. Red Hat nutzt diese Fragen dazu, um seine Kunden besser kennen zu lernen. Basierend auf diesen Umfragen werden weitere Sitzungen geplant, um einzelne Punkte in kleineren Arbeitsgruppen besprechen zu können.

Umfragen werden z.B. als webbasierte Formulare durchgeführt oder als Live-Interviews mit den Produkt-Teams.

Produktvorstellungen

Hier stellt ein Produkt-Team geplante Neuerungen, Änderungen oder neue Funktionen vor und stellt sich direkt der Kritik der Accelerators. Es wird dabei darauf geachtet, dass Kritik konstruktiv geäußert wird. Ein einfaches „Das ist Mist.“ oder „Das finde ich doof.“ ist dabei nicht gern gesehen. Ein konstruktives „Ich würde mir dieses oder jenes aus folgenden Gründen wünschen.“ wird gern entgegengenommen.

Als Accelerator hat man hier die Möglichkeit, seine Wünsche mitzuteilen. Es besteht keine Garantie und kein Anspruch, dass diese Berücksichtigung finden. Auch kann man die Entwicklung nicht direkt bestimmen. Doch hat Red Hat selbstverständlich ein Interesse daran, möglichst viele seiner Kunden bei der Stange und bei Laune zu halten. Denn ein glücklicher Kunde kauft gern nochmal, während ein unglücklicher Kunde vermutlich etwas neues ausprobiert.

Schön finde ich bei diesen Veranstaltungen auch, dass man erfahren kann, warum einige Wünsche nicht berücksichtigt werden oder auf der Roadmap sehr weit hinten anstehen müssen. Dies schafft Transparenz und ist in meinen Augen sehr zu begrüßen.

Doch auch für Red Hat kann es hier manchmal eine Enttäuschung geben, wenn z.B. ein Design-Entwurf von einer großen Mehrheit abgelehnt (im Sinne von: „Wir mögen das wirklich nicht und wünschen es uns wie folgt.“) wird.

Fokus-Gruppen

In den sogenannten Fokus-Gruppen bietet sich für ausgewählte Accelerators die Chance, eng mit einem Red Hat Produkt-Team zusammen zu arbeiten.

So hatte ich im Sommer 2020 das Vergnügen, in der Fokus-Gruppe Red Hat Insights unter Leitung von Mohit Goyal (Senior Principal Product Manager, Red Hat) mitzuarbeiten. Hier bot sich mir die Möglichkeit, die besonderen Anforderungen an den Einsatz einer solchen Lösung in Deutschland und in meiner Organisation zu vertreten und dafür zu sensibilisieren. Durch den Einfluss mehrerer Red Hat Accelerators wurde die geplante automatische Registrierung von RHEL-Systemen in Red Hat Insights auf unbestimmte Zeit verschoben.

So viel Einfluss auf eine laufende Produktentwicklung hatte ich bisher bei keinem anderen Hersteller. Und ich wünsche mir deutlich mehr davon.

Welche Vorteile hat Red Hat davon?

Selbstverständlich profitiert auch Red Hat von dem Accelerators-Programm. Wie bereits erwähnt, bekommt der Hersteller hier wertvolle Rückmeldungen von vertrauten Kunden, direkt aus der Praxis. Darüber hinaus stehen die Accelerators bereit, Produktneuheiten zu testen, zu validieren und den Einsatz in der eigenen Umgebung zu prüfen, bevor diese veröffentlicht werden. Dadurch kann bei Problemen noch rechtzeitig gegengesteuert werden.

Das Programm hilft Red Hat, seine Kunden und deren Bedürfnisse besser zu verstehen und die eigenen Produkte noch besser am Bedarf der Kunden auszurichten.

Und natürlich verfügt Red Hat mit den Accelerators über ein Heer aus Enthusiasten, Evangelisten und Missionaren, welche die Open Source Botschaft in die Welt hinaus tragen. Und wir alle wissen doch, dass Mund-zu-Mund-Propaganda die wirksamste Form der Werbung ist.

Wie kann man Mitglied werden?

Ihr seid bereits Red Hat Kunde und mein Beitrag hat euch neugierig gemacht, so dass ihr ebenfalls zu den Red Hat Accelerators dazustoßen möchtet? Das ist gut, denn die EMEA-Region und besonders der deutschsprachige Raum ist aktuell noch etwas unterrepräsentiert.

Bitte lest euch die Programm-Bedingungen (in englischer Sprache) durch und bewerbt euch.

Ich selbst darf übrigens keinerlei Geschenke von Red Hat oder dem Accelerators-Programm annehmen. Wenn ihr im letzten Feld des Bewerbungsformulars also meinen Namen angebt, ist mir nicht mehr und nicht weniger gewiss, als der ewige Dank von Andi und Lili.

Es ist in 2021 ein Lenovo ThinkPad T14s (AMD) geworden

Anfang April habe ich mir Gedanken zu Neuer Hardware in 2021 gemacht. Zu der Zeit hatte ich ein TUXEDO Pulse 14 Gen 1 und ein ThinkPad P14s Gen 1 ins Auge gefasst.

Eure Rückmeldungen in den Kommentaren und das Studium etlicher Testberichte auf notebookcheck.net mündeten nun in einer Entscheidung. Besonders das umfangreiche Feedback von ‚Art‘ hat meine Kaufentscheidung beeinflusst. Danke dafür.

Ich habe mir nun ein Lenovo Campus ThinkPad T14s 20UJS00K00 für 1.399 Euro bei cyberport gekauft. Das Gerät beinhaltet (Quelle: Datenblatt):

  • CPU: AMD Ryzen™ 7 Pro 4750U Prozessor (bis zu 4,1 GHz), Octa-Core
  • Display: 35,6 cm (14 Zoll) IPS Full-HD Display mit LED-Hintergrundbeleuchtung, 400 nits, 800:1 Kontrast
  • RAM: 32 GB DDR4-3200 SO-DIMM fest verlötet
  • Festplatte: 1 TB SSD M.2 2280 PCIe NVMe Opal2
  • Webcam: IR Kamera und HD720p Kamera mit ThinkShutter
  • WLAN und Bluetooth: Wireless LAN 802.11 ax und Bluetooth 5.1
  • Weitere Anschlüsse:
    • 2x USB 3.2 Gen 1 (1x Always On)
    • 2x USB 3.2 Type-C Gen 2 (mit Power Delivery und DisplayPort 1.4)
    • 1x HDMI 2.0
    • Ethernet extension connector (proprietärer Anschluss)
    • Mikrofoneingang / Kopfhörerausgang (komb.)
    • Dockinganschluss
    • MicroSD-Kartenleser; Lesegerät für Smartcards

Das Feedback von ‚Art‘ bezieht sich zwar auf das P14s, doch teilt sich dieses Modell etliche Komponenten mit dem T14s, so dass ich in der Hoffnung gekauft habe, einige Eigenschaften übertragen zu können. Dieses Feedback, der Trackpoint, dieser Testbericht und der Preis waren die Haupteinflussfaktoren bei diesem Kauf.

Es folgt ein erster persönlicher Erfahrungsbericht zum neuen Gerät.

Ach du Schreck, ist das dünn.

Mein erstes ThinkPad war ein R61. Ich habe dessen Größe, Gewicht und Robustheit geschätzt. Auch das T410 und das X201 machen einen stabilen und robusten Eindruck. Und nun ist da dieses T14s.

Mein erster Gedanke war: „Damit erschlägst du niemanden mehr.“ (Nicht, dass ich das jemals getan hätte.)

Für ein Gerät dieser Größe ist die Stabilität in Ordnung. Erwartungsgemäß ist es nicht so verwindungssteif, wie die älteren Modelle. Dafür ist es bedeutend leichter. Ich glaube, auf dieses Gerät muss ich deutlich besser acht geben, damit es lange hält.

Die äußeren Maße finde ich hingegen optimal. Es passt genau zwischen das T410 und das X201, was mir gut gefällt.

vergleich-t410-x201-t14s
T410 (links unten), X201 (oben) und T14s (rechts unten) auf einen Blick

Um es kurz zu machen, ich habe mich mit dem T14s angefreundet.

Die einzige Sache, die sich mir bisher noch nicht erschlossen hat, ist der Sinn hinter dem proprietären LAN-Anschluss.

proprietaerer-lan-anschluss
Der proprietäre LAN-Anschluss befindet sich zwischen dem USB-C-Ladeanschluss (links) und dem USB-A-Anschluss.

Um einen LAN-Anschluss mit bis zu 1 Gbps nach außen zu führen, hätte in einen Augen ein normaler USB-C-Port gereicht. Diesen hätte man auch noch anderweitig verwenden können. Aber vielleicht steckt ja noch mehr hinter diesem Port, das mir noch nicht bewusst ist.

Und wie läuft es mit Linux?

Debian Buster wollte nicht starten. Ich habe mehrere Debian Testing Images ausprobiert, doch hat mich die Partitionierung im Installer so genervt, dass ich schlussendlich (erstmal) zu Fedora 34 Workstation gegriffen habe. Hiermit funktionierte fast alles Out-of-the-Box.

Lediglich für den Standby-Modus war noch ein Firmware-Update auf Version 1.30 notwendig. Dank LVFS war dies im Handumdrehen aus Linux heraus erledigt.

Nur ein Bug nervt mich sehr. In meinem Gerät ist ein Touchpad und Trackpoint der Firma Elantech verbaut. Bei Nutzung des Trackpoints springt dieser sporadisch an die Seiten bzw. in die Ecken des Displays. Da dieser Bug bei Lenovo bekannt ist und reproduziert werden konnte, habe ich die Hoffnung, dass hier noch Abhilfe geschaffen wird.

Mit dem letzten Debian Testing weekly-build funktionieren Stand-By (ursächlich ist hier wohl eher die aktualisierte Firmware). Nur der Trackpoint-Bug existiert wenig überraschend auch hier.

Fazit

Alles in allem ist es ein schönes Gerät. Die Linux-Unterstützung ist gut und ich habe es behalten.

Das Problem mit dem Trackpoint ist wirklich nervig, doch verschmerzbar. Zudem hoffe ich hier auf Abhilfe.

An dieser Stelle noch einmal Danke für eure Kommentare, die mir bei der Entscheidung geholfen haben.

Weiterführende Links

Ansible: Wiederherstellung meines Blogs auf Buster und Bullseye in 2021

Dies ist ein Update zu den Beiträgen:

  1. Konzept zum Deployment meines Blogs mit Ansible und
  2. Erfahrungsbericht zum Deployment meines Blogs mit Ansible.

Umgebung

Aktuell nutze ich als Ansible Control Node (ACN) ein Debian Buster mit Ansible 2.7.7. Die Backups liegen wie gehabt auf einem Speicher im lokalen Heimnetzwerk.

Als Zielsysteme für die Wiederherstellung dienen ein Debian 10 (Buster) und Debian Testing (das kommende Bullseye). Bei beiden Zielsystemen handelt es sich um minimale Installation in zwei VMs auf einem KVM-Hypervisor.

Ablauf

Zuerst habe ich meinen Blog aus dem Backup auf der Debian 10 VM wiederhergestellt. Dabei gab es tatsächlich ein Problem. Das VHOST-Template für den Webserver entsprach nicht mehr der Version, die auf dem Produktivsystem zum Einsatz kommt. Ich hatte schlicht vergessen, die Änderung nachzupflegen. Der Fehler wurde schnell identifiziert und behoben. Anschließend verlief der Wiederherstellungsprozess reibungslos.

Beim zweiten Versuch erfolgte die Wiederherstellung auf einer VM mit Debian Testing (Bullseye). Dieser Test ist für mich wichtig, um zu sehen, ob ich meinen Blog auch auf der kommenden stabilen Debian-Version ausrollen kann. Hier waren etwas mehr Anpassungen an der Rolle „deploy-my-blog“ notwendig, um dieses Blog erfolgreich wiederherstellen zu können. So haben sich einige Paketnamen geändert:

Alter NameNeuer Name
python-aptpython3-apt
python-mysqldbpython3-mysqldb
Gegenüberstellung der alten und neuen Paketnamen

Doch auch an der VM selbst war ein manueller Eingriff notwendig, bevor sich mein ACN überhaupt mit dem Node verbinden konnte. Ansible konnte auf dem Node keinen Python-Interpreter finden. Ich schiebe die Schuld der Version 2.7.7 in die Schuhe. Nachdem ich einen Symlink von /usr/bin/python auf /usr/bin/python3 erstellt hatte, klappte der Zugriff.

Der letzte Stolperstein war php-fpm. Kommt unter Buster Version 7.3 zum Einsatz so ist dies unter Bullseye 7.4. Da die Versionsnummer in meiner Ansible-Rolle hart verdrahtet ist, war auch hier eine Anpassung notwendig. Anschließend gelang auch hier die Wiederherstellung.

Fazit

Grundsätzlich klappte die Wiederherstellung wie gewohnt. Den Fehler mit der VHOST-Datei könnte ich zukünftig vermeiden, indem ich diese einfach mit aus dem Backup wiederherstelle, statt ein Template zu nutzen.

Das bei der Wiederherstellung auf einer neueren Betriebssystemversion Anpassungen erforderlich sind, hatte ich erwartet. Diese halten sich meiner Meinung nach in Grenzen und sind akzeptabel.

Die längste Zeit beanspruchte das Kopieren der Backups auf die Zielsysteme. Die eigentliche Wiederherstellung war mit den Stolpersteinen in 10-15 Minuten. Mit fehlerbereinigter Rolle sogar nur noch ca. 5 Minuten. Eine manuelle Wiedereinrichtung hat mich früher eher zwischen 30-60 Minuten gekostet. Von daher bin ich sehr zufrieden.

Postfix: From-Adresse beim Relay über Smarthost erzwingen

In diesem Beitrag dokumentiere ich eine Lösung für die Meldung: „554 5.7.1 REJECT policy violation – too many different Display Names – code #242 (in reply to end of DATA command)“

Umgebung

Ich betreibe einen Virtual Private Server (VPS) im Internet, sowie einige Raspberry Pis und weitere Geräte, die man heute wohl am ehesten dem Internet der Dinge zuordnen würde.

Diese Systeme sollen mir Systemmeldungen per E-Mail senden. Dafür habe ich mir ein günstiges E-Mail-Postfach bei Mailbox.org gebucht und auf den betroffenen Systemen Postfix installiert und zum Versand über einen Smarthost konfiguriert. Die Konfiguration erfolgte über die Ansible-Rolle relaymail von Yannik. Diese dient jedoch nur als Werkzeug. Die Konfiguration kann selbstverständlich auch manuell durchgeführt werden.

Problembeschreibung

Bei einer Systemüberprüfung fielen mir einige Fehlermeldungen der folgenden Art ins Auge (einige Werte durch <Platzhalter> ersetzt):

„<Hostname und IP-Adresse> said: 554 5.7.1 id=<ID> – Rejected by next-hop MTA on relaying, from MTA(smtp:[<IP-Adresse>]:10025): 554 5.7.1 REJECT policy violation – too many different Display Names – code #242 (in reply to end of DATA command)“

Weitere Informationen zu dieser Meldung und deren Ursache finden sich im Mailbox.org-Benutzerforum in: „mailbox.org als smtp Relay nutzen“

Während meine Raspberry Pis mit Raspbian GNU/Linux 10 (buster) und Postfix 3.4.14-0+deb10u1 sich wie erwartet verhalten und lediglich meine E-Mail-Adresse in das Header-Feld „From“ eintragen, fügt mein VPS mit Debian GNU/Linux 10 (buster) und Postfix 3.4.14-0+deb10u1 den Namen des jeweiligen Benutzers bzw. Dienstes mit ein, welcher die E-Mail versenden möchte. Diese Informationen nimmt der VPS aus dem Kommentarfeld der /etc/passwd. Während die Kommentarfelder auf meinen Raspberry Pis leer sind, sind diese auf dem VPS entsprechend gefüllt.

Im E-Mail-Header stellt sich das dann wie folgt dar.

Header-Auszug bei E-Mail von Raspberry Pi

Date: Mon, 10 May 2021 04:56:32 +0200 (CEST)
From: no-reply@example.com

Header-Auszüge bei E-Mails vom VPS

From: no-reply@example.com (Cron Daemon)
To: root
Date: Mon, 10 May 2021 04:44:12 +0200 (CEST)
From: Jörg Kastning <no-reply@example.com>
Date: Mon, 10 May 2021 04:44:36 +0200 (CEST)
From: root <no-reply@example.com>

Lösung

Um das Problem aufzulösen, lasse ich nun Postfix das Header-Feld „From“ umschreiben und explizit auf den Wert no-reply@example.com setzen. In der /etc/postfix/main.cf müssen dazu folgende Zeilen vorhanden sein:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

Inhalt der /etc/postfix/sender_canonical_maps:

/.+/    no-reply@example.com

Dies sorgt dafür, dass Postfix das Feld „Envelope-From“ explizit auf no-reply@example.com setzt.

Inhalt der /etc/postfix/header_check:

/From:.*/ REPLACE From: no-reply@example.com

Hiermit wird der Wert des Header-Felds „From“ explizit auf no-reply@example.com gesetzt. Die Lösung habe ich hier gefunden. Damit läuft der Versand meiner Systembenachrichtigungen wieder.

Weitere Artikel zu Postfix und Smarthosts in diesem Blog

Linux-Distributionen zwischen Stabilität und Aktualität

Die Linux-Gemeinschaft lässt sich grob in drei Lager unterteilen. Dabei nimmt ein Lager den Extremwert „stabil wie ein Fels“ mit z.B. Debian oldstable ein, während der andere Extremwert „bleeding edge“ durch Anhänger z. B. von Arch Linux besetzt wird. Das dritte Lager besetzt die Mitte, in der sich unzählige weitere Distributionen tummeln, die mehr zu dem einen oder dem anderen Extremwert hin tendieren.

Warum das so ist und welche Distribution einen, wie ich finde, ganz interessanten Mittelweg eingeschlagen hat, möchte ich in diesem Artikel beleuchten. Bierernst bin ich dabei allerdings nicht. Die ein oder andere Ausführung ist durchaus mit einem Augenzwinkern zu verstehen. ;-)

Stabil wie ein Fels

So soll eine Linux-Distribution aus Sicht vieler Systemadministratoren sein. Gut getestet, alle Komponenten perfekt aufeinander abgestimmt und über ihren Lebenszyklus nur wenigen — am besten gar keinen — Änderungen unterworfen. Einzig Sicherheitsaktualisierungen dürfen und sollen zeitnah geliefert werden.

Distributionen, die sich diesem Paradigma unterwerfen, versprechen geringe Wartungsaufwände und sind des Sysadmins Freund. In meinen Augen dürfen Debian, RHEL, SLES, etc. dieser Kategorie zugeordnet werden.

Doch bergen diese Distributionen paradigmenbedingt auch einige Nachteile. Da Kernel und Bibliotheken meist schon etwas älter sind — manche sagen dazu steinalt, andere gut abgehangen — wird neue Hardware evtl. nicht in vollem Umfang unterstützt. Oder die mitgelieferten Bibliotheken und Laufzeitumgebungen sind schlicht zu alt, um mit aktuellen Versionen verfügbarer Software noch kompatibel zu sein.

Um den Nachteilen zu begegnen, bleibt Sysadmins häufig nichts anderes übrig, als das wohlige Heim der Distribution zu verlassen und Laufzeitumgebungen aus Upstream- oder Drittanbieter-Repos zu installieren, Software selbst zu übersetzen oder sich Container in die heilige Halle zu stellen. Die Distributionen versuchen dem zu begegnen, in dem sie unter Umständen zu Minor-Releases neuere Software-Versionen als sogenannte Rebases oder Backports nachliefern. Das dies passiert ist jedoch keineswegs garantiert und stellt im Zweifel ein Risiko für die Stabilität dar.

Wenn die Distribution dann aber doch eine neue Softwareversion ausliefert, hat der Sysadmin meist keine Wahl. Entweder er bleibt auf der alten Version und erhält voraussichtlich keinerlei Sicherheitsupdates mehr für diese oder installiert die aktuelle Version und lernt die Neuerungen lieben bzw. damit zu leben.

Bleeding Edge

Mit diesem Beinamen werden häufig Distributionen bezeichnet, welche dem Rolling-Release-Modell folgen und Software mitliefern, die sehr nah am aktuellen Stand der Upstream-Entwicklung ist (the latest and greatest). In dieser Ecke findet man z. B. Distributionen wie Arch Linux, Manjaro, Fedora Rawhide, etc. wobei diese Liste keinen Anspruch auf Vollständigkeit erhebt.

Der Betrieb dieser Distributionen ist geprägt von häufigen Updates. Die stetige Weiterentwicklung birgt das Risiko, dass auch mal etwas kaputt geht und plötzlich nicht mehr funktioniert. Doch versprechen die Distributionen meist, dass gerade durch den schnellen Entwicklungszyklus gefundene Fehler auch schnell behoben werden. Wohingegen die Nutzer stabiler Version häufig Monate, wenn nicht Jahre oder gar vergebens auf einen Bugfix warten müssen.

Blöd wird es, wenn man Software betreiben muss, die nur für eine bestimmte Version einer Laufzeitumgebung, oder bestimmter Bibliotheken freigegeben ist und unterstützt wird. Wer solche Software betreibt, sollte sich jedoch von vornherein fragen, ob er bei rollenden Releases richtig aufgehoben ist.

Dann sind da auch noch jene unter uns, die für den Betrieb auf gewisse Zertifizierungen ihrer Betriebssysteme angewiesen sind. Hier sind die Zertifizierungsverfahren häufig länger, als die Lebensspanne eines Bleeding-Edge-Release.

Das Mittelfeld

Dieses Feld ist weitgespannt. Hier tummeln sich Distributionen wie Fedora, Ubuntu sowie viele weitere. Ihnen allen unterstelle ich, dass sie den besten Kompromiss suchen, um so stabil wie möglich und so aktuell wie nötig zu sein.

So habe auch ich in der Vergangenheit auf Ubuntu LTS gesetzt, da ich es für den besten Kompromiss hielt. Leider waren unsere Entwickler mit den mitgelieferten Software-Versionen nicht lange zufrieden und ließen sich nicht bis zum nächsten Release hinhalten. Also wurden auch hier wieder {Dritanbieter,Upstream}-Repos eingebunden und die Software von dort installiert. Eine Erfahrung die ich bisher unter jeder Distribution machen durfte.

Genauso gut kenne ich den umgekehrten Fall, wo Paket XY auf gar keinen Fall aktualisiert werden darf, da sonst ein Dienst unrettbar kaputt geht. Lasst euch gesagt sein, man hat es schon nicht leicht in der Systemadministration. ;-)

Appstreams und Module

Mit RHEL 8 hat Red Hat eine interessante Neuerung eingeführt, die sog. Module im Appstream-Repository. Nun ein Listing sagt vermutlich mehr, als viele Sätze:

$ sudo dnf module list nginx php postgresql
Updating Subscription Management repositories.
Last metadata expiration check: 0:27:21 ago on Mi 21 Apr 2021 05:41:58 CEST.
Extra Packages for Enterprise Linux Modular 8 - x86_64
Name            Stream        Profiles                        Summary                                 
nginx           mainline      common                          nginx webserver                         

Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
Name            Stream        Profiles                        Summary                                 
nginx           1.14 [d]      common [d]                      nginx webserver                         
nginx           1.16          common [d]                      nginx webserver                         
nginx           1.18          common [d]                      nginx webserver                         
php             7.2 [d]       common [d], devel, minimal      PHP scripting language                  
php             7.3           common [d], devel, minimal      PHP scripting language                  
php             7.4           common [d], devel, minimal      PHP scripting language                  
postgresql      9.6           client, server [d]              PostgreSQL server and client module     
postgresql      10 [d]        client, server [d]              PostgreSQL server and client module     
postgresql      12            client, server [d]              PostgreSQL server and client module     

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Wie ihr sehen könnt, hat man damit die Auswahl aus mehreren Versionen ein und der selben Anwendung. Das kannte ich so bisher noch nicht, ohne zusätzliche Repos einbinden zu müssen, oder mich gar mit den berüchtigten Red Hat Software Collections beschäftigen zu müssen.

Als Sysadmin habe ich damit etwas Flexibilität dazugewonnen. Ich kann z. B. eine Altlast mit NGINX 1.14, PHP 7.2 und PostgreSQL 9.6 auf einem Host und eine aktuelle Anwendung mit NGINX 1.18, PHP 7.4 und PostgreSQL 12 auf einem anderen Host betreiben, dabei aber das gleiche stabile Release RHEL 8 nutzen.

Allerdings kann man nicht zwei verschiedene Versionen von z. B. PHP oder PostgreSQL parallel auf dem gleichen Host betreiben. Wer dies wünscht, kann die entsprechenden Anwendungen lokal in Podman-Containern ausführen. Auch hier stehen Images für die verschiedenen Versionen bereit.

Red Hat verspricht, neue Versionen von Anwendungen, Sprachen und Werkzeugen auf diesem Weg verfügbar zu machen. So sind in der Beta des kommenden RHEL 8.4 zum Beispiel PostgreSQL 13, Python 3.9 und Podman 3.0.1 enthalten. Zu beachten ist jedoch, dass die jeweiligen Streams ihre eigenen Life-Cycles besitzen, die es im Auge zu behalten gilt. Hier hilft ein Blick in die offizielle Dokumentation weiter:

Fazit

Ob diese Neuerung und die damit einhergehenden Vorteile in der Praxis von Relevanz sein werden, kann ich heute noch nicht sagen. Dafür fehlt mir noch etwas Erfahrung mit diesem neuen Konzept.

Ich persönlich glaube, dass sich Application Streams und das Konzept zur Verwendung von Containern nicht gegenseitig ausschließen, sondern sinnvoll ergänzen können. In meinen Augen gelingt es Red Hat mit Appstreams, seine stabile Distribution etwas in Richtung Aktualität zu schieben, ohne dabei Stabilität aufgeben zu müssen.