Benutzer & Rollen
Der PDNS Manager kennt bewusst nur zwei Rollen: Admin und User. Keine fein granulare Permission-Matrix, weil das in 95 % der DNS-Anwendungsfälle reine Komplexität ohne Mehrwert ist. Die feinere Steuerung passiert über Zonen-Zuordnungen.
Die Rollen
| Rolle | Was sie darf |
|---|---|
| Admin | Sieht und ändert alles: alle Server, alle Zonen, alle Records, alle User, alle Settings, das Audit-Log, die Templates, Branding, ACME-Tokens. |
| User | Sieht nur die ihm zugewiesenen Zonen. Innerhalb der Zone hat er entweder Lese- oder Vollzugriff. Er sieht keine anderen Zonen, keine Server-Admin-Settings, kein Audit-Log und kann keine User verwalten. |
User anlegen
Benutzer → Neuer Benutzer. Felder: Username, E-Mail, Passwort (oder leer lassen → Passwort-Reset-Mail wird verschickt, sofern SMTP konfiguriert ist), Rolle.
Zonen-Zuordnung mit Berechtigungs-Level
Bei einem User: Zonen zuweisen. Pro Zone wählst du:
- Lesen – User sieht die Zone und ihre Records, kann aber nichts ändern. Schreibende API-Calls werden serverseitig mit
HTTP 403abgelehnt – das gilt auch für Records, DNSSEC-Schalter und NOTIFY. - Voll – User darf alles innerhalb dieser Zone. Keine Server- oder Setting-Rechte, das bleibt Admin.
Im DB-Modell sieht das so aus (user_zone_access):
user_id zone_name permission
17 example.com. manage
17 intern.example. read
23 kunde-a.de. manage Zwei-Faktor-Auth (TOTP)
Jeder User kann unter Einstellungen → API & Sicherheit → 2FA aktivieren ein TOTP-Verfahren einschalten:
- Backend generiert ein Secret und einen QR-Code (über das
qrcode-Paket). - User scannt mit seiner App (Aegis, Google Authenticator, 1Password, …).
- User gibt einen aktuellen 6-stelligen Code ein → 2FA aktiv.
Beim nächsten Login fragt das Panel nach Username/Passwort und im zweiten Schritt nach dem TOTP-Code. Im Backend läuft das über POST /api/v1/auth/login + POST /api/v1/auth/login/2fa.
Passwort-Reset
Drei Wege:
- User selbst:
/forgot-password→ Mail mit Reset-Link → neues Passwort. - Admin: in der Benutzer-Liste auf einen User klicken → „Passwort zurücksetzen". Setzt entweder ein neues Passwort manuell oder schickt einen Reset-Link.
- Notfall (Konsole) – wenn alles weg ist:
docker compose exec backend python -c "
from app.core.database import async_session
from app.models.models import User
from app.core.auth import hash_password
import asyncio
async def reset():
async with async_session() as db:
admin = await db.get(User, 1) # User-ID 1 = erster Admin
admin.hashed_password = hash_password('neues-passwort')
await db.commit()
print('Passwort zurueckgesetzt.')
asyncio.run(reset())
" Login-Rate-Limit
Seit v2.3.7 sperrt das Backend eine IP nach mehreren fehlgeschlagenen Logins für ein paar Minuten (HTTP 429 mit Retry-After-Header). Brute-Force gegen schwache Passwörter wird damit unattraktiv – legitime User merken davon nichts, weil das Fenster gleitend ist und sich nach erfolgreichem Login zurücksetzt.