MFA mit TOTP selbst hosten — der Self-Hosted-Standard ohne Cloud-Zwang
Microsoft 365 MFA macht Sie cloud-abhängig. Duo Security kostet 3-9 €/User/Monat. RSA SecurID braucht Hardware-Tokens. Es gibt eine vierte Option: TOTP nach RFC 6238 selbst implementieren — kompatibel mit allen Standard-Apps, gratis, BSI-konform.
Was TOTP eigentlich ist
Time-based One-Time Password (TOTP) ist seit 2011 als RFC 6238 standardisiert. Es funktioniert so:
- Server und Authenticator-App teilen ein gemeinsames Secret (32-stelliger Base32-String).
- Beide berechnen einmal pro 30 Sekunden den gleichen 6-stelligen Code aus
HMAC-SHA1(Secret, UnixTime / 30). - Der Benutzer tippt den 6-stelligen Code in der Login-Maske ein.
- Server prüft: stimmt der Code überein? Wenn ja, einlassen.
Der Witz: Das Secret muss nur einmal beim Setup geteilt werden (per QR-Code). Danach läuft alles offline. Keine Cloud-Anrufe, keine SMS, keine Roaming-Gebühren — die Authenticator-App und der Server brauchen nicht einmal Internet.
Welche Apps unterstützen TOTP nativ
Praktisch jede moderne Authenticator-App:
- Microsoft Authenticator (iOS/Android, kostenlos)
- Google Authenticator (iOS/Android, kostenlos)
- Authy (alle Plattformen, kostenlos, mit Multi-Device-Sync)
- 1Password (Premium-App mit TOTP-Integration)
- Bitwarden (Open-Source, kostenlos in der Free-Variante)
- YubiKey (Hardware-Token, max. 32 Slots für TOTP)
- KeePassXC (Desktop-Passwortmanager mit TOTP-Plugin)
Alle implementieren denselben RFC 6238 — ein Secret funktioniert in jeder dieser Apps gleichermaßen.
Was Sie für die Self-Hosted-Implementation brauchen
Drei Bausteine genügen für eine produktionsreife TOTP-MFA:
1. Secret-Generierung
Beim ersten Setup pro User generieren Sie ein 32-stelliges Base32-Secret:
# Go-Beispiel:
import "github.com/pquerna/otp/totp"
key, err := totp.Generate(totp.GenerateOpts{
Issuer: "ITscanner",
AccountName: user.Email,
SecretSize: 32,
})
if err != nil { return err }
// key.Secret() ist das Base32-Secret, in der DB speichern
// key.URL() ist die otpauth://-URL fuer QR-Code-Anzeige
2. QR-Code-Anzeige
Der otpauth-URL kommt in einen QR-Code (z. B. mit der Go-Library github.com/skip2/go-qrcode). Der User scannt das mit seiner Authenticator-App, und das Secret ist beidseitig gespeichert.
3. Code-Verifikation beim Login
valid := totp.Validate(userInput, key.Secret())
if !valid {
return errors.New("MFA-Code ungueltig")
}
// User ist authentifiziert
Das war's. 3 Funktionen, keine externen Services, keine API-Calls.
Brute-Force-Schutz nach BSI ORP.4
TOTP-Codes haben nur 6 Stellen — das sind 1.000.000 mögliche Werte. Pro 30-Sekunden-Fenster könnte ein Angreifer theoretisch 1 Mio Versuche fahren. BSI ORP.4 verlangt deshalb:
- Brute-Force-Lockout: Nach 5 fehlgeschlagenen Versuchen Konto sperren für 15 Minuten.
- Asymmetrisches Logging: Erfolgreiche Logins normal loggen, Fehlversuche detaillierter (mit Source-IP, User-Agent, Time).
- Anti-Replay: Wenn der User Code „123456" eingegeben hat, darf derselbe Code im selben 30-Sek-Fenster nicht nochmal akzeptiert werden.
Implementation in ITscanner (vereinfacht):
// Pseudo-Code aus internal/auth/lockout.go
const MAX_ATTEMPTS = 5
const LOCKOUT_MINUTES = 15
func (s *AuthService) Login(username, password, totpCode string) (string, error) {
if s.IsLocked(username) {
return "", errors.New("Account gesperrt - 15min warten")
}
if !s.VerifyPassword(username, password) {
s.RecordFailedAttempt(username)
return "", errors.New("Falsche Anmeldedaten")
}
if !s.VerifyTOTP(username, totpCode) {
s.RecordFailedAttempt(username)
return "", errors.New("MFA-Code ungueltig")
}
s.ClearAttempts(username)
return s.IssueSession(username), nil
}
Backup-Codes für den verlorenen Phone-Fall
Was passiert, wenn der User sein Handy verliert? Klassische TOTP-Implementations lassen Backup-Codes zu — 10 einmalig nutzbare Codes, die beim Setup angezeigt werden.
Diese Codes müssen:
- Kryptographisch sicher generiert sein (12-stellig, Base32, von
crypto/rand). - Gehasht in der DB liegen (Argon2id wie bei normalen Passwörtern).
- Beim ersten Gebrauch entwertet werden — nie wiederverwendbar.
- Vom User in einer sicheren Form aufbewahrt werden (Passwortmanager, ausgedruckt im Tresor).
Wenn alle 10 Backup-Codes verbraucht sind, muss der Admin den User-Account zurücksetzen (neuer TOTP-Secret, neue Backup-Codes).
MFA-Pflicht — ja oder nein?
BSI ORP.4 verlangt MFA für privilegierte Konten — Admin-Logins, Service-Accounts mit weitreichenden Rechten, Konten mit Zugriff auf sensible Daten.
Für normale User-Konten ist MFA empfohlen, aber nicht zwingend. Praktisch sollten Sie das aber so machen:
- Admin-Logins (Dashboard-Admin): MFA-Pflicht.
- Read-only User: MFA optional, aber als Default aktiviert.
- Service-Accounts (für API-Zugriff): kein MFA — stattdessen Long-Lived API-Tokens mit IP-Whitelist.
ITscanner-Setup: MFA in 60 Sekunden
So aktivieren Sie MFA für Ihren Admin-Account in ITscanner:
- Im Tab „Einstellungen → MFA / Authentifizierung" auf „MFA aktivieren" klicken.
- QR-Code mit Microsoft / Google Authenticator scannen.
- Den 6-stelligen Code zur Verifikation eintippen.
- Die 10 Backup-Codes ausdrucken oder im Passwortmanager speichern.
Beim nächsten Login fragt ITscanner zusätzlich zum Passwort den TOTP-Code ab. Logout-Zeit: 15 Minuten Inaktivität (konfigurierbar).
ITscanner jetzt 7 Tage testen — Flat-Rate 49,50 €/Jahr
Vollständige Funktionen, keine Asset-Limits, keine Cloud, keine Kreditkarte. Aktivieren in 5 Minuten.
Kostenlos herunterladen Vergleich mit Docusnap & Lansweeper →