Dovecot Quota - для каждого своя

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
iNeedfor
проходил мимо
Сообщения: 6
Зарегистрирован: 2013-12-04 17:38:43

Dovecot Quota - для каждого своя

Непрочитанное сообщение iNeedfor » 2013-12-04 17:53:23

Здравствуйте.

Настраиваю почтовый сервер впервые. На данный момент все работает отлично в связке Postfix+Postfixadmin+Dovecot.

Разобрался в общем с работой квот при помощи Dovecot, а так же прикрутил оповещение пользователей и админа.

Теперь пытаюсь разрешить проблему настройки индивидуальных разрешений для каждого пользователя (а в идеале еще и с отдельными настройками для каждой из его папок).
Хотелось бы не использовать базу mysql, т.к. опыта в этом у меня нет, а получать его планировал лишь в дальнейшем. Или же, если такое есть, был бы рад получить надстройку над Postfixadmin.

Сейчас это выглядит так:
90-quota.conf

Код: Выделить всё

plugin {
  quota = maildir:User quota
  quota_rule = *:storage=10G
  quota_rule2 = Sent:ignore
  quota_rule3 = Archive:ignore
  quota_rule4 = Ham:ignore
  quota_rule5 = Trash:storage=+500M
  quota_warning = storage=85%% quota-warning 85 %u
  quota_warning2 = storage=90%% quota-warning 90 %u
  quota_warning3 = storage=95%% quota-warning 95 %u
  quota_warning4 = storage=99%% quota-warning 99 %u
}
service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = vmail
  unix_listener quota-warning {
    user = vmail
    mode = 0666
  }
}
Заодно прошу совета со строкой
mode = 0666
Верно ли я её сделал, т.к. при 600 скрипт не запускался принадлежа пользователю vmail.

Сильно не пинайте...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение skeletor » 2013-12-05 12:03:23

Ставить права 0666 на письма - не надо. Достаточно 0660 и выставить нужные права на скрипт или добавить владельца скрипта в нужную группу.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2013-12-05 17:34:52

Давеча прикрутил и отдебажил квотирование к Dovecot 2 с использованием базы на SQL. Для этого использовал поле quota в таблице mailbox базы exim (postfixadmin) чтобы не плодить сущности.
Всё вполне себе работает. Руководствовался исключительно wiki2.dovecot.org
Там всё довольно подробно разжёвано.
IT voodoo blog https://kostikov.co

iNeedfor
проходил мимо
Сообщения: 6
Зарегистрирован: 2013-12-04 17:38:43

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение iNeedfor » 2013-12-06 13:00:36

С частью разобрался, оказывается проглазел создание квот в самом PostfixAdmin, но есть проблемы с dovecot-sql.conf.ext

Читал статью от Лисяры и запутался...
Файл подключения к базе данных /usr/local/etc/dovecot/dovecot-sql.conf.ext
...
password_query = SELECT `username` as `user`, `password` FROM \
`mailbox` WHERE `username` = '%n@%d' AND `active`='1'
# Запрос, возвращающий инфу о юзере и проверяющий квоту
user_query = SELECT CONCAT('/var/mail/exim/', `domain`, '/', `maildir`) \
AS `home`, 26 AS `uid`, 26 AS `gid`, concat('dict:storage=', \
CAST(ROUND(quota / 1024) AS CHAR), '::proxy::sqlquota') \
AS quota, CONCAT('*:storage=', CAST(quota AS CHAR), 'B') AS quota_rule \
FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'

Файл словаря SQL квот /usr/local/etc/dovecot/dovecot-dict-sql.conf.ext

# Строка подключения к БД
connect = host=localhost dbname=exim user=exim password=eximsecretpass
# Описание полей и указание таблицы quota2,
# именно эта таблица используется для Dovecot 2-й версии
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
Мой текущий недоработанный, но работающий конфиг сделанный по другим мануалам:

Код: Выделить всё

user_query = \
  SELECT '/home/vmail/%d/%n' as home, 'maildir:/home/vmail/%d/%n' as mail, \
  5000 AS uid, 5000 AS gid, concat('dirsize:storage=', quota) AS quota \
  FROM mailbox WHERE username = '%u' AND active = '1'
90-quota.conf

Код: Выделить всё

