Zum Inhalt springen

Server

claimward-vpn-server: prüft die Anmeldung, vergibt VPN-Adressen, programmiert das WireGuard-Gateway, streamt die Routen der Mandanten über gRPC und stellt eine Admin-API und Metriken bereit.

claimward-vpn-server v0.2.0 ist die Steuerungsebene. Er prüft das Bearer-Token, das ein Gerät vorlegt, vergibt VPN-Adressen und programmiert das WireGuard-Gateway mit einem Peer pro registriertem Gerät. Er läuft auf dem Linux-Gateway-Host, neben einem vorhandenen wg0.

Was er bereitstellt

ListenerPfadZweck
LISTEN_ADDR (:8443)POST /api/v1/enrollprüfen, den Mandanten wählen, eine Adresse vergeben, den Peer hinzufügen, die Tunnelkonfiguration zurückgeben
GET /api/v1/tenantsdie Mandanten, mit denen sich der Aufrufer verbinden darf
POST /api/v1/heartbeatdie Lease des Geräts erneuern
POST /api/v1/deregisterden Peer entfernen
GET /healthzLiveness
GET /metricsPrometheus-Metriken
/admin/Admin-API und WebUI, wenn ADMIN_TOKEN gesetzt ist
GRPC_ADDR (:8444)claimward.routes.v1.RouteService/Watchstreamt die Routen des Mandanten und ihre Aktualisierungen

Die API-Anfragen tragen Authorization: Bearer <token>: ein GitHub-Access-Token, ein OIDC-ID-Token oder ein go-authn-Access-Token, je nach AUTH_PROVIDER. Die Nutzdaten sind im Registrierungsprotokoll beschrieben.

Mit TLS_CERT und TLS_KEY verwenden beide Listener TLS. Ohne sie ist die HTTP-API unverschlüsselt (terminieren Sie TLS an einem Proxy), ebenso der RouteService, den die Clients dann ablehnen, außer über Loopback: Geräte verbinden sich, erhalten aber keine Live-Aktualisierungen der Routen.

Konfiguration

Die gesamte Konfiguration erfolgt über die Umgebung.

VariableErforderlichStandardHinweise
AUTH_PROVIDERgithubIdentitätsanbieter: github, oidc oder go-authn
GITHUB_ALLOWED_ORGS—CSV-Allowlist der Organisationen (github): Ein aktives Mitglied einer davon wird zugelassen
GITHUB_API_URLhttps://api.github.comfür GitHub Enterprise zu setzen
OIDC_ISSUERoidc, go-authn—URL des Issuers (Discovery)
OIDC_CLIENT_IDoidc, go-authn—die Audience, die Tokens tragen müssen
OIDC_ALLOWED_DOMAINS—CSV-Allowlist der E-Mail-Domains (oidc)
GOAUTHN_GATEWAY_CLIENT_IDgo-authn—der eigene Client des Gateways beim Anbieter (wireguard_peers)
GOAUTHN_GATEWAY_SECRET_FILEgo-authn—sein Secret, nur aus einer Datei
GOAUTHN_PEER_LIST_INTERVAL30swie oft die Liste der registrierten Schlüssel abgerufen wird
GOAUTHN_SSFfalsezusätzlich den Shared-Signals-Stream des Anbieters abfragen, damit auf eine Deaktivierung sofort reagiert wird; der Client des Gateways muss dort SSF-Empfänger sein
GOAUTHN_SSF_INTERVAL5swie oft der SSF-Stream abgefragt wird
WG_ENDPOINT✅—öffentlicher host:port des Gateways, den Clients mitgeteilt
WG_PRIVATE_KEY / WG_PRIVATE_KEY_FILE✅—der private Schlüssel des Gateways in Base64 (die Variable hat Vorrang vor der Datei)
WG_INTERFACEwg0zu verwaltende Schnittstelle
WG_DRYRUNfalsePeer-Operationen protokollieren statt sie anzuwenden (lokale Entwicklung)
VPN_CIDR10.80.0.0/24IPv4-Adresspool; sein erster Host ist der des Gateways
PUSH_ROUTESVPN_CIDRCSV-Routen des Mandanten default
DNS—CSV-DNS-Server des Mandanten default
KEEPALIVE25den Clients mitgeteiltes Persistent Keepalive (Sekunden)
LEASE_TTL24hwie lange eine Registrierung ohne Heartbeat gilt
LISTEN_ADDR:8443HTTP-Listen-Adresse
GRPC_ADDR:8444Listen-Adresse des RouteService
GRPC_ENDPOINT—den Clients mitgeteilter host:port des RouteService; ist er leer, beobachten sie nicht
ADMIN_TOKEN—Bearer-Token für die Admin-API und die WebUI; leer deaktiviert sie
TLS_CERT / TLS_KEY—HTTPS und TLS auf dem RouteService
DEBUG—beliebiger Wert: Debug-Protokollierung (eine Zeile pro Anfrage)

