c't 21/2021
S. 140
Praxis
Single-Sign-On
Bild: Thorsten Hübner

Geschlossene Gesellschaft

Webanwendungen schützen mit Authelia

Nicht alle Webanwendungen authentifizieren ihre Benutzer selbst. Authelia als generischer Single-Sign-On-Dienst rüstet das nach, auf Wunsch mit Zwei-Faktor-Authentifizierung.

Von Niklas Dierking

Das Open-Source-Projekt Authelia dient als Autorisierungs- und Authentifizierungsserver und schützt Webanwendungen vor unbefugten Zugriffen. Authelia arbeitet Hand in Hand mit Reverse-Proxies wie Traefik, Nginx oder HAProxy, die Anfragen von Clients aus dem Netz entgegennehmen und an dahinterliegende Server weiterreichen. Authelia bestimmt anhand festgelegter Richtlinien, welche Anfragen es durchzulässt und welche es blockiert. Wer eine geschützte Webadresse im Browser aufruft, landet zunächst beim Authelia-Portal, wo es erst weitergeht, wenn alle Anmeldebedingungen, beispielsweise Nutzername, Passwort und ein zweiter Faktor, erfüllt sind. Nutzer müssen sich nur einmal bei Authelia einloggen und können dann alle angeschlossenen Dienste ohne erneute Anmeldung benutzen (Single-Sign-On). Um sich gegen Brute-Force-Angriffe zu wehren, sperrt Authelia in der Standardkonfiguration temporär Benutzer, wenn die Schwellenwerte für gescheiterte Anmeldeversuche in einem festgelegten Zeitraum überschreiten. Wenn Nutzer ihr Passwort verlieren, können sie sich von Authelia eine E-Mail schicken lassen, um es zurückzusetzen. Der Artikel zeigt Ihnen, wie Sie Authelia und Traefik in Betrieb nehmen, konfigurieren und damit Beispielanwendungen absichern.

Authelia unterstützt drei Methoden für die Zwei-Faktor-Authentifizierung (2FA): Mittels Google-Authenticator-App können Nutzer ein sogenanntes Time-based One-Time Password (TOTP) abrufen; das passiert auf einem unabhängigen Gerät, meistens auf dem Smartphone. Auch Hardware-Sicherheitsschlüssel von YubiKey funktionieren mittels Universal-Second-Factor (U2F) als zweiter Faktor. Darüber hinaus gibt es die Möglichkeit, die Authentifizierung via Push-Benachrichtung über die 2FA-Plattform Duo vorzunehmen, die sich diesen Service jedoch bezahlen lässt und eher auf Unternehmen abzielt.

Sie benötigen eine eigene Domain mit vier Subdomains für Authentifikationsendpunkt und Test-Hosts sowie eine gültige Mail-Adresse. Ein externer SMTP-Server für den Mail-Versand ist von Vorteil, aber kein Muss. Weil Authelia in der Welt der containerisierten Microservices zu Hause ist, empfehlen wir die Installation als Docker-Container. Voraussetzungen dafür sind ein Linux-System mit Docker und Docker-Compose sowie etwas Linux- und Docker-Compose-Grundwissen [1]. Wir haben Authelia auf Ubuntu Server 20.04 LTS installiert. Die Entwickler stellen Authelia auch als Debian-Paket und FreeBSD-Port bereit. Sie können auch die Binärdatei aus dem GitHub-Repository des Projektes (ct.de/y17e) laden oder Authelia aus dem Arch-User-Repository (AUR) beziehen.

Authelia à la carte

Die Entwickler dokumentieren unterschiedliche Varianten, Authelia aufzusetzen, „Local“, „Lite“ und „Full“ (High Availability und Kubernetes). Die Local-Variante dient als Demo, oder falls Sie Authelia ausschließlich im lokalen Netz betreiben und der Server nicht mit dem Internet verbunden ist.

