206 lines
9.8 KiB
Markdown
206 lines
9.8 KiB
Markdown
================================================================================
|
|
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
|