Встановлення та налаштування поштового сервісу на базі exim+dovecot+ClamAV+postfixadmin+roundcube+quota на прикладі CentOS 5

19 Січня, 2011 | Теґи: , , , , , , , , , ,

Якщо у Вас є панель керування сервісами на сервері (cPanel/ISPManager/VHCS/Webmin/Plesk/DirectAdmin і т. д.), то особливої потреби в цій статті немає: там така ,або ж подібна, зв’язка вже передбачена.
Проте якщо панельки немає(як у мене), то постало питання: як же це все налаштувати, щоб було добре? 🙂
Тоді в мене й виникла ідея про ручний збір всіх конфігів, оскільки дефолтні зовсім не сподобалися.
Далі я розповім, що ж з цього вийшло.

За допомогою системи, наведеної тут, можна:
— створювати, змінювати, видаляти поштові домени та поштові скриньки;
— налаштовувати поштові редиректи;
— задавати/змінювати паролі на поштові скриньки;
— задавати/міняти квоти на поштові скриньки/домени;
— задавати/змінювати кількість редиректів, поштових скриньок і т. д.;
— мати доступ до пошти по веб-інтерфейсу (Roundcube), чи з поштового клієнта (навіть у провайдерів, які закрити 25 порт на вихід);
— користуватися шифрованим TLS/SSL з’днанням;
— перевіряти кореспонденцію на віруси;
— мати захист від більшості спаму (своєрідний грейлістинг).

Конфігурилося на такому ПЗ:
— exim-4.72;
— dovecot-1.2.16;
— clamav-0.96.5;
— roundcubemail-0.1.1;
— Postfix Admin 2.3.2.

Отже, розпочнемо. Сподіваюся, LAMP у Вас уже налаштовано.

Інсталимо exim+dovecot+ClamAV:

yum install -y exim exim-mysql dovecot-1.2 clamav

Ставлю версію 1.2, тому бо конфіг підіганяв під неї. Друга версія сильно перероблена, і в плані конфігурації.

Генеруємо самопідписні SSL-сертифікати для з’єднань з допомогою TLS/SSL:

mkdir -p /etc/ssl/
cd /etc/ssl/
cat >> gencert.sh < EOF
#!/bin/sh

# Перегляд вмісту сертифікату
# openssl x509 -noout -text -in <файл сертифікату>

# Генерація сертифікату для Exim’а
openssl req -new -x509 -days 1825 -sha1 -newkey rsa:1028 -nodes -keyout exim.key -out exim.crt -subj '/CN=`hostname`'

# Генерація сертифікату для Dovecot’а
openssl req -new -x509 -days 1825 -sha1 -newkey rsa:1029 -nodes -keyout dovecot.key -out dovecot.crt -subj '/CN=`hostname`'

chown root dovecot.key

# Змінюємо власника сертифікату для Exim’а, що він міг його прочитати
chown exim exim.key

chmod 400 *.key
EOF
chmod 700 gencret.sh
./gencert.sh

Текстова версія

Створюємо БД, налаштовуємо користувача, заливаємо дамп додаткових таблиць (для грейлістингу):

~#mysql -uroot -p
mysql>create user exim@localhost identified by 'somepass';
mysql>create database exim4;
mysql>grant all privileges on exim4.* to exim4@localhost;
mysql>exit
wget https://deusblog.org.ua/files/exim4_additional_tables
~# mysql -uexim4 -p exim4 < exim4_additional_tables

Налаштовуємо конфіги:
Exim ( /etc/exim/exim.conf ):

#!/bin/sh

# exim config. 2011-01-08

# Подяки:за частинки створення конфіга
# http://www.lissyara.su - логічна розбивка, каркас вайтліста, фіча з антиспам-затримками
# http://www.exim.org - глибоке розуміння дій, виконуваних директивами
# http://centos.org.ua - локальна доставка dovecot’ом
# власному натхненню - як же без цього в нашій справі

# ім’я хоста, використоується командою EHLO. Підміняє параметри qualify_domain, qualify_recipient,
# якщо ті явно не задані. За його відстуності він встановлюється автоматично з допомогою функції uname()
primary_hostname = server.deusblog.org.ua

# перелік портів, які має слухати exim
daemon_smtp_ports = 25 : 26 : 465 : 587