plugin {
  quota = dict:User quota::noenforcing:proxy::quotadict
  quota_rule = *:storage=2G
}
В итоге в почтовике вижу квоту заданную из PostfixAdmin-морды:
Квота = "storage=512000000"
А ниже вижу состояние, что использовано лишь хх% из двух гигабайт.

Как правильно сконфигурировать user_query?

И осталось неясным насчет таблиц quota и quota2, где же и какую использовать.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2013-12-06 13:46:35

Вчера только закончил настройку. Сейчас всё расскажу.
Используется postfixadmin и Dovecot 2 последних релизов.
База создана стандартная postfixadmin'а под именем 'exim'.
Итак, во-первых, активируем квоты в postfixadmin

Код: Выделить всё

root@beta:/usr/local/www/postfixadmin # cat config.inc.php | grep quota
$CONF['maxquota'] = '0';
$CONF['quota'] = 'YES';
$CONF['quota_multiplier'] = '1048576';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';
Для Dovecot версии выше 1.2 используется таблица 'quota2'.

Во-вторых, настраиваем Dovecot 2.
Даю общие переменные и кусок с нужными секциями.

Код: Выделить всё

root@beta:/usr/local/etc/dovecot # cat dovecot.conf 
# --- by xM v.2013-12-05
auth_mechanisms = cram-md5 plain login
base_dir = /var/run/dovecot
disable_plaintext_auth = no
first_valid_gid = 0
first_valid_uid = 25
mail_uid = 26
mail_gid = 26
login_greeting = Dovecot ready!
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
mail_access_groups = mail
mail_location = maildir:/var/mail/%d/%n
mail_privileged_group = mail
auth_debug = no
auth_debug_passwords = no
auth_verbose = no
mail_debug = no
listen = *
protocols = imap pop3 lmtp sieve
mail_plugins = acl quota trash

# skip ... namespace

passdb {
  args = /usr/local/etc/dovecot/dovecot-sql.conf
  driver = sql
}
userdb {
  args = /usr/local/etc/dovecot/dovecot-sql.conf
  driver = sql
}

# -- Quota
plugin {
  quota = dict:domain_quota:%d:proxy::sqldomainquota
  quota2 = dict:user_quota::proxy::sqluserquota
  quota2_rule2 = Trash:storage=+20%%
  quota2_rule3 = Junk:storage=+20%%
  quota2_grace = 10%%
  quota2_warning = storage=100%% quota-exceeded 100 %u
  quota2_warning2 = storage=95%% quota-warning 95 %u
  quota2_warning3 = storage=90%% quota-warning 90 %u
  quota2_warning4 = storage=75%% quota-warning 75 %u
}
dict {
  sqluserquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql-user.conf
  sqldomainquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql-domain.conf
}
service dict {
  unix_listener dict {
  user = mailnull
  mode = 0660
  }
}
service quota-warning {
  executable = script /usr/local/etc/dovecot/quota_warning.sh
  unix_listener quota-warning {
  user = mailnull
  mode = 0660
  }
}

# -- Trash
plugin {
  trash = /usr/local/etc/dovecot/dovecot-trash.conf
}

# skip ... all other
Далее, запросы к записям об учётных данных пользователей

Код: Выделить всё

root@beta:/usr/local/etc/dovecot # cat dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=exim user=exim password=exim
default_pass_scheme = CRAM-MD5 
password_query 	= SELECT `username` AS `user`, `password` \
		  FROM `mailbox` WHERE `username` = LCASE('%u') \
		  AND `active` = '1'
user_query 	= SELECT CONCAT('/var/mail/',LCASE(maildir)) AS home, \
		  CONCAT('*:bytes=', domain.maxquota*1048576) AS quota_rule, \
		  CONCAT('*:bytes=', mailbox.quota) AS quota2_rule \
		  FROM mailbox, domain \
		  WHERE username = LCASE('%u') AND mailbox.active = '1' \
		  AND domain.domain = '%d' AND domain.active = '1'
Обратите внимание, что используется два набора параметров 'quota' в Dovecot - без префикса для доменов, и с префиксом 2 для пользователей.
Далее, запросы к словарям квот. Опять же, отдельно для доменов и пользователей

Код: Выделить всё

root@beta:/usr/local/etc/dovecot # cat dovecot-dict-sql-domain.conf 
connect = host=localhost dbname=exim user=exim password=exim
map {
    pattern = priv/quota/storage
    table = domain
    username_field = domain
    value_field = quota
}
map {
    pattern = priv/quota/messages
    table = quota2
    username_field = username
    value_field = messages
}