Authentifizierungsanbieter

Die Authentifizierung ist hinter der Schnittstelle Verifier austauschbar (internal/auth):

  • github (Standard): Das Bearer-Token ist ein GitHub-OAuth-Access-Token aus dem Device Flow. Der Server löst es über die GitHub-API auf (/user, /user/orgs) und verlangt mit GITHUB_ALLOWED_ORGS eine aktive Mitgliedschaft in einer dieser Organisationen. Es ist kein Client-Secret beteiligt.
  • oidc: Das Bearer-Token ist ein OIDC-ID-Token, geprüft gegen den Issuer mit der Audience OIDC_CLIENT_ID und der optionalen Allowlist der E-Mail-Domains.
  • go-authn: Das Bearer-Token ist ein Access-Token (at+jwt) eines go-authn/bridge-Anbieters, und der Schlüssel des Geräts muss dort von derselben Person registriert sein. Der Server liest die signierte Liste der registrierten Schlüssel des Anbieters (go-authn/wireguard) und entfernt aus wg0 einen Schlüssel, den der Anbieter zurückzieht.

Jeden Ablauf von Ende zu Ende finden Sie unter Identitätsanbieter.

Registrierungsregeln

  • Ein Schlüssel gehört demjenigen, der ihn registriert hat. Das Registrieren eines Schlüssels, den eine andere Identität hält, wird abgelehnt (409 key_taken): Ein öffentlicher Schlüssel ist öffentlich, und ihn zu übernehmen gäbe die Macht, das Gerät seines Besitzers abzumelden.
  • Derselbe Schlüssel, erneut von seinem Besitzer registriert, behält seine Adresse und erhält eine neue Lease.
  • Die einzige erlaubte IP des Peers ist das /32 des Geräts, sodass Geräte die Adressen der jeweils anderen nicht verwenden können.
  • Der Mandant ist derjenige, den der Aufrufer angefordert hat, sofern er Mitglied ist, oder sein einziger. Siehe Mandanten.

Wie er das Gateway programmiert

Der Server verwendet wgctrl, um Peers auf einer vorhandenen Schnittstelle hinzuzufügen und zu entfernen, und prüft beim Start, dass die Schnittstelle existiert. Die Schnittstelle selbst (ihr privater Schlüssel und Listen-Port) bleibt wg-quick oder systemd-networkd beim Booten überlassen, was die privilegierte Einrichtung der Schnittstelle aus dem dauerhaft laufenden Dienst heraushält.

Lokal ausführen

Mit WG_DRYRUN=true wird kein WireGuard-Gerät angetastet:

export AUTH_PROVIDER=oidc
export OIDC_ISSUER=https://accounts.google.com
export OIDC_CLIENT_ID=xxxx.apps.googleusercontent.com
export WG_ENDPOINT=vpn.example.com:51820
export WG_PRIVATE_KEY=$(wg genkey)
export WG_DRYRUN=true LISTEN_ADDR=:8080

go run ./cmd/claimward-server

task run:dev tut dasselbe mit GitHub-Anmeldung und einem flüchtigen Schlüssel, und task dex startet ein lokales Dex, bei dem man sich anmelden kann (deploy/dev/).

Hinter TLS betreiben. Bearer-Tokens sind Zugangsdaten: Stellen Sie die API immer über HTTPS bereit, entweder mit TLS_CERT/TLS_KEY oder hinter einem Proxy, der TLS terminiert, und geben Sie dem RouteService ein Zertifikat, damit Geräte Live-Aktualisierungen der Routen erhalten.

Erstellt am von tannevaled

Geändert am von tannevaled