Skip to main content

MQTT-BaCo - Installation MQTT

Debian 13: Mosquitto MQTT (Mosquitto) schnell & sehr sicherBroker mit Zertifikats-AuthmTLS (mTLS)Client-Zertifikate) + TLS 1.3 (nur IP, ohne DNS, ohne sudo)

Ziel:Voraussetzung: EinAlle Mosquitto-Broker,Befehle derwerden nurals verschlüsselteroot Verbindungen annimmt, bei denen sich auch der Client per Zertifikat ausweistausgeführt (mutualsonst TLSgeht /„ohne mTLS)sudo“ nicht).
Zusätzlich:
su saubere Rechte, minimale Angriffsfläche, Firewall, und (optional) Systemd-Hardening.
-
Wichtig zuZu “500 Jahre Zertifikate”:
Ein Zertifikat, das 500 Jahre gültig ist, ist nicht “super sicher”. Nicht wegen Mathematik allein,, sondern wegen Praxis: Schlüssel können kompromittiert werden, Algorithmen werden über Jahrzehnte schwächer, Geräte werden ersetzt, und manche Stacks/Policies mögen extrem“super lange Laufzeiten nicht.
riskant”.
Empfehlung:Empfohlen: Root-CA sehr lang (ja, wenn du willstunbedingt 500 Jahre)willst), aber Server- und Client-ZertifikateServer/Client kurz (z.B.Rotation).

Wenn 1–2du Jahre)am und24.12.2025 rotieren.startest: Das500 Jahre = 182621 Tage.

0. Werte anpassen

In dieser Doku ist derdie Broker-IP als Beispiel: 192.168.1.10
Ersetze sie üblicheberall “maximaldurch sicher”-Ansatz.deine Untenechte ist beides dokumentiert.Broker-IP.

1. Architektur-Entscheidung

  • Broker: Eclipse Mosquitto (leichtgewichtig, schnell, standardnah)
  • Transport: TLS 1.3 (MQTTS auf Port 8883)
  • Authentifizierung: Client-Zertifikate (require_certificate)
  • Autorisierung: ACL-Datei, Username aus Zertifikat (CN) via use_identity_as_username

2. Pakete installieren (Debian 13)

sudo apt update
sudo
apt install -y mosquitto mosquitto-clients openssl ca-certificates
Mosquitto läuft als Systemdienst. Wir konfigurieren ihn so, dass er nur noch einen TLS-Listener bereitstellt.

3.2. VerzeichnisstrukturVerzeichnisse & Rechte

Wir legen ein PKI-Verzeichnis an, in dem der Broker seine Server-Zertifikate liest. Die Root-CA-Schlüssel sollten im Idealfall offline bleiben.

# PKI-Verzeichnis: lesbar für Gruppe "mosquitto", private Keys später restriktiv
sudo install -d -m 0750 -o root -g mosquitto /etc/mosquitto/pki

# Optional: eigenes Arbeitsverzeichnis für CA/Signing (nicht auf dem Broker lassen, wenn "super sicher")
sudo
install -d -m 0700 -o root -g root /root/mqtt-pki

4.3. PKI erstellen (Root-CA + Server + Client)

4.3.1 Root-CA erstellen (Beispiel: 500 Jahre)

Wir nutzen ECDSA (P-384) für die Root-CA. Das ist effizient und stark.
Hinweis zu “500 Jahre”: Wenn du das am 24.12.2025 erstellst, entsprechen 500 Jahre 182621 Tagen.

cd /root/mqtt-pki
umask 077

# Root-CA Private Key

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out ca.key

# Root-CA Zertifikat (selbstsigniert)
# 500 Jahre ab 24.12.2025: -days 182621

openssl req -x509 -new -sha384 -days 182621 \
  -key ca.key -out ca.crt \
  -subj "/CN=MQTT Root CA/O=YourOrg/OU=IoT/C=DE" \
  -addext "basicConstraints=critical,CA:TRUE,pathlen:1" \
  -addext "keyUsage=critical,keyCertSign,cRLSign" \
  -addext "subjectKeyIdentifier=hash"
Super-sicher-Variante:Wenn du es ernst meinst mit Sicherheit: Kopiere ca.key aufgehört einoffline. Offline-System (USB, Tresor, was auch immer Menschen so machen) und lasse aufAuf dem Broker bleibt nur ca.crt.

4.3.2 Server-Zertifikat erstellen (TLSnur IP, kein DNS)

r denIP-basierte Broker)Verifikation

Derist BrokerSAN: brauchtIP einentscheidend. Server-ZertifikatCN mitist korrektenpraktisch SANs (DNS/IP), damit Clients den Hostnamen prüfen können.

Deko.
cd /root/mqtt-pki
umask 077

# Server Key (ECDSA P-256 ist schneller, i.d.R. sehr kompatibel)256)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out server.key

# CSRCSR: mitCN SANkann (DNSirgendwas +sein, optionalhier IP)zur -Ordnung passe mqtt.example.lan unddie IP
an# Wichtig: subjectAltName enthält NUR die IP (kein DNS)
openssl req -new -sha256 \
  -key server.key -out server.csr \
  -subj "/CN=mqtt.example.lan/192.168.1.10/O=YourOrg/OU=IoT/C=DE" \
  -addext "subjectAltName=DNS:mqtt.example.lan,IP:192.168.1.10"

# Extensions für Server-Zertifikat

cat > server.ext <<'EOF'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=DNS:mqtt.example.lan,IP:192.168.1.10
EOF

# Server-Zertifikat signieren
# Empfohlen: kurzSignieren (empfohlen kurz, z.B. 825 Tage ~ 2,25 Jahre) statt 500 Jahre.Tage)
openssl x509 -req -sha256 -days 825 \
  -in server.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out server.crt -extfile server.ext
Wenn du wirklichunbedingt 500 Jahre”Jahre auch für dasrs Server-Zertifikat willst, ersetze -days 825 durchwillst: -days 182621. DasSicherer istwird’s aberdadurch das Gegenteil von “Keys rotieren” und damit nicht “maximal sicher”.nicht.

4.3.3 Client-Zertifikat erstellen (mTLS-Clientauth)mTLS)

Der ClientCN authentifiziertdes sichClient-Zerts perwird Zertifikat. Der Broker kann den CNspäter als “Username” verwenden (für ACLs)ACLs verwendet (use_identity_as_username).

cd /root/mqtt-pki
umask 077

# Client Key

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out client-sensor01.key

# CSR (CN entspricht später dem Username, wenn use_identity_as_username=true)

openssl req -new -sha256 \
  -key client-sensor01.key -out client-sensor01.csr \
  -subj "/CN=sensor01/O=YourOrg/OU=IoT/C=DE"

# Extensions für Client-Zertifikat
cat > client.ext <<'EOF'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
extendedKeyUsage=clientAuth
EOF

# Client-Zertifikat signieren (empfohlen kurz, z.B. 365 Tage)

openssl x509 -req -sha256 -days 365 \
  -in client-sensor01.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out client-sensor01.crt -extfile client.ext

5.4. Zertifikate zum Broker installierenkopieren

Auf dem Broker brauchen wir:

  • ca.crt (die CA, der der Broker vertraut)
  • server.crt + server.key (Server-Identität)
# Kopieren
sudo cp /root/mqtt-pki/ca.crt /etc/mosquitto/pki/
sudo
cp /root/mqtt-pki/server.crt /etc/mosquitto/pki/
sudo cp /root/mqtt-pki/server.key /etc/mosquitto/pki/

# Rechte: private Keys nur für mosquitto lesbar
sudo

chown root:mosquitto /etc/mosquitto/pki/ca.crt /etc/mosquitto/pki/server.crt
sudo chown mosquitto:mosquitto /etc/mosquitto/pki/server.key
sudo
chmod 0640 /etc/mosquitto/pki/ca.crt /etc/mosquitto/pki/server.crt
sudo chmod 0400 /etc/mosquitto/pki/server.key
Wichtig: Lass ca.key (Root-Private-Key) nicht auf dem Broker, wenn du es ernst meinst.

6.5. Mosquitto sicher konfigurieren (nur TLS + mTLS)

6.5.1 Hauptkonfiguration prüfen

In Debian liegt die Hauptdatei typischerweise unter /etc/mosquitto/mosquitto.conf und inkludiert Zusatzdateien aus /etc/mosquitto/conf.d/. Stelle sicher, dass dort ein include_dir /etc/mosquitto/conf.d existiert.

6.2 TLS/mTLS Listener anlegen

Neue Datei: /etc/mosquitto/conf.d/secure-tls.conf

# /etc/mosquitto/conf.d/secure-tls.conf

# Einstellungen pro Listener getrennt behandeln
per_listener_settings true
# Optional: $SYS Infos reduzieren (weniger Fingerprinting)
sys_interval 0

# TLS Listener (MQTTS)

listener 8883
protocol mqtt

# TLS 1.3 only (Minimum ist tlsv1.3)
tls_version tlsv1.3

# Server-Zertifikat + Key

cafile /etc/mosquitto/pki/ca.crt
certfile /etc/mosquitto/pki/server.crt
keyfile /etc/mosquitto/pki/server.key

# TLS 1.3 Ciphersuites (Defaults sind okay, explizit ist klarer)
ciphers_tls1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256

# mTLS: Client muss Zertifikat liefern
require_certificate true

# CN aus Client-Zertifikat als Username verwenden (für ACLs)
use_identity_as_username true
# Keine anonymen Clients
allow_anonymous false

# Autorisierung über ACL-Datei

acl_file /etc/mosquitto/aclfile

# Optional: Zertifikate sperren (CRL)
# crlfile /etc/mosquitto/pki/ca.crl

6.35.2 ACL-Datei erstellen

Datei: /etc/mosquitto/aclfile

# Standard: alles verbieten (explizit)
topic deny #

