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 üblicheBroker-IP “maximalals sicher”-Ansatz.Beispiel: Unten192.168.1.10
Ersetze istsie beidesüberall dokumentiert.durch deine echte 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 fürIP, denkein Broker)DNS)

    Der

    Für BrokerIP-basierte brauchtVerifikation einist Server-ZertifikatSAN: mitIP korrektenentscheidend. SANsCN (DNS/IP),ist damitpraktisch 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 dasfürs 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” verwendenfür ACLs verwendet (für ACLs)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.