Die Lite-Variante kommt mit minimalen Abhängigkeiten aus. Sie benötigen bei Lite eine Domain und müssen eigenständig DNS-Einträge vornehmen. Authelia-Lite speichert Daten in einer lokalen SQLite-Datenbank. Nutzer verwalten Sie über eine simple Konfigurationsdatei. Lite dürfte für den Großteil der Privat- und Heimanwender die erste Wahl sein. Wer viele Benutzer verwaltet oder Features wie High-Availability braucht, entscheidet sich für die Full-Variante, die Benutzerdatensätze aus einem LDAP-Verzeichnis beziehen kann und eine Datenbank wie MariaDB, MySQL oder PostgreSQL an ihrer Seite erwartet. Sie können die LDAP-Anbindung und eine Datenbank auch noch im Nachhinein in der Authelia-Konfigurationsdatei ergänzen.

Haben Sie per Richtlinie bestimmt, dass Nutzer sich für den Zugriff auf eine Web-App authentifizieren müssen, fängt Authelia die Anfrage ab. Weiter geht es erst, wenn alle Bedingungen für die Anmeldung erfüllt sind.

Wir zeigen, wie Sie Authelia-Lite in Kombination mit dem containerisierten Edge-Router Traefik an den Start bringen. Traefik übernimmt die Aufgabe des Reverse-Proxy, beschafft TLS-Zertifikate von der Zertifizierungsstelle Let’s Encrypt und reicht Anfragen aus dem Web mit der Traefik-Middleware ForwardAuth an den Authentifizierungsserver Authelia durch. Sobald das Gespann aus Authelia und Traefik läuft, sichern Sie weitere Webanwendungen im Handumdrehen ab. Um Web-Apps mit Authelia zu sichern, genügt dann ein einziges Traefik-Label in der docker-compose-Datei:

  - 'traefik.http.routers.example.middlewares=authelia@docker'

Authelia konfigurieren

Um das Beispiel mit einer eigenen Domain nachzubauen, legen Sie vier Subdomains an, die allesamt auf die IP-Adresse Ihres Servers verweisen. Ersetzen Sie example.com in der gesamten Anleitung durch Ihre eigene Domain:

auth.example.com, 
traefik.example.com, 
public.example.com, 
secure.example.com

Die erste Subdomain ist für den Authelia-Endpunkt bestimmt. Die anderen drei für Beispieldienste. Falls Sie Authelia im Heimnetzwerk betreiben und nicht über eine öffentliche, feste IP-Adresse verfügen, können Sie sich mit einem DynDNS-Dienst und Portweiterleitungen behelfen. Traefik benötigt den TCP-Port 80 für die Beschaffung der Zertifikate und liefert Webanwendungen verschlüsselt über Port 443 aus. Wie Sie Ports an Ihrem Router freigeben und was es dabei zu beachten gibt, haben wir kürzlich in einem Artikel festgehalten [2].

Die Entwickler stellen im Github-Repository des Projektes Vorlagen für Docker-Compose je für die Local- und Lite-Variante von Authelia bereit. Die dienen im Folgenden als Starthilfe. Klonen Sie das Repository und wechseln dann in das Verzeichnis mit den Lite-Beispielen.

git clone https://github.com/authelia/authelia/
cd authelia/examples/compose/lite

Hier finden Sie die Datei docker-compose.yml, die als Bauplan für die Container-Sammlung dient. Sie legt Images, Ports und Volumes fest und definiert, wie die Container zusammenarbeiten. Zunächst legen Sie jedoch Nutzer an. Wechseln Sie dazu in den Ordner ./lite/authelia und öffnen Sie die Datei users_database.yml mit einem Texteditor Ihrer Wahl. In der Lite-Variante dient diese Datei anstelle von LDAP zur Nutzerverwaltung.

users:
  ndi:
    displayname: "ndi"
    password: $argon2id$v=19$m=65536,t=1,p=8$cGVQczN2ckhIcEMxdEUrag$MNS2+6ILNsP95/jMP4
    email: mail@example.com 

In der Vorlage existiert bereits ein Beispielnutzer namens „authelia“ mit dem Passwort „authelia“. Ersetzen Sie die Werte für Nutzer, Namen, Passwort und ergänzen Sie eine gültige Mail-Adresse. Das Passwort tragen Sie nicht im Klartext, sondern als Hash ein. Fürs Passwort-Hashing setzt Authelia auf das sogenannte Argon2-Verfahren. Um einen Argon2-Hash zu generieren, sieht das Authelia-​Image einen eigenen Befehl vor. Ersetzen Sie im folgenden Befehl den Platzhalter yourpassword durch ihr eigenes Passwort.