# вимикаємо підтримку ipv6, якщо сервер не налаштований відповідно
disable_ipv6=true

# список шифрів, що можуть використовуватися при конекті з допомогою TLS
tls_require_ciphers = ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP

# оповіщення хостів, що підпадають під вказаний шаблон, про наявність можливості TLS підключення
tls_advertise_hosts = *

# шлях до сертифіката та ключа exim для використання при шифрованому з’єднанні
tls_certificate = /etc/ssl/exim.crt
tls_privatekey = /etc/ssl/exim.key

# увікмнення перевірки клієнтських сертифікатів при з’єднанні (як частина TLS протоколу)
tls_verify_certificates = *

# вибираєм опції для логування:
# + - пишемо в логи,
# - - не логуємо.
# +all_parents - проміжні ІР а шляху проходження пошти між адресатов та адресантом
# +connection_reject - розірвані з’єднання
# +incoming_interface - інтерфейс (реальна IP-адреса, наприклад, внутрішня у локальній мережі)
# +lost_incoming_connections - втрачені вхідні конекти
# +received_sender - відправник
# +received_recipients - отримувач
# +smtp_confirmation -  підтвердження отримання листа віддаленим сервером
# +smtp_syntax_error - помилки синтаксису SMTP
# +smtp_protocol_error - помилки протоколу SMTP
# -queue_run - робота черги (заморожені)
log_selector = \
+all_parents \
+connection_reject \
+incoming_interface \
+lost_incoming_connection \
+received_sender \
+received_recipients \
+smtp_confirmation \
+smtp_syntax_error \
+smtp_protocol_error \
-queue_run

# вмикається фільтрація на рівні сервера і задається шлях до файлу-конфігу
system_filter=/etc/exim/exim_system_filter

# параметри доступу до mysql для exim’a: сервер/база/юзер/пароль.
# hide - опція, ща запобігає виведенню цієї стрічки на консоль при тестуванні конфіга: exim -bV
hide mysql_servers = localhost/exim4/exim4/somepass

# вибираємо з бази список локальних доменів і формуємо список для exim’а
domainlist local_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE \
                                `domain`='${domain}' AND `active`='1'}}

# формуємо список доменів, які можуть використовувати цей сервер як релей (авторизований)
domainlist relay_to_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE \
                                `domain`='${domain}' AND  `active`='1'}}

# список ІР, яким дозволений неавторизований релей
hostlist   relay_from_hosts = localhost : 127.0.0.1/8 : 192.168.0.0/24

# оголошуємо  ACL-лісти для перевірки пошти
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

# додаємо антивірус для перевірки пошти. Тут вказуємо шлях до його сокета
# увага! clamav повинен бути в групі exim’а, інакше доступу до сокета не буде
av_scanner = clamd:/var/run/clamav/clamd.socket

# підставляє частину $domain для локальних відправників, якщо її не вказано
# наприклад, переформує postmaster --> postmaster@server.deusblog.org.ua
qualify_domain = server.deusblog.org.ua

# те ж саме, тільки для локальних отримувачів
qualify_recipient = server.deusblog.org.ua

# чи приймати пошту від домену, що позначено IP-адресою
# наприклад, від admin@8.8.8.8
allow_domain_literals = false

# в цілях безпеки вимикаємо можливість роботи доставщика пошти під юзером root
never_users = root

# дозволити відсилку пошти для мил, що складаються лише
# з локальної частини (для цього списку доменів)
sender_unqualified_hosts = +relay_from_hosts

# те ж саме, але для списку отримувачів
recipient_unqualified_hosts = +relay_from_hosts

# список ІР/мереж, від яких пошта приймається навіть при помилках в протоколі
helo_accept_junk_hosts = 192.168.0.0/16

# період повтору доставки заморожених листів
auto_thaw = 1h

# проміжок часу, який заморожене повідомлення ще буде намагатися доставлятися.
# Після цього генерується повідомлення з помилкою.
timeout_frozen_after = 7d

# час, на який заморожується лист-відбійник після невдалої доставки відправнику.
# Після вказаного періоду відправка відбувається ще раз, а при невдачі - лист видаляється
ignore_bounce_errors_after = 30m

# формує запрошення exim
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

# обмеження на розмір листа
message_size_limit = 16M

