Blame
|
1 | # CT 113 – Authelia |
||||||
| 2 | ||||||||
| 3 | > [!NOTE] |
|||||||
| 4 | > CT 113 hostet **Authelia** als zentrale vorgeschaltete Authentifizierungs- und 2FA-Schicht für ausgewählte Webdienste hinter Caddy. |
|||||||
| 5 | ||||||||
| 6 | ## Basisdaten |
|||||||
| 7 | ||||||||
| 8 | | Eigenschaft | Wert | |
|||||||
| 9 | |---|---| |
|||||||
| 10 | | **CT-ID** | `113` | |
|||||||
| 11 | | **Name** | `authelia` | |
|||||||
| 12 | | **IP** | `192.168.178.64` | |
|||||||
| 13 | | **OS** | Debian 13 | |
|||||||
| 14 | | **Öffentliche URL** | `https://auth.ls-cloud.biz` | |
|||||||
| 15 | | **Interner Port** | `9091/tcp` | |
|||||||
| 16 | | **Compose-Pfad** | `/opt/authelia/compose.yml` | |
|||||||
| 17 | | **Konfig-Pfad** | `/opt/authelia/config/configuration.yml` | |
|||||||
| 18 | | **User-Datei** | `/opt/authelia/config/users_database.yml` | |
|||||||
| 19 | | **Notification-Datei** | `/opt/authelia/config/notification.txt` | |
|||||||
| 20 | ||||||||
| 21 | ## Zweck |
|||||||
| 22 | ||||||||
| 23 | Authelia sitzt vor ausgewählten Webdiensten und erzwingt dort je nach Regel: |
|||||||
| 24 | - kein Login (`bypass`) |
|||||||
| 25 | - Passwort-Login (`one_factor`) |
|||||||
| 26 | - Passwort + zweiter Faktor (`two_factor`) |
|||||||
| 27 | ||||||||
| 28 | Aktuell ist Authelia bereits für folgende Dienste in Benutzung: |
|||||||
| 29 | - `terminal.ls-cloud.biz` → `two_factor` |
|||||||
| 30 | - `files.ls-cloud.biz` → `two_factor` |
|||||||
| 31 | - `termix.ls-cloud.biz` → `two_factor` (Termix mit SSH/RDP) |
|||||||
| 32 | ||||||||
| 33 | ## Architektur |
|||||||
| 34 | ||||||||
| 35 | ```text |
|||||||
| 36 | Browser |
|||||||
| 37 | -> Caddy auf dem Host |
|||||||
| 38 | -> forward_auth gegen Authelia (CT 113 :9091) |
|||||||
| 39 | -> bei Erfolg weiter zum eigentlichen Backend-Dienst |
|||||||
| 40 | ``` |
|||||||
| 41 | ||||||||
| 42 | Portal selbst: |
|||||||
| 43 | ||||||||
| 44 | ```text |
|||||||
| 45 | https://auth.ls-cloud.biz |
|||||||
| 46 | -> Caddy reverse_proxy |
|||||||
| 47 | -> CT 113 :9091 |
|||||||
| 48 | ``` |
|||||||
| 49 | ||||||||
| 50 | ## Wie ein neuer Dienst geschützt wird |
|||||||
| 51 | ||||||||
| 52 | Es braucht immer **zwei Änderungen**: |
|||||||
| 53 | ||||||||
| 54 | ### 1. Authelia-Regel |
|||||||
| 55 | In `configuration.yml` unter `access_control.rules` eine Domain-Regel ergänzen, z. B.: |
|||||||
| 56 | ||||||||
| 57 | ```yaml |
|||||||
| 58 | - domain: 'files.ls-cloud.biz' |
|||||||
| 59 | policy: two_factor |
|||||||
| 60 | ``` |
|||||||
| 61 | ||||||||
| 62 | ### 2. Caddy davor schalten |
|||||||
| 63 | Im jeweiligen Domain-Block: |
|||||||
| 64 | ||||||||
| 65 | ```caddy |
|||||||
| 66 | forward_auth http://192.168.178.64:9091 { |
|||||||
| 67 | uri /api/authz/forward-auth |
|||||||
| 68 | copy_headers Remote-User Remote-Groups Remote-Email Remote-Name |
|||||||
| 69 | } |
|||||||
| 70 | ``` |
|||||||
| 71 | ||||||||
| 72 | Danach erst das eigentliche `reverse_proxy` zum Backend. |
|||||||
| 73 | ||||||||
| 74 | ## Benutzerverwaltung |
|||||||
| 75 | ||||||||
| 76 | Aktuell wird der **file-based authentication backend** genutzt. |
|||||||
| 77 | ||||||||
| 78 | Benutzer stehen in: |
|||||||
| 79 | ||||||||
| 80 | ```text |
|||||||
| 81 | /opt/authelia/config/users_database.yml |
|||||||
| 82 | ``` |
|||||||
| 83 | ||||||||
| 84 | Dort liegen u. a.: |
|||||||
| 85 | - Benutzername |
|||||||
| 86 | - Anzeige-Name |
|||||||
| 87 | - Mailadresse |
|||||||
| 88 | - Argon2-Passworthash |
|||||||
| 89 | - Gruppen |
|||||||
| 90 | ||||||||
| 91 | ### Aufbau eines Benutzers |
|||||||
| 92 | ||||||||
| 93 | Ein einzelner Benutzer sieht im aktuellen Setup z. B. so aus: |
|||||||
| 94 | ||||||||
| 95 | ```yaml |
|||||||
| 96 | users: |
|||||||
| 97 | admin: |
|||||||
| 98 | disabled: false |
|||||||
| 99 | displayname: "Sergej" |
|||||||
| 100 | password: "$argon2id$..." |
|||||||
| 101 | email: "sergej@ls-cloud.biz" |
|||||||
| 102 | groups: |
|||||||
| 103 | - admins |
|||||||
| 104 | ``` |
|||||||
| 105 | ||||||||
| 106 | ### Vorlage für einen neuen Benutzer |
|||||||
| 107 | ||||||||
| 108 | ```yaml |
|||||||
| 109 | neueruser: |
|||||||
| 110 | disabled: false |
|||||||
| 111 | displayname: "Neuer User" |
|||||||
| 112 | password: "$argon2id$HIER_DEN_HASH_EINTRAGEN" |
|||||||
| 113 | email: "user@example.com" |
|||||||
| 114 | groups: |
|||||||
| 115 | - users |
|||||||
| 116 | ``` |
|||||||
| 117 | ||||||||
| 118 | ### Passwort-Hash erzeugen |
|||||||
| 119 | Ein Passwort wird nicht im Klartext gespeichert, sondern als Hash. |
|||||||
| 120 | Ein neuer Hash kann z. B. so erzeugt werden: |
|||||||
| 121 | ||||||||
| 122 | ```bash |
|||||||
| 123 | pct exec 113 -- docker run --rm authelia/authelia:latest \ |
|||||||
| 124 | authelia crypto hash generate argon2 --password 'NEUES_PASSWORT' |
|||||||
| 125 | ``` |
|||||||
| 126 | ||||||||
| 127 | Den `Digest:`-Wert dann in `users_database.yml` als `password:` eintragen. |
|||||||
| 128 | ||||||||
| 129 | ### Benutzer hinzufügen – Schritt für Schritt |
|||||||
| 130 | ||||||||
| 131 | 1. Passwort-Hash erzeugen |
|||||||
| 132 | 2. Benutzerblock unter `users:` in `users_database.yml` ergänzen |
|||||||
| 133 | 3. Datei speichern |
|||||||
| 134 | 4. Authelia neu starten: |
|||||||
| 135 | ||||||||
| 136 | ```bash |
|||||||
| 137 | pct exec 113 -- bash -lc "cd /opt/authelia && docker compose -f compose.yml restart" |
|||||||
| 138 | ``` |
|||||||
| 139 | ||||||||
| 140 | 5. Danach mit dem neuen Benutzer an `https://auth.ls-cloud.biz` testen |
|||||||
| 141 | ||||||||
| 142 | ### Passwort eines bestehenden Benutzers ändern |
|||||||
| 143 | ||||||||
| 144 | 1. neuen Hash erzeugen |
|||||||
| 145 | 2. beim Benutzer nur den Wert von `password:` ersetzen |
|||||||
| 146 | 3. Authelia neu starten |
|||||||
| 147 | ||||||||
| 148 | ### Benutzer deaktivieren |
|||||||
| 149 | ||||||||
| 150 | ```yaml |
|||||||
| 151 | neueruser: |
|||||||
| 152 | disabled: true |
|||||||
| 153 | ``` |
|||||||
| 154 | ||||||||
| 155 | > [!IMPORTANT] |
|||||||
| 156 | > Nach Änderungen an `users_database.yml` ist ein Restart von Authelia der saubere Weg, damit die Änderung sicher übernommen wird. |
|||||||
| 157 | ||||||||
| 158 | ## TOTP / Google Authenticator / Aegis |
|||||||
| 159 | ||||||||
| 160 | Für den Benutzer kann in der Weboberfläche unter Sicherheitsoptionen ein **Einmal-Passwort (TOTP)** hinzugefügt werden. |
|||||||
| 161 | Das funktioniert mit: |
|||||||
| 162 | - Google Authenticator |
|||||||
| 163 | - Aegis |
|||||||
| 164 | - Ente Auth |
|||||||
| 165 | - Authy |
|||||||
| 166 | - anderen TOTP-Apps |
|||||||
| 167 | ||||||||
| 168 | ## „E-Mails“ / One-Time-Codes |
|||||||
| 169 | ||||||||
| 170 | Aktuell ist **kein echter SMTP-Versand** eingerichtet. |
|||||||
| 171 | Stattdessen schreibt Authelia Benachrichtigungen in eine Datei auf dem Server: |
|||||||
| 172 | ||||||||
| 173 | ```text |
|||||||
| 174 | /opt/authelia/config/notification.txt |
|||||||
| 175 | ``` |
|||||||
| 176 | ||||||||
| 177 | Dort landen z. B.: |
|||||||
| 178 | - Identity-Confirmation-Codes |
|||||||
| 179 | - One-Time-Codes |
|||||||
| 180 | - Links zum Widerruf |
|||||||
| 181 | - andere notifier-basierte Meldungen |
|||||||
| 182 | ||||||||
| 183 | ### Beispiel ansehen |
|||||||
| 184 | ||||||||
| 185 | ```bash |
|||||||
| 186 | pct exec 113 -- tail -60 /opt/authelia/config/notification.txt |
|||||||
| 187 | ``` |
|||||||
| 188 | ||||||||
| 189 | > [!IMPORTANT] |
|||||||
| 190 | > Wenn ein Benutzer behauptet, es komme „keine Mail“, ist im aktuellen Setup zuerst **diese Datei** zu prüfen. |
|||||||
| 191 | ||||||||
| 192 | ## Prüfung |
|||||||
| 193 | ||||||||
| 194 | ```bash |
|||||||
| 195 | pct status 113 |
|||||||
| 196 | pct exec 113 -- bash -lc "cd /opt/authelia && docker compose -f compose.yml ps" |
|||||||
| 197 | curl -k -I https://auth.ls-cloud.biz |
|||||||
| 198 | curl -k -I https://terminal.ls-cloud.biz |
|||||||
| 199 | curl -k -I https://files.ls-cloud.biz |
|||||||
| 200 | ``` |
|||||||
| 201 | ||||||||
| 202 | ## Wichtige Dateien |
|||||||
| 203 | ||||||||
| 204 | | Pfad | Zweck | |
|||||||
| 205 | |---|---| |
|||||||
| 206 | | `/opt/authelia/compose.yml` | Docker-Compose-Definition | |
|||||||
| 207 | | `/opt/authelia/config/configuration.yml` | Hauptkonfiguration | |
|||||||
| 208 | | `/opt/authelia/config/users_database.yml` | Benutzer & Passwort-Hashes | |
|||||||
| 209 | | `/opt/authelia/config/db.sqlite3` | lokaler Storage | |
|||||||
| 210 | | `/opt/authelia/config/notification.txt` | serverseitige „E-Mails“ / Codes | |
|||||||
| 211 | | `/etc/caddy/Caddyfile` (Host) | Portal + ForwardAuth vor geschützten Diensten | |
|||||||
| 212 | ||||||||
| 213 | ## Hinweise |
|||||||
| 214 | ||||||||
| 215 | > [!TIP] |
|||||||
| 216 | > Für neue Dienste immer in zwei Schritten denken: **Authelia-Regel** und **Caddy forward_auth**. |
|||||||
| 217 | ||||||||
| 218 | > [!WARNING] |
|||||||
| 219 | > Nur Webdienste hinter Caddy lassen sich so sauber schützen. Nicht-HTTP-Protokolle brauchen andere Wege. |
|||||||
