# Lokale Sicherheit

> Sicherheitsanforderungen an LMSP-Dienste, mit Loopback-Bindung, Kopplung und Bearer-Tokens, Scopes, Origin- und Host-Prüfungen gegen bösartige Webseiten, LAN-Modus und Protokollierungsregeln.

Source: https://madeforagent.com/de/lmsp/1.0/security/
Language: de
Specification: LMSP 1.0 (draft)
Updated: 2026-11-08

## 10.1 Grundlage {#baseline}

Das ausschließliche Lauschen auf localhost ist keine absolute Sicherheit: Eine bösartige Webseite kann trotzdem versuchen, lokale Ports zu erreichen. LMSP kombiniert deshalb mehrere Maßnahmen.

- Ein Dienst **MUSS** sich standardmäßig an die Loopback-Adressen binden. Er **DARF NICHT** auf `0.0.0.0` oder einer anderen Nicht-Loopback-Adresse lauschen, solange der LAN-Modus nicht aktiviert ist ([Abschnitt 10.5](https://madeforagent.com/de/lmsp/1.0/security.md#lan)).
- Beim ersten Start **SOLLTE** ein Dienst ein zufälliges Dienstgeheimnis mit hoher Entropie erzeugen und damit, statt mit einem eingebauten Standardwert, Tokens ausstellen und prüfen.
- Jede Anfrage an die Kernschnittstelle **MUSS** ein gültiges Bearer-Token tragen, außer bei den in [Abschnitt 4.2](https://madeforagent.com/de/lmsp/1.0/endpoints.md#conventions) aufgeführten Bootstrap-Endpunkten. Von Loopback zu kommen genügt allein nie.

## 10.2 Kopplung und Tokens {#pairing}

Ein Client erhält sein eigenes Bearer-Token mit einem lokalen Kopplungscode. Der Nutzer lässt sich vom Dienst auf dessen Weise einen Kopplungscode anzeigen, und der Client reicht ihn ein:

```http
POST /lmsp/v1/pair
Content-Type: application/json
```

```json
{
  "client_name": "example-client",
  "pairing_code": "K7QD-4M2X",
  "scopes": ["inference"]
}
```

| Anfragefeld | Bedeutung |
| --- | --- |
| `client_name` | Anzeigename des Clients, dem Nutzer angezeigt. |
| `pairing_code` | Der Code, den der Nutzer vom Dienst erhalten hat. |
| `scopes` | Optionale Liste der angeforderten Scopes. Standardwert ist `["inference"]`. |

Der Dienst antwortet mit einem Token. Der `token_type` ist immer `Bearer`:

```json
{
  "client_id": "cli_01J8MAT3W6X9B2D5F8H1K4N7QZ",
  "access_token": "lmsp_example_3f9a1c52e7d84b60",
  "token_type": "Bearer",
  "scopes": ["inference"]
}
```

Danach sendet der Client mit jeder Anfrage `Authorization: Bearer <token>`.

- Ein Kopplungscode **MUSS** nur einmal verwendbar sein und **SOLLTE** innerhalb von 5 Minuten ablaufen. Er **SOLLTE** mindestens 40 Bit Entropie enthalten. Ein Dienst **MUSS** fehlgeschlagene Versuche begrenzen. Ein falscher oder abgelaufener Code wird mit `401` und `unauthorized` beantwortet.
- Tokens sind pro Client unabhängig, sodass der Nutzer einen Client widerrufen kann, ohne die anderen zu beeinträchtigen. Ein Dienst **SOLLTE** dem Nutzer erlauben, gekoppelte Clients aufzulisten und zu widerrufen.
- Ein Client **SOLLTE** sein Token im Schlüsselbund oder in der Anmeldeinformationsverwaltung des Betriebssystems aufbewahren. Ein Dienst **SOLLTE** nur einen Hash jedes Tokens speichern.
- Ein fehlendes, ungültiges oder widerrufenes Token wird mit `401`, `unauthorized` und einem `WWW-Authenticate: Bearer`-Header beantwortet. Ein gültiges Token, dem der von einem Endpunkt benötigte Scope fehlt, wird mit `403` und `forbidden` beantwortet.

## 10.3 Scopes {#scopes}

Berechtigungen sind in getrennte Scopes aufgeteilt. Modelle herunterzuladen, Modelle zu löschen und Tools auszuführen läuft nie über den Inferenz-Scope mit.

| Scope | Erlaubt |
| --- | --- |
| `inference` | Den Modellkatalog lesen, Antworten und Aufgaben erstellen sowie die eigenen Aufgaben des Clients lesen und abbrechen. |
| `models:manage` | Modelle laden und entladen. |
| `models:install` | Reserviert. Modelle herunterladen und löschen. |
| `tools:execute` | Reserviert. Tools auf Dienstseite ausführen. |

Aufgaben und gespeicherte Antworten gehören dem Client, der sie erstellt hat. Ein Dienst **SOLLTE** auf die Anfrage eines anderen Clients antworten, als gäbe es sie nicht (`task_not_found` oder `response_not_found`).

## 10.4 Schutz von Browser und Netzwerk {#browser}

- Ein Dienst **MUSS** Cross-Origin-Browseranfragen standardmäßig ablehnen und nur ausdrücklich konfigurierte `Origin`-Werte zulassen. Eine Anfrage mit einer anderen `Origin` wird mit `403` und `forbidden` beantwortet.
- Ist ein Origin erlaubt, beantwortet der Dienst dessen CORS-Preflight-Anfragen und sendet `Access-Control-Allow-Origin` mit genau diesem Origin, nie mit `*`.
- Ein Dienst **MUSS** den `Host`-Header validieren, um DNS-Rebinding zu verhindern. Er akzeptiert nur Hostnamen, die er bedient: die Loopback-Namen und -Adressen sowie alle für den LAN-Modus konfigurierten Namen. Jeder andere Wert wird mit `403` und `forbidden` beantwortet.

## 10.5 LAN-Modus {#lan}

LAN-Modus bedeutet, über die Loopback-Adressen hinaus zu lauschen.

- Ein Dienst **DARF NICHT** den LAN-Modus aktivieren, es sei denn, der Nutzer schaltet ihn ausdrücklich ein.
- Im LAN-Modus **MUSS** ein Dienst eine Authentifizierung verlangen und **SOLLTE** außerdem TLS aktivieren. Ein Client **SOLLTE NICHT** ein Token über unverschlüsseltes HTTP an eine Nicht-Loopback-Adresse senden, es sei denn, der Nutzer erlaubt es ausdrücklich.
- Die mDNS-Ankündigung ist nur im LAN-Modus erlaubt, wenn der Nutzer außerdem die LAN-Erkennung eingeschaltet hat ([Abschnitt 3.2](https://madeforagent.com/de/lmsp/1.0/discovery.md#mdns)).

## 10.6 Protokollierung und Datenschutz {#logging}

- Modellpfade, Logs, Prompts und generierte Inhalte **DÜRFEN NICHT** in mDNS-Ankündigungen erscheinen.
- Standardmäßig **SOLLTE** ein Dienst nur Metadaten protokollieren (Zeiten, Endpunkte, Statuscodes, IDs, Token-Zahlen und Dauern). Er **SOLLTE NICHT** vollständige Prompts oder generierte Inhalte protokollieren.
- Health-Antworten und Fehlerdetails **DÜRFEN NICHT** Modellpfade, Prompts, Zugriffstokens oder andere sensible Informationen enthalten.
