PostgreSQL & MariaDB Bereitstellung: Enterprise-Setup & Härtung unter Debian Linux
Erstellt: 08.11.2026 · Zuletzt aktualisiert: 08.11.2026 · Nejat Hakan
Management Summary: Der produktive Betrieb von Datenbanken in Enterprise-Umgebungen erfordert mehr als die bloße Installation veralteter Standardpakete der Linux-Distribution. Zuverlässige Architekturen verlangen den Einsatz der neuesten stabilen Datenbank-Engines direkt aus den offiziellen Upstream-Repositories, die Durchsetzung kryptografisch sicherer Authentifizierungsverfahren wie SCRAM-SHA-256, die deterministische Konfiguration von UTF-8 / UTF8MB4-Zeichensätzen zur Vermeidung von Datenabschneidung sowie die strikte Absicherung lokaler Kommunikationskanäle über geschützte Unix-Domain-Sockets. Dieser Leitfaden liefert automatisierte, produktionserprobte Bereitstellungs-Workflows für PostgreSQL 17 und MariaDB 11 unter Debian 12 (Bookworm).
-
PostgreSQL 17 Bereitstellung
PGDG-Repository einbinden, saubere UTF-8-Cluster initialisieren,
pg_stat_statementsaktivieren und SCRAM-SHA-256-Passworthashing erzwingen. -
MariaDB 11 Bereitstellung
Automatisierte Härtung ohne interaktive Abfragen: Anonyme Accounts entfernen, Unix-Socket-Authentifizierung absichern und 4-Byte
utf8mb4etablieren. -
Netzwerk- & Socket-Sicherheit
TCP-Listener strikt an Loopback (
127.0.0.1) binden, Socket-Dateiberechtigungen unter/runsperren undpg_hba.confauditieren. -
systemd & Ressourcenlimits
File-Deskriptor-Limits anheben (
LimitNOFILE=65536), automatische Neustarts bei Abstürzen konfigurieren und Health-Checks viapg_isreadyeinrichten.
1. Architektonischer Vergleich der beiden Engines
Vor der Bereitstellung müssen Systems Engineers die wesentlichen architektonischen Eigenschaften und Trade-offs beider Systeme abwägen:
| Eigenschaft | PostgreSQL 17 | MariaDB 11 (InnoDB-Engine) |
|---|---|---|
| Prozess-/Thread-Modell | Process-per-Connection (fork()) |
Thread-per-Connection / Thread-Pool |
| Haupt-Speicherengine | Einheitlicher Heap-Speicher + B-Tree-Indizes | Clustered Index (Index-Organized Table) |
| Standard-Isolationsstufe | READ COMMITTED |
REPEATABLE READ |
| Passwort-Hashing | SCRAM-SHA-256 (kryptografische Nonce) |
caching_sha2_password / ed25519 |
| JSON-Unterstützung | Natives binäres JSONB mit GIN-Indizierung |
Funktionale JSON-Hilfsfunktionen über Text |
| Erweiterungs-Ökosystem | Exzellent (TimescaleDB, pgvector, PostGIS) |
Pluggable Engines (ColumnStore, Spider) |
| Ideal geeignet für | Komplexe Analysen, Vektordaten, strikte SQL-Treue | Durchsatzstarke Web-Apps, CMS, E-Commerce |
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
CLIENT["Client-Anwendung<br/>(Backend Web Service)"]
subgraph PG ["1. PostgreSQL 17 Sockets"]
direction TB
PG_UDS["Unix Domain Socket<br/>/var/run/postgresql/<br/>.s.PGSQL.5432 (peer)"]
PG_NET["TCP Listener<br/>127.0.0.1:5432<br/>(scram-sha-256)"]
PG_UDS --> PG_NET
end
subgraph MARIA ["2. MariaDB 11.4 Sockets"]
direction TB
MARIA_UDS["Unix Domain Socket<br/>/run/mysqld/mysqld.sock<br/>(unix_socket)"]
MARIA_NET["TCP Listener<br/>127.0.0.1:3306<br/>(sha256_password)"]
MARIA_UDS --> MARIA_NET
end
CLIENT --> PG
PG ==> MARIA
2. PostgreSQL 17: Offizielle PGDG-Bereitstellung auf Debian 12
Um immer aktuelle Sicherheitsupdates und die neueste Major-Version 17 zu erhalten, binden wir das offizielle PostgreSQL Global Development Group (PGDG) Repository ein:
# Datei: /opt/db-ops/install_postgresql17_debian.sh
#!/usr/bin/env bash
set -euo pipefail
# 1. Voraussetzungen installieren und offiziellen PGDG-GPG-Schlüssel importieren
sudo apt update && sudo apt install -y curl ca-certificates gnupg lsb-release
sudo install -d /etc/apt/keyrings
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
# 2. Offizielles PGDG-APT-Repository registrieren
echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | \
sudo tee /etc/apt/sources.list.d/pgdg.list
# 3. PostgreSQL 17 Server, Client und Contrib-Erweiterungen installieren
sudo apt update
sudo apt install -y postgresql-17 postgresql-client-17 postgresql-contrib-17
# 4. systemd-Dienst aktivieren und Socket-Bereitschaft prüfen
sudo systemctl enable --now postgresql
pg_isready -h 127.0.0.1 -p 5432
Härtung der pg_hba.conf & Datenbank-Initialisierung
In der Standardkonfiguration sollten Passwörter niemals über unsichere MD5-Hashes übertragen werden. Wir erzwingen strikt scram-sha-256 für alle TCP-Schnittstellen:
# Datei: /etc/postgresql/17/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# Lokale Administration via Unix Domain Socket (erfordert identischen OS-Benutzer)
local all postgres peer
# Lokale Benutzer greifen auf eigene Datenbanken via Unix Socket zu
local all all peer
# IPv4 Loopback-Verbindungen für Anwendungen: STRIKT SCRAM-SHA-256
host all all 127.0.0.1/32 scram-sha-256
# IPv6 Loopback-Verbindungen für Anwendungen: STRIKT SCRAM-SHA-256
host all all ::1/128 scram-sha-256
Konfiguration neu laden und einen dedizierten App-Benutzer samt isolierter Datenbank anlegen:
# Datei: /opt/db-ops/setup_production_pg_database.sh
#!/usr/bin/env bash
set -euo pipefail
# 1. Konfiguration unterbrechungsfrei neu laden
sudo systemctl reload postgresql
# 2. Anwendungs-Rolle und Produktions-Datenbank anlegen
sudo -u postgres psql <<'EOF'
-- SCRAM-SHA-256 für alle neu erzeugten Passwörter erzwingen
SET password_encryption = 'scram-sha-256';
-- Dedizierte Anwendungs-Rolle anlegen (niemals Superuser 'postgres' für Apps nutzen!)
CREATE ROLE app_runtime WITH LOGIN PASSWORD 'Secr3t_K3y_Pr0d_2026!';
-- Saubere Produktions-Datenbank mit C.UTF-8 Locale erstellen
CREATE DATABASE enterprise_prod
OWNER app_runtime
ENCODING 'UTF8'
LC_COLLATE 'C.UTF-8'
LC_CTYPE 'C.UTF-8'
TEMPLATE template0;
-- Öffentliche Standardrechte auf der Datenbank entziehen
REVOKE ALL ON DATABASE enterprise_prod FROM PUBLIC;
EOF
3. MariaDB 11: Enterprise-Bereitstellung auf Debian 12
MariaDB ist der Standard-Ersatz für MySQL unter Debian. Der Administrator-Account root wird standardmäßig über das Kernel-Plugin unix_socket geschützt: Ausschließlich der lokale Betriebssystem-Benutzer root (z. B. via sudo mariadb) kann sich ohne Passwort anmelden, was Passwort-Diebstahl über das Netzwerk unmöglich macht.
# Datei: /opt/db-ops/install_mariadb11_debian.sh
#!/usr/bin/env bash
set -euo pipefail
# 1. MariaDB Server und Client aus Debian Bookworm installieren
sudo apt update
sudo apt install -y mariadb-server mariadb-client
# 2. systemd-Dienst aktivieren und starten
sudo systemctl enable --now mariadb
mariadb-admin ping --silent
Automatisierte Härtung & 4-Byte UTF8MB4-Konfiguration
In automatisierten Infrastrukturen sollte das interaktive mysql_secure_installation durch ein deterministisches Skript ersetzt werden:
-- Datei: /opt/db-ops/harden_mariadb.sql
-- 1. Anonyme Benutzer-Accounts löschen
DELETE FROM mysql.user WHERE User = '';
-- 2. Unsichere Test-Datenbank und zugehörige Berechtigungen entfernen
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = 'test' OR Db LIKE 'test\_%';
-- 3. Berechtigungen sofort neu laden
FLUSH PRIVILEGES;
Konfiguration anpassen, um vollwertiges 4-Byte utf8mb4 (verhindert Datenabschneidung bei Emojis und internationalen Sonderzeichen) zu erzwingen:
# Datei: /etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
# Strikte Bindung an localhost (Datenbank-Ports niemals direkt ins Internet öffnen)
bind-address = 127.0.0.1
# Vollständige 4-Byte UTF-8 Kodierung erzwingen
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_520_ci
# Verbindungs- und Ressourcenlimits
max_connections = 200
connect_timeout = 5
wait_timeout = 600
max_allowed_packet = 64M
# MariaDB neu starten und Mandanten anlegen
sudo systemctl restart mariadb
sudo mariadb <<'EOF'
CREATE DATABASE enterprise_prod CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
CREATE USER 'app_runtime'@'127.0.0.1' IDENTIFIED BY 'Secr3t_K3y_Pr0d_2026!';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES
ON enterprise_prod.* TO 'app_runtime'@'127.0.0.1';
FLUSH PRIVILEGES;
EOF
4. systemd-Diensthärtung & Health-Checks
In produktiven Umgebungen werden Datenbankdienste zuverlässig über systemd gesteuert. Durch gezielte Overrides verhindern wir Fehler des Typs „Too many open files“ bei Lastspitzen:
# Datei: /etc/systemd/system/postgresql.service.d/override.conf
[Service]
# File-Deskriptor-Limit für viele gleichzeitige Verbindungen und Tabellen anheben
LimitNOFILE=65536
# Verhindern, dass der Linux OOM-Killer bei Speicherdruck zuerst die Datenbank beendet
OOMScoreAdjust=-900
# Automatischer Neustart bei unerwartetem Absturz
Restart=on-failure
RestartSec=5s
Overrides aktivieren und Status verifizieren:
sudo systemctl daemon-reload
sudo systemctl restart postgresql
systemctl show postgresql -p LimitNOFILE -p OOMScoreAdjust
Health-Check-Sonden
Verfügbarkeitstests für automatisierte Monitoring-Skripte oder Loadbalancer: