Skip to main content

MQTT-BaCo - Installation MQTT

Voraussetzung: Alle Befehle werden als root ausgeführt (sonst geht „ohne sudo“ nicht).
su -
Zu “500 Jahre Zertifikate”:
500 Jahre ist nicht “super sicher”, sondern “super lange riskant”.
Empfohlen: Root-CA lang (wenn du unbedingt willst), Server/Client kurz (Rotation).

0. Werte anpassen

In dieser Doku ist die Broker-IP als Beispiel: 192.168.1.10
Ersetze sie überall durch deine echte Broker-IP.

1. Pakete installieren

apt update
apt install -y mosquitto mosquitto-clients openssl ca-certificates

2. Verzeichnisse & Rechte

install -d -m 0750 -o root -g mosquitto /etc/mosquitto/pki
install -d -m 0700 -o root -g root /root/mqtt-pki

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

3.1 Root-CA erstellen (Beispiel: 500 Jahre)

cd /root/mqtt-pki
umask 077

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

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"
Wenn du es ernst meinst mit Sicherheit: ca.key gehört offline. Auf dem Broker bleibt nur ca.crt.

3.2 Server-Zertifikat erstellen (nur IP, kein DNS)

Für IP-basierte Verifikation ist SAN: IP entscheidend. CN ist praktisch Deko.
cd /root/mqtt-pki
umask 077

# Server Key (ECDSA P-256)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out server.key

# CSR: CN kann irgendwas sein, hier zur Ordnung die IP
# Wichtig: subjectAltName enthält NUR die IP (kein DNS)
openssl req -new -sha256 \
  -key server.key -out server.csr \
  -subj "/CN=192.168.1.10/O=YourOrg/OU=IoT/C=DE" \
  -addext "subjectAltName=IP:192.168.1.10"

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

# Signieren (empfohlen kurz, z.B. 825 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 unbedingt 500 Jahre auch fürs Server-Zertifikat willst: -days 182621. Sicherer wird’s dadurch nicht.

3.3 Client-Zertifikat erstellen (mTLS)

Der CN des Client-Zerts wird später als “Username” für ACLs verwendet (use_identity_as_username).
cd /root/mqtt-pki
umask 077

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

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

cat > client.ext <<'EOF'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature
extendedKeyUsage=clientAuth
EOF

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

4. Zertifikate zum Broker kopieren

cp /root/mqtt-pki/ca.crt /etc/mosquitto/pki/
cp /root/mqtt-pki/server.crt /etc/mosquitto/pki/
cp /root/mqtt-pki/server.key /etc/mosquitto/pki/

chown root:mosquitto /etc/mosquitto/pki/ca.crt /etc/mosquitto/pki/server.crt
chown mosquitto:mosquitto /etc/mosquitto/pki/server.key
chmod 0640 /etc/mosquitto/pki/ca.crt /etc/mosquitto/pki/server.crt
chmod 0400 /etc/mosquitto/pki/server.key

5. Mosquitto konfigurieren (nur TLS + mTLS)

5.1 TLS/mTLS Listener

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

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

per_listener_settings true
sys_interval 0

listener 8883
protocol mqtt

tls_version tlsv1.3

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

ciphers_tls1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256

require_certificate true
use_identity_as_username true
allow_anonymous false

acl_file /etc/mosquitto/aclfile

# Optional:
# crlfile /etc/mosquitto/pki/ca.crl

5.2 ACL-Datei

Datei: /etc/mosquitto/aclfile

topic deny #
pattern readwrite clients/%u/#
chown root:mosquitto /etc/mosquitto/aclfile
chmod 0640 /etc/mosquitto/aclfile

6. Dienst starten & prüfen

systemctl enable --now mosquitto
systemctl status mosquitto
ss -ltnp | less
# In less nach ":8883" suchen

7. Firewall (nftables) minimal

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

# Port 8883 nur aus dem LAN erlauben (Beispiel)
tcp dport 8883 ip saddr 192.168.1.0/24 accept
systemctl enable --now nftables
nft list ruleset | less

8. Systemd-Hardening (optional)

Datei: /etc/systemd/system/mosquitto.service.d/hardening.conf

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

cat > /etc/systemd/system/mosquitto.service.d/hardening.conf <<'EOF'
[Service]
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
LockPersonality=true
RestrictNamespaces=true
MemoryDenyWriteExecute=true
UMask=0077
ReadWritePaths=/var/lib/mosquitto /var/log/mosquitto
EOF

systemctl daemon-reload
systemctl restart mosquitto

9. Client-Test (mTLS, nur IP)

Auf dem Client brauchst du: ca.crt, client-sensor01.crt, client-sensor01.key.
Verbinde dich per IP: 192.168.1.10.
mosquitto_sub -h 192.168.1.10 -p 8883 \
  --tls-version tlsv1.3 \
  --cafile ca.crt \
  --cert client-sensor01.crt \
  --key client-sensor01.key \
  -t 'clients/sensor01/#' -v
mosquitto_pub -h 192.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 nutzen. Das ist “Sicherheit aus Dekorationszwecken”.

10. Zertifikat-Rotation ohne Neustart

systemctl kill -s HUP mosquitto

11. Sicherheits-Kurzliste

  • Nur 8883 offen, ideal nur LAN/VPN.
  • TLS 1.3 only, mTLS Pflicht.
  • Root-CA Private Key offline.
  • ACL “default deny”.
  • Rotation statt 500-Jahre-Leaf-Zerts.