================================================================================ Docker-Mailserver mit Active Directory LDAPS - Dokumentation ByteTrail GmbH | FH Burgenland SS 2026 | Team 3 VZ ================================================================================ UMGEBUNG -------- - Mailserver: SRV-EXCH01.byte.trail (10.10.10.11), Docker mit docker-mailserver v15.1.0 - Domain Controller: SRV-DC01.byte.trail (10.10.10.10), Windows Server, AD DS - Domain: byte.trail - 29 Benutzer + 1 Service-Account in Active Directory - Git-Repo: https://git.lucida.ee/blackicedbear/dms.git (Branch: main) UEBERSICHT: WAS WURDE GEMACHT ------------------------------ 1. LDAPS-Zertifikat auf dem Domain Controller (AD CS) - Active Directory Certificate Services (AD CS) als Enterprise Root CA installiert (Server-Manager > Rollen hinzufuegen > Active Directory Certificate Services > Certification Authority > Enterprise CA > Root CA) - Rolle: Certification Authority (Enterprise Root CA) - CA-Name: byte-SRV-DC01-CA - Nach Installation von AD CS stellt die CA automatisch ein Zertifikat fuer den DC aus (Auto-Enrollment). LDAPS (Port 636) wird dadurch automatisch aktiviert. - Kein separates Skript noetig — AD CS Enterprise Root CA reicht aus. Warum LDAPS statt LDAP? - Windows Security Update erzwingt LDAP Signing unabhaengig von Registry-Einstellungen - Einfaches LDAP (Port 389) funktioniert nicht mehr zuverlaessig mit Signing-Enforcement - LDAPS (Port 636) umgeht das Problem komplett durch TLS-Verschluesselung 2. Active Directory Benutzer und Struktur - Skript: Setup-ByteTrail-AD.ps1 - 6 OUs: Geschaeftsfuehrung, Sales, Marketing, Service, Server, Gruppen - 11 Sicherheitsgruppen (GRP-GF-*, GRP-SALES-*, GRP-MKT-*, GRP-SVC-*, GRP-ALL-EMAIL, GRP-ADMINS) - 29 Benutzer mit E-Mail-Adressen (vorname.nachname@byte.trail) - 1 Service-Account: svc-mailserver (fuer LDAP-Bind) - Standardpasswort Benutzer: ByteTrail2026! - Service-Account Passwort: Mail$3rv!ceAcc2026 3. Docker-Mailserver Konfiguration (mailserver.env) - ACCOUNT_PROVISIONER=LDAP - LDAP_SERVER_HOST=ldaps://10.10.10.10 - LDAP_BIND_DN=CN=Mailserver Service Account,OU=Server,DC=byte,DC=trail - LDAP_START_TLS=no (weil wir ldaps:// verwenden) - DOVECOT_AUTH_BIND=yes (Authentifizierung per LDAP-Bind statt Passwort-Vergleich) - DOVECOT_USER_FILTER=(&(objectClass=person)(mail=%u)) - DOVECOT_PASS_FILTER=(&(objectClass=person)(mail=%u)) - SSL_TYPE=manual (selbst-signiertes Zertifikat) 4. SSL/TLS Zertifikat fuer den Mailserver - Selbst-signiertes Zertifikat fuer mail.byte.trail - Wird automatisch beim ersten Start durch ssl-init Container erstellt - Wichtig: basicConstraints=CA:FALSE (Thunderbird lehnt CA-Zertifikate als Server-Zertifikate ab) - SAN: DNS:mail.byte.trail, DNS:byte.trail - Gueltig fuer 10 Jahre PROBLEME UND LOESUNGEN ----------------------- Problem 1: LDAP-Verbindung haengt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: Dovecot LDAP-Verbindung zu ldaps://10.10.10.10 haengt endlos, keine Fehlermeldung, keine Timeout-Meldung. Ursache: Die globale OpenLDAP-Client-Konfiguration (/etc/ldap/ldap.conf) hatte kein TLS_REQCERT never. Die OpenLDAP-Bibliothek hat das selbst-signierte CA-Zertifikat des DC stillschweigend abgelehnt. Dovecot's eigene tls_require_cert=never Einstellung reicht NICHT aus, weil die darunterliegende OpenLDAP-Bibliothek die globale Konfiguration fuer ldaps:// Verbindungen nutzt. Loesung: In /etc/ldap/ldap.conf im Container: TLS_REQCERT never Problem 2: LDAP-Suche gibt "Operations error" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: ldap_search() failed: Operations error (LDAP Error Code 1) Ursache: Active Directory liefert standardmaessig Referrals (Verweise auf andere Naming Contexts wie CN=Configuration, CN=Schema). Die OpenLDAP-Client-Bibliothek kann diese Referrals nicht verarbeiten und meldet "Operations error". Loesung: In /etc/ldap/ldap.conf im Container: REFERRALS off Problem 3: LDAP-Authentifizierung schlaegt fehl (Password mismatch) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: doveadm auth test anna.huber@byte.trail ByteTrail2026! -> "Password mismatch (for LDAP bind)" Ursache: Alle AD-Benutzer wurden mit -ChangePasswordAtLogon $true erstellt (im Setup-Skript). Das setzt pwdLastSet=0 in AD. Solange pwdLastSet=0 ist, scheitern LDAP-Simple-Binds mit "Invalid Credentials" (data 52e). Loesung: Auf dem Domain Controller fuer alle Benutzer ausfuehren: Invoke-Command -ComputerName 10.10.10.10 -ScriptBlock { Get-ADUser -Filter {mail -like "*@byte.trail"} | ForEach-Object { Set-ADUser $_ -ChangePasswordAtLogon $false } } Problem 4: Dovecot kennt pass_attrs/user_attrs nicht (AD-Attribute fehlen) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: "uniqueIdentifier missing", "no fields returned by the server", "User is missing UID" Ursache: Docker-mailserver generiert die Dovecot-LDAP-Konfiguration mit Standardwerten fuer OpenLDAP-Schemata: - pass_attrs = uniqueIdentifier=user,userPassword=password - user_attrs = mailHomeDirectory=home,mailUidNumber=uid,... Active Directory hat diese Attribute NICHT (kein uniqueIdentifier, kein mailHomeDirectory, kein mailUidNumber etc.). Loesung: In user-patches.sh werden die Attribute beim Container-Start automatisch umgeschrieben auf: - pass_attrs = =user=%u (statischer Wert, da auth_bind=yes den Benutzer per LDAP-Bind authentifiziert und kein Passwort aus LDAP lesen muss) - user_attrs = =uid=5000,=gid=5000,=home=/var/mail/%d/%n/home/,=mail=maildir:/var/mail/%d/%n (statische Werte fuer UID/GID des vmail-Benutzers und Maildir-Pfade) Problem 5: Mail-Zustellung scheitert mit "Mailbox was deleted under us" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: dovecot-lda und LMTP melden beim Speichern einer Mail: "failed to store into mailbox 'INBOX': Mailbox was deleted under us" Ursache: Die /var/mail Verzeichnisse waren als Bind-Mount von Windows NTFS eingebunden. Docker auf Windows nutzt dafuer das v9fs-Dateisystem (Plan 9 Filesystem Protocol). v9fs unterstuetzt die POSIX-Dateioperationen nicht korrekt, die Dovecot fuer Maildir-Operationen benoetigt (insbesondere dotlock-Dateien und dovecot-uidvalidity). Loesung: In docker-compose.yml Bind-Mounts durch Docker Named Volumes ersetzen: Vorher: - ./docker-data/dms/mail-data/:/var/mail/ Nachher: - dms-mail-data:/var/mail/ Docker Named Volumes nutzen ext4 statt v9fs, was alle POSIX-Dateisystemoperationen korrekt unterstuetzt. Problem 6: Thunderbird "Basic Constraints" Fehler ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: "Der Server verwendet ein Zertifikat mit einer Basiseinschraenkung, die es als eine Zertifizierungsstelle identifiziert." Ursache: Das selbst-signierte Zertifikat wurde mit basicConstraints CA:TRUE generiert (OpenSSL-Standard fuer -x509). Thunderbird lehnt korrekt ab, ein CA-Zertifikat als Server-Zertifikat zu akzeptieren. Loesung: Zertifikat neu generieren mit expliziten Extensions: -addext "basicConstraints=critical,CA:FALSE" -addext "keyUsage=digitalSignature,keyEncipherment" -addext "extendedKeyUsage=serverAuth" Problem 7: Container-Restart ueberspringt user-patches.sh ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Symptom: Nach "docker restart" meldet der Container "Skipping most setup routines" und user-patches.sh wird nicht ausgefuehrt. LDAP-Fixes gehen verloren. Ursache: docker-mailserver erkennt einen Restart (vs. frischen Start) und ueberspringt Setup-Routinen inkl. user-patches.sh. Loesung: Statt "docker restart" immer "docker compose down && docker compose up -d" verwenden, damit der Container frisch erstellt wird und user-patches.sh ausgefuehrt wird. Bei einem einfachen Restart bleiben die Aenderungen im Container-Dateisystem erhalten (nur relevant wenn der Container nicht geloescht wird). WICHTIGE DATEIEN ---------------- docker-compose.yml - Docker Services (ssl-init, mailserver, mssql) mailserver.env - Mailserver-Konfiguration (LDAP, SSL, Filter) docker-data/dms/config/user-patches.sh - Startup-Patches (LDAP TLS, Referrals, Dovecot attrs) docker-data/dms/config/ldap-ca.pem - LDAPS CA-Zertifikat vom Domain Controller docker-data/dms/ssl/cert.pem - Mailserver TLS-Zertifikat (selbst-signiert) docker-data/dms/ssl/key.pem - Mailserver TLS-Schluessel (nicht im Git) Setup-ByteTrail-AD.ps1 - AD-Setup (OUs, Gruppen, Benutzer, Service-Account) THUNDERBIRD-EINSTELLUNGEN ------------------------- Server: mail.byte.trail IMAP: Port 993, SSL/TLS SMTP: Port 587, STARTTLS Benutzername: anna.huber@byte.trail (oder jeder andere AD-Benutzer) Passwort: ByteTrail2026! Beim ersten Verbinden muss die Sicherheitsausnahme fuer das selbst-signierte Zertifikat bestaetigt werden. Alternativ kann das Zertifikat (docker-data/dms/ssl/cert.pem) in Thunderbird importiert werden: Einstellungen > Datenschutz & Sicherheit > Zertifikate verwalten > Zertifizierungsstellen > Importieren USER-PATCHES.SH - WAS WIRD BEIM START GEMACHT ---------------------------------------------- 1. /etc/ldap/ldap.conf: TLS_REQCERT never + REFERRALS off 2. LDAP CA-Zertifikat in System Trust Store installieren 3. Dovecot LDAP: tls_require_cert=never, pass_attrs und user_attrs fuer AD anpassen 4. Postfix LDAP: TLS-Zertifikatspruefung deaktivieren