# Pattern-ACL: Jeder Client darf nur in seinen eigenen Namensraum
# %u ist der Username, der hier aus dem Zertifikats-CN kommt (use_identity_as_username)
pattern readwrite clients/%u/#

# Beispiel: Wenn du willst, dass jeder auch Status lesen kann:
# topic read clients/+/status
sudo chown root:mosquitto /etc/mosquitto/aclfile
sudo
chmod 0640 /etc/mosquitto/aclfile

7.6. Dienst starten & prüfen

sudo systemctl enable --now mosquitto
sudo systemctl status mosquitto

Port prüfen (ohne “rumgrep’en”):

ss -ltnp | less
# Suche imIn less nach ":8883" suchen

8.7. Firewall (nftables) minimal hart machen

Debian nutzt nftables. Ziel: Nur Port 8883 erlauben, idealerweise nur aus deinen Netzen/VPNs.

Datei: /etc/nftables.conf (in derdeiner input-input-Chain ergänzen)

# Beispiel (IPv4): ErlaubePort 8883 nur aus dem LAN 192.168.1.0/24erlauben (Beispiel)
tcp dport 8883 ip saddr 192.168.1.0/24 accept

# Optional (IPv6) analog:
# tcp dport 8883 ip6 saddr fd00:1234:abcd::/64 accept
sudo systemctl enable --now nftables
sudo
nft list ruleset | less

9.8. Systemd-Hardening (optional, aber sinnvoll)optional)

Drop-in erstellen:Datei: /etc/systemd/system/mosquitto.service.d/hardening.conf

sudo install -d -m 0755 /etc/systemd/system/mosquitto.service.d

sudocat tee> /etc/systemd/system/mosquitto.service.d/hardening.conf >/dev/null <<'EOF'
[Service]
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
LockPersonality=true
RestrictNamespaces=true
MemoryDenyWriteExecute=true
UMask=0077
# Mosquitto braucht Schreibzugriff für Persistence/Logs (falls aktiviert)
ReadWritePaths=/var/lib/mosquitto /var/log/mosquitto
EOF

sudo systemctl daemon-reload
sudo
systemctl restart mosquitto
Wenn
du

9. Persistence komplett deaktivierstClient-Test (und LogsmTLS, nur über journald laufen lässt), kannst du ReadWritePaths weiter einschränken.


10. Funktionstest mit mosquitto_pub / mosquitto_sub (mTLS)IP)

Client-Dateien (auf

Auf dem Client-System):

Client
    brauchst
  • du: ca.crt
  • ,
  • client-sensor01.crt
  • ,
  • client-sensor01.key
  • .
    Verbinde
dich per IP: 192.168.1.10.
# Subscribe (TLS 1.3, mTLS)
mosquitto_sub -h mqtt.example.lan192.168.1.10 -p 8883 \
  --tls-version tlsv1.3 \
  --cafile ca.crt \
  --cert client-sensor01.crt \
  --key client-sensor01.key \
  -t 'clients/sensor01/#' -v
# Publish
mosquitto_pub -h mqtt.example.lan192.168.1.10 -p 8883 \
  --tls-version tlsv1.3 \
  --cafile ca.crt \
  --cert client-sensor01.crt \
  --key client-sensor01.key \
  -t 'clients/sensor01/test' -m 'hello mTLS'
Niemals --insecure benutzen, wenn du “super sicher” sagst.nutzen. Das deaktiviertist Zertifikatsprüfung.“Sicherheit aus Dekorationszwecken”.

11.10. Zertifikate rotieren (empfohlen) & ReloadZertifikat-Rotation ohne DowntimeNeustart

Mosquitto kann Server-Zertifikat und Key per SIGHUP neu laden. Das ist perfekt für Rotation.
# Neue server.crt/server.key nach /etc/mosquitto/pki/ kopieren (atomar ersetzen)
# dann:
sudo systemctl kill -s HUP mosquitto

12.11. Optional: Zertifikate sperren (CRL)

Mosquitto unterstützt eine CRL-Datei. Damit kannst du kompromittierte Client-Zertifikate “abschalten”, ohne die CA zu wechseln. Das erfordert aber, dass du deine CA “richtig” mit Datenbank (index.txt) betreibst.

# In /etc/mosquitto/conf.d/secure-tls.conf aktivieren:
# crlfile /etc/mosquitto/pki/ca.crl
Für eine saubere CRL-Pipeline lohnt sich ein kleines CA-Setup (openssl ca) oder ein dediziertes PKI-Tool.

13. Kurz-Checkliste “wirklich sicher”Sicherheits-Kurzliste

  • Nur Port 8883 offen, ideal nur aus VPN/LAN.LAN/VPN.
  • TLS 1.3 only, mTLS Pflicht.
  • Root-CA Private Key offline.
  • Client-ZertsACL kurzlebig“default + Rotation.deny”.
  • ACLsRotation restriktiv,statt Default deny.
  • Regelmäßige Security Updates (unattended-upgrades, wenn passend).500-Jahre-Leaf-Zerts.