Clusters (DDI_CLUSTER), Kea HA pairs (DDI_KEA_HA), dynamic zones (DDI_DYNAMIC_ZONES) and SSO (DDI_SSO) now need the matching Keygen entitlement; the trial grants all of them. Only taking a feature into use is blocked (403 license_feature): existing clusters, HA pairs, dynamic zones and enabled SSO keep working and stay editable. maxAgents is checked when creating an enrollment token and, under an advisory lock, at enrollment; revoked agents do not count. GET /license reports available_features and the agent usage. The UI shows the features on the license page and disables locked controls, and keygen-setup.sh creates the entitlements and assigns them to licenses (ADR 0027). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7.4 KiB
Lizenzierung
Nur der Management-Server braucht eine Lizenz. Agents, DNS und DHCP laufen immer unverändert weiter, auch ohne Lizenz, mit abgelaufener Lizenz oder ohne Verbindung zum Lizenzserver. Die Entscheidungen dazu stehen in ADR 0016.
Überblick
| Zustand | Bedeutung | Verwaltung |
|---|---|---|
Testphase (trial) |
30 Tage ab Erststart, solange nie eine Lizenz aktiv war | voll nutzbar |
Gültig (valid) |
Lizenz online geprüft oder gültige Offline-Lizenzdatei | voll nutzbar |
Karenzzeit (grace) |
Lizenzserver nicht erreichbar, Lizenz gesperrt oder abgelaufen; Standard 14 Tage ab der letzten erfolgreichen Prüfung | voll nutzbar, Hinweis in der Oberfläche |
Schreibgeschützt (read_only) |
Testphase oder Karenzzeit vorbei, Offline-Datei abgelaufen | ansehen und exportieren ja, Änderungen nein |
Die Oberfläche zeigt den Zustand als Banner und auf der Seite Lizenz mit Ablaufdatum, Limits, Nutzung und Funktionen.
Lizenzserver: Keygen
Lizenzanbieter ist ein selbst gehostetes Keygen (Community Edition) unter https://license.beugsiud.de. Account-ID und öffentlicher Schlüssel des Accounts werden beim Build fest in den Server eingebaut (Makefile: KEYGEN_ACCOUNT_ID, KEYGEN_PUBLIC_KEY). Konfigurierbar bleiben:
| Variable | Bedeutung | Standard |
|---|---|---|
KEYGEN_URL |
Adresse des Lizenzservers | https://license.beugsiud.de |
KEYGEN_PRODUCT_ID |
Produkt, auf das Lizenzen geprüft werden | – (von keygen-setup.sh setup ausgegeben) |
DDI_LICENSE_GRACE_PERIOD |
Karenzzeit | 14d |
Jede Antwort des Lizenzservers wird mit dem eingebauten Schlüssel auf ihre Signatur geprüft. Gefälschte oder wiederholt eingespielte Antworten werden verworfen und wie „nicht erreichbar“ behandelt.
Einmalige Einrichtung in Keygen
Voraussetzungen: bash, curl, jq und ein Admin-Token des Keygen-Accounts. Das Token wird nur als Umgebungsvariable übergeben und nirgends gespeichert. Es gehört nicht ins Repository.
export KEYGEN_ADMIN_TOKEN='…' # nicht in die Shell-History: z. B. read -rs KEYGEN_ADMIN_TOKEN
tools/keygen-setup/keygen-setup.sh setup
Das Skript legt an (und verwendet beim erneuten Aufruf wieder):
- Produkt
ddi-management-server - Policy
ddi-server-standard:- genau ein Server pro Lizenz (
maxMachines: 1,strict) - Aktivierung mit dem Lizenzschlüssel (
authenticationStrategy: LICENSE) - täglicher Heartbeat; ein Server, der sich einen Tag nicht meldet, wird freigegeben und beim nächsten Kontakt automatisch neu aktiviert
- Laufzeit ein Jahr
- Standardlimits in den Metadaten:
maxAgents: 10,maxAddresses: 5000
- genau ein Server pro Lizenz (
- Entitlements für die Funktionen (siehe unten):
DDI_CLUSTER,DDI_KEA_HA,DDI_DYNAMIC_ZONES,DDI_SSO
Die ausgegebene Produkt-ID wird beim Server als KEYGEN_PRODUCT_ID eingetragen.
Limits und Funktionen
| In Keygen | Name/Code | Wirkung |
|---|---|---|
| Lizenz-Metadaten | maxAddresses |
Höchstzahl der Einträge der Adresstabelle (alle Netze zusammen) |
| Lizenz-Metadaten | maxAgents |
Höchstzahl registrierter Agents (DNS und DHCP zusammen, gesperrte zählen nicht) |
| Entitlement | DDI_CLUSTER |
DNS- und DHCP-Cluster |
| Entitlement | DDI_KEA_HA |
Kea-HA: DHCP-Cluster mit Primary und Secondary (braucht zusätzlich DDI_CLUSTER) |
| Entitlement | DDI_DYNAMIC_ZONES |
dynamische Zonen (Updates per RFC 2136, z. B. Active Directory) |
| Entitlement | DDI_SSO |
Anmeldung per Single Sign-On (OIDC) |
- Fehlt ein Metadatum, gilt dafür keine Grenze. Die Schreibweise muss genau stimmen.
- In der Testphase ist alles freigeschaltet und unbegrenzt.
- Ohne eine Funktion lässt sie sich nicht neu in Gebrauch nehmen (kein neuer Cluster, kein neues Mitglied, kein neues HA-Paar, keine neue dynamische Zone, SSO nicht einschaltbar). Was schon besteht, läuft weiter und bleibt bearbeitbar – eine Lizenzänderung schaltet weder DNS/DHCP noch den Zugang ab (ADR 0027).
- Am Agent-Limit lassen sich keine Registrierungs-Tokens mehr erzeugen, und Registrierungen werden abgelehnt. Bestehende Agents laufen weiter. Für eine Neuregistrierung (
enroll --force) den alten Agent vorher sperren oder löschen. - Die Seite Lizenz zeigt Nutzung, Limits und welche Funktionen freigeschaltet sind; gesperrte Bedienelemente sind in der Oberfläche deaktiviert.
Lizenz ausstellen
tools/keygen-setup/keygen-setup.sh create-license --name "Kunde GmbH" --max-agents 20 --max-addresses 20000 \
--features DDI_CLUSTER,DDI_KEA_HA,DDI_DYNAMIC_ZONES,DDI_SSO # oder --features all
Ausgegeben werden Lizenz-ID, Lizenzschlüssel und die zugeordneten Funktionen. Limits pro Lizenz stehen in deren Metadaten (maxAgents, maxAddresses), Funktionen als Entitlements der Lizenz.
Funktionen einer bestehenden Lizenz ändern:
tools/keygen-setup/keygen-setup.sh features --license <LIZENZ-ID> # anzeigen
tools/keygen-setup/keygen-setup.sh features --license <LIZENZ-ID> --add DDI_SSO --remove DDI_KEA_HA
Limits einer bestehenden Lizenz ändern (Keygen ersetzt metadata vollständig, also beide Werte angeben):
curl -sS -X PATCH "https://license.beugsiud.de/v1/accounts/<ACCOUNT-ID>/licenses/<LIZENZ-ID>" \
-H "Authorization: Bearer $KEYGEN_ADMIN_TOKEN" \
-H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" \
-d '{"data":{"type":"licenses","attributes":{"metadata":{"maxAgents":20,"maxAddresses":20000}}}}'
Der Server übernimmt Änderungen bei der nächsten Prüfung (stündlich) oder sofort mit Lizenz → Jetzt prüfen. Offline-Lizenzdateien enthalten die Entitlements zum Zeitpunkt des Exports; nach einer Änderung neu exportieren.
Der Administrator trägt den Schlüssel in der Oberfläche unter Lizenz → Lizenzschlüssel eintragen ein. Der Server prüft ihn, aktiviert sich selbst als Maschine (Fingerprint aus der Machine-ID, nicht die Machine-ID selbst) und meldet sich danach regelmäßig.
Ein Schlüssel ist an genau einen Server gebunden. Für einen Umzug entfernt man die Lizenz auf dem alten Server (Lizenz entfernen gibt die Maschine frei) oder wartet, bis Keygen den alten Server nach einem Tag ohne Heartbeat freigibt.
Isolierte Netze: Offline-Lizenzdatei
Hat der Server keine Verbindung zum Lizenzserver, erzeugt man eine Lizenzdatei:
tools/keygen-setup/keygen-setup.sh checkout --license <LIZENZ-ID> --ttl 31536000 --out kunde.lic
Mit --encrypt wird die Datei zusätzlich mit dem Lizenzschlüssel verschlüsselt; dann muss beim Import auch der Schlüssel angegeben werden. Der Import erfolgt in der Oberfläche unter Lizenz → Offline-Lizenzdatei importieren. Die Datei ist bis zu ihrem eigenen Ablauf (--ttl) bzw. bis zum Ablauf der Lizenz gültig; eine Karenzzeit gibt es dabei nicht.
Weitere Befehle
tools/keygen-setup/keygen-setup.sh list # Lizenzen des Produkts
Sperren, Verlängern und Löschen von Lizenzen erfolgen über die Keygen-API bzw. die Keygen-Werkzeuge.
Grenzen
Eine Lizenzprüfung in selbst gehosteter Software ist ein Soft-Control: Wer das Server-Binary verändert, kann sie umgehen. Die eingebauten Schlüssel, die signierten Antworten und der Maschinen-Fingerprint verhindern nur das bequeme Umgehen per Konfiguration oder Netzwerk. Dies wird auch in docs/SECURITY.md beschrieben.