Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:dovecot_quotas_-_sql-backend

Dovecot Quotas - SQL-Backend

:!: HINWEIS - Die Nachfolgende Konfiguration von Dovecot setzt eine lauffähige Installation von Dovecot sowie eine lauffähige Installation von Postfix Admin voraus, wie unter nachfolgenden internen Links beschrieben !!!

Dovecot ist ein Open-Source-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 große Installationen. Dovecot ist schnell und einfach zu installieren, erfordert keine besonderen Voraussetzungen und ist Ressourcenschonend.

Dovecot wird von Timo Sirainen entwickelt.

Beschreibung Externer Link
Homepage http://dovecot.org
Dokumentation http://dovecot.org/documentation.html
Wiki Dovecot2 http://wiki2.dovecot.org/

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: 

Vorbereitung

:!: WICHTIG - Diese Konfiguration setzt auf die vollständige Durchführung der unter nachfolgendem Link beschriebenen Quota-Konfiguration auf. Falls noch nicht geschehen, ist die Konfiguration wie unter nachfolgendem Link beschrieben zuerst durchzuführen !!!

Konfiguration - Allgemein

Nachfolgend sind verschiedene Konfigurationsschritte notwendig, die ggf. auch Kombinationen aus den einzelnen Teilen eines Quota-Systems bestehen.

/etc/dovecot/dovecot.conf

Um zu verhindern, dass jeder einzelne Prozess eine eigene SQL-Verbindung eröffnet, kann die gesamte „Dictionary“ Kommunikation über einen einzelnen „Dictionary“-Server-Prozess abgehandelt werden, welcher die Kommunikation permanent offen hält.

Dies kann durch nachfolgende Konfiguration durchgeführt werden:

(Nur relevanter Ausschnitt)

...
##
## Dictionary server settings
##
 
# Dictionary can be used to store key=value lists. This is used by several
# plugins. The dictionary can be accessed either directly or though a
# dictionary server. The following dict block maps dictionary names to URIs
# when the server is used. These can then be referenced using URIs in format
# "proxy::<name>".
 
dict {
  #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
  #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
  # Tachtler
  sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf.ext
  sqldomainquota = mysql:/etc/dovecot/dovecot-sql-domain.conf.ext
}
...

/etc/dovecot/dovecot-dict-sql-user.conf.ext

Nachfolgende Konfigurationsdatei ist standardmäßig nicht im Verzeichnis

  • /etc/dovecot

enthalten.

Jedoch kann die Konfigurationsdatei aus dem installierten rpm-Paket dovecot in das Konfigurationsverzeichnis von Dovecot kopiert werden, was mit nachfolgendem Befehl durchführt werden kann:

# cp -a /usr/share/doc/dovecot-2.2.10/example-config/dovecot-dict-sql.conf.ext /etc/dovecot/dovecot-dict-sql-user.conf.ext

Anschließend kann mit nachfolgendem Befehl überprüft werden, ob dies erfolgreich durchgeführt wurde:

# ll /etc/dovecot/dovecot-dict-sql-user.conf.ext
-rw-r--r-- 1 root root 1085 May 23 13:06 /etc/dovecot/dovecot-dict-sql-user.conf.ext

(Komplette Konfigurationsdatei)

# This file is commonly accessed via dict {} section in dovecot.conf
 
# Tachtler
# default: #connect = host=localhost dbname=mails user=testuser password=pass
connect = host=mysql.tachtler.net dbname=postfix user=postfixuser password=geheim
 
# 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
  # defautl: table = quota
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  # Tachtler
  # defautl: table = quota
  table = quota2
  username_field = username
  value_field = messages
}
 
# CREATE TABLE expires (
#   username varchar(100) not null,
#   mailbox varchar(255) not null,
#   expire_stamp integer not null,
#   primary key (username, mailbox)
# );
 
# Tachtler - DISABLED -
#map {
#  pattern = shared/expire/$user/$mailbox
#  table = expires
#  value_field = expire_stamp
#
#  fields {
#    username = $user
#    mailbox = $mailbox
#  }
#}

Erläuterungen:

Hier müssen, für die permanente Verbindung des „Dictionary“-Servers zur SQL-Datenbank, die Verbindungsdaten gesetzt werden.

# Tachtler
# default: #connect = host=localhost dbname=mails user=testuser password=pass
connect = host=mysql.tachtler.net dbname=postfix user=postfixuser password=geheim

Da nicht die Standardtabelle von Dovecot sondern eine Tabelle von Postfix Admin verwendet werden soll, sind nachfolgende Anpassungen notwendig:

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
}

Die Verwendung einer Tabelle für Ablaufdaten, soll hier aktuell nicht zum Einsatz kommen:

# Tachtler - DISABLED -
#map {
#  pattern = shared/expire/$user/$mailbox
#  table = expires
#  value_field = expire_stamp
#
#  fields {
#    username = $user
#    mailbox = $mailbox
#  }
#}

/etc/dovecot/dovecot-dict-sql-domain.conf.ext

Nachfolgende Konfigurationsdatei ist standardmäßig nicht im Verzeichnis

  • /etc/dovecot

enthalten.

Jedoch kann die Konfigurationsdatei aus dem installierten rpm-Paket dovecot in das Konfigurationsverzeichnis von Dovecot kopiert werden, was mit nachfolgendem Befehl durchführt werden kann:

# cp -a /usr/share/doc/dovecot-2.2.10/example-config/dovecot-dict-sql.conf.ext /etc/dovecot/dovecot-dict-sql-domain.conf.ext

Anschließend kann mit nachfolgendem Befehl überprüft werden, ob dies erfolgreich durchgeführt wurde:

# ll /etc/dovecot/dovecot-dict-sql-domain.conf.ext
-rw-r--r-- 1 root root 1085 May 23 13:06 /etc/dovecot/dovecot-dict-sql-domain.conf.ext

(Komplette Konfigurationsdatei)

# This file is commonly accessed via dict {} section in dovecot.conf
 
# Tachtler
# default: #connect = host=localhost dbname=mails user=testuser password=pass
connect = host=mysql.tachtler.net dbname=postfix user=postfixuser password=geheim
 
# 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
  # defautl: table = quota
  table = domain
  # Tachtler
  # default: username_field = username
  username_field = domain
  # Tachtler
  # default: value_field = bytes
  value_field = quota
}
map {
  pattern = priv/quota/messages
  # Tachtler
  # defautl: table = quota
  table = quota2
  username_field = username
  value_field = messages
}
 
# CREATE TABLE expires (
#   username varchar(100) not null,
#   mailbox varchar(255) not null,
#   expire_stamp integer not null,
#   primary key (username, mailbox)
# );
 
# Tachtler - DISABLED -
#map {
#  pattern = shared/expire/$user/$mailbox
#  table = expires
#  value_field = expire_stamp
#
#  fields {
#    username = $user
#    mailbox = $mailbox
#  }
#}

Erläuterungen:

Hier müssen, für die permanente Verbindung des „Dictionary“-Servers zur SQL-Datenbank, die Verbindungsdaten gesetzt werden.

# Tachtler
# default: #connect = host=localhost dbname=mails user=testuser password=pass
connect = host=mysql.tachtler.net dbname=postfix user=postfixuser password=geheim

Da nicht die Standardtabelle von Dovecot sondern eine Tabelle von Postfix Admin verwendet werden soll, sind nachfolgende Anpassungen notwendig:

map {
  pattern = priv/quota/storage
  # Tachtler
  # defautl: table = quota
  table = domain
  # Tachtler
  # default: username_field = username
  username_field = domain
  # Tachtler
  # default: value_field = bytes
  value_field = quota
}

map {
  pattern = priv/quota/messages
  # Tachtler
  # default: table = quota
  table = quota2
  username_field = username
  value_field = messages
}

Die Verwendung einer Tabelle für Ablaufdaten, soll hier aktuell nicht zum Einsatz kommen:

# Tachtler - DISABLED -
#map {
#  pattern = shared/expire/$user/$mailbox
#  table = expires
#  value_field = expire_stamp
#
#  fields {
#    username = $user
#    mailbox = $mailbox
#  }
#}

/etc/dovecot/conf.d/10-master.conf

Die nachfolgend beschriebene Konfiguration ermöglichte es den Prozessen der Benutzer von Dovecot auf den Socket

  • /var/run/dovecot/dict

zuzugreifen.

Die nachfolgende Konfiguration setzt ebenfalls voraus, dass ein Authentifizierungsbenutzer wie unter nachfolgendem internen Link beschrieben

verwendet wird und somit alle Benutzer die gleiche UID und GID haben.

(Nur relevanter Ausschnitt)

...
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 {
    # Tachtler
    # default: #mode = 0600
    mode = 0660
    # Tachtler
    # default: #user = 
    user = vmail
    # Tachtler
    # default: #group = 
    group = vmail
  }
}

/etc/dovecot/conf.d/90-quota.conf

In der Konfigurationsdatei werden Quota spezifische Einstellungen eingestellt.

:!: WICHTIG - Die hier durchgeführten Konfigurationen sind Änderungen gegenüber der Konfiguration unter nachfolgendem internen Link:

plugin

Quota-Backend Bereich: (Nur relevanter Ausschnitt)

...
##
## 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
  # Tachtler
  # default: #quota = maildir:User quota
  # Using SQL Tables to store current quota size
  quota = dict:Quota:%d:proxy::sqldomainquota
  quota = dict:User Quota::proxy::sqluserquota
  # Allow 10% more for Trash Folder
  quota2_rule = Trash:storage=+10%%
  #quota = dict:User quota::proxy::quota
  #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
  #quota2_rule = *:storage=1048576
}
...

/etc/dovecot/dovecot-sql.conf.ext

:!: WICHTIG - Nachfolgender interner Link beschreibt die Anpassungen an der Konfigurationsdatei

  • /etc/dovecot/dovecot-sql.conf.ext