root@beta:/usr/local/etc/dovecot # cat dovecot-dict-sql-user.conf
connect = host=localhost dbname=exim user=exim password=exim
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}
Тонкий момент - размер занимаемого пользователем места и количество сообщений в ящике хранятся в таблице 'quote2', тогда как для домена там хранится только количество сообщений. Размер места, которое занимают пользователи домена хранятся в таблице 'domain'.
Далее, скрипт для отправки уведомлений о заканчивающихся квотах.

Код: Выделить всё

root@beta:/usr/local/etc/dovecot # ll quota_warning.sh 
-rwxr-xr-x  1 mailnull  mail  302  4 дек 23:16 quota_warning.sh*
root@beta:/usr/local/etc/dovecot # cat quota_warning.sh 
PERCENT=$1
USER=$2
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@yourdomain.ru
Subject: Quota warning
X-Priority: 2

Your mailbox is now $PERCENT% full.
Please remove unnecessary information to avoid new mail loss.
EOF
Обратите внимание на права и атрибуты скрипта.
И, наконец, модуль автоочистки 'trash', который я активировал на всякий случай.

Код: Выделить всё

root@beta:/usr/local/etc/dovecot # cat dovecot-trash.conf 
1 Trash
2 Junk
3 Draft
Ещё один тонкий момент, который я заметил при запуске квот - подсчёт количества сообщений и использованного места для домена на уже
работающей системе с кучей пользователей и доменов.
Для корректного подсчёта мне пришлось руками внести их правильные значения (количество сообщений в таблицу 'quota2' и занимаемого места в 'domian'). Для этого необходимо, чтобы для всех пользователей данного домена сформировались аналогичные параметры в таблице 'quote2'.
Для этого им достаточно получить по одному новому сообщению. Я для этого использовал широковещательную рассылку через интерфейс postfixadmin.
После чего:
1. Останавливаем Dovecot во избежание пересчёта в процессе корректировки.
2. Подсчитываем суммы столбцов таблицы 'quota2' для 'bytes' и 'messages'.
3. Сумму количества сообщений вставляем в соответствующий столбец для данного домена в той же таблице.
4. Сумму места, занимаемого всеми пользователями, вставляем в столбец 'quota' в таблице 'domain' в строке нужного домена.
5. Запускаем Dovecot.

Собственно, всё.
Enjoy it!
IT voodoo blog https://kostikov.co

iNeedfor
проходил мимо
Сообщения: 6
Зарегистрирован: 2013-12-04 17:38:43

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение iNeedfor » 2013-12-06 15:48:42

xM писал(а):Вчера только закончил настройку. Сейчас всё расскажу.
...
Собственно, всё.
Enjoy it!
Красота! Работает отлично, хоть и без некоторых мелких пониманий процесса (придет со временем), но причесал под себя.

Благо у меня один домен, так что квоту делал лишь на пользователей.

Спасибо за помощь, вопрос снят.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2013-12-06 18:16:27

iNeedfor писал(а):Благо у меня один домен, так что квоту делал лишь на пользователей
При наличии квоты на домен возможно для одних пользователей ставить личную квоту, а для других вообще не лимитировать дисковое пространство.
Тогда для последних будет применяться квота на домен.
Согласитесь, это более разумно и удобно. Именно из этих соображений я и сделал такое двухуровневое квотирование.
IT voodoo blog https://kostikov.co

iNeedfor
проходил мимо
Сообщения: 6
Зарегистрирован: 2013-12-04 17:38:43

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение iNeedfor » 2013-12-08 11:07:34

xM писал(а):
iNeedfor писал(а):Тогда для последних будет применяться квота на домен.
Среди последних у меня лишь админский ящик, сборщик всех писем и технические, не вижу смысла их ограничивать любым из способов.

В остальном конечно мысль верная, общий лимит через ограничение домена - хитрый и действенный выход.

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-08 19:22:32

Добрый день, всем,

подскажите, кто-то настраивал квоты Dovecot в связке c Microsoft Windows Active Directory?
Если есть какая либо инфа - прошу помощи в настройке или мануальчик.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2014-08-10 13:35:45