# максимальне число одночасних підключень по SMTP-протоколу
smtp_accept_max = 50

# максимальне число листів, що приймається від хоста за одне підключення
smtp_accept_max_per_connection = 25

# таймаут на з’єднання за rfc1413. При "0" ці запити вимикаються
# практично на всіх серверах таке уже закрито, тому що це потенційна дирка в безпеці:
# можна отримати uid, GID, тип ОС і т. д. ТОму сміливо відключаємо
rfc1413_query_timeout = 0

# максимальна кількість з’єднань в режимі очікування.
# exim передає цю опцію мережевій системі TCP/IP при старті
smtp_connect_backlog = 30

# обмеження на кількість конектів для одного хоста
smtp_accept_max_per_host = 20

# розбиваємо директорію spool на піддиректорії, для підвищення швикодії
split_spool_directory = true

# максимальна кількість процесів доставки для повідомлення, яке має багато адресатів
remote_max_parallel = 15

# якщо формується відбійник, то в нього включається чатсина
# оригінального листа розміром, що вказаний тут
return_size_limit = 8k

# ліміт навантаження на сервері, за якого вже не відправляється
# тобто, при 4.99 вона ща піде, а при 5.00 пеезапуску черги вже не буде
deliver_queue_load_max = 5

# дозовляємо символи, які по дефолту використовувати при командах HELO/EHLO заборонено
helo_allow_chars = _

# клієнт повинен очікувати запрошення сервера(дотримуватися протоколу).
# Якщо він пробує передавати дані без цього, з’єднання розривається.
smtp_enforce_sync = true

# ACL для вхідної пошти
begin acl

# правила для всіх отримувачів
acl_check_rcpt:

# приймати повідомлення не по протолколу TCP/IP (з localhost)
accept hosts = :

# приймати повідомлення від усіх, хто авторизувався.
# Це правило зверху, тому що деякі хости ріжуться на подальших
accept  authenticated = *

# перевіряємо навність недопустимих символів в адресах для локальних отримувачів
deny message = "Restricted characters in address"
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]

# те ж, але для віддалених отримувачів
deny message = "Restricted characters in address"
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

# перевіряємо відправника, який встановлено для листа. При неможливості перевірки лист відкидається
require verify        = sender

# відкидаємо ті хости, які не обмінюються привітаннями (HELO/EHLO)
deny message = "HELO/EHLO require by SMTP RFC"
!senders = :
condition = ${if eq{$sender_helo_name}{}{yes}{no}}

# відкридаємо тих, в кого в HELO підставлена своя ІР-адреса
deny message = "Your IP in HELO - access denied!"
hosts = * : !+relay_from_hosts
!senders = :
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}

# відкридаємо тих, хто а HELO пхає локальні домени або хостнейм сервера
deny    condition       = ${if match_domain{$sender_helo_name} \
                        {$primary_hostname:+local_domains:+relay_to_domains} \
                        {yes}{no}}
        !senders = :
        message         = Message was delivered by ratware - own
        log_message   = remote host used our name in HELO/EHLO greeting - spam_host


# відкидаємо тих, в кого HELO має ІР цього сервера
deny condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
!senders = :
message = "main IP in your HELO! Access denied!"

# відкидаємо тих, в кого в HELO лише цифри
deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "Can not be only number in HELO!"

# відкидаємо тих, хто в HELO підставляє localhost
deny    condition       = ${if match{$sender_helo_name}{localhost}{yes}{no}}
        !hosts          = 127.0.0.1 : localhost : *
        !senders = :
        message         = Your host is not localhost!

# встановлюємо затримку в 20 секунд для всіх хостів (своєрідний грейлістинг, відбиває 99%+ спаму)
# Проте мінус цього методу в тому, що поштовий сервер може тримати багато конектів
warn    set acl_m2      = 0