docker run authelia/authelia:latest authelia hash-password 'yourpassword'

Nachdem Sie einen oder mehrere Nutzer angelegt haben, öffnen Sie die Konfigurationsdatei configuration.yml, die sich im gleichen Ordner befindet. Die hier zitierten und beschriebenen Blöcke müssen Sie überarbeiten. Die restlichen können Sie unverändert lassen.

host: 0.0.0.0
port: 9091
log_level: debug

jwt_secret: OEhfEAOFvgRftxrA6bLM3LkvyWTeI+RUaz6TnIx2LQGDAWCSR7+gRftxA6bEAQ
default_redirection_url:https://auth.example.com

Authelia nutzt für die Identitätsüberprüfung ein JSON-Web-Token (JWT), das mit einem Geheimnis signiert wird. Tragen Sie bei jwt_secret einen langen, zufälligen String ein. Die Schlüssel host, port, log_level und deren Werte tragen Sie exakt so ein, wie es hier im Ausschnitt der Fall ist. Tragen Sie bei default_redirection_url die Adresse (inklusive https://) für den Authentifikationsendpunkt ein, die Sie zuvor angelegt haben. Wenn Sie befristet nutzbare Einmalpasswörter als zweiten Faktor bereitstellen wollen, dann setzen Sie folgende Werte beim Abschnitt totp. Beim Schlüssel issuer können Sie auch einen eigenen Anzeigenamen als Wert wählen. Er dient später dazu, Einmalpasswörter in der Authenticator-App auf dem Smartphone Ihrer Authelia-Instanz zuzuordnen.

totp:
  issuer: meinauthelia
  period: 30
  skew: 1

Herzstück der Konfigurationsdatei ist der Abschnitt access_control.

access_control:
  default_policy: deny
  rules:
    - domain: public.example.com
      policy: bypass
    - domain: traefik.example.com
      policy: one_factor
    - domain: secure.example.com
      policy: two_factor

In diesem Abschnitt legen Sie fest, welche Bedingungen Clients erfüllen müssen, damit Authelia sie an den jeweiligen Webserver weiterleitet. Die Richtlinie bypass setzt keine Authentifizierung voraus. Authelia reicht alle Anfragen einfach durch. Mit one_factor müssen Nutzer sich mit Namen und Passwort authentifizieren. Bei two_factor kommt ein zweiter Faktor als Bedingung hinzu. Tragen Sie hier Ihre zuvor angelegten Subdomains ein. Mit der Richtlinie deny lehnt Authelia alle Anfragen ab. Sie können die Zugangskontrolle auch feingliedriger gestalten und beispielsweise Richtlinien für Gruppen oder Netzwerke definieren. Welche weiteren Möglichkeiten es gibt, zeigt die Authelia-Dokumentation auf, die Sie unter ct.de/y17e finden.

Im Abschnitt session bearbeiten Sie den Wert für den Schlüssel domain und tragen dort Ihre (Wurzel-)Domain ein:

domain: example.com

Um den Schlüssel secret müssen Sie sich zunächst nicht weiter kümmern. Dieses Geheimnis ist für den Schlüssel-Zwischenspeicher Redis bestimmt, den Sie in der Lite-Variante nicht benötigen. Legen Sie deswegen den ganzen Abschnitt redis still, indem Sie den Zeilen das Kommentarzeichen (“#“) voranstellen. Schlussendlich tragen Sie im Abschnitt notifier Ihre Zugangsdaten für einen externen SMTP-Server ein, damit Authelia Mails versenden kann.

notifier:
  smtp:
    username: mail@example.com
    password: password
    host: smtp.example.com
    port: 587
    sender: mail@example.com

Falls Sie auf den Komfort von E-Mails verzichten wollen, kann Authelia den Inhalt der Mails auch in eine lokale Textdatei schreiben. Dazu ersetzen Sie smtp durch den Notifier filesystem.

Authelia verschickt Mails, damit Nutzer neue Geräte als zweiten Faktor hinzufügen und ihr Passwort zurücksetzen können. Auch eine Benachrichtigung über das lokale Dateisystem ist möglich.
notifier:
  disable_startup_check: false
  filesystem:
    filename: /config/notification.txt

Speichern Sie nun die Konfigurationsdatei. Die Authelia-Entwickler empfehlen aus Sicherheitsgründen Lese- und Schreibrechte für die Dateien configuration.yml und users_database.yml nur an den Besitzer zu vergeben. Das erledigen Sie mit dem Befehl chmod 600 configuration.yml users_database.yml. Damit haben Sie die Grundkonfiguration von Authelia abgeschlossen. Im nächsten Schritt bringen Sie Authelia, Traefik und zwei Beispiel-Webserver online.

Türsteher verkabeln

Bearbeiten Sie dazu die Datei docker-compose.yml im Ordner lite. Hier müssen Sie nicht mehr viel eintragen, sondern hauptsächlich die Beispiel-Domains in den Traefik-Labels durch Ihre eigenen Subdomains ersetzen. Beginnen Sie mit dem Authelia-Container und bearbeiten Sie die beiden folgenden Zeilen aus dem Abschnitt labels:

  - 'traefik.http.routers.authelia.rule=Host(`auth.example.com`)'
  - 'traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/verify?rd=https://auth.example.com'

Setzen Sie Ihre Domain als Traefik-Host und tragen Sie dann die URL Ihres Authentifikationsendpunktes (https://auth.example.com) am Ende der Zeile ein, die die ForwardAuth-Middleware definiert. Den Abschnitt redis kommentieren Sie komplett aus, weil der Redis-Zwischenspeicher bei Authelia-Lite nicht notwendig ist.

Nehmen Sie sich als Nächstes den Service traefik vor. Traefik soll nicht nur Zertifikate besorgen und Anfragen an Authelia durchreichen, sondern auch das Traefik-Dashboard als Demo-Webanwendung bereitstellen. Tragen Sie dazu die entsprechende Subdomain als Traefik-Host ein:

labels:
  - 'traefik.enable=true'
  - 'traefik.http.routers.api.rule=Host(`traefik.example.com`)'

Geben Sie für Let‘s Encrypt eine gültige E-Mail-Adresse an:

  - '--certificatesResolvers.letsencrypt.acme.email=mail@example.com'

Um die Funktionsweise von Authelia zu verstehen, haben die Entwickler dem Compose-Stack zwei Beispiel-Webserver namens public und secure spendiert. Dabei handelt es sich um einen kleinen Test-Webserver der Traefik-Entwickler (traefik/whoami), der Informationen über das Gerät des Nutzers und die HTTP-Anfrage listet. Setzen Sie bei beiden Containern Ihre Subdomains als Host-Einträge:

labels:
  - 'traefik.enable=true'
  - 'traefik.http.routers.public.rule=Host(`public.example.com`)'
labels:
  - 'traefik.enable=true'
  - 'traefik.http.routers.secure.rule=Host(`secure.example.com`)'

Damit haben Sie ein Grundgerüst aus Authentifizierungsserver und Reverse-Proxy geschaffen, ebenso drei Hosts (public-, traefik-, secure.example.com), die Authelia unterschiedlich stark (bypass, one_factor, two_factor) schützt. Speichern Sie die docker-compose.yml-Datei und starten Sie mit dem Befehl docker-compose up -d die Container-Sammlung. Überprüfen Sie mit dem Befehl docker ps den Status der Container. Sollte sich der Authelia-Container fortlaufend neu starten, dann besteht ein Problem mit der Konfigurationsdatei. Mit docker logs authelia sehen Sie die Authelia-Logs ein, die Ihnen bei der Fehlersuche helfen.

Geräte registrieren

Probieren Sie jetzt die gestarteten Dienste im Browser aus. Steuern Sie zunächst Ihren allgemeinen Authentifikationsendpunkt auth.example.com an und loggen sich ein. Falls Ihr Browser beim ersten Aufruf vor einem selbst signierten Zertifikat warnt, dann hat Traefik noch keines von Let‘s Encrypt besorgt. Dieser Prozess kann mitunter einige Minuten in Anspruch nehmen. Wenn Sie sich mit dem Nutzernamen und Passwort authentifiziert haben, fordert Authelia Sie auf, einen zweiten Faktor zu hinterlegen.

Scannen Sie den QR-Code, um Ihren Authelia-Server zum Google Authenticator hinzuzufügen. Der Prozess unterscheidet sich nicht von anderen Onlinediensten, bei denen man TOTP als zweiten Faktor hinzufügt.
Bild: authelia.com

Klicken Sie auf den Link „Not registered yet“ und Authelia sendet Ihnen einen Registrierungslink via E-Mail. Wenn Sie diesen im Browser öffnen, zeigt Ihr Authelia-Server einen QR-Code an, den Sie mit der Google-Authenticator-App scannen. Die App generiert nun fortlaufend einen sechsstelligen Zahlencode, der Ihnen fortan als zweiter Faktor dient. Loggen Sie sich jetzt aus, um den Zugriff auf die anderen Hosts zu testen.

Voilà! Das sechsstellige Einmalpasswort aus dem Authenticator entsperrt Seiten, für die Sie Zwei-Faktor-Authentifizierung konfiguriert haben.

Wenn Sie in Ihrem Browser die URL public.example.com aufrufen, sehen Sie die Ausgabe des Whoami-Webservers, ganz ohne Anmeldung am Authelia-Portal. Die hier beispielhaft gesetzte Richtlinie bypass können Sie in Zukunft für Webseiten und Web-Apps nutzen, auf die jedermann zugreifen darf.

Rufen Sie als nächstes die URL traefik.example.com auf. Authelia fängt die Anfrage ab und leitet Sie zum Authelia-Portal weiter. Nach erfolgreicher Anmeldung gewährt Authelia den Zugriff auf das Traefik-Dashboard, wo Sie Überblick über Routen, Services und Middlewares bekommen. Mit der Regel one_factor sperren Sie nichtöffentliche Seiten und Dienste weg, beispielsweise weil diese keine eigene Methode zur Authentifizierung bieten oder die Ihren Sicherheitsansprüchen nicht genügt.

Steuern Sie zuletzt secure.example.com an. Authelia fordert Sie nun auf, auch das sechsstellige Einmalpasswort aus der Authenticator-App einzugeben. Erst dann gelangen Sie zur Ausgabe des geheimen Whoami-Webservers. Mittels two_factor sichern Sie Webanwendungen mit Zwei-Faktor-Authentifizierung ab, etwa weil sie besonders sensible Daten enthalten.

Authelia ist in diesem Beispiel Ihren Webdiensten vorgeschaltet, jedoch nicht mit deren integriertem Nutzermanagement verzahnt. Zukünftig soll Authelia auch diese Aufgabe übernehmen können, indem die Software als OpenID-Provider agiert. Das Feature befindet sich aktuell noch in der Beta-Phase.

Nach diesen Beispielen können Sie weitere Web-Apps und Webseiten mit Authelia sichern, indem Sie diese nach dem Vorbild der Whoami-Container in die docker-compose.yml-Datei eintragen. In der Authelia-Dokumentation, die wir unter ct.de/y17e verlinkt haben, finden Sie Vorlagen für Nextcloud und das Heimdall-Dashboard. Grundsätzlich können Sie jede beliebige, containerisierte Anwendung in die Obhut von Authelia übergeben, indem Sie die entsprechenden Traefik-Labels setzen und eine Richtlinie für die Domain konfigurieren.

Fazit

Bei Authelia handelt es sich um eine leichtgewichtige und simple SSO- und 2FA-Lösung. Wenn Sie schon mehrere Webdienste als Container betreiben, die über keine oder mangelhafte Authentifizierungsmethoden verfügen, schafft Authelia schnell Abhilfe. Auch abseits davon ist es sinnvoll, eigenen Webanwendungen ein Authelia-Portal vorzuschalten, um diese vor neugierigen Augen zu schützen und zu verhindern, dass Angreifer Informationen sammeln. (ndi@ct.de)

Authelia-Repository bei GitHub, Authelia-Dokumentation: ct.de/y17e

Kommentieren