Files
DDI/docs/LICENSING.md
sir_melonchenandClaude Opus 5.5 cb7f4c9f3d
ci / Go (lint, test, vuln) (push) Successful in 6m43s
ci / Protobuf (push) Successful in 7s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 3m35s
install / Installation (debian:12) (push) Successful in 3m20s
ci / Web (lint, test, audit, build) (push) Successful in 12m41s
ci / Shell and licence headers (push) Successful in 14s
ci / Integration (real BIND and Kea) (push) Successful in 2m50s
ci / Development environment (compose) (push) Successful in 15s
install / Installation (rocky:9) (push) Successful in 4m1s
install / Installation (ubuntu:24.04) (push) Successful in 3m23s
ci / Release build (dry run) (push) Failing after 10m38s
install / Installation (debian:13) (push) Successful in 3m22s
install / Installation (ubuntu:22.04) (push) Successful in 3m33s
feat(license): gate features by entitlement and enforce maxAgents
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>
2026-10-18 17:51:55 +02:00

7.4 KiB
Raw Permalink Blame History

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