# перевіряємо ,чи віддалений хост уже в таблиці з вайтліст доменами
# і чи не закінчився його час рестрації там (30 днів з часу останнього листа туди)
# Якщо так,то обновляємо лічильники та дату у вайтлісті (або додаємо його у вайдліст для поточного домену)
warn    condition       = ${if eq{${lookup mysql{SELECT 1 FROM `sended_list` \
                        WHERE `user_to` = \
                        LCASE('${quote_mysql:$sender_address_domain}') AND `user_from` \
                        = LCASE('${quote_mysql:$domain}') AND \
                        `last_mail_unix_timestamp` < `last_mail_unix_timestamp` \
                        + (30*86400) LIMIT 1}}}{1}{yes}{no}}

        condition       = ${lookup mysql{INSERT IGNORE INTO `domain_whitelist` \
                        (`domainname`, `domain_ip`, `added_timestamp`, \
                        `last_mail_timestamp`, `last_mail_unix_timestamp`, \
                         `mail_count`) \
                                VALUES (LCASE('${quote_mysql:$sender_address_domain}'), \
                                '${quote_mysql:$sender_host_address}', \
                                NOW(), NOW(), UNIX_TIMESTAMP(), '1') ON \
                                DUPLICATE KEY UPDATE \
                                `last_mail_timestamp` = NOW(), \
                                `last_mail_unix_timestamp` = UNIX_TIMESTAMP(), \
                                `mail_count` = `mail_count` + 1}}
        hosts      = !+relay_from_hosts : *
        set acl_m2   = 1

# перевіряємо вайтліст
warn    condition       = ${if eq{${lookup mysql{SELECT 1 FROM `domain_whitelist` \
                            WHERE `domain_ip` = \
                            '${quote_mysql:$sender_host_address}' \
                        LIMIT 1}}}{1}{yes}{no}}
        hosts      = !+relay_from_hosts : *
        set acl_m2   = 1

# змінна для визначення наявності домену у вайтлісті
warn    condition       = ${if eq{$acl_m2}{1}{yes}{no}}
        set acl_m0   = 0

# пишемо логи (в основному використовую для відлагодження)
#warn   logwrite = Variables: \
#               sender_address = $sender_address; message_exim_id = $message_exim_id; \
#               sender_address_domain = $sender_address_domain; sender_host_name = $sender_host_name; \
#               sender_helo_name = $sender_helo_name; sender_host_address =$sender_host_address; \
#               host_lookup_failed = $host_lookup_failed; \
#               return_path = $return_path; recipients_count = $recipients_count; rcpt_count = \
#               $rcpt_count; rcpt_defer_count = $rcpt_defer_count; rcpt_fail_count = \
#               $rcpt_fail_count; received_count = $received_count; received_for = \
#               $received_for



# встановлюємо затримку в 10 секунд для всіх хостів (своєрідний грейлістинг, відбиває 95%+ спаму)
# Проте мінус цього методу в тому, що поштовий сервер може тримати багато конектів
       warn
        set acl_c0 = 10s

# для невідомих доменів ставимо затримку в 15 сек
       warn
        condition   = ${if !eq{$acl_m0}{0}{yes}{no}}
        set acl_c0   = 15s

# для локальних та з вайтліста обнуляємо затримку
       warn
         hosts = +relay_from_hosts
         set acl_c0 = 0s

        warn
         condition   = ${if eq{$acl_m2}{1}{yes}{no}}
         set acl_c0   = 0s

#        warn
#        logwrite = Delay $acl_m0 for $sender_host_name \
#        [$sender_host_address] with HELO=$sender_helo_name. \
#        Mail from $sender_address to $local_part@$domain.

# вмикаємо саму затримку
delay = $acl_c0

# дозволяємо пошту з доменів зі списуку relay_from_hosts
accept  hosts = +relay_from_hosts

# перевіряємо отримувача в локальних доменах
accept  domains = +local_domains
        endpass
        verify = recipient

# перевіряємо отримувача в релейних доменах
accept  domains = +relay_to_domains
        endpass
        verify = recipient

# відкидаємо тих, хто в беклістах
deny    message      = host is listed in $dnslist_domain
        dnslists      =   zen.spamhaus.org : \
                          bl.spamcop.net

# всіх інших відкидаємо
deny    !senders = :
        message = "$sender_fullhost is currently not permitted to \
                        relay through this server. Perhaps you \
                        have not logged into the pop/imap server in the \
                        last 30 minutes or do not have SMTP Authentication turned on in your email client."




# ACL для перевірки тіла листа
acl_check_data:

# відкидаємо листи з китайськими ієрогліфами (навряд Ви вмієте їх читати :) )
deny    message         = This is spam - denied
        condition   = ${if match{$message_body} \
                        {105[-_]*51[-_]*86|778[-_]*98[-_]*94}\
                        {yes}{no}}

