Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:dovecot_archlinux_-_sql

Dovecot ArchLinux - SQL

:!: HINWEIS - Die Nachfolgende Konfiguration von Dovecot setzt eine lauffähige Installation von Dovecot voraus, wie unter nachfolgendem internen Link beschrieben:

* Dovecot ArchLinux

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.

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

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:

  1. Im PostfixAdmin existiert eine Domain: tachtler.net
  2. Im PostfixAdmin wurde ein Benutzer mit dem Benutzernamen/Mailbox klaus@tachtler.net angelegt
  3. Zur Anmeldung an Dovecot wird die E-Mail-Adresse verwendet
  4. 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-Vergleich
  • userdb - 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

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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.
:!: ACHTUNG - Falls Dovecot als Authentifizierungsbackend z.B. für eine SASL-Authentifizierung zum Einsatz kommen soll, ist es erforderlich das Passwort im Klartext in der Datenbank zu speichern!

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)

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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)

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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)

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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)

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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 „normaleuserdb-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

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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

:!: HINWEIS - Die Konfiguration erfolgt in einer Zeile - ohne - Zeilenumbrüche!

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.

es können mehrere Kontingentstämme definieren, indem eine aufsteigende Zahl an die Bezeichnung der Einstellung anhängt wird:

Global verfügbare Argumente für den Parameter <backend args>:

noenforcing = Quota-Berechnungen werden durchgeführt, aber nicht durchgesetzt, trotz z.B. Quota-Warnings!.
ns=<prefix> = Ein separates namensraumspezifisches Kontingent, das von allen Benutzern gemeinsam genutzt wird.

Wenn mehrere Backend-Argumente angegeben werden sollen, sind die diese mit : (z. B. noenforcing:ns=Public/:foo:bar) zu trennen.

:!: 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.

es können mehrere Kontingentstämme definieren, indem eine aufsteigende Zahl an die Bezeichnung der Einstellung anhängt wird:

Global verfügbare Argumente für den Parameter <backend args>:

noenforcing = Quota-Berechnungen werden durchgeführt, aber nicht durchgesetzt, trotz z.B. Quota-Warnings!.
ns=<prefix> = Ein separates namensraumspezifisches Kontingent, das von allen Benutzern gemeinsam genutzt wird.

Wenn mehrere Backend-Argumente angegeben werden sollen, sind die diese mit : (z. B. noenforcing:ns=Public/:foo:bar) zu trennen.

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:

PostfixAdmin ArchLinux Anzeige: Mailbox Übersicht

:!: HINWEIS - Diese Anzeige kam erst nach ca. 10 E-Mails mit je ca. 655 Byte zustande!

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
tachtler/dovecot_archlinux_-_sql.txt · Zuletzt geändert: von klaus