Dovecot Authentifizierung - SQL - /etc/dovecot/dovecot-sql.conf.ext|

(* Bereich CentOS 7 - SQL-QUOTAS)

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.2.10: /etc/dovecot/dovecot.conf
# OS: Linux 2.6.32-431.5.1.el6.x86_64 x86_64 CentOS release 6.5 (Final) 
auth_debug = yes
auth_master_user_separator = *
auth_mechanisms = plain digest-md5 cram-md5 login
auth_verbose = yes
dict {
  sqldomainquota = mysql:/etc/dovecot/dovecot-sql-domain.conf.ext
  sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf.ext
}
mail_debug = yes
mail_location = maildir:~/Maildir
mail_plugins = " quota"
mbox_write_locks = fcntl
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix = INBOX/
  separator = /
}
passdb {
  args = /etc/dovecot/master-users
  driver = passwd-file
  master = yes
  pass = yes
}
passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
plugin {
  quota = dict:User Quota::proxy::sqluserquota
  quota2_rule = Trash:storage=+10%%
  quota_grace = 10%%
  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
}
protocols = imap lmtp
service dict {
  unix_listener dict {
    group = vmail
    mode = 0660
    user = vmail
  }
}
service lmtp {
  inet_listener lmtp {
    address = 192.168.0.80
    port = 24
  }
}
service quota-status {
  client_limit = 1
  executable = quota-status -p postfix
  inet_listener {
    address = 192.168.0.80
    port = 12340
  }
}
service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = vmail
}
ssl_cert = </etc/pki/dovecot/certs/CAcert-class3-wildcard_all_in_one.crt
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-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_dh_parameters_length = 2048
ssl_key = </etc/pki/dovecot/private/tachtler.net.key
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3
userdb {
  args = username_format=%u /etc/dovecot/users
  driver = passwd-file
}
verbose_proctitle = yes
protocol imap {
  mail_plugins = " quota imap_quota"
}

:!: 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 ausschließt !!!

Danach kann der dovecot-Server mit nachfolgendem Befehle neu gestartet werden:

# service dovecot restart
Stopping Dovecot Imap:                                     [  OK  ]
Starting Dovecot Imap:                                     [  OK  ]

Ob alle aktuell konfigurierten Dienste von Dovecot gestartet sind, kann mit nachfolgendem Befehl überprüft werden, und sollte eine Ausgabe wie die nachfolgende zurück liefern:

# ps auxwf | grep dovecot
root     30198  0.0  0.0 103244   828 pts/1 S+   15:30   0:00                      \_ grep dovecot
root     28354  0.0  0.0  23824  1360 ?     Ss   14:51   0:00 /usr/sbin/dovecot
dovenull 28356  0.1  0.2  43304  4272 ?     S    14:51   0:03  \_ dovecot/imap-login [13 connections (13 TLS)]
dovecot  28357  0.0  0.0  13304  1140 ?     S    14:51   0:00  \_ dovecot/anvil [2 connections]
root     28358  0.0  0.0  13436  1336 ?     S    14:51   0:00  \_ dovecot/log
root     28360  0.0  0.1  20656  2552 ?     S    14:51   0:00  \_ dovecot/config
dovecot  28362  0.0  0.2  93988  4220 ?     S    14:51   0:00  \_ dovecot/auth [0 wait, 0 passdb, 0 userdb]
...
root     28479  0.0  0.2  96060  4596 ?     S    14:53   0:00  \_ dovecot/auth worker: idling
dovecot  28568  0.0  0.2  91564  4076 ?     S    14:55   0:00  \_ dovecot/dict
...
root     30165  0.0  0.0  18596  1684 ?     S    15:29   0:00  \_ dovecot/lmtp [idling]
root     30176  0.0  0.0  16524  1536 ?     S    15:29   0:00  \_ dovecot/quota-status -p postfix

* Neu ist hier der Prozess dovecot/dict

Beispiel-Anzeige

Nachfolgende Anzeige ist ein Ausschnitt aus der Web-Anwendung Postfix Admin:

Postfix Admin Anzeige-Ausschnitt

Quota-Befehle: doveadm

:!: HINWEIS - Nachfolgende Befehle sind nur verfügbar, wenn das quota-Plugin aktiv ist!

doveadm quota get

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:

# doveadm quota get -u klaus@tachtler.net
Quota name Type    Value   Limit                                                              %
User quota STORAGE 91351 1024000                                                              8
User quota MESSAGE   865       -                                                              0

# doveadm quota get -u petra@tachtler.net
Quota name Type    Value   Limit                                                              %
User quota STORAGE 19485 1024000                                                              1
User quota MESSAGE    91       -                                                              0

:!: HINWEIS - Die Angabe des STORAGE erfolgt in KiloByte!

doveadm quota recalc

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!

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
tachtler/dovecot_quotas_-_sql-backend.txt · Zuletzt geändert: 2017/04/07 15:08 von klaus