# перевікра листів на віруси
warn malware = *
        logwrite = VIRUS from host $sender_host_name [$sender_host_address]. \
                        Mail from $sender_address to $local_part@$domain.
        set acl_m1 = 1
        logwrite = "In e-mail found VIRUS - $malware_name"

# перевіряємо наявність NUL-символів
deny    message         = This message contains NUL characters
        log_message     = NUL characters!
        condition   = ${if >{$body_zerocount}{0}{1}{0}}

# перевіряємо синтаксис заголовків
deny    message         = Incorrect headers syntax
        hosts           = !+relay_from_hosts:*
        !verify         = header_syntax

# всі інші пропускаємо
accept



# Тут описуємо, що робити з поштою
begin routers

# пошук маршруту до хостаю Якщо не знайдемо, генерується відбійник з помівомленням про Unroutable address
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more

# перевіряємо аліаси
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' OR \
`address`='${quote_mysql:@$domain}'}}

# Все інше - локальні адреси, тому
# передаємо пошту dovecot’у
dovecot_user:
driver = accept
condition = ${lookup mysql{SELECT `goto` FROM \
`alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' OR \
`address`='${quote_mysql:@$domain}'}{yes}{no}}
transport = dovecot_delivery



# транстпорти - як саме доставляти пошту
begin transports


# доставка на віддалені сервери по SMTP протоколу
remote_smtp:
driver = smtp
hosts_avoid_esmtp = ${lookup mysql{INSERT IGNORE INTO `sended_list` \
(`user_from`, `user_to`, `added_timestamp`, \
`last_mail_timestamp`, `last_mail_unix_timestamp`, `mail_count`) VALUES \
(LCASE('${quote_mysql:$sender_address_domain}'), \
LCASE('${quote_mysql:$domain}'), \
NOW(), NOW(), UNIX_TIMESTAMP(), '1') ON DUPLICATE \
KEY UPDATE `last_mail_timestamp` = NOW(), \
`last_mail_unix_timestamp` = UNIX_TIMESTAMP(), \
`mail_count` = `mail_count` + 1}}


# для докальниих користувачів листи передаємо довекоту
dovecot_delivery:
driver = pipe
command = /usr/libexec/dovecot/deliver -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
log_output
user = exim



# Налаштування повторів відправки недоставленої пошти
begin retry



* * F,2h,15m; G,16h,1h,1.5; F,4d,6h



# налаштування підміни адрес
begin rewrite



# налаштування авторизації для відправки листів.
begin authenticators



auth_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT `username` FROM \
`mailbox` WHERE `username` = \
'${quote_mysql:$auth2}' AND `password` = \
'${quote_mysql:$auth3}'}{yes}{no}}
server_prompts = :
server_set_id = $auth2

auth_login:
driver = plaintext
public_name = LOGIN
server_condition = ${lookup mysql{SELECT `username` FROM \
`mailbox` WHERE `username` = \
'${quote_mysql:$auth1}' AND `password` = \
'${quote_mysql:$auth2}'}{yes}{no}}
server_prompts = Username:: : Password::
server_set_id = $auth1

auth_cram_md5:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup mysql{SELECT `password` FROM \
`mailbox` WHERE `username` \
= '${quote_mysql:$auth1}'}{$value}fail}
server_set_id = $auth2

Текстова версія
Вона ж без коментів

exim_system_filter ( /etc/exim/exim_system_filter )

# Exim filter

# задаємо лог-файл, в який писати фільтрацію
logfile /var/log/exim/reject.log

# якщо лист не відправився, але в черзі, то повторно його перевіряти немає сенсу
if not first_delivery
then
  finish
endif

# листи з вірусами перенаправляємо на окрему поштову скриньку
if $acl_m1 contains "1"
then
    deliver virus@server.deusblog.org.ua
endif

Текстова версія

Dovecot ( /etc/dovecot.conf )

#!/bin/sh

# dovecot config. 2011-01-08

#Подяки
#http://wiki.dovecot.org/ за докладну документацію
#http://centos.org.ua/ за квоти

# тимчасова директорія для даних dovecot’а
base_dir = /var/run/dovecot/

# Протоколи для обслуговування клієнтів
protocols = imap imaps pop3 pop3s

# слухати всі IP-адреси
listen = *

# використовувати SSL?
ssl = yes

# шлях до файла та ключа
ssl_cert_file = /etc/ssl/dovecot.crt
ssl_key_file = /etc/ssl/dovecot.key

# як часто регенерувати параметри SSL (в годинах)
ssl_parameters_regenerate = 168

# докладний лог SSL-конекта?
verbose_ssl = no

# вимкнути не SSL автентифікацію?
disable_plaintext_auth = no

# примусово завершувати всі активні конекти (дочірні процеси) при зупинці батьківського?
shutdown_clients = yes

# шлях до логу та формат дати/часу в ньому
log_path = /var/log/dovecot.log
log_timestamp = "%b %d %H:%M:%S "

## Блок налаштування логінів
# Директорія для сокетів активних логінів користувачів
login_dir = /var/run/dovecot/login

# chrootити користувача в login_dir?
login_chroot = yes

# максимальний розмір (у МБ) для логін-процесу
login_process_size = 64

# Чи кожен логін повинен оброблятися власним процесом?
login_process_per_connection = yes

# число процесів логіну, що очікують на з’єднання
login_processes_count = 3

# обмеження кількості процесів авторизації
login_max_processes_count = 64

# обмеження кліькості з’єднань в стані логіна
login_max_connections = 128

# привітання для клієнтів
login_greeting = dovecot ready!

# налаштування логів довекоту
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %
login_log_format = %$: %s

## Блок обробки пошти
# активізація режиму відлагодження
verbose_proctitle = yes

# В мене всі користувачі працюють від юзера exim, тому тут його UID’и та GID’и
first_valid_uid = 93
last_valid_uid = 93
first_valid_gid = 93
last_valid_gid = 93

#mail_debug = yes

# тип та вигляд директорії пошти (має збігатися з тим, що й в базі exim4)
mail_location = maildir:/var/mail/exim/%d/%n

## налаштування IMAP протоколу
protocol imap {

# увімкнення квоти для IMAP
mail_plugins = quota imap_quota

# шлях до каталогу з IMAP плагінами довекота
mail_plugin_dir = /usr/lib/dovecot/imap

# зашиті в довекот методи обробки деяких клієнтських помилок
imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
}

## налаштування POP3 протоколу
protocol pop3 {

# формат POP3 UIDL (обмін ідентифікаторами прочитаної/нової пошти при залишенні її на сервері)
pop3_uidl_format = %08Xu%08Xv

# увімкнення квоти для POP3
mail_plugins = quota

# шлях до каталогу з POP3 плагінами довекота
mail_plugin_dir = /usr/lib/dovecot/pop3

# фомат логів POP3
pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s

# зашиті в довекот методи обробки деяких клієнтських помилок
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}

## налаштування LDA протоколу, внутрішня доставка довекота
protocol lda {

# мило для листів про перевищення квоти
postmaster_address = postmaster@domain.name

# увімкнення квоти
mail_plugins = quota

# шлях до каталогу з LDA плагінами довекота
mail_plugin_dir = /usr/lib/dovecot/lda

# шлях до сокета
auth_socket_path = /var/run/dovecot/auth-master
}


## Налаштування автентифікації

# розширені логи для відлагодження
# auth_verbose = yes
# auth_debug = yes


auth default {

# підтримувані механізми автентифікації
mechanisms = plain login digest-md5 cram-md5

# налаштування сокету для роботи dovecot-deliver
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0777
user = exim
group = exim
}
}

# база користувачів (SQL)
passdb sql {
args = /etc/dovecot_mysql.conf
}

# база паролів (SQL)
userdb sql {
args = /etc/dovecot_mysql.conf
}

# користувач, від якого працює dovecot.
user = exim

}

## Налаштування плагінів
# Плагін квоти
dict {
quota = mysql:/etc/dovecot-dict-quota.conf
}

# оголошення плагінів та режимів їх роботи
plugin {
quota = dict:user::proxy::quota
}

Текстова версія
Вона ж без коментарів

dovecot_mysql ( /etc/dovecot_mysql.conf )

# Цей файл відкривається від рута, тому права повинні бути 0400 (для секюрності).

# який драйвер використовуємо
driver = mysql

# параметри доступу до бази даних
connect = host=127.0.0.1 dbname=exim4 user=exim4 password=somepass

# спосіб кодування паролів у базі
default_pass_scheme = PLAIN

# яким чином тягнеться користувач
user_query = SELECT CONCAT('/var/mail/exim/',LCASE(`maildir`)) AS `home`, 93 AS `uid`, 93 AS `gid`, \
CONCAT('*:storage=', `quota`, 'B') AS `quota_rule` FROM `mailbox` WHERE \
`username` = LCASE('%n@%d') AND `active`='1'

# яким чином тягнеться пароль
password_query = SELECT `username` as `user`, `password` FROM  \
`mailbox` WHERE `username` = '%n@%d' AND `active`='1'

Текстова версія

dovecot_quota ( /etc/dovecot-dict-quota.conf )

# Цей файл відкривається від рута, тому права повинні бути 0400 (для секюрності).

# дані доступу до бази
connect = host=localhost dbname=exim4 user=exim4 password=somepass

# квота по диску
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
}

Текстова версія

Додам лише одне: exim використовує для розкладання пошти dovecot, тому й квоти рахуються виключно dovecot’ом.

=====================

Переходимо до налаштування інтерфейсу управління (postfixAdmin):
качаємо та інсталимо:

mkdir -p /usr/share/postfixAdmin/
cd /usr/share/postfixAdmin/
wget http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3.2/postfixadmin-2.3.2.tar.gz/download
tar xzf postfixadmin-2.3.2.tar.gz
rm -f postfixadmin-2.3.2.tar.gz
cat > /etc/httpd/conf.d/postfixAdmin.conf << EOF
Alias /mailadm /usr/share/postfixAdmin
Alias /postfixAdmin /usr/share/postfixAdmin


        Order Deny,Allow
        Deny from all
        Allow from all

EOF
/etc/init.d/httpd graceful

Налаштовуємо:

vim /usr/share/postfixAdmin/config.inc.php
# Даємо знати програмі, що конфіг її налаштовано
$CONF['configured'] = true;

# Налаштовуємо доступ до БД
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'exim4';
$CONF['database_password'] = 'somepass';
$CONF['database_name'] = 'exim4';

# Налаштовуємо адміністративну пошту, щоб знати, що робиться в програмі
$CONF['admin_email'] = 'some@e-mail.ua'

# Яким чином зберігати паролі з БД і вигрібати їх звідти
$CONF['encrypt'] = 'cleartext';

# Вмикаємо можливість налаштування квоти через postfaxAdmin
$CONF['quota'] = 'YES';
# ЩОб квоту задавати в Мб
$CONF['quota_multiplier'] = '1048576';

# Всі інші на Ваш вибір

Тепер заходимо в http://IP/postfixAdmin/setup.php , проробляємо дії там (саме тут створюється структура БД, яку використовує не тільки postfaxAdmin, а й exim та divecot ), і можна створювати поштові домени та скриньки.

============

Налаштовуємо RoundCube.
Я ставив з RPM, але можна й з сирців.

yum install roundcubemail -y

Додаємо потрібні аліаси в /etc/httpd/conf.d/roundcubemail.conf і перечитуємо конфіг апача.
Налаштовуємо:
Створення БД, налаштування користувача, заливка дампу:

~#mysql -uroot -p
mysql>create user roundcube@localhost identified by 'somepass';
mysql>create database roundcube;
mysql>grant all privileges on roundcube.* to roundcube@localhost;
mysql>exit

Створюємо структуру бази:

~# mysql -uroot -p roundcube < /usr/share/roundcubemail/SQL/mysql.initial.sql

Конфіг веб-інтерфейсу:

vim /usr/share/roundcubemail/config/db.inc.php
# Доступ до БД
$rcmail_config['db_dsnw'] = 'mysql://USER:PASS@HOST/DB';

Все, що у /usr/share/roundcubemail/config//main.inc.php -- на Ваш  розсуд.

Стартуємо exim та dovecot, clamd:

/etc/init.d/exim start
/etc/init.d/dovecot start
/etc/init.d/clamav start

Заходимо на http://IP/webmail і можна користуватися поштою.

===================

Основа готова.
PS. Тут не все мені подобається, тому з часом буду правити, додавати нові фічі... щойно знаду час та натхнення.

Ще немає коментарів.