Files-basierter RADIUS-Server (Clients + Users), managed analog DHCP/WireGuard.
- Migration 0042: radius_settings (singleton, node-lokal), radius_clients (secret_enc), radius_users (password_enc) — Secrets via secrets.Box verschlüsselt.
- internal/freeradius: Multi-File-Renderer (clients.conf + authorize) via Box.Open, Secret-Escaping (" \), Service default-off/an enabled gekoppelt. internal/services/radius + internal/handlers/radius.go: Settings + Client/User-CRUD, write-only Secret-Semantik, Validierung (IP/CIDR, name-charset), GET liefert secret_configured statt Secret.
- Firewall: udp 1812/1813 Auto-Rule bei enabled. Cluster: clients/users repliziert (hashSpec), radius_settings node-lokal.
- main.go + render.go + WithAllReloaders. Packaging: freeradius Dependency, setgid-Dir /etc/edgeguard/freeradius (Gruppe freeradius), Symlinks clients.conf+authorize, disable-on-install, sudoers.
- UI: RADIUS-Seite (Einstellungen + Clients + Benutzer) unter Sicherheit, Route/Nav/i18n de/en.
- Tests (guarded): Renderer-Inhalt + Secret-Escaping/Roundtrip + Masking. Scope v1: PAP/CHAP files-based (kein EAP/802.1X).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
52 lines
1.9 KiB
SQL
52 lines
1.9 KiB
SQL
-- +goose Up
|
|
-- +goose StatementBegin
|
|
|
|
-- RADIUS (FreeRADIUS) — node-lokale Singleton-Settings (ob DIESE Node
|
|
-- RADIUS betreibt + Listen). Clients/Users sind geteilte Config (repliziert).
|
|
CREATE TABLE IF NOT EXISTS radius_settings (
|
|
id INTEGER PRIMARY KEY DEFAULT 1,
|
|
enabled BOOLEAN NOT NULL DEFAULT false,
|
|
listen_addresses TEXT NOT NULL DEFAULT '',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT radius_settings_singleton CHECK (id = 1)
|
|
);
|
|
INSERT INTO radius_settings (id) VALUES (1) ON CONFLICT DO NOTHING;
|
|
|
|
-- NAS-Clients (Geräte, die RADIUS-Requests senden): IP/CIDR + Shared Secret
|
|
-- (verschlüsselt via secrets.Box).
|
|
CREATE TABLE IF NOT EXISTS radius_clients (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
ipaddr TEXT NOT NULL,
|
|
secret_enc BYTEA,
|
|
active BOOLEAN NOT NULL DEFAULT true,
|
|
description TEXT NOT NULL DEFAULT '',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT radius_clients_name_unique UNIQUE (name)
|
|
);
|
|
|
|
-- Benutzer (PAP/CHAP): Name + Passwort (verschlüsselt; Cleartext nur zur
|
|
-- Render-Zeit in die freeradius-lesbare authorize-Datei).
|
|
CREATE TABLE IF NOT EXISTS radius_users (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
username TEXT NOT NULL,
|
|
password_enc BYTEA,
|
|
active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT radius_users_username_unique UNIQUE (username)
|
|
);
|
|
|
|
-- +goose StatementEnd
|
|
|
|
-- +goose Down
|
|
-- +goose StatementBegin
|
|
|
|
DROP TABLE IF EXISTS radius_users;
|
|
DROP TABLE IF EXISTS radius_clients;
|
|
DROP TABLE IF EXISTS radius_settings;
|
|
|
|
-- +goose StatementEnd
|