Inhaltsverzeichnis
Dovecot ArchLinux - SQL
|
---|
Dovecot ist ein Quelloffener IMAP-und POP3-E-Mail-Server für Linux bzw. UNIX-ähnlichen Systeme, entwickelt mit dem Hauptaugenmerk auf Sicherheit. Dovecot ist eine ausgezeichnete Wahl für kleine und grosse Installationen. Dovecot ist schnell und einfach zu installieren, erfordert keine besonderen Voraussetzungen und ist Ressourcenschonend.
Dovecot wird von Timo Sirainen entwickelt und soll hier in der Version CE zum Einsatz kommen.
Beschreibung | Externer Link |
---|---|
Homepage | Dovecot |
Dokumentation | https://doc.dovecot.org/2.3/ |
SQL | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Postfixadmin | https://github.com/postfixadmin/postfixadmin/blob/master/DOCUMENTS/DOVECOT.txt |
Ab hier werden root
-Rechte zur Ausführung der nachfolgenden Befehle benötigt. Um root
zu werden geben Sie bitte folgenden Befehl ein:
$ su - Password:
Voraussetzungen
Für die nachfolgende Installation wird vorausgesetzt,
- dass eine lauffähige Version von Dovecot ab Version 2.3
vorhanden ist und die unter nachfolgenden Links beschriebenen Installationen und Konfigurationen von Dovecot als Mindestvoraussetzung zwingend durchgeführt wurden:
Da für Dovecot und auch für Postfix jeweils SQL-Abfragen zur Ermittlung der benötigten Informationen, über die
- Domains
- Postfächer
- Aliase
genutzt werden sollen, ist als Verwaltung für die in einer Datenbank hinterlegten Informationen eine weitere unabdingbare und zwingende Voraussetzung für das nachfolgende Vorgehen
- dass eine lauffähige Version von PostfixAdmin
vorhanden ist und die unter nachfolgendem Link beschriebene Installation und Konfiguration von
erforderlich.
Vorbereitungen
Authentifizierungsquellen
Dovecot bringt in der Konfigurationsdatei
/etc/dovecot/conf.d/10-auth.conf
ganz am Ende der Konfigurationsdatei vorbereitete include
-Dateien mit, welche für die verschiedenen Authentifizierungsquellen bereits grundlegend vorkonfiguriert sind und nur um entsprechend zwingende Angaben ergänzt werden müssen. Nachfolgend eine Aufstellung:
(Nur relevanter Ausschnitt):
... !include auth-system.conf.ext #!include auth-sql.conf.ext #!include auth-ldap.conf.ext #!include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-static.conf.ext
Hier nur die vier gebräuchlichsten in einer Übersicht:
inlcude-Datei | Authentifizierungsquelle | Beschreibung |
---|---|---|
auth-system.conf.ext | /etc/passwd & /etc/shadow | Benutzer mit shell -Zugriff |
auth-sql.conf.ext | SQL-Datenbank | Benutzer in einer Datenbank |
auth-ldap.conf.ext | LDAP | Benutzer in LDAP |
auth-passwdfile.conf.ext | /etc/dovecot/users | Benutzer in einer Datei |
Konfiguration
/etc/dovecot/dovecot-sql.conf.ext
Bei den Einstellungen der Konfigurationsdatei, soll von nachfolgenden Gegebenheiten ausgegangen werden:
- Im PostfixAdmin existiert eine Domain:
tachtler.net
- Im PostfixAdmin wurde ein Benutzer mit dem Benutzernamen/Mailbox
klaus@tachtler.net
angelegt - Zur Anmeldung an Dovecot wird die E-Mail-Adresse verwendet
- Die Verwaltung der Postfächer (Mailbox) wird unter Zuhilfenahme eines Dummy-Benutzers (
vmail
) als Authentifizierungsbenutzer durchgeführt, wie unter nachfolgendem internen Link beschrieben
verwendet wird.
Nachfolgend noch einmal in einer Tabelle dargestellt
Gegebenheit | Wert |
---|---|
PostfixAdmin Domain | tachtler.net |
PostfixAdmin Benutzer(name)/Mailbox | klaus@tachtler.net |
Dovecot Anmeldename | klaus@tachtler.net (e-Mail-Adresse vollständig,nicht nur der localpart) |
Dovecot Dummy-Benutzer (vmail ) | interner Link Dovecot ArchLinux - Konfiguration: Authentifizierungsbenutzer |
Normalerweise trennt Dovecot die beiden Abfragen
passdb
- Abfrage des Benutzernamens und Passwort-Vergleichuserdb
- Abfrage der Benutzer spezifischen Einstellung z.B. home, uid, gid, usw.
so dass auch zwei SQL-Abfragen nötig sind.
WICHTIG - Hier kann jedoch optimiert werden, so dass Dovecot nur eine SQL-Abfrage benötigt, um die
passdb
- und userdb
-Daten zu ermitteln. Dies wird mit einer Einstellung Namens prefetch erreicht
driver
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | driver = |
Neuer Wert | driver = mysql |
Konfiguration | # Database driver: mysql, pgsql, sqlite # Tachtler #driver = driver = mysql |
Beschreibung | Treiber zur verwendeten SQL-Datenbank. |
connect
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | connect = |
Neuer Wert | connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix
Verschlüsselte Kommunikation über Zertifikats basierte Verbdinung: connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix ssl_ca=/etc/dovecot/ssl/certs/CAcert.pem ssl_cert=/etc/dovecot/ssl/certs/server-lmtp-chain.pem ssl_key=/etc/dovecot/ssl/private/server.idmz.tachtler.net.key ssl_cipher=DHE-RSA-AES256-SHA
|
Konfiguration | # Tachtler #connect = connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix
Verschlüsselte Kommunikation über Zertifikats basierte Verbdinung: # Tachtler #connect = connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix ssl_ca=/etc/dovecot/ssl/certs/CAcert.pem ssl_cert=/etc/dovecot/ssl/certs/server-lmtp-chain.pem ssl_key=/etc/dovecot/ssl/private/server.idmz.tachtler.net.key ssl_cipher=DHE-RSA-AES256-SHA
|
Beschreibung | Verbindungsdaten zur verwendeten SQL-Datenbank. |
ACHTUNG - Der private Schlüssel bei der Verwendung zur verschlüsselten Kommunikation mit der Datenbank MUSS nachfolgende Besitz- und Dateirechte haben:
Besitzrechte:
# chown root:dovecot /etc/dovecot/ssl/private/server.idmz.tachtler.net.key
Dateirechte:
# chmod 440 /etc/dovecot/ssl/private/server.idmz.tachtler.net.key
default_pass_scheme
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | default_pass_scheme = MD5 |
Neuer Wert | default_pass_scheme = PLAIN |
Konfiguration | # Tachtler #default_pass_scheme = MD5 default_pass_scheme = PLAIN |
Beschreibung | Wenn alle Kennwörter dasselbe Format haben, kann default_pass_scheme verwendet werden. Andernfalls muss jedem Passwort {password-scheme} vorangestellt werden, zum Beispiel {plain}plaintext-password . |
|
---|
Siehe auch den nachfolgender internen Link
Aktuell ist das Abhören der Übertragung des Benutzernamens und des Passwortes nahezu unmöglich, da bei der Übertragung ein individueller Sitzungsschlüssel zum Einsatz kommt. Mit Hilfe dieses individuellen Sitzungsschlüssels, können Server und Client, jeweils für sich das Passwort berechnen, der ebenfalls nur jeweils einmalig für eine Sitzung identisch ist.
WICHITG - Da Server und Client jeweils das Passwort errechnen können müssen, ist es
- erforderlich, das Server und Client, das Passwort im Klartext kennen!
HINWEIS - Das bedeutet, dass beim Einsatz von cram-md5/digest-md5 das
- Passwort des Benutzers im Klartext gespeichert werden muss!
user_query
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | user_query = |
Neuer Wert | user_query = SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, domain WHERE username = '%Lu' AND mailbox.active = 1 AND domain.domain = '%Ld' AND domain.active = 1
* %Ld = domain = tachtler.net (in Kleinschrift) | %Ln = localpart = klaus (in Kleinschrift) | %Lu = localpart@domain = klaus@tachtler.net (in Kleinschrift) |
Konfiguration | #user_query = \ # SELECT home, uid, gid \ # FROM users WHERE username = '%n' AND DOMAIN = '%d' user_query = SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, DOMAIN WHERE mailbox.username = '%Lu' AND mailbox.active = 1 AND DOMAIN.domain = '%Ld' AND DOMAIN.active = 1
* %Ld = domain = tachtler.net (in Kleinschrift) | %Ln = localpart = klaus (in Kleinschrift) | %Lu = localpart@domain = klaus@tachtler.net (in Kleinschrift) |
Beschreibung | Ermittlung aller benötigten Benutzerdaten z.B. bei der E-Mail-Einlieferung durch LMTP, wie * userdb - uid - UserID * userdb - gid - GruppenID * userdb - home - Verzeichnis in dem die (hier Maildir )-Struktur liegt * userdb - quota - Quota, zusammengesetzten aus einer Zeichenkette und einem Datenbankfeld |
password_query
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | password_query = |
Neuer Wert | password_query = SELECT username AS user, password, 10000 AS userdb_uid, 10000 as userdb_gid, CONCAT('/srv/vmail/', maildir) AS userdb_home, CONCAT('*:bytes=', mailbox.quota) AS userdb_quota_rule FROM mailbox WHERE username = '%Lu' AND active = 1
* %Ld = domain = tachtler.net (in Kleinschrift) | %Ln = localpart = klaus (in Kleinschrift) | %Lu = localpart@domain = klaus@tachtler.net (in Kleinschrift) |
Konfiguration | # Tachtler #password_query = \ # SELECT userid AS USER, password, \ # home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \ # FROM users WHERE userid = '%u' password_query = SELECT username AS USER, password, 10000 AS userdb_uid, 10000 AS userdb_gid, CONCAT('/srv/vmail/', maildir) AS userdb_home, CONCAT('*:bytes=', mailbox.quota) AS userdb_quota_rule FROM mailbox WHERE username = '%Lu' AND active = 1
* %Ld = domain = tachtler.net (in Kleinschrift) | %Ln = localpart = klaus (in Kleinschrift) | %Lu = localpart@domain = klaus@tachtler.net (in Kleinschrift) |
Beschreibung | Ermittlung aller benötigten Benutzerdaten zur Anmeldung, wie * passdb - user(name) - Anmeldename (hier E-Mail-Adresse) * passdb - password - Passwort * userdb - uid - UserID * userdb - gid - GruppenID * userdb - home - Verzeichnis in dem die (hier Maildir )-Struktur liegt * userdb - quota - Quota, zusammengesetzten aus einer Zeichenkette und einem Datenbankfeld |
iterate_query
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | iterate_query = |
Neuer Wert | iterate_query = SELECT username AS user FROM mailbox WHERE active = 1 |
Konfiguration | # Tachtler # Query TO GET a list OF ALL usernames. # Tachtler #iterate_query = SELECT username AS USER FROM users iterate_query = SELECT username AS USER FROM mailbox WHERE active = 1 |
Beschreibung | Ermittlung aller Benutzer durch den doveadm user localpart@domain.tld -Befehl |
Hier abschliessend die komplette Konfigurationsdatei - /etc/dovecot/dovecot-sql.conf.ext
- optimiert - (prefetch), unter Verwendung der SQL-Datenbank und der Tabellen von PostfixAdmin:
# This file is commonly accessed via passdb {} or userdb {} section in # conf.d/auth-sql.conf.ext # This file is opened as root, so it should be owned by root and mode 0600. # # http://wiki2.dovecot.org/AuthDatabase/SQL # # For the sql passdb module, you'll need a database with a table that # contains fields for at least the username and password. If you want to # use the user@domain syntax, you might want to have a separate domain # field as well. # # If your users all have the same uig/gid, and have predictable home # directories, you can use the static userdb module to generate the home # dir based on the username and domain. In this case, you won't need fields # for home, uid, or gid in the database. # # If you prefer to use the sql userdb module, you'll want to add fields # for home, uid, and gid. Here is an example table: # # CREATE TABLE users ( # username VARCHAR(128) NOT NULL, # domain VARCHAR(128) NOT NULL, # password VARCHAR(64) NOT NULL, # home VARCHAR(255) NOT NULL, # uid INTEGER NOT NULL, # gid INTEGER NOT NULL, # active CHAR(1) DEFAULT 'Y' NOT NULL # ); # Database driver: mysql, pgsql, sqlite # Tachtler #driver = driver = mysql # Database connection string. This is driver-specific setting. # # HA / round-robin load-balancing is supported by giving multiple host # settings, like: host=sql1.host.org host=sql2.host.org # # pgsql: # For available options, see the PostgreSQL documentation for the # PQconnectdb function of libpq. # Use maxconns=n (default 5) to change how many connections Dovecot can # create to pgsql. # # mysql: # Basic options emulate PostgreSQL option names: # host, port, user, password, dbname # # But also adds some new settings: # client_flags - See MySQL manual # connect_timeout - Connect timeout in seconds (default: 5) # read_timeout - Read timeout in seconds (default: 30) # write_timeout - Write timeout in seconds (default: 30) # ssl_ca, ssl_ca_path - Set either one or both to enable SSL # ssl_cert, ssl_key - For sending client-side certificates to server # ssl_cipher - Set minimum allowed cipher security (default: HIGH) # ssl_verify_server_cert - Verify that the name in the server SSL certificate # matches the host (default: no) # option_file - Read options from the given file instead of # the default my.cnf location # option_group - Read options from the given group (default: client) # # You can connect to UNIX sockets by using host: host=/var/run/mysql.sock # Note that currently you can't use spaces in parameters. # # sqlite: # The path to the database file. # # Examples: # connect = host=192.168.1.1 dbname=users # connect = host=sql.example.com dbname=virtual user=virtual password=blarg # connect = /etc/dovecot/authdb.sqlite # # Tachtler #connect = connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix # Default password scheme. # # List of supported schemes is in # http://wiki2.dovecot.org/Authentication/PasswordSchemes # # Tachtler #default_pass_scheme = MD5 default_pass_scheme = PLAIN # passdb query to retrieve the password. It can return fields: # password - The user's password. This field must be returned. # user - user@domain from the database. Needed with case-insensitive lookups. # username and domain - An alternative way to represent the "user" field. # # The "user" field is often necessary with case-insensitive lookups to avoid # e.g. "name" and "nAme" logins creating two different mail directories. If # your user and domain names are in separate fields, you can return "username" # and "domain" fields instead of "user". # # The query can also return other fields which have a special meaning, see # http://wiki2.dovecot.org/PasswordDatabase/ExtraFields # # Commonly used available substitutions (see http://wiki2.dovecot.org/Variables # for full list): # %u = entire user@domain # %n = user part of user@domain # %d = domain part of user@domain # # Note that these can be used only as input to SQL query. If the query outputs # any of these substitutions, they're not touched. Otherwise it would be # difficult to have eg. usernames containing '%' characters. # # Example: # password_query = SELECT userid AS user, pw AS password \ # FROM users WHERE userid = '%u' AND active = 'Y' # #password_query = \ # SELECT username, domain, password \ # FROM users WHERE username = '%n' AND domain = '%d' # userdb query to retrieve the user information. It can return fields: # uid - System UID (overrides mail_uid setting) # gid - System GID (overrides mail_gid setting) # home - Home directory # mail - Mail location (overrides mail_location setting) # # None of these are strictly required. If you use a single UID and GID, and # home or mail directory fits to a template string, you could use userdb static # instead. For a list of all fields that can be returned, see # http://wiki2.dovecot.org/UserDatabase/ExtraFields # # Examples: # user_query = SELECT home, uid, gid FROM users WHERE userid = '%u' # user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = '%u' # user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u' # # Tachtler #user_query = \ # SELECT home, uid, gid \ # FROM users WHERE username = '%n' AND domain = '%d' user_query = SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, domain WHERE mailbox.username = '%Lu' AND mailbox.active = 1 AND domain.domain = '%Ld' AND domain.active = 1 # If you wish to avoid two SQL lookups (passdb + userdb), you can use # userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll # also have to return userdb fields in password_query prefixed with "userdb_" # string. For example: # Tachtler #password_query = \ # SELECT userid AS user, password, \ # home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \ # FROM users WHERE userid = '%u' password_query = SELECT username AS user, password, 10000 AS userdb_uid, 10000 as userdb_gid, CONCAT('/srv/vmail/', maildir) AS userdb_home, CONCAT('*:bytes=', mailbox.quota) AS userdb_quota_rule FROM mailbox WHERE username = '%Lu' AND active = 1 # Query to get a list of all usernames. # Tachtler #iterate_query = SELECT username AS user FROM users iterate_query = SELECT username AS user FROM mailbox WHERE active = 1
/etc/dovecot/conf.d/auth-sql.conf.ext
Grundsätzlich müssen an dieser Konfigurationsdatei keine Veränderungen durchgeführt werden, außer es wird zur Optimierung der SQL-Datenbank-Zugriffe die Einstellung prefetch verwendet
prefetch
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ |
Defaultwert | # userdb { # driver = prefetch # } |
Neuer Wert | userdb { driver = prefetch } |
Konfiguration | # "prefetch" user database means that the passdb already provided the # needed information and there's no need to do a separate userdb lookup. # <doc/wiki/UserDatabase.Prefetch.txt> # Tachtler - ENABLED - userdb { driver = prefetch } |
Beschreibung | „prefetch“ Benutzerdatenbank bedeutet, dass die passdb bereits die benötigten Informationen bereitstellt und es nicht notwendig ist, eine separate userdb -Suche durchzuführen. |
WICHTIG - Trotz der Verwendung von prefetch muss auch noch eine „normale“
userdb
-Abfrage konfiguriert sein !!!
HINWEIS - Dies ist notwendig, da nach der Anmeldung auch noch
userdb
-Abfragen z.B. durch den Empfang von e-Mails per LMTP oder Einlieferung via dovecot-lda
ausgelöst werden!
Hier abschliessend die komplette Konfigurationsdatei - /etc/dovecot/conf.d/auth-sql.conf.ext
- optimiert - (prefetch):
# Authentication for SQL users. Included from 10-auth.conf. # # <doc/wiki/AuthDatabase.SQL.txt> passdb { driver = sql # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext args = /etc/dovecot/dovecot-sql.conf.ext } # "prefetch" user database means that the passdb already provided the # needed information and there's no need to do a separate userdb lookup. # <doc/wiki/UserDatabase.Prefetch.txt> # Tachtler - ENABLED - userdb { driver = prefetch } userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } # If you don't have any user-specific settings, you can avoid the user_query # by using userdb static instead of userdb sql, for example: # <doc/wiki/UserDatabase.Static.txt> #userdb { #driver = static #args = uid=vmail gid=vmail home=/var/vmail/%u #}
/etc/dovecot/conf.d/10-auth.conf
Dovecot bringt in der Konfigurationsdatei
/etc/dovecot/conf.d/10-auth.conf
ganz am Ende der Konfigurationsdatei vorbereitete include
-Dateien mit, welche für die verschiedenen Authentifizierungsquellen bereits grundlegend vorkonfiguriert sind und nur nun angepasst werden müssen.
Hier muss der Eintrag
!include auth-system.conf.ext
auskommentiert werden, bzw. der Eintrag
!include auth-passwdfile.conf.ext
auskommentiert werden, falls bisher dieses Authentifizierungsverfahren genutzt wurde und der Eintrag
#!include auth-sql.conf.ext
aktiviert werden
Vorher (Standard): (Nur relevanter Ausschnitt):
!include auth-system.conf.ext #!include auth-sql.conf.ext #!include auth-ldap.conf.ext #!include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-vpopmail.conf.ext #!include auth-static.conf.ext
ggf. Stand mit Authentifizierungsverfahren passwd-file
wie unter nachfolgenden internen Link
beschrieben.
Vorher (passwd-file
= auth-system.conf.ext
):
(Nur relevanter Ausschnitt):
# Tachtler # default: !include auth-system.conf.ext # !include auth-system.conf.ext #!include auth-sql.conf.ext #!include auth-ldap.conf.ext # Tachtler # default: #!include auth-passwdfile.conf.ext !include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-vpopmail.conf.ext #!include auth-static.conf.ext
Nachher (SQL
= auth-sql.conf.ext
):
(Nur relevanter Ausschnitt):
# Tachtler # default: !include auth-system.conf.ext # !include auth-system.conf.ext # Tachtler # default: #!include auth-sql.conf.ext !include auth-sql.conf.ext #!include auth-ldap.conf.ext #!include auth-passwdfile.conf.ext #!include auth-checkpassword.conf.ext #!include auth-vpopmail.conf.ext #!include auth-static.conf.ext
Quota: SQL
Nachdem Dovecot auf SQL umgestellt haben, kann auch die Quota-Ermittlung wie folgt auf SQL umgestellt werden.
/ect/dovecot.conf
Nachfolgende Anpassung ist an der Konfigurationsdatei /etc/dovecot.conf
dafür erforderlich.
dict
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ https://doc.dovecot.org/2.3/configuration_manual/quota/quota_dict/ |
Defaultwert | dict { #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } |
Neuer Wert | userdb { driver = prefetch } |
Konfiguration | dict { # Tachtler # default: #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext sqlquota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } |
Beschreibung | Das „Dictionary“ kann zum Speichern von key=value-Listen verwendet werden. Dies wird von mehreren Plugins verwendet. Auf das Wörterbuch kann entweder direkt oder über einen Wörterbuchserver zugegriffen werden. Der folgende Diktatblock ordnet die Wörterbuchnamen den URIs zu, wenn der Server verwendet wird. Diese können dann über URIs im Format proxy::<name> referenziert werden. |
/etc/dovecot/dovecot-dict-sql.conf.ext
Mit nachfolgender Konfigurationsdatei kann konfiguriert werden, wie Dovecot auf die Datenbank zugreifen kann und wie die Tabellen heissen, welche verwendet werden sollen.
connect
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ https://doc.dovecot.org/2.3/configuration_manual/quota/quota_dict/ |
Defaultwert | connect = |
Neuer Wert | connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix
Verschlüsselte Kommunikation über Zertifikats basierte Verbdinung: connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix ssl_ca=/etc/dovecot/ssl/certs/CAcert.pem ssl_cert=/etc/dovecot/ssl/certs/server-lmtp-chain.pem ssl_key=/etc/dovecot/ssl/private/server.idmz.tachtler.net.key ssl_cipher=DHE-RSA-AES256-SHA
|
Konfiguration | # Tachtler #connect = connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix
Verschlüsselte Kommunikation über Zertifikats basierte Verbdinung: # Tachtler #connect = connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix ssl_ca=/etc/dovecot/ssl/certs/CAcert.pem ssl_cert=/etc/dovecot/ssl/certs/server-lmtp-chain.pem ssl_key=/etc/dovecot/ssl/private/server.idmz.tachtler.net.key ssl_cipher=DHE-RSA-AES256-SHA
|
Beschreibung | Verbindungsdaten zur verwendeten SQL-Datenbank. |
ACHTUNG - Der private Schlüssel bei der Verwendung zur verschlüsselten Kommunikation mit der Datenbank MUSS nachfolgende Besitz- und Dateirechte haben:
Besitzrechte:
# chown root:dovecot /etc/dovecot/ssl/private/server.idmz.tachtler.net.key
Dateirechte:
# chmod 440 /etc/dovecot/ssl/private/server.idmz.tachtler.net.key
map: storage
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ https://doc.dovecot.org/2.3/configuration_manual/quota/quota_dict/ |
Defaultwert | map { pattern = priv/quota/storage table = quota username_field = username value_field = bytes } |
Neuer Wert | map { pattern = priv/quota/storage # Tachtler # default: table = quota table = quota2 username_field = username value_field = bytes } |
Konfiguration | map { pattern = priv/quota/storage # Tachtler # default: table = quota table = quota2 username_field = username value_field = bytes } |
Beschreibung | Definition, welche Tabelle genutzt werden soll. |
map: messages
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/authentication/sql/ https://doc.dovecot.org/2.3/configuration_manual/quota/quota_dict/ |
Defaultwert | map { pattern = priv/quota/messages table = quota username_field = username value_field = messages } |
Neuer Wert | map { pattern = priv/quota/messages # Tachtler # default: table = quota table = quota2 username_field = username value_field = messages } |
Konfiguration | map { pattern = priv/quota/messages # Tachtler # default: table = quota table = quota2 username_field = username value_field = messages } |
Beschreibung | Definition, welche Tabelle genutzt werden soll. |
Hier abschliessend die komplette Konfigurationsdatei - /etc/dovecot/dovecot-dict-sql.conf.ext
:
# This file is commonly accessed via dict {} section in dovecot.conf # Tachtler # default: #connect = host=localhost dbname=mails user=testuser password=pass connect = host=db.idmz.tachtler.net port=3306 user=postfixuser password=geheim dbname=postfix # CREATE TABLE quota ( # username varchar(100) not null, # bytes bigint not null default 0, # messages integer not null default 0, # primary key (username) # ); map { pattern = priv/quota/storage # Tachtler # default: table = quota table = quota2 username_field = username value_field = bytes } map { pattern = priv/quota/messages # Tachtler # default: table = quota table = quota2 username_field = username value_field = messages }
/etc/dovecot/conf.d/10-master.conf
Damit Dovecot auch auf Anfragen von z.B. Postfix über das Protokoll dict
, wie hier beschrieben
erreichbar ist, sind nachfolgende Einstellungen in der Konfigurationsdatei
- /etc/dovecot/conf.d/10-master.conf
durchzuführen.
service dict: user
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/service_configuration/#user Dovecot Configuration Manual - Service Configuration - inet-listeners |
Defaultwert | user = |
Neuer Wert | user = vmail |
Konfiguration | service dict { # If dict proxy is used, mail processes should have access to its socket. # For example: mode=0660, group=vmail and global mail_access_groups=vmail unix_listener dict { #mode = 0600 # Tachtler # default: #user = user = vmail # Tachtler # default: #group = group = vmail } } |
Beschreibung | Grundsätzlich muss der dict-Prozess als Benutzer: root laufen und darf nur vorübergehend Rechte an Benutzer abgeben. Andernfalls könnte er keine Postzustellungen an mehr als einen Benutzer mit unterschiedlicher UID verarbeiten. Wenn allerdings nur eine einzige globale UID/GID verwendet wird, kann die Sicherheit erhöhen werden, indem der dict-Prozesse als diesen Benutzer ausgeführt wird. |
service dict: group
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/configuration_manual/service_configuration/#user Dovecot Configuration Manual - Service Configuration - inet-listeners |
Defaultwert | group = |
Neuer Wert | group = vmail |
Konfiguration | service dict { # If dict proxy is used, mail processes should have access to its socket. # For example: mode=0660, group=vmail and global mail_access_groups=vmail unix_listener dict { #mode = 0600 # Tachtler # default: #user = user = vmail # Tachtler # default: #group = group = vmail } } |
Beschreibung | Grundsätzlich muss der dict-Prozess in der Gruppe: root laufen und darf nur vorübergehend Rechte an Benutzer abgeben. Andernfalls könnte er keine Postzustellungen an mehr als einer Gruppe mit unterschiedlicher GID verarbeiten. Wenn allerdings nur eine einzige globale UID/GID verwendet wird, kann die Sicherheit erhöhen werden, indem der dict-Prozesse in dieser Gruppe ausgeführt wird. |
/etc/dovecot/conf.d/90-quota.conf
plugin (Quota backends): quota
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/settings/plugin/quota-plugin/#plugin_setting-quota-quota Dovecot Configuration Manual - Quota Plugin |
Defaultwert | quota = |
Neuer Wert | quota = dict:User quota::proxy::sqlquota |
Konfiguration | ## ## Quota backends ## # Multiple backends are supported: # dirsize: Find and sum all the files found from mail directory. # Extremely SLOW with Maildir. It'll eat your CPU and disk I/O. # dict: Keep quota stored in dictionary (eg. SQL) # maildir: Maildir++ quota # fs: Read-only support for filesystem quota plugin { #quota = dirsize:User quota #quota = maildir:User quota # Tachtler # default: #quota = dict:User quota::proxy::quota quota = dict:User quota::proxy::sqlquota #quota = fs:User quota } # Multiple quota roots are also possible, for example this gives each user # their own 100MB quota and one shared 1GB quota within the domain: plugin { #quota = dict:user::proxy::quota #quota2 = dict:domain:%d:proxy::quota_domain #quota_rule = *:storage=102400 # Tachtler # default: #quota2_rule = *:storage=1048576 quota2_rule = Trash:storage=+10%% } |
Beschreibung | Die Quotenstammkonfiguration hat die folgende Syntax: quota = <backend>[:<quota root name>[:<backend args>]]
Der Name des Kontingentstamms ist nur eine beliebige Zeichenfolge, die an IMAP-Clients gesendet wird, die sie wiederum dem Benutzer anzeigen können. Der Name hat keine Bedeutung. Standardmässig wird eine leere Zeichenkette verwendet, aber das sollte geändert werden, da einige Clients (Apple Mail) die Quota nicht anzeigen. |
HINWEIS - Die Option
noenforcing
, könnte bei einer weichen Neueinführung von Quotas wertvoll sein!
plugin (Quota backends): quota2_rule
Information | Beschreibung |
---|---|
Dokumentation | https://doc.dovecot.org/2.3/settings/plugin/quota-plugin/#plugin_setting-quota-quota Dovecot Configuration Manual - Quota Plugin |
Defaultwert | quota2_rule = |
Neuer Wert | quota2_rule = Trash:storage=+10%% |
Konfiguration | ## ## Quota backends ## # Multiple backends are supported: # dirsize: Find and sum all the files found from mail directory. # Extremely SLOW with Maildir. It'll eat your CPU and disk I/O. # dict: Keep quota stored in dictionary (eg. SQL) # maildir: Maildir++ quota # fs: Read-only support for filesystem quota plugin { #quota = dirsize:User quota #quota = maildir:User quota # Tachtler # default: #quota = dict:User quota::proxy::quota quota = dict:User quota::proxy::sqlquota #quota = fs:User quota } # Multiple quota roots are also possible, for example this gives each user # their own 100MB quota and one shared 1GB quota within the domain: plugin { #quota = dict:user::proxy::quota #quota2 = dict:domain:%d:proxy::quota_domain #quota_rule = *:storage=102400 # Tachtler # default: #quota2_rule = *:storage=1048576 quota2_rule = Trash:storage=+10%% } |
Beschreibung | Die Quotenstammkonfiguration hat die folgende Syntax: quota = <backend>[:<quota root name>[:<backend args>]]
Der Name des Kontingentstamms ist nur eine beliebige Zeichenfolge, die an IMAP-Clients gesendet wird, die sie wiederum dem Benutzer anzeigen können. Der Name hat keine Bedeutung. Standardmässig wird eine leere Zeichenkette verwendet, aber das sollte geändert werden, da einige Clients (Apple Mail) die Quota nicht anzeigen. |
Neustart
Bevor der der dovecot
-Daemon/Dienst neu gestartet werden soll, ist eine Überprüfung der korrekten Konfiguration durch nachfolgenden Befehl, zu empfehlen
doveconf -n
# 2.3.21.1 (d492236fa0): /etc/dovecot/dovecot.conf # OS: Linux 6.12.20-1-lts x86_64 # Hostname: vml080.idmz.tachtler.net auth_mechanisms = plain digest-md5 cram-md5 login auth_verbose = yes dict { sqlquota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } listen = 127.0.0.1, 10.0.0.80, ::1, fd00::10:10:0:0:80, 2001:db8::10:10:0:0:80 mail_location = maildir:~/Maildir mail_plugins = " quota notify mail_log zlib" namespace inbox { inbox = yes location = mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } mailbox Trash { auto = subscribe special_use = \Trash } prefix = INBOX/ separator = / type = private } passdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } plugin { mail_log_events = delete undelete expunge save copy mailbox_create mailbox_delete mailbox_rename mail_log_fields = uid box msgid size vsize from quota = dict:User quota::proxy::sqlquota quota2_rule = Trash:storage=+10%% quota_max_mail_size = 50M quota_rule = *:storage=1G quota_rule2 = INBOX/Trash:storage=+100M quota_status_nouser = DUNNO quota_status_overquota = 552 5.2.2 Mailbox is over quota quota_status_success = DUNNO quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=80%% quota-warning 80 %u zlib_save = gz zlib_save_level = 6 } protocols = imap lmtp service auth { inet_listener auth { address = 10.0.0.80, fd00::10:10:0:0:80 port = 12345 } } service lmtp { inet_listener lmtp { address = 10.0.0.80, fd00::10:10:0:0:80 port = 24 ssl = yes } user = vmail } service quota-status { client_limit = 1 executable = quota-status -p postfix inet_listener { address = 10.0.0.80, fd00::10:10:0:0:80 port = 12340 } } service quota-warning { executable = script /usr/local/bin/quota-warning.sh unix_listener quota-warning { user = vmail } user = vmail } service stats { unix_listener stats-reader { user = vmail } unix_listener stats-writer { user = vmail } } ssl = required ssl_cert = </etc/dovecot/ssl/certs/fullchain.pem ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256 :ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256 :DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA :ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA :AES128-GCM-SHA256:AES256-GCM-SHA384:!CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK :!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA ssl_cipher_suites = TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 :TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256 ssl_dh = # hidden, use -P to show it ssl_key = # hidden, use -P to show it ssl_prefer_server_ciphers = yes userdb { driver = prefetch } userdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } verbose_proctitle = yes protocol lmtp { auth_ssl_require_client_cert = yes ssl = required ssl_ca = </etc/dovecot/ssl/certs/server-lmtp-chain.pem ssl_require_crl = no ssl_verify_client_cert = yes } protocol imap { mail_plugins = " quota notify mail_log zlib imap_quota imap_zlib" }
HINWEIS - Die Konfiguration der Parameter
ssl_cipher_list
ssl_cipher_suites
erfolgt in einer Zeile - OHNE - Zeilenumbrüche!
HINWEIS - die Konfiguration des
dovecot
-Daemon/Dienst konnte korrekt gelesen werden, wenn die Konfiguration erscheint, was letztendlich zwar nicht bedeutet, das Sie auch korrekt ist, aber syntaktische Fehler ausschliesst !!!
Danach kann der dovecot-Server mit nachfolgendem Befehle neu gestartet werden:
# systemctl restart dovecot.service
Überprüfung erfolgreicher Neustart
Um zu Überprüfen, ob der Neustart des dovecot
-Daemons/Dienstes erfolgreich durchgeführt wurden, kann nachfolgender Befehl genutzt werden:
# ss -tauben | grep dovecot tcp LISTEN 0 1000 10.0.0.80:12345 0.0.0.0:* ino:16554 sk:1001 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 10.0.0.80:12340 0.0.0.0:* ino:16568 sk:1002 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 10.0.0.80:24 0.0.0.0:* ino:16482 sk:1003 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 127.0.0.1:143 0.0.0.0:* ino:16505 sk:1004 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 10.0.0.80:143 0.0.0.0:* ino:16506 sk:1005 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 127.0.0.1:993 0.0.0.0:* ino:16510 sk:1006 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 10.0.0.80:993 0.0.0.0:* ino:16511 sk:1007 cgroup:/system.slice/dovecot.service <-> tcp LISTEN 0 100 [::1]:993 [::]:* ino:16512 sk:100a cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [fd00::10:10:0:0:80]:993 [::]:* ino:16513 sk:100b cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [2001:db8::10:10:0:0:80]:143 [::]:* ino:16509 sk:100c cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [fd00::10:10:0:0:80]:12340 [::]:* ino:16569 sk:100d cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 1000 [fd00::10:10:0:0:80]:12345 [::]:* ino:16555 sk:100e cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [fd00::10:10:0:0:80]:24 [::]:* ino:16483 sk:100f cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [2001:db8::10:10:0:0:80]:993 [::]:* ino:16514 sk:1010 cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [fd00::10:10:0:0:80]:143 [::]:* ino:16508 sk:1011 cgroup:/system.slice/dovecot.service v6only:1 <-> tcp LISTEN 0 100 [::1]:143 [::]:* ino:16507 sk:1012 cgroup:/system.slice/dovecot.service v6only:1 <->
oder auch dieser Befehl:
# ps auxwf | grep dovecot | grep -v grep root 7024 0.0 0.2 8208 5392 ? Ss 14:45 0:00 /usr/bin/dovecot -F dovecot 7025 0.0 0.1 4440 2592 ? S 14:45 0:00 \_ dovecot/anvil [1 connections] root 7026 0.0 0.1 4576 2936 ? S 14:45 0:00 \_ dovecot/log root 7027 0.0 0.2 7408 4940 ? S 14:45 0:00 \_ dovecot/config dovecot 7041 0.0 0.1 5608 3448 ? S 14:45 0:00 \_ dovecot/stats [3 connections] dovecot 7217 0.0 0.5 18460 10692 ? S 14:55 0:00 \_ dovecot/auth [0 wait, 0 passdb, 0 userdb] root 7218 0.0 0.5 18464 10696 ? S 14:55 0:00 \_ dovecot/auth worker: idling dovecot 7219 0.0 0.4 17288 9588 ? S 14:55 0:00 \_ dovecot/dict [0 clients, 0 lookups:0/0/0/0, 0 iters:0/0/0/0, 0 commits:0/0/0/0]
* Neu ist hier der Prozess dovecot/dict
bzw. auch dieser Befehl:
# systemctl status dovecot.service ● dovecot.service - Dovecot IMAP/POP3 email server Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; preset: > Active: active (running) since Wed 2025-04-21 13:24:15 CET; 1min 15s ago Invocation: 2d378761f9bc4a57934c39a42cf869b3 Docs: man:dovecot(1) https://doc.dovecot.org/ Main PID: 6003 (dovecot) Status: "v2.3.21.1 (d492236fa0) running" Tasks: 4 (limit: 2315) Memory: 3.6M (peak: 4M) CPU: 78ms CGroup: /system.slice/dovecot.service ├─6003 /usr/bin/dovecot -F ├─6005 "dovecot/anvil [0 connections]" ├─6006 "dovecot/log " └─6007 "dovecot/config " Apr 21 13:24:15 server systemd[1]: Starting Dovecot IMAP/POP3 email server... Apr 21 13:24:15 server dovecot[1723]: master: Dovecot v2.3.21.1 (d492236fa0) st> Apr 21 13:24:15 server systemd[1]: Started Dovecot IMAP/POP3 email server.
Test
Login-Test mit doveadm
Um zu Überprüfen, ob eine Anmeldung als Benutzer möglich ist, kann nachfolgender Befehl genutzt werden:
# doveadm auth test klaus@tachtler.net Password: passdb: klaus@tachtler.net auth succeeded extra fields: user=klaus@tachtler.net
Dies würde nachfolgende Einträge im
systemd-journald
zur Anzeige bringen, wenn die Log-Ausgabe wie in diesem internen Link beschrieben
gesetzt wurde: (Nur relevanter Ausschnitt):
# journalctl -fu dovecot Apr 21 13:34:32 server dovecot[6068]: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Apr 21 13:34:32 server dovecot[6068]: auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so Apr 21 13:34:32 server dovecot[6068]: auth: Debug: sqlpool(mysql): Creating new connection Apr 21 13:34:32 server dovecot[6068]: auth: Debug: Read auth token secret from /run/dovecot/auth-token-secret.dat Apr 21 13:34:32 server dovecot[6068]: auth: Debug: mysql(db.idmz.tachtler.net): Connecting Apr 21 13:34:32 server dovecot[6068]: auth: Debug: auth client connected (pid=0) Apr 21 13:34:32 server dovecot[6068]: auth: Debug: client in: AUTH 1 PLAIN service=doveadm debug resp=<hidden> Apr 21 13:34:32 server dovecot[6068]: auth: Debug: sql(klaus@tachtler.net): Performing passdb lookup Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: sqlpool(mysql): Creating new connection Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: mysql(db.idmz.tachtler.net): Connecting Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): Server accepted connection (fd=14) Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): Sending version handshake Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): auth-worker<1>: Handling PASSV request Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): auth-worker<1>: sql(klaus@tachtler.net): Performing passdb lookup Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): auth-worker<1>: sql(klaus@tachtler.net): query: SELECT username AS user, password, 10000 AS userdb_uid, 10000 as userdb_gid, CONCAT('/srv/vmail/', maildir) AS userdb_home, CONCAT('*:bytes=', mailbox.quota) AS userdb_quota_rule FROM mailbox WHERE username = 'klaus@tachtler.net' AND active = 1 Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: mysql(db.idmz.tachtler.net): Finished query 'SELECT username AS user, password, 10000 AS userdb_uid, 10000 as userdb_gid, CONCAT('/srv/vmail/', maildir) AS userdb_home, CONCAT('*:bytes=', mailbox.quota) AS userdb_quota_rule FROM mailbox WHERE username = 'klaus@tachtler.net' AND active = 1' in 0 msecs Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): auth-worker<1>: sql(klaus@tachtler.net): Finished passdb lookup Apr 21 13:34:32 server dovecot[6068]: auth-worker(6130): Debug: conn unix:auth-worker (pid=6129,uid=76): auth-worker<1>: Finished Apr 21 13:34:32 server dovecot[6068]: auth: Debug: sql(klaus@tachtler.net): Finished passdb lookup Apr 21 13:34:32 server dovecot[6068]: auth: Debug: auth(klaus@tachtler.net): Auth request finished Apr 21 13:34:32 server dovecot[6068]: auth: Debug: client passdb out: OK 1 user=klaus@tachtler.net
Ausgabe Benutzerdaten
Mit nachfolgendem Befehl, gibt Dovecot eine Liste aller ihm bekannten Benutzer aus:
# doveadm user '*' klaus@tachtler.net petra@tachtler.net
Dies würde nachfolgende Einträge im
systemd-journald
zur Anzeige bringen, wenn die Log-Ausgabe wie in diesem internen Link beschrieben
gesetzt wurde: (Nur relevanter Ausschnitt):
# journalctl -fu dovecot Apr 21 13:37:45 server dovecot[6068]: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Apr 21 13:37:45 server dovecot[6068]: auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so Apr 21 13:37:45 server dovecot[6068]: auth: Debug: sqlpool(mysql): Creating new connection Apr 21 13:37:45 server dovecot[6068]: auth: Debug: Read auth token secret from /run/dovecot/auth-token-secret.dat Apr 21 13:37:45 server dovecot[6068]: auth: Debug: mysql(db.idmz.tachtler.net): Connecting Apr 21 13:37:45 server dovecot[6068]: auth: Debug: master in: LIST 1 user=* service=doveadm debug Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: sqlpool(mysql): Creating new connection Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: mysql(db.idmz.tachtler.net): Connecting Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): Server accepted connection (fd=14) Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): Sending version handshake Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): auth-worker<1>: Handling LIST request Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): auth-worker<1>: sql(*): Performing userdb lookup Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: mysql(db.idmz.tachtler.net): Finished query 'SELECT username AS user FROM mailbox WHERE active = 1' in 0 msecs Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): auth-worker<1>: sql(*): SELECT username AS user FROM mailbox WHERE active = 1 Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): auth-worker<1>: sql(*): Finished userdb lookup Apr 21 13:37:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): auth-worker<1>: Finished Apr 21 13:38:45 server dovecot[6068]: auth-worker(6144): Debug: conn unix:auth-worker (pid=6143,uid=76): Disconnected: Connection closed (fd=-1) Apr 21 13:38:45 server dovecot[6068]: auth-worker(6144): Debug: mysql(db.idmz.tachtler.net): Connection finished (queries=1, slow queries=0) Apr 21 13:39:45 server dovecot[6068]: auth: Debug: mysql(db.idmz.tachtler.net): Connection finished (queries=0, slow queries=0)
Um zu Überprüfen, welche Benutzerdaten Dovecot bekannt sind, kann nachfolgender Befehl genutzt werden:
# doveadm user klaus@tachtler.net field value uid 10000 gid 10000 home /srv/vmail/tachtler.net/klaus mail maildir:~/Maildir quota_rule *:bytes=1024000000 # doveadm user petra@tachtler.net field value uid 10000 gid 10000 home /srv/vmail/tachtler.net/petra mail maildir:~/Maildir quota_rule *:bytes=1024000000
Dies würde nachfolgende Einträge im
systemd-journald
zur Anzeige bringen, wenn die Log-Ausgabe wie in diesem internen Link beschrieben
gesetzt wurde: (Nur relevanter Ausschnitt):
Apr 21 13:41:53 server dovecot[6068]: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Apr 21 13:41:53 server dovecot[6068]: auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so Apr 21 13:41:53 server dovecot[6068]: auth: Debug: sqlpool(mysql): Creating new connection Apr 21 13:41:53 server dovecot[6068]: auth: Debug: Read auth token secret from /run/dovecot/auth-token-secret.dat Apr 21 13:41:53 server dovecot[6068]: auth: Debug: mysql(db.idmz.tachtler.net): Connecting Apr 21 13:41:53 server dovecot[6068]: auth: Debug: master in: USER 1 klaus@tachtler.net service=doveadm debug Apr 21 13:41:53 server dovecot[6068]: auth: Debug: prefetch(klaus@tachtler.net): Performing userdb lookup Apr 21 13:41:53 server dovecot[6068]: auth: Debug: prefetch(klaus@tachtler.net): passdb didn't return userdb entries, trying the next userdb Apr 21 13:41:53 server dovecot[6068]: auth: Debug: prefetch(klaus@tachtler.net): Finished userdb lookup Apr 21 13:41:53 server dovecot[6068]: auth: Debug: sql(klaus@tachtler.net): Performing userdb lookup Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: Module loaded: /usr/lib/dovecot/modules/auth/lib20_auth_var_expand_crypt.so Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: sqlpool(mysql): Creating new connection Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: mysql(db.idmz.tachtler.net): Connecting Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): Server accepted connection (fd=14) Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): Sending version handshake Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<1>: Handling USER request Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<1>: sql(klaus@tachtler.net): Performing userdb lookup Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<1>: sql(klaus@tachtler.net): SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, domain WHERE mailbox.username = 'klaus@tachtler.net' AND mailbox.active = 1 AND domain.domain = 'tachtler.net' AND domain.active = 1 Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: mysql(db.idmz.tachtler.net): Finished query 'SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, domain WHERE mailbox.username = 'klaus@tachtler.net' AND mailbox.active = 1 AND domain.domain = 'tachtler.net' AND domain.active = 1' in 0 msecs Apr 21 13:41:53 server dovecot[6068]: auth: Debug: sql(klaus@tachtler.net): Finished userdb lookup Apr 21 13:41:53 server dovecot[6068]: auth: Debug: userdb out: USER 1 klaus@tachtler.net home=/srv/vmail/tachtler.net/klaus/ uid=10000 gid=10000 quota_rule=*:bytes=1024000000 Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<1>: sql(klaus@tachtler.net): Finished userdb lookup Apr 21 13:41:53 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<1>: Finished Apr 21 13:42:05 server dovecot[6068]: auth: Debug: master in: USER 1 petra@tachtler.net service=doveadm debug Apr 21 13:42:05 server dovecot[6068]: auth: Debug: prefetch(petra@tachtler.net): Performing userdb lookup Apr 21 13:42:05 server dovecot[6068]: auth: Debug: prefetch(petra@tachtler.net): passdb didn't return userdb entries, trying the next userdb Apr 21 13:42:05 server dovecot[6068]: auth: Debug: prefetch(petra@tachtler.net): Finished userdb lookup Apr 21 13:42:05 server dovecot[6068]: auth: Debug: sql(petra@tachtler.net): Performing userdb lookup Apr 21 13:42:05 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<2>: Handling USER request Apr 21 13:42:05 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<2>: sql(petra@tachtler.net): Performing userdb lookup Apr 21 13:42:05 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<2>: sql(petra@tachtler.net): SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, domain WHERE mailbox.username = 'petra@tachtler.net' AND mailbox.active = 1 AND domain.domain = 'tachtler.net' AND domain.active = 1 Apr 21 13:42:05 server dovecot[6068]: auth-worker(6159): Debug: mysql(db.idmz.tachtler.net): Finished query 'SELECT CONCAT('/srv/vmail/', maildir) AS home, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', mailbox.quota) AS quota_rule FROM mailbox, domain WHERE mailbox.username = 'petra@tachtler.net' AND mailbox.active = 1 AND domain.domain = 'tachtler.net' AND domain.active = 1' in 1 msecs Apr 21 13:42:05 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<2>: sql(petra@tachtler.net): Finished userdb lookup Apr 21 13:42:05 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): auth-worker<2>: Finished Apr 21 13:42:05 server dovecot[6068]: auth: Debug: sql(petra@tachtler.net): Finished userdb lookup Apr 21 13:42:05 server dovecot[6068]: auth: Debug: userdb out: USER 1 petra@tachtler.net home=/srv/vmail/tachtler.net/petra/ uid=10000 gid=10000 quota_rule=*:bytes=1024000000 Apr 21 13:43:05 server dovecot[6068]: auth-worker(6159): Debug: conn unix:auth-worker (pid=6158,uid=76): Disconnected: Connection closed (fd=-1) Apr 21 13:43:05 server dovecot[6068]: auth-worker(6159): Debug: mysql(db.idmz.tachtler.net): Connection finished (queries=2, slow queries=0) Apr 21 13:43:53 server dovecot[6068]: auth: Debug: mysql(db.idmz.tachtler.net): Connection finished (queries=0, slow queries=0)
Test E-Mail
Mittels Einlieferung einer E-Mail kann mit herausgefunden werden, ob lokal erzeugte e-Mails auch an Dovecot: imap.tachtler.net
über Port 24
und via TLS-Verschlüsselung - zugestellt werden kann, was ausnahmsweise mit nachfolgendem Befehl (und nicht mit telnet
) durchgeführt werden soll z.B. überprüft werden, ob die entsprechenden Log-Felder im Log von Dovecot ersichtlich sind:
# echo "Test-E-Mail (virtual domain)" | /usr/sbin/sendmail root
Nachfolgende die Log-Schreibung, welche im systemd-journald
-Log ersichtlich ist und mit z.B. dem Befehl
# journalctl -u dovecot.service
zur Ansicht gebracht werden kann:
Apr 21 13:50:01 server dovecot[6204]: lmtp(6226): Connect from fd00::10:10:0:0:60 Apr 21 13:50:02 server dovecot[6204]: lmtp(klaus@tachtler.net)<6226><jCqZOukwBmhSGAAAhuu2+w>: Mailbox created: INBOX Apr 21 13:50:02 server dovecot[6204]: lmtp(klaus@tachtler.net)<6226><jCqZOukwBmhSGAAAhuu2+w>: save: box=INBOX, uid=1, msgid=<20250421115002.90FB8180084@mx1.tachtler.net>, size=655, vsize=670, from=root@vml060.idmz.tachtler.net Apr 21 13:50:02 server dovecot[6204]: lmtp(klaus@tachtler.net)<6226><jCqZOukwBmhSGAAAhuu2+w>: msgid=<20250421115002.90FB8180084@mx1.tachtler.net>: saved mail to INBOX Apr 21 13:50:02 server dovecot[6204]: lmtp(6226): Disconnect from fd00::10:10:0:0:60: Logged out (state=READY)
Quota Werte ausgeben
Mit nachfolgenden Befehlen, können Informationen zur Quota-Berechnung/Limit und zur Quota-Verwaltung realisiert werden.
Mit nachfolgendem Befehl, können Informationen zur mailbox (Postfach) eines Benutzer abgefragt werden:
HINWEIS - Die Angabe des STORAGE erfolgt in KiloByte!
# doveadm quota get -u klaus@tachtler.net Quota name Type Value Limit % User quota STORAGE 1 1000000 0 User quota MESSAGE 1 - 0
HINWEIS - Die einzeln erzeugte E-Mail ist zu kein, da diese weniger als 1 KiloByte gross ist!
Eine SQL-Abfrage gegen die Datenbank, kann jedoch auch die kleinsten Werte zurückgaben, wie nachfolgende Ausgabe darstellt:
# mariadb Welcome TO the MariaDB monitor. Commands END WITH ; OR \g. Your MariaDB connection id IS 20204 Server version: 11.4.5-MariaDB Arch Linux Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab AND others. TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.
MariaDB [(NONE)]> SELECT * FROM postfix.quota2 WHERE username = 'klaus@tachtler.net'; +--------------------+-------+----------+ | username | bytes | messages | +--------------------+-------+----------+ | klaus@tachtler.net | 655 | 1 | +--------------------+-------+----------+ 1 ROW IN SET (0.000 sec)
MariaDB [(NONE)]> quit Bye
ACHTUNG - Dies Abfrage wurde auf dem Datenbank-Server direkt ausgeführt!
Quota neu berechnen
Mit nachfolgendem Befehl, kann Dovecot angewiesen werden, die Quota-Berechnung für einen Benutzer neu durchzuführen:
# doveadm quota recalc -u klaus@tachtler.net
HINWEIS - Es erfolgt keine Ausgabe!
Beispiel-Anzeige
Nachfolgende Anzeige ist ein Ausschnitt aus der Web-Anwendung PostfixAdmin ArchLinux:
HINWEIS - Diese Anzeige kam erst nach ca. 10 E-Mails mit je ca. 655 Byte zustande!