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).
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.
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:
Verbinde dich per IP: 192.168.1.10.
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.
No Comments