dommav писал(а):Добрый день, всем,
подскажите, кто-то настраивал квоты Dovecot в связке c Microsoft Windows Active Directory?
Если есть какая либо инфа - прошу помощи в настройке или мануальчик.
А в чём проблема?
Получайте квоту из LDAP и вперед.
http://wiki2.dovecot.org/Quota/Configuration#LDAP
http://wiki2.dovecot.org/AuthDatabase/LDAP
IT voodoo blog https://kostikov.co

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-11 10:08:40

Может есть какой-то примерный конфиг или описание по шагам, не могу понять что именно делать на АД и куда добавить данную строку

Код: Выделить всё

user_attrs = homeDirectory=home, quotaBytes=quota_rule=*:bytes=%$
на данный момент, вот мой Dovecot.conf

Код: Выделить всё

postmaster_address = syadmin@domain.ua
!include_try /usr/share/dovecot/protocols.d/*.protocol
#Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
# Журнал будем писать в файл /var/log/dovecot.err
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Включаем SSL
ssl = yes
ssl_cert =< /etc/dovecot/mail.domain.ua.crt
ssl_key =< /etc/dovecot/mail.domain.ua.key
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/%d/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
#auth_verbose = yes
#auth_debug = yes
#auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login # digest-md5
#Задаем параметры аутентификации
#passdb {
# driver = sql 
# args = /etc/dovecot/dovecot-sql.conf
#}
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix      
  }
}
service imap-login { 
inet_listener imap { 
port = 143
 }
inet_listener imaps { 
port = 993
ssl = yes
}
}
#=============================================================================
# Авторизация LDAP
passdb {
   args = /etc/dovecot/dovecot-ldap.conf.ext
   driver = ldap
}
userdb {
   args = /etc/dovecot/dovecot-ldap.conf.ext
   driver = ldap
}
userdb {
    driver = static
    args = uid=5000 gid=5000 home=maildir:/var/spool/mail/%d/%n
}
passdb {
    driver = static
    args = uid=5000 gid=5000 home=maildir:/var/spool/mail/%d/%n
}

#============================================================================
# Авто-создание IMAP папок в Dovecot
protocol imap {
  mail_plugins = $mail_plugins autocreate
}
#plugin {
#    autocreate = INBOX                         # Входящие
#    autocreate2 = &BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-      # Отправленные
#    autocreate3 = &BCMENAQwBDsENQQ9BD0ESwQ1-  # Удаленные
#    autocreate4 = &BCcENQRABD0EPgQyBDgEOgQ4-   # Черновики
#    autocreate5 = &BCEEPwQwBDw-                            # Спам
#    autosubscribe = INBOX
#    autosubscribe2 = &BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-
#    autosubscribe3 = &BCMENAQwBDsENQQ9BD0ESwQ1-
#    autosubscribe4 = &BCcENQRABD0EPgQyBDgEOgQ4-
#    autosubscribe5 = &BCEEPwQwBDw-
#}
plugin {
    autocreate = INBOX
    autocreate2 = Sent
    autocreate3 = Trash
    autocreate4 = Drafts
    autocreate5 = Junk
    autosubscribe = INBOX
    autosubscribe2 = Sent
    autosubscribe3 = Trash
    autosubscribe4 = Drafts
    autosubscribe5 = Junk
}
# Для кодировки русских имен формат UTF7-IMAP сайт - http://toolswebtop.com/text/process/enc … wTLEvl_vag
#=============================================================================
# Квота and Shared
# ошибка при приёме почты при превышении квоты пользователем
quota_full_tempfail = yes
rejection_subject = Rejected: %s
rejection_reason = Ваше сообщение для <%t> автоматически отклонено:%n%r.%n%nЕсли вы действительно хотите, чтобы письмо дошло, пожалуйста, свяжитесь с почтовым администратором <syadmin@domain.ua>

mail_plugins = quota acl

# включаем использование плагина protocol LDA
protocol lda {
 mail_plugins = acl quota
 log_path = /var/log/dovecot.err  #dovecot-lda.log
 info_log_path = /var/log/dovecot.err   #dovecot-lda.log
}

# включаем использование плагина в IMAP-сервере
protocol imap {
 mail_plugins = $mail_plugins autocreate acl imap_acl quota imap_quota
}

# Включаем плагин Квот и общего доступа к папкам
protocol imaps {
 mail_plugins = $mail_plugins autocreate acl imap_acl quota imap_quota
}
#автоматически создавать ящик, если таковой отсутствует
lda_mailbox_autocreate = yes
lda_mailbox_autosubscribe = yes
#подключаем плагин квот
plugin {
 quota_exceeded_message = Quota exceeded (mailbox is full)
#квота применяется к ящику каждого пользователя
 quota = maildir:User quota
#на все папки даётся лимит 2G
 quota_rule = *:storage=2G
#на корзину даётся дополнительно +500M от общего лимита
 quota_rule2 = Trash:storage=+500M
#на папку "Спам" даётся дополнительно 20% от общего лимита
 quota_rule3 = Spam:storage=+20%%
#}
#выдавать предупреждения при превышении лимита
#plugin {
  quota_warning5 = -storage=100%% quota-warning below %u
  quota_warning4 = storage=100%% quota-exceeded 100 %u
  quota_warning3 = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=90%% quota-warning 90 %u
  quota_warning = storage=85%% quota-warning 85 %u
}
#скрипт, выдающий предупреждения
service quota-warning {
  executable = script /etc/dovecot/quota_warning.sh
  unix_listener quota-warning {
  user = virtual
  group = virtual
#    mode = 0660
  }
  user = dovecot
}

# Shared forlders
# Значение vfile предписывает создавать внутри почтового ящика файл dovecot-acl, в котором и будут
# прописываться права доступа к нему со стороны других пользователей.
# Значение acl_shared_dict указывает путь к файлу словаря, который позволит пользователям узнавать,
# к каким каталогам в чужих почтовых ящиках у них имеется доступ. В данном случае для каждого домена$
# создан отдельный файл словаря, расположенный в каталоге домена, на одном уровне с ящиками
# Прописываем настройки плагина
plugin {
#  acl = vfile
  acl = vfile:/var/spool/mail/%d/%n/dovecot-acl:cache_secs=300
  acl_shared_dict = file:/var/spool/mail/%d/dovecot-acl
#  acl_shared_dict = file:/var/spool/mail/%d/shared-mailboxes
}
namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
}
namespace {
  type = public
  separator = /
  prefix = public/
#  location = maildir:/var/spool/mail/%d/%n/:INDEX=/var/spool/mail/%d/public
  location = maildir:/var/spool/mail/%d/public:LAYOUT=fs:INDEX=/var/spool/mail/%d/%n/pub_index
  inbox = no
  hidden = no
  list = yes
  subscriptions = yes
}
namespace {
  type = shared
  separator = /
  prefix = Shared/%%u/
  location = maildir:/%%h:INDEX=%%h/shared/%n
  subscriptions = yes
  list = children
}

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-11 10:37:34

у меня 2000 пользователей, и как их забивать в конфиг файл quota_user_ldap - руками - или есть скрипт?

задача вот такая стоит
" Настройка индивидуальных квот через MS AD. смертные – 1 гигабайт, офис – 10 гигабайт, индивидуально – больше"

сейчас использую Mdaemon там все просто - но стало очень много пользователей, а денег на лицензии нет - использовать пиратский софт неактуально

авторизация

Код: Выделить всё

dovecot-ldap.conf.ext

Код: Выделить всё

hosts           = pdc.domain.ua:3268
ldap_version    = 3
auth_bind       = yes
dn              = ldapaccess@domain.ua
dnpass          = ldapaccess
base            = dc=domain,dc=ua
scope           = subtree
deref           = never
user_filter     = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl=514)))
pass_filter     = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl=514)))
pass_attrs      = userPassword=password
default_pass_scheme = CRYPT
user_attrs      = =home=/var/spool/mail/domain.ua/%n/,=mail=maildir:/var/spool/mail/domain.ua/%n/

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-11 12:05:38

взял кое что вот тут http://serverfault.com/questions/573725 ... pended-for, и вообще Imap перестал работать, уже каша просто в голове :st: :st: :st:

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-11 17:38:08

xM писал(а):
dommav писал(а):Добрый день, всем,
подскажите, кто-то настраивал квоты Dovecot в связке c Microsoft Windows Active Directory?
Если есть какая либо инфа - прошу помощи в настройке или мануальчик.
А в чём проблема?
Получайте квоту из LDAP и вперед.
http://wiki2.dovecot.org/Quota/Configuration#LDAP
http://wiki2.dovecot.org/AuthDatabase/LDAP

Был там, но так и ничего не получилось у меня :st: :st: :(
подскажите - есть у кого-то нибудь пример, как сделать квоты для каждого пользователя (и групп пользователей) свои не через SQL а именно через Microsofot AD.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2014-08-22 12:25:55

user_attrs = =home=/var/spool/mail/domain.ua/%n/,=mail=maildir:/var/spool/mail/domain.ua/%n/
И где у вас тут квота задается?
Читайте внимательно. За вас никто это делать не будет.
IT voodoo blog https://kostikov.co

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-22 14:05:10

Спасибо
Последний раз редактировалось dommav 2014-08-22 14:07:05, всего редактировалось 1 раз.

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-22 14:06:30

xM писал(а):
user_attrs = =home=/var/spool/mail/domain.ua/%n/,=mail=maildir:/var/spool/mail/domain.ua/%n/
И где у вас тут квота задается?
Читайте внимательно. За вас никто это делать не будет.
Спасибо, я, уже все решил - там была квота, но не получалось никак взять значение поля с MS AD, глобальный каталог и правка схемы - делают многие вещи :Yahoo!:
за это время я перешел на Ubuntu 14.04 и Dovecot 2.2.9

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2014-08-22 17:33:35

dommav писал(а):
xM писал(а):
user_attrs = =home=/var/spool/mail/domain.ua/%n/,=mail=maildir:/var/spool/mail/domain.ua/%n/
И где у вас тут квота задается?
Читайте внимательно. За вас никто это делать не будет.
Спасибо, я, уже все решил - там была квота, но не получалось никак взять значение поля с MS AD
Так опубликуйте конфиги с комментариями. Наверняка кому-то пригодится.
IT voodoo blog https://kostikov.co

dommav
проходил мимо
Сообщения: 8
Зарегистрирован: 2014-07-29 1:01:52

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение dommav » 2014-08-22 17:46:44

xM писал(а):
dommav писал(а):
xM писал(а):
user_attrs = =home=/var/spool/mail/domain.ua/%n/,=mail=maildir:/var/spool/mail/domain.ua/%n/
И где у вас тут квота задается?
Читайте внимательно. За вас никто это делать не будет.
Спасибо, я, уже все решил - там была квота, но не получалось никак взять значение поля с MS AD
Так опубликуйте конфиги с комментариями. Наверняка кому-то пригодится.
С радостью, но сейчас занимаюсь фильтрами (Sieve) - настройкой и шлифовкой + публичные и шаровые папки + шаровые группы рассылки. Не хотелось бы дать просто конфиг или мануал, что бы после писали и матерились (кто выложил - ничего не работает). в скором времени обязательно выложу и напишу.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2014-08-22 21:35:03

dommav писал(а):в скором времени обязательно выложу и напишу.
Ждем-с.
IT voodoo blog https://kostikov.co

Monstr
проходил мимо
Сообщения: 6
Зарегистрирован: 2015-04-06 8:54:48

Dovecot Quota - для каждого своя

Непрочитанное сообщение Monstr » 2015-04-08 14:49:37

Сегодня опробовал подключение Довекот квот из АД. Работает нормально. Пишу большую памятку сейчас на будущее.

А если коротко, то необходимо файл подключения к АД /etc/dovecot/dovecot-ldap.conf привести к виду:

Код: Выделить всё

hosts           = 192.168.111.2:389
ldap_version    = 3
auth_bind       = yes
dn              = user@developer.com
dnpass          = 123qwe
base            = ou=Структура,dc=developer,dc=com
scope           = subtree
deref           = searching
user_filter     = (&(mail=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_filter     = (&(mail=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_attrs      = userPassword=password
default_pass_scheme = CRYPT
user_attrs      = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/,=quota_rule=*:bytes=%{ldap:st}
debug_level = 0
Важное для нас это строка с параметрами user_attrs, и в ней это =quota_rule=*:bytes=%{ldap:st}, в этой строке самый важный параметр это st. Так вот, st, это есть, не что иное как поле в свойства юзера находящегося в АД.

Почему именно поле st?

Да просто мне так удобно.

Поле st принадлежит свойствам юзера живущего в АД, это поле "Область, край" в закладке "Адрес". Так вот, сюда в это поле забиваем нужный размер ящика в числовом виде, размерность байты. Т.е. если необходимо пользователю сделать объем ящика 10мб, то вбиваем 10000000.

Поле для использования в качестве квоты каждый выбирает сам.

Теперь в конфиге /etc/dovecot/dovecot.conf

В секции plugin, приводим параметр quota к виду:

Код: Выделить всё

plugin {
  quota = maildir:User quota
}
Вложения
Image 2.jpg
Image 1.jpg

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2015-10-03 0:16:50

Важное замечание к моему развёрнутому посту про конфигурирование квот.
Ввиду недопонимания назначения полей в базе данных Postfixadmin были допущены ошибки (несмертельные, но всё же) в конфигах. :pardon:
Так, выяснилось, что нет возможности (штатно) задать размер квот для того или иного домена. В этой связи оставлены квоты только для
юзеров.
Итак, правильный вариант.
1. dovecot.conf (фрагмент связанный с квотами)

Код: Выделить всё

...
# -- Quota
plugin {
  quota = dict:user_quota::proxy::sqluserquota
  quota_rule2 = Trash:storage=+10%%
  quota_rule3 = Junk:storage=+10%%
  quota_grace = 10%%
  quota_warning = storage=100%% quota-exceeded 100 %u
  quota_warning2 = storage=95%% quota-warning 95 %u
  quota_warning3 = storage=90%% quota-warning 90 %u
  quota_warning4 = storage=75%% quota-warning 75 %u
}
dict {
  sqluserquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql-user.conf
}
service dict {
  unix_listener dict {
  user = mailnull
  mode = 0660
  }
}
service quota-warning {
  executable = script /usr/local/etc/dovecot/quota_warning.sh
  unix_listener quota-warning {
  user = mailnull
  mode = 0660
  }
}
...
2. Доступ к хранимым данным о текущем размере ящиков
root@beta:/var/mail # cat /usr/local/etc/dovecot/dovecot-dict-sql-user.conf
connect = host=localhost dbname=exim user=exim password=exim
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
3. Скрипт доступ к базе данных о ящиках
root@beta:/var/mail # cat /usr/local/etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=exim user=exim password=exim
default_pass_scheme = CRAM-MD5
password_query = SELECT username AS user, password \
FROM mailbox WHERE username = LCASE('%u') \
AND active = '1'
user_query = SELECT CONCAT('/var/mail/',LCASE(maildir)) AS home, \
CONCAT('*:bytes=', mailbox.quota) AS quota_rule \
FROM mailbox, domain \
WHERE username = LCASE('%u') AND mailbox.active = '1' \
AND domain.domain = '%d' AND domain.active = '1'
4. Ну и скрипт письма об приближении квоты к концу
root@beta:/var/mail # cat /usr/local/etc/dovecot/quota_warning.sh
#!/bin/sh

PERCENT=$1
USER=$2

SUBJ="Место для почты близко к исчерпанию / Mailbox space is near limit"
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@your.domain
Subject: ${SUBJ}
Content-Type: text/plain; charset=utf-8
X-Priority: 2

Ваш почтовый ящик заполнен на $PERCENT%.
Пожалуйста, удалите ненужную почту для предотвращения потери новых сообщений!

Your mailbox is now $PERCENT% full.
Please remove unnecessary messages to avoid new mail loss!
EOF
Впрочем, сама идея двухуровневого квотирования пользователь - домена здрава и имеет место на жизнь. Однако, её реализация требует модификации структуры базы данных (элементарной) и средств её администрирования.
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2015-10-06 23:01:54

Приветствую.

Вот собственно выдержки из кода

Dovecot 2.2.13

Код: Выделить всё

# cat dovecot-2.2.13/src/lib-dict/dict-sql.c

Код: Выделить всё

static const char *
sql_dict_update_query(const struct dict_sql_build_query *build)
{
        struct sql_dict *dict = build->dict;
        const struct dict_sql_build_query_field *fields;
        unsigned int i, field_count;
        string_t *query;

        i_assert(build->inc);

        fields = array_get(&build->fields, &field_count);
        i_assert(field_count > 0);

        query = t_str_new(64);
        str_printfa(query, "UPDATE %s SET ", fields[0].map->table); #### вот здесь всё отрабатывает отлично
        for (i = 0; i < field_count; i++) {
                if (i > 0)
                        str_append_c(query, ',');
                str_printfa(query, "%s=%s", fields[i].map->value_field,
                            fields[i].map->value_field);
                if (fields[i].value[0] != '-')
                        str_append_c(query, '+');
                str_append(query, fields[i].value);
        }

        sql_dict_where_build(dict, fields[0].map, build->extra_values,
                             build->key1, SQL_DICT_RECURSE_NONE, query);
        return str_c(query);
} 
Как всё было и работало.

Код: Выделить всё

Connect   postfix@localhost on postfix
Query     BEGIN
Query     UPDATE domain SET quota=quota+2570 WHERE domain = 'domain.lan'
Query     BEGIN
Query     UPDATE quota2 SET bytes=bytes+1723,messages=messages+1 WHERE username = 'user@domain.lan'
Connect   postfix@localhost on postfix
Query     BEGIN
Query     UPDATE domain SET quota=quota+1723 WHERE domain = 'domain.lan'
Query     UPDATE quota2 SET messages=messages+1 WHERE username = 'domain.lan'
Quit

Dovecot 2.2.19

Код: Выделить всё

# cat dovecot-2.2.19/src/lib-dict/dict-sql.c

Код: Выделить всё

static void sql_dict_unset(struct dict_transaction_context *_ctx,
                           const char *key)
{
        struct sql_dict_transaction_context *ctx =
                (struct sql_dict_transaction_context *)_ctx;
        struct sql_dict *dict = (struct sql_dict *)_ctx->dict;
        const struct dict_sql_map *map;
        ARRAY_TYPE(const_string) values;

        if (ctx->prev_inc_map != NULL)
                sql_dict_prev_inc_flush(ctx);

        map = sql_dict_find_map(dict, key, &values);
        if (map == NULL) {
                i_error("sql dict unset: Invalid/unmapped key: %s", key);
                ctx->failed = TRUE;
                return;
        }

        T_BEGIN {
                string_t *query = t_str_new(256);
                const char *error;

                str_printfa(query, "DELETE FROM %s", map->table);
                if (sql_dict_where_build(dict, map, &values, key[0],
                                         SQL_DICT_RECURSE_NONE, query, &error) < 0) {
                        i_error("dict-sql: Failed to delete %s: %s", key, error);
                        ctx->failed = TRUE;
                } else {
                        sql_update(ctx->sql_ctx, str_c(query));
                }
        } T_END;
}
Результат работы DELETE/INSERT

Код: Выделить всё

Connect   postfix@localhost on postfix
Query     SELECT quota FROM domain WHERE domain = 'domain.lan'
Query     SELECT quota FROM domain WHERE domain = 'domain.lan'
Query     SELECT messages FROM quota2 WHERE username = 'domain.lan'
Query     BEGIN
Query     DELETE FROM domain WHERE domain = 'domain.lan' ############ вот тут вся информация о домене исчезает из базы...
Query     DELETE FROM quota2 WHERE username = 'domain.lan'
Query     INSERT INTO domain (quota,domain) VALUES ('8581','domain.lan') ON DUPLICATE KEY UPDATE quota='8581'
Quit 
Смысл замены принципа обновления базы честно говоря неочень понятен, возможно не понимаю, буду рад, если объясните.
Рассылка Dovecot'а молчит что-то, нового ничего не нашел, все статьи практически одинаковы.
Автор Dovecot'а хоть и пишет в документации, что ему нет смысла отправлять email, но рискнул, тоже молчит к сожалению.

Интересно всё-таки узнать, с чем связана замена подхода к обновлению состояния квот.
Может кто-то решил проблему квоты для домена, если да, поделитесь опытом пожалуйста ?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2015-10-07 0:19:43

Visionman писал(а): Может кто-то решил проблему квоты для домена, если да, поделитесь опытом пожалуйста ?
А в чём проблема у вас?
Можете воспользоваться вот этой двухуровневой схемой, которую я публиковал ранее.
Подправьте там только SQL запросы к словарю с учётом используемой вами структуры баз данных.
Или именно она теперь не работает?
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2015-10-07 0:46:11

Ваша схема отлично работает у меня на старом сервере, где Dovecot 2.2.13, а вот в новом версии 2.2.19 удаляется информация о домене.

База стандартно созданная Postfixadmin.
Да, именно она и не работает.
При первом же обращении Dovecot к базе, информация о домене удаляется