# MQTT

# MQTT-BaCo

# Topics

IP-Addresse: 10.100.10.16

# MQTT-BaCo - Installation MQTT

<div class="note" id="bkmrk-voraussetzung%3A-alle-">**Voraussetzung:** Alle Befehle werden als **root** ausgeführt (sonst geht „ohne sudo“ nicht).  
</div>```
su -
```

<div class="warn" id="bkmrk-zu-%E2%80%9C500-jahre-zertif">**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).  
</div>---

## 0. Werte anpassen

<div class="note" id="bkmrk-in-dieser-doku-ist-d">In dieser Doku ist die Broker-IP als Beispiel: **192.168.1.10**  
Ersetze sie überall durch deine echte Broker-IP.</div>---

## 1. Pakete installieren

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

---

## 2. Verzeichnisse &amp; 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"
```

<div class="warn" id="bkmrk-wenn-du-es-ernst-mei">**Wenn du es ernst meinst mit Sicherheit:** `ca.key` gehört offline. Auf dem Broker bleibt nur `ca.crt`.</div>### 3.2 Server-Zertifikat erstellen (nur IP, kein DNS)

<div class="note" id="bkmrk-f%C3%BCr-ip-basierte-veri">Für IP-basierte Verifikation ist **SAN: IP** entscheidend. CN ist praktisch Deko.</div>```
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
```

<div class="note" id="bkmrk-wenn-du-unbedingt-50">Wenn du unbedingt 500 Jahre auch fürs Server-Zertifikat willst: `-days 182621`. Sicherer wird’s dadurch nicht.</div>### 3.3 Client-Zertifikat erstellen (mTLS)

<div class="note" id="bkmrk-der-cn-des-client-ze">Der CN des Client-Zerts wird später als “Username” für ACLs verwendet (use_identity_as_username).</div>```
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 &amp; 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)

<div class="note" id="bkmrk-auf-dem-client-brauc">Auf dem Client brauchst du: `ca.crt`, `client-sensor01.crt`, `client-sensor01.key`.  
Verbinde dich per IP: **192.168.1.10**.</div>```
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'
```

<div class="warn" id="bkmrk-niemals---insecure-n">**Niemals** `--insecure` nutzen. Das ist “Sicherheit aus Dekorationszwecken”.</div>---

## 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.