Q&A Laufend: Ubuntu Migration – Legacy Stack PHP 7.2 / MySQL 5

Kategorie: Q&A · Channel: #laufend

Format: Bühnenspiel – Admin · Angreifer · Kunde

Kontext: Ubuntu < 20.04 EOL, Anwendung läuft auf PHP 7.2 + MySQL 5.x


Die Situation

Problem:   Ubuntu 18.04 LTS läuft aus (EOL April 2023)
           Ubuntu 20.04 LTS läuft aus (EOL April 2025)
Wunsch:    Upgrade auf 24.04 LTS
Blockade:  Anwendung erfordert PHP 7.2 + MySQL 5.7
           PHP 7.2 EOL seit November 2020
           MySQL 5.7 EOL seit Oktober 2023
Kompromiss: Ubuntu 22.04 LTS als Zwischenziel
            Support bis April 2027

👨‍💻 Admin-Perspektive: Migration planen und durchführen

Schritt 1: Ist-Zustand dokumentieren

# Aktuelles System erfassen – VOR der Migration
lsb_release -a                          # Ubuntu Version
uname -r                                # Kernel
php --version                           # PHP Version
mysql --version                         # MySQL Version
apache2 -v || nginx -v                  # Webserver

# Installierte Pakete sichern
dpkg --get-selections > /root/packages_before.txt

# Laufende Dienste
systemctl list-units --state=running --type=service > /root/services_before.txt

# Offene Ports
ss -tlnp > /root/ports_before.txt

# Konfigurationen sichern
tar czf /root/config_backup_$(date +%Y%m%d).tar.gz \
  /etc/apache2 /etc/nginx /etc/php /etc/mysql \
  /etc/ssh /etc/cron* /etc/iptables

# Datenbank sichern
mysqldump --all-databases --single-transaction \
  > /root/db_backup_$(date +%Y%m%d).sql

Schritt 2: PHP 7.2 auf Ubuntu 22.04 – das Problem

Ubuntu 22.04 liefert standardmäßig:
  PHP 8.1

PHP 7.2 ist seit Nov 2020 EOL → kein offizieller Support mehr.
Lösung: Ondřej Surý PPA (inoffiziell aber weit verbreitet)
        oder: eigene PHP-Kompilation (nicht empfohlen)
# PHP 7.2 auf Ubuntu 22.04 via Ondřej Surý PPA:
apt install software-properties-common
add-apt-repository ppa:ondrej/php
apt update

# PHP 7.2 installieren
apt install php7.2 php7.2-fpm php7.2-mysql php7.2-xml \
            php7.2-mbstring php7.2-curl php7.2-zip \
            php7.2-gd php7.2-bcmath php7.2-intl

# Welche PHP-Version ist aktiv?
php --version
update-alternatives --list php

# Zwischen PHP-Versionen wechseln:
update-alternatives --set php /usr/bin/php7.2

# Apache: PHP-Modul wechseln
a2dismod php8.1
a2enmod php7.2
systemctl restart apache2

# PHP-FPM (nginx):
systemctl stop php8.1-fpm
systemctl start php7.2-fpm
systemctl enable php7.2-fpm

Schritt 3: MySQL 5.7 auf Ubuntu 22.04 – das Problem

Ubuntu 22.04 liefert standardmäßig:
  MySQL 8.0

MySQL 5.7 ist seit Oktober 2023 EOL.
Lösung A: MySQL 5.7 via offiziellem MySQL APT Repository
Lösung B: Percona Server 5.7 (kompatibel, länger supported)
Lösung C: MariaDB 10.x (teilweise kompatibel, prüfen!)
# Option A: MySQL 5.7 via MySQL APT Repository
# https://dev.mysql.com/downloads/repo/apt/
wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb
dpkg -i mysql-apt-config_0.8.29-1_all.deb
# → im Dialog: MySQL 5.7 Server auswählen
apt update
apt install mysql-server-5.7

# Option B: Percona Server 5.7 (empfohlen für Langzeit)
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
dpkg -i percona-release_latest.jammy_all.deb
percona-release setup ps57
apt install percona-server-server-5.7

# MySQL-Version prüfen
mysql --version
mysql -e "SELECT VERSION();"

Schritt 4: In-Place Upgrade vs. Neuinstallation

Option A: In-Place Upgrade (do-release-upgrade)
─────────────────────────────────────────────
Vorteil:  alle Configs bleiben, weniger Arbeit
Nachteil: PPAs werden deaktiviert, müssen neu konfiguriert werden
          PHP/MySQL könnten auf neue Version gezogen werden
          Risiko: kaputte Abhängigkeiten

# Vorgehen:
do-release-upgrade -d     # Entwicklungsversion
do-release-upgrade        # stabile Version

# ⚠️ VOR dem Upgrade:
# 1. Vollständiges Snapshot/Backup
# 2. PHP/MySQL PPAs deaktivieren
# 3. Nach Upgrade: PPAs neu einrichten

Option B: Neuinstallation (empfohlen für Legacy-Stack)
──────────────────────────────────────────────────────
Vorteil:  saubere Basis, keine alten Abhängigkeiten
          PHP/MySQL gezielt installierbar
Nachteil: mehr Arbeit, alle Configs neu einrichten

# Ablauf:
# 1. Ubuntu 22.04 fresh install
# 2. PPAs einrichten (Ondřej PHP + MySQL/Percona)
# 3. PHP 7.2 + MySQL 5.7 installieren
# 4. Konfigurationen übertragen
# 5. Datenbank importieren
# 6. Anwendung testen
# 7. DNS/IP umschalten

Schritt 5: Migrations-Test vor Go-Live

# Anwendung auf neuem Server testen:
# /etc/hosts auf Test-Client:
echo "10.0.1.51 www.kunde.example.com" >> /etc/hosts

# PHP-Kompatibilitätsprüfung:
php -l /var/www/html/index.php         # Syntax-Check
php -l /var/www/html/*.php

# PHP Compatibility Checker (für gesamtes Projekt):
composer require --dev phpcompatinfo/phpcompatinfo
# oder:
phpcs --standard=PHPCompatibility \
  --runtime-set testVersion 7.2 \
  /var/www/html/

# MySQL: Datenbank importieren und prüfen
mysql -u root -p shopdb < /root/db_backup.sql
mysql -e "SHOW TABLES;" shopdb
mysql -e "SELECT COUNT(*) FROM orders;" shopdb

# Apache/nginx Error-Log beobachten beim ersten Test
tail -f /var/log/apache2/error.log
tail -f /var/log/nginx/error.log

Schritt 6: Wartungsfenster und Go-Live

# 1. Wartungsfenster ankündigen (mind. 48h vorher!)
# 2. Wartungsseite aktivieren

# 3. Letztes Datenbank-Backup kurz vor Umschaltung
mysqldump --all-databases --single-transaction \
  > /root/db_final_$(date +%Y%m%d_%H%M).sql

# 4. Neue TTL für DNS war schon auf 300 gesenkt?
dig @10.0.0.53 www.kunde.example.com | grep TTL

# 5. DNS umschalten
# In Zonefile: A-Record auf neue IP
rndc reload example.com

# 6. Warten bis TTL abläuft (max 300s)
sleep 300

# 7. Testen
curl -I https://www.kunde.example.com

# 8. Alten Server noch 7 Tage bereithalten!

🦹 Angreifer-Perspektive: Was bietet Legacy-Stack?

PHP 7.2 – bekannte Angriffsvektoren

PHP 7.2 EOL seit November 2020:
→ Keine Sicherheits-Patches mehr
→ Bekannte CVEs ohne Fix:

Relevante CVE-Kategorien:
- Type Confusion Vulnerabilities
- Buffer Overflow in bestimmten Extensions
- Deserializierungs-Schwachstellen

Angriffspunkt:
curl -X POST https://www.ziel.de/upload.php \
  -F "file=@shell.php;type=image/jpeg"
→ wenn Upload-Validierung auf PHP 7.2 Bugs setzt: Shell hochgeladen

MySQL 5.7 – bekannte Angriffsvektoren

MySQL 5.7 EOL seit Oktober 2023:
→ CVE-2023-22084: Privilege Escalation
→ CVE-2023-22079: DoS via SQL Injection Variante

Wenn MySQL von außen erreichbar (Port 3306 offen!):
mysql -h ziel.de -u root -p
→ Passwort-Brute-Force gegen bekannte Standard-Passwörter

Wenn SQL-Injection in PHP-Anwendung:
'; DROP TABLE users; --
' UNION SELECT username,password FROM admin_users --

Was der Angreifer zuerst prüft

# PHP-Version aus HTTP-Header lesen:
curl -I https://www.ziel.de | grep X-Powered-By
# X-Powered-By: PHP/7.2.34   ← sofort sichtbar!

# MySQL-Version aus Fehlermeldungen:
# Wenn Debug-Modus an: Fehlermeldungen zeigen MySQL-Version

# Empfehlung für Admin:
# X-Powered-By Header deaktivieren!
# /etc/php/7.2/apache2/php.ini:
# expose_php = Off

👔 Kunden-Perspektive: Was bedeutet das für mich?

Situation: Anwendung läuft auf PHP 7.2 / MySQL 5.7
           Entwickler sagt: "Upgrade zu teuer, läuft doch"

Risiken die der Kunde tragen muss:
→ Keine Sicherheitspatches für PHP und MySQL
→ Bei Datenpanne: DSGVO-Haftung bleibt beim Betreiber
→ Versicherungen schließen EOL-Software oft aus
→ PCI-DSS (Kreditkarten): EOL-Software = Verstoß

Was Admin dem Kunden klar machen muss:
"Wir können den Server betreiben, aber:
 PHP 7.2 und MySQL 5.7 erhalten keine Sicherheitsupdates mehr.
 Bei einem Sicherheitsvorfall haftet der Auftraggeber.
 Wir empfehlen dringend eine Anwendungs-Migration zu PHP 8.x."

Migration dokumentieren

E-Mail an Kunden (zur Dokumentation):
Datum: [Datum]
Betreff: Sicherheitshinweis – EOL Software PHP 7.2 / MySQL 5.7

Sehr geehrte Damen und Herren,

wir betreiben Ihre Anwendung derzeit auf:
- PHP 7.2 (End of Life seit 30.11.2020)
- MySQL 5.7 (End of Life seit 31.10.2023)

Diese Versionen erhalten keine Sicherheitsupdates mehr.
[...]
Wir empfehlen dringend eine Migration auf aktuelle Versionen.
Bis dahin betreiben wir die Infrastruktur auf Ubuntu 22.04 LTS
als Kompromisslösung (Support bis April 2027).

Mit freundlichen Grüßen

🎯 Erkenntnis – Drei Perspektiven zusammen

Perspektive Kernaussage
👨‍💻 Admin Ubuntu 22.04 + Ondřej PPA = PHP 7.2 machbar – aber nur als Zwischenlösung
🦹 Angreifer X-Powered-By: PHP/7.2 im Header = Einladung zu bekannten CVEs
👔 Kunde EOL-Stack = Haftungsrisiko – schriftlich dokumentieren!

🗺️ Migrationspfad – Gesamtübersicht

JETZT:          Ubuntu 18.04/20.04 + PHP 7.2 + MySQL 5.7
                → EOL, unsicher, läuft aber

ZWISCHENZIEL:   Ubuntu 22.04 LTS + PHP 7.2 (PPA) + MySQL 5.7 (Percona)
                → Support bis April 2027
                → gleiche Anwendung ohne Code-Änderung
                → Zeit kaufen für Schritt 3

ZIEL:           Ubuntu 24.04 LTS + PHP 8.2/8.3 + MySQL 8.0
                → Anwendungs-Migration nötig (PHP 8 Breaking Changes!)
                → Support bis April 2029

PHP 7 → PHP 8 Breaking Changes (Vorschau für Entwickler)

Wichtigste Breaking Changes PHP 7.x → 8.x:

1. str_contains(), str_starts_with(), str_ends_with() → neu in 8.0
2. match statt switch (strikterer Typvergleich)
3. Named Arguments → neu in 8.0
4. Union Types → neu in 8.0
5. Nullsafe Operator ?-> → neu in 8.0
6. Deprecated: create_function(), each()
7. Error Handling: viele Warnings werden zu Exceptions

Test-Tool:
composer require --dev rector/rector
vendor/bin/rector process src --dry-run --set php80

📋 Schnellreferenz: Legacy Migration – Einzeiler

# Ist-Zustand
php --version && mysql --version && lsb_release -a

# PHP 7.2 auf 22.04
add-apt-repository ppa:ondrej/php && apt update
apt install php7.2 php7.2-fpm php7.2-mysql php7.2-xml php7.2-mbstring

# PHP-Version wechseln
update-alternatives --set php /usr/bin/php7.2

# MySQL 5.7 via Percona
percona-release setup ps57 && apt install percona-server-server-5.7

# Backup vor Migration
mysqldump --all-databases --single-transaction > /root/db_$(date +%Y%m%d).sql
tar czf /root/configs_$(date +%Y%m%d).tar.gz /etc/apache2 /etc/nginx /etc/php /etc/mysql

# X-Powered-By verstecken
echo "expose_php = Off" >> /etc/php/7.2/apache2/php.ini