Zum Inhalt

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_statements aktivieren 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 utf8mb4 etablieren.

  • Netzwerk- & Socket-Sicherheit


    TCP-Listener strikt an Loopback (127.0.0.1) binden, Socket-Dateiberechtigungen unter /run sperren und pg_hba.conf auditieren.

  • systemd & Ressourcenlimits


    File-Deskriptor-Limits anheben (LimitNOFILE=65536), automatische Neustarts bei Abstürzen konfigurieren und Health-Checks via pg_isready einrichten.


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:

# PostgreSQL Readiness-Probe (Exit-Code 0 = betriebsbereit)
pg_isready -h 127.0.0.1 -p 5432 -U app_runtime -d enterprise_prod

# MariaDB Readiness-Probe (Exit-Code 0 = betriebsbereit)
mariadb-admin -h 127.0.0.1 -u app_runtime -p'Secr3t_K3y_Pr0d_2026!' ping