Translate

пʼятниця, 28 березня 2014 р.

Mailserver with Postfix and Dovecot on Debian 7

Мабуть у вас колись виникало бажання створити свій власний мейл-сервер із купую можливостей та гарним доменним іменем. Тому, можливо, ця стаття - для вас.
Буде встановлено та налаштовано:

Postfix - агент передачі пошти (MTA - mail transfer agent), відправляє та доставляє електронні листи. SMTP-сервер.

Dovecot - агент доставки пошти (MDA - mail delivery agent),  реалізує доступ до пошти. IMAP і POP3-сервер.

SpamAssassin - спам-фільтр, написаний на Perl. Працює із Postfix за допомогою демону spamass-milter.

ClamAV - антивірус. Підключається до SMTP-сервера через clamav-milter. Сканер листів на віруси.

Graylist - базовий спам-фільтр. Спосіб автоматичного блокування спаму, заснований на тому, що «поведінка» програмного забезпечення, призначеного для розсилки спаму, відрізняється від поведінки звичайних серверів електронної пошти. Якщо поштовий сервер одержувача відмовляється прийняти лист і повідомляє про «тимчасової помилку», сервер відправника зобов'язаний пізніше повторити спробу. Спамерське програмне забезпечення в таких випадках, зазвичай, не намагається цього робити.

AlterMIME - невелика програма, яка використовується для зміни mime-частин поштових вкладень (може додавати описи, видаляти при певних умовах вкладення чи їх заміняти). За допомогою AlterMIME ми будемо додавати до листів автоматичний підпис.

Vacation - скрипт для управліннями попередженнями щодо відпустки/відсутності на роботі. Його робота, установка попереджень про відсутність на робочому місці чи редагування повідомлення, буде керуватись через Postfix Admin.

Sieve/ManageSieve - мова опису правил фільтрації пошти, Sieve працює на стороні сервера і розкладає пошту в залежності від логіки, що задає користувач.

Postfix Admin - веб-панель адміністрування поштових скриньок.

RoundCube + plugins - поштовий веб-клієнт зі зручним інтерфейсом та деякі плагіни для нього.

Дещо прокоментую дану прекрасну схему. Mail-клієнт задля відсилки електронного повідомлення підключається до Postfix (SMTP-сервер). Лист, що надсилає клієнт, перевіряється mail-фільтрами (milters, mail filters) на віруси (clamav-milter) та на спам (spamass-milter та milter-greylist). У разі якщо поштова скринька отримувача не знаходится на сервері - лист пересилається на інший сервер, інакше через бібліотеку SASL проходить пошук користувача в MySQL-базі і в разі його знаходження лист передається демону Dovecot, котрий вже і кладе лист на диск в необхідну директорію в указаном форматі. В свою чергу Dovecot надає доступ до збережених листів mail-клієнту по протоколах IMAP та POP3. Для аутентифікації Dovecot використовує вбудовану SASL бібліотеку і перевіряє логіни/паролі в MySQL.

Для зручності управління діючими емейл-адресами та створення нових будемо користуватись Postfix Admin. У якості веб-кліента для пошти буде установлено Roundcube. Перший та другий буде використовувати зв'яку Nginx та Php-fpm.

Переходимо до довгого та кропіткого налаштування всього вищезазначеного.


MySQL, NGINX, PHP-FPM

Спочатку встановлюємо MySQL та всі необхідні залежності:

# apt-get install mysql-server mysql-client

Додаємо репозиторій для пакетів php5-fpm:

# vim /etc/apt/sources.list...
deb http://packages.dotdeb.org wheezy-php55 all
deb-src http://packages.dotdeb.org wheezy-php55 all
...

# wget http://www.dotdeb.org/dotdeb.gpg
# sudo apt-key add dotdeb.gpg

Встановлюємо Php5-fpm, Nginx та інші необхідні пакети:

# apt-get install php5-fpm php5-imap php5-mysql php5-mcrypt php5-intl nginx openssl ssl-cert

Після установки варто пересвідчитись, що Php5-fpm, Nginx та MySQL запущені та працюють коректно.
Створюємо директорії для RoundCube та адмін-панелі Postfix:

# mkdir -p /var/www/postfix-admin/{logs,tmp}
# mkdir -p /var/www/webmail/{logs,tmp}

Сворюємо конфігураційний файл для кожного із сайтів. Для http://webmail.my.com :

# vim /etc/nginx/sites-available/webmail.my.com.conf
server {
    server_name webmail.my.com;
    root /var/www/webmail;
    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass unix:/etc/php5/fpm/socks/webmail.my.com.sock;
        include fastcgi_params;
        #fastcgi_param HTTPS on;
    }

    location ~ /\. {
        deny all;
    }

    access_log /var/www/webmail.my.com/logs/access.log;
    error_log /var/www/webmail.my.com/logs/error.log;
    error_page 404 /404.html;

}

Для http://postfix-admin.my.com :

# vim /etc/nginx/sites-available/postfix-admin.my.com.conf

server {
    server_name postfix-admin.my.com;
    root /var/www/postfix-admin;
    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass unix:/etc/php5/fpm/socks/postfix-admin.my.com.sock;
        include fastcgi_params;
        #fastcgi_param HTTPS on;
    }

    location ~ /\. {
        deny all;
    }

    access_log /var/www/postfix-admin/logs/access.log;
    error_log /var/www/postfix-admin/logs/error.log;
    error_page 404 /404.html;
}

Активуємо кожен із сайтів, перевіряємо конфіги та перезапускаємо веб-сервер:

# ln -s /etc/nginx/sites-available/webmail.my.com.conf /etc/nginx/sites-enabled/webmail.my.com.conf
# ln -s /etc/nginx/sites-available/postfix-admin.my.com.conf /etc/nginx/sites-enabled/postfix-admin.my.com.conf
# nginx -t
# service nginx restart


Непоганою ідеєю є варіант сховати це все під https. Для цього необхідно або згенерувати самопідписні сертифікати, або замовити справжні.

Створюємо конфігураційний файл для FastCGI сервера, php-fpm пула для webmail.my.com:

# vim /etc/php5/fpm/pool.d/webmail.my.com.conf

[webmail.my.com]

    listen = /etc/php5/fpm/socks/webmail.my.com.sock
    user = www-data
    group = www-data
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 1
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    pm.max_requests = 0
    php_admin_value[open_basedir]=/
    php_admin_value[session.save_path]=/var/www/webmail/tmp
    php_admin_value[upload_tmp_dir]=/var/www/webmail/tmp
    php_admin_value[disable_functions]=dl

Та для postfix-admin.my.com:

# vim /etc/php5/fpm/pool.d/postfix-admin.my.com.conf

[postfix-admin.my.com]

    listen = /etc/php5/fpm/socks/postfix-admin.my.com.sock
    user = www-data
    group = www-data
    pm = dynamic
    pm.max_children = 50
    pm.start_servers = 1
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    pm.max_requests = 0
    php_admin_value[open_basedir]=/
    php_admin_value[session.save_path]=/var/www/postfix-admin/tmp
    php_admin_value[upload_tmp_dir]=/var/www/postfix-admin/tmp
    php_admin_value[disable_functions]=dl

Також варто встановити коректний часовий пояс та перезапустити php5-fpm:

# vim /etc/php5/fpm/php.ini
...
Your timezone
...
# service php5-fpm restart

Створюємо базу та користувача для postfix:

mysql> CREATE DATABASE postfix;
mysql> GRANT ALL PRIVILEGES ON postfix.* TO 'postfix_admin'@'localhost' IDENTIFIED BY 'your_password_first';
mysql> GRANT SELECT ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'your_password_second';
mysql> FLUSH PRIVILEGES;


POSTFIX ADMIN

Інсталюємо Postfix Admin. Є два можливі варіанти це зробити: скористатись репозиторіями чи завантажити його із сайту проекта. Я обрав друге.

# cd /tmp
# wget http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3.7/postfixadmin-2.3.7.tar.gz/download -O postfixadmin-2.3.7.tar.gz
# tar xvfz postfixadmin-2.3.7.tar.gz
# mv postfixadmin-2.3.7/* /var/www/postfix-admin

Редагуємо файл config.inc.php та змінюємо такі параметри:


# vim /var/www/postfix-admin/config.inc.php
...
$CONF['configured'] = true;
$CONF['postfix_admin_url'] = 'http://postfix-admin.my.com';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix_admin';
$CONF['database_password'] = 'your_password_first';
$CONF['database_name'] = 'postfix';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['fetchmail'] = 'NO';
...

Відкриваємо в браузері http://postfix-admin.my.com/setup.php та вказуємо вгорі сторінки власний пароль адміна (будь-який) та тиснемо ‘Gererate password hash’. Згенероване значення додаємо до згаданого вище config.inc.php:

# vim /var/www/postfix-admin/config.inc.php
...
$CONF['setup_password'] = '<hash>';
...

Тепер ми зможемо залогінитись в Postfix Admin за адресою http://postfix-admin.my.com/ і надалі керувати імейлами користувачів через цю адмін-панель.


Вигляд панелі редагування/додавання користувачів:


У якості альтернативи можна спробувати Vimbadmin, на сайті є зручна демка.


POSTFIX та SASL

Установлюємо пакети для SMTP-сервера Postfix та бібліотеки SASL:

# apt-get install postfix postfix-mysql libsasl2-modules libsasl2-modules-sql

З'явиться псевдографічний інтерфейс установщика Postfix і на запитання "General type of mail configuration" необхідно обрати "Internet Site":


Та "System mail name" - mail.my.com (домен для якого відбувається налаштування пошти)


Все інше можна обрати поки з дефолтними значеннями, пізніше ми їх виправимо.

Створюємо користувача і групу від яких працюватиме Postfix:

# groupadd -g 3000 vmail
# useradd -d /home/vmail -m -u 3000 -g 3000 vmail

Налаштовуємо Postfix. Встановлюємо такі параметри:

vim /etc/postfix/main.cf
...
mydestination = 
relayhost =
...
virtual_uid_maps = static:3000
virtual_gid_maps = static:3000
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
relay_domains = mysql:/etc/postfix/mysql_relay_domains.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
smtpd_recipient_restrictions =
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_hostname,
 reject_non_fqdn_sender,
 reject_non_fqdn_recipient,
 reject_unauth_destination,
 reject_unauth_pipelining,
 reject_invalid_hostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
milter_default_action = accept

smtpd_recipient_restrictions - це перелік обмежень (фільтрів), що запобігають використанню нашого сервера задля надсилання спаму. Були активовані такі перевірки:

permit_mynetworks - приймати всі листи з довіреної зони
permit_sasl_authenticated - приймати всі листи по з'єднанням з авторизацією
reject_non_fqdn_hostname - відкидати листи, якщо ім'я сервера відправника неповне
reject_non_fqdn_sender - відкидати листи від неповного домену відправника
reject_non_fqdn_recipient - відкидати листи для неповного домену отримувача
reject_unauth_destination - відкидати листи, які не відносяться до доменів, що ми
обслуговуємо
reject_invalid_hostname - відкидати листи, якщо неправильне ім'я сервера відправника

Існуючі адреси, списки розсилок і тд. Postfix буде переглядати в базі MySQL (вказані параметри virtual_mailbox_domains, virtual_mailbox_maps, virtual_alias_maps та ін.), тому створимо спочатку mysql_virtual_mailbox_domains.cf:

# vim /etc/postfix/mysql_virtual_mailbox_domains.cf

hosts = 127.0.0.1
user = postfix
password = your_password_second
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1


Потім mysql_virtual_mailbox_maps.cf:

# vim /etc/postfix/mysql_virtual_mailbox_maps.cf

hosts = 127.0.0.1
user = postfix
password = your_password_second
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1


mysql_virtual_alias_maps.cf (вони всі описані в основному конфігураційному файлі main.cf):

# vim /etc/postfix/mysql_virtual_alias_maps.cf

hosts = 127.0.0.1
user = postfix
password = your_password_second
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1


Та mysql_relay_domains.cf:

# vim /etc/postfix/mysql_relay_domains.cf

hosts = 127.0.0.1
user = postfix
password = your_password_second
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 1


Додаємо користувача postfix до sasl групи:

# adduser postfix sasl

Редагуємо master.cf і додаємо/розкоментовуємо рядки:

vim /etc/postfix/master.cf
...
submission inet n - - - - smtpd 
 -o syslog_name=postfix/submission 
 -o smtpd_tls_security_level=encrypt 
 -o smtpd_sasl_auth_enable=yes 
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 -o milter_macro_daemon_name=ORIGINATING
smtps inet n - - - - smtpd
 -o syslog_name=postfix/smtps
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,reject

 -o milter_macro_daemon_name=ORIGINATING
...

Таким чином були дозволене з'єднання по захищеним smtp портам.


DOVECOT

Встановимо демон доступу до пошти:

# apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql dovecot-lmtpd

Dovecot також звертається до бази задля отримання списку дійсних користувачів, тому створимо файл dovecot-mysql.conf.ext і запишемо в нього таке:

# vim /etc/dovecot/dovecot-mysql.conf.ext


driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=your_password_second
default_pass_scheme = MD5-CRYPT
user_query = SELECT '/home/vmail/%d/%n' as home, 3000 AS uid, 3000 AS gid FROM mailbox WHERE username = '%u'
password_query = SELECT password FROM mailbox WHERE username = '%u'

Вся пошта буде зберігатись в директорії /home/vmail/домен/ім'я. Правимо файл конфігурації 10-auth.conf:

# vim /etc/dovecot/conf.d/10-auth.conf
...
disable_plaintext_auth = no
auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext
...


Описуємо адресу розміщення пошти:

# vim /etc/dovecot/conf.d/10-mail.conf
...
mail_location = maildir:/home/vmail/%d/%n:INDEX=/home/vmail/%d/%n/indexes
...

Дозволяємо ssl:

# vim /etc/dovecot/conf.d/10-ssl.conf
...
ssl = yes
...

Максимальна кількість підключень із одного IP встановимо 20:

# vim /etc/dovecot/conf.d/20-imap.conf
...
mail_max_userip_connections = 20
...

Описуємо спосіб аутентифікації користувачів:

# vim /etc/dovecot/conf.d/auth-sql.conf.ext
...
passdb {
 driver = sql
 # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
 args = /etc/dovecot/dovecot-mysql.conf.ext
}
userdb {
 driver = sql
 args = /etc/dovecot/dovecot-mysql.conf.ext
}
...

Редагуємо /etc/dovecot/conf.d/10-master.conf:

# vim /etc/dovecot/conf.d/10-master.conf
...
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service auth {
  unix_listener auth-userdb {
    mode = 0604
    user = vmail
    group = vmail
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
}
...

І нарешті перезапускаємо сервіси.

# service dovecot restart
# service postfix restart

У разі помилок варто перевірити лог-файли:

# tail -f /var/log/auth.log /var/log/mail.log /var/log/syslog

Переходимо до установки фільтрів (milters).


CLAMAV

Почнемо з фільтра-антивіруса ClamAV. Установимо його:

# apt-get install clamav-milter clamav-unofficial-sigs

Оновимо антивірусні бази, виконавши команду:

# freshclam

Та запустимо сервіс:

# /etc/init.d/clamav-daemon start

Розкоментуємо останній рядок в clamav-milter для роботи із Postfix:

# vim /etc/default/clamav-milter
...
SOCKET_RWGROUP=postfix
...

Створимо директорію для сокета clamav-milter:

# mkdir /var/spool/postfix/clamav
# chown clamav /var/spool/postfix/clamav

Та запускаємо автоконфігурацію:

# dpkg-reconfigure clamav-milter

І відповідаємо на питання приблизно таким чином:

Handle configuration automatically --> yes
User to run clamav-milter as --> clamav
Groups for clamav-milter (space-separated) --> none (empty field)
Communication interface with Sendmail --> /var/spool/postfix/clamav/clamav-milter.ctl
Group owner of clamav-milter local (UNIX) socket --> clamav
Creation mode for clamav-milter local (UNIX) socket --> 660
Remove stale socket after unclean shutdown? --> yes
Wait timeout for data coming from clamd --> 120
Should clamav-milter stay in foreground (not forking)? --> no
Chroot to directory: --> none (empty field)
PID file --> /var/run/clamav/clamav-milter.pid
Temporary directory path --> /tmp
Clamd socket to connect to for scanning --> unix:/var/run/clamav/clamd.ctl
Hosts excluded from scanning --> none (empty field)
Mail addresses whitelist --> none (empty field)
Action to perform on infected messages --> Reject
Action to perform on error conditions --> Defer
Specific rejection reason for infected messages --> Rejecting harmful e-mail: %v found.
Add headers to processed messages? -> Replace
Log file for clamav-milter --> /var/log/clamav/clamav-milter.log
Disable log file locking? --> no
Maximum size of the log file (MB) --> 0
Log time with each message? --> yes
Use system logger? --> yes
Log facility (type of syslog message) --> LOG_LOCAL6
Enable verbose logging --> no
Information to log on infected messages --> Basic
Information to log if no threat is found --> Off
Size limit for scanned messages --> 25


В результаті всі листи із вірусами будуть відхилятись із 500-ю помилкою. Відправник листа отримає відповідь від мейлсервера із причиною відхилення. Таку поведінку можна змінити, відповівши інакше на попередні питання.

Конфігуруємо Postfix на використання цього фільтру:

# postconf -e 'smtpd_milters = unix:/clamav/clamav-milter.ctl'
# postfix reload

Для перевірки роботи антивірусу раджу відіслати декілька тестових файлів EICAR, чи скористатись подібним сервісом.

Надалі, можливо, краще буде приховати header із інформацією щодо антивірусу, що використовується на сервері. Для цього необхідно відредагувати clamav-milter.conf:

# vim /etc/clamav/clamav-milter.conf
...
#AddHeader Replace
...

Раджу також встановити пакет clamav-unofficial-sigs (так він зветься в Ubuntu/Debian репозиторіях). Він включає додаткові сигнатури з SanesecurityMalwarePatrol та ін., що в свою чергу допоможе краще шукати віруси.


 
SPAMASSASSIN

Як я вже сказав вище, SpamAssassin - це спам-фільтр, тож будемо його використувувати для блокування небажаної пошти.  Спочатку встановимо його:

# apt-get install spamass-milter

І відредагуємо конфігураційний файл фільтру:

# vim /etc/default/spamass-milter
...
OPTIONS="-u spamass-milter -i 127.0.0.1 -m -r -1 -I"
...

-u - користувач від імені якого буде запущено фільтр
-i - мережі, листи від яких не варто перевіряти на спам
-m - не додавати/змінювати додаткові заголовки до листів 
-r -1 - не приймати жодних листів, що будуть позначені як спам SpamAssassin-ом
-l - не сканувати листи, що були відправлені залогіненими на сервер користувачами

Тож після таких опцій в результаті всі листи, котрі SpamAssassin буде ідентифікувати як спам, будуть відкинуті і не потраплять до адресата.

Додамо окремого користувача для SpamAssassin:

# adduser --shell /bin/false --home /var/lib/spamassassin --disabled-password --disabled-login --gecos "" spamd

Та відредагуємо ще один конфіг:

# vim /etc/default/spamassassin
...
ENABLED=1
OPTIONS="--create-prefs --max-children 5 --helper-home-dir=/var/lib/spamassassin -u spamd -g spamd"
CRON=1
...

Оновимо правила та перезапустимо сервіс:

# sa-update -v
# service spamassassin restart


Як результат додамо ще один milter до конфігураційного файлу SMTP-серверу:

# postconf -e 'smtpd_milters = unix:/clamav/clamav-milter.ctl, unix:/spamass/spamass.sock'
# postfix reload


Певні параметри можна також налагодити відредагувавши /etc/spamassassin/local.cf
Перевірити роботу SpamAssassin можна за допомогою тестового повідомлення GTUBE.

Згодом я дещо додав балів за листи від IP-адрес, що не проходять SPF-тест, тобто що зазвичай йдуть з "підставним" полем From:

# vim /etc/spamassassin/local.cf
...
#   Mails with bad SPF goes to Junk
#
score SPF_SOFTFAIL 10.0
score SPF_FAIL 10.0
score SPF_HELO_FAIL 10.000
...


GREYLIST

Встановимо останній фільтр milter-greylist. Логіка його роботи заснована на тому, що спамери, у разі неможливості відправити листа, на відміну віднормальних сервісів, не повторюють відправку.

# aptitude install milter-greylist

Дещо відредагуємо конфігураційний файл greylist.conf:

# vim /etc/milter-greylist/greylist.conf
...
# For sendmail use the following two lines
#socket "/var/run/milter-greylist/milter-greylist.sock"
#user "smmsp"
# For Postfix uncomment the following two lines and comment out the
# sendmail ones above.
socket "/var/spool/postfix/milter-greylist/milter-greylist.sock" 660
user "greylist"
...

Та milter-greylist:

# vim /etc/default/milter-greylist
...
ENABLED=1
SOCKET="/var/spool/postfix/milter-greylist/milter-greylist.sock"
...

Створимо директорію для сокета та перевантаживо мейл-фільтр:

# mkdir /var/spool/postfix/milter-greylist
# chmod 2755 /var/spool/postfix/milter-greylist
# chown greylist:postfix /var/spool/postfix/milter-greylist
# service milter-greylist restart


І, як з попередними фільтрами, опишемо його використання в конфігураційному файлі Postfix:

# postconf -e 'milter_connect_macros = i b j _ {daemon_name} {if_name} {client_addr}'
# postconf -e 'smtpd_milters = unix:/milter-greylist/milter-greylist.sock, unix:/clamav/clamav-milter.ctl, unix:/spamass/spamass.sock'
# postfix reload


У якості альтернативи для подібного функціоналу можна обрати Postgrey, SQLgrey і т.п.


ROUNDCUBE

RoundCube - веб-клієнт для пошти. У якості альтернативи можна обрати щось інше, наприклад, HordeSquirrelMail, Zimbra, Modoboa. На час написання статті майже стабільною стала версія 1.0, тому її і будемо встановлювати. 
Нагадаю, що раніше ми налаштували віртуалхост webmail.my.com із root-директорією /var/www/webmail, тому саме в неї все і розпакуємо:

# cd /tmp
# wget http://sourceforge.net/projects/roundcubemail/files/roundcubemail-beta/1.0-RC/roundcubemail-1.0-rc.tar.gz
# tar xvfz roundcubemail-1.0-rc.tar.gz

# mv roundcubemail-1.0-rc/* /var/www/webmail

Ставимо необхідні права на директорію /var/www:

# chown -R www-data.www-data /var/www

Створюємо окремого користувача до бази та заливаємо дефолтну структуру таблиць:

mysql> CREATE DATABASE roundcube;
mysql> GRANT ALL PRIVILEGES ON roundcube.* TO roundcube@localhost IDENTIFIED BY 'your_password';
mysql> FLUSH PRIVILEGES;

# cd /var/www/webmail/
# mysql -u roundcube -p your_password < SQL/mysql.initial.sql


Відкриваємо браузер на сторінці http://webmail.my.com/installer і крок за кроком заповнюємо необхідні дані. На сторінці ‘Create config’ заповнюємо:

product_name: My webmail
support_url: your_help_page
database name: roundcube
database password: your_password
default_host: localhost
smtp_server: localhost
language: en_US

Після установки варто видалити директорію installer:

# rm -rf /var/www/webmail/installer

Опціонально можна додати деякі плагіни до Roundcube. Для цього необхідно завантажити їх із http://plugins.roundcube.net/explore, розпакувати в директорію /var/www/webmail/plugins та підключити в  /var/www/webmail/config/config.inc.php таким чином:

# vim /var/www/webmail/config/config.inc.php
...
// ----------------------------------
// PLUGINS
// ----------------------------------
// List of active plugins (in plugins/ directory)
//$config['plugins'] = array();
$config['plugins'] = array('managesieve', 'contextmenu', 'markasjunk2', 'keyboard_shortcuts', 'rholala_logo', 'bruteforcebreaker');
...

В прикладі приведені розширення, котрі я вважаю корисними. Також для автоматизації налаштування плагінів можна установити Composer.
Вигляд вебпошта має такий:


Вікно листів:


Вікно налаштувань:



SIEVE / MANAGESIEVE


Sieve - це мова опису фільтрації поштових повідомлень; фільтри, що працюють на стороні сервера і можуть бути налаштовані безпосередньо клієнтом. Тобто не важливо яким клієнтом користуватись - пошта буде завжди розкладуватись по правильним папкам. Як завжди все починається із установки пакетів:

# apt-get install dovecot-managesieved dovecot-sieve

Для налаштування необхідно відредагувати 15-lda.conf:

# vim /etc/dovecot/conf.d/15-lda.conf...
protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve
}
...

Та 20-lmtp.conf:
# vim /etc/dovecot/conf.d/20-lmtp.conf
...
protocol lmtp {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve

}
...

Основні параметри налаштування демона фільтрації знаходяться в конфігураційному файлі 90-sieve.conf:

# cat /etc/dovecot/conf.d/90-sieve.conf
...
plugin {
  sieve = /home/vmail/%d/%n/sieve/.dovecot.sieve
  sieve_default = /var/lib/dovecot/sieve/default.sieve
  sieve_dir = /home/vmail/%d/%n/sieve/
  #sieve_before = /var/lib/dovecot/sieve/default.sieve
  #sieve_after =
...

sieve - шлях до головного скрипта користувача
sieve_default - фільтр, що буде активним у випадку якщо не встановлено користувачем жодного власного правила.
sieve_dir - директорія, де зберігаються скрипти користувача
sieve_before - правила, що будуть запускатись перед фільтрами користувача
sieve_after - правила, що будуть запускатись лише вкінці всіх користувацьких правил. В мене закоментовано, тому що я ними не користуюсь

Попередньо я навів приклад налаштування спам-фільтра SpamAssassin на reject всіх повідомлень із хедером "X-Spam-Flag: YES".  Припустимо що ми хочемо дещо змінити логіку обробки спам-повідомлень: не приймати повідомлення лиш із великим спам-рейтингом, а всі інші обережно класти в папку Junk і щоб це правило діяло для всіх користувачів не залежно від того чи було налаштовано користувацькі sieve-фільтри чи ні. Для цього спершу відредагуємо конфігураційний файл SpamAssassin-а:

# vim /etc/default/spamass-milter
...
OPTIONS="-u spamass-milter -i 127.0.0.1"

# Reject emails with spamassassin scores > 15.
OPTIONS="-r 15"
...

На цьому етапі SpamAssassin лише помічатиме повідомлення, що являються спамом, а за допомогою Sieve вони автоматично відправлятимуться в директорію Junk на сервері:

# vim /etc/dovecot/conf.d/90-sieve.conf
...
sieve_before = /var/lib/dovecot/sieve/default.sieve
...

А вміст скрипта default.sieve такий:
...
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Junk";
}
...

Тобто все що з флагом "X-Spam-Flag: YES" потрапить в Junk.

Проте також необхідно налаштувати Dovecot на автоматичне створення директорії Junk при створенні скриньки кожному новому користувачу, інакше Sieve не зможе перенаправити пошту в директорію, котрої не існує.

# vim /etc/dovecot/conf.d/15-mailboxes.conf
...
  mailbox Junk {
    auto=subscribe
    special_use = \Junk
  }
...

Нарешті перевантажуємо Dovecot і перевіряємо роботу скриптів:

# service dovecot restart

Для управління фільтрами з вебпошти необхідно установити managesieve плагін для RoundCube.


Та описати порт для managesieve:

# vim /var/www/webmail/config/config.inc.php
...
$config['managesieve_port'] = 4190;
...

Звісно, порт 4190 має бути відкритим.

Існує також плагін для Thunderbird, що має назву Sieve. Для останніх версій Thunderbird плагін краще встановлювати останній та звідси. Для того, щоб відредагувати фільтри в Thunderbird варто перейти Menu -> Message Filters -> Message Filters --> Server side filters:



VACATION AUTOREPLIES

Vacation - це невеличкий perl-скрипт, що дозволяє встановлювати причину відсутності на роботі. Тобто якщо відіслати повідомлення адресату, котрий встановив у себе перемикач Vacation, то у відповідь буде надіслана автовідповідь, що адресат відсутній на робочому місці.

Для його роботи необхідні додаткові пакети, котрі доступні в репозиторіях "main contrib non-free" тому варто перевірити їх наявність:

# vim /etc/apt/sources.list
...
deb http://ftp.ru.debian.org/debian wheezy main contrib non-free
deb-src http://ftp.ru.debian.org/debian stable main contrib non-free
 ...

Та установити необхідні пакети:

# apt-get update
# apt-get install libmail-sender-perl libdbd-mysql-perl libemail-valid-perl libmime-perl liblog-log4perl-perl liblog-dispatch-perl libgetopt-argvfile-perl libmime-charset-perl libmime-encwords-perl

Також потрібно додати користувача від якого все працюватиме та скопіювати скрипт, котрий йде в стандартному архіві Postfix Admin:

# groupadd -r -g 65501 vacation
# useradd -r -u 65501 -g vacation -d /var/spool/vacation -s /sbin/nologin vacation
# mkdir /var/spool/vacation
# cp /var/www/postfix-admin/VIRTUAL_VACATION/vacation.pl /var/spool/vacation/
# chown -R vacation:vacation /var/spool/vacation
# chmod -R 0700 /var/spool/vacation

Редагуємо права в MySQL:

# mysql -e 'GRANT INSERT,UPDATE ON postfix.vacation_notification TO "postfix_admin"@"localhost"'

Створюємо конфігураційний файл /var/www/postfix-admin/vacation.conf і описуємо в ньому такі параметри:

# vim  /var/www/postfix-admin/vacation.conf
# db_type - uncomment one of these
our $db_type = 'mysql';

# leave empty for connection via UNIX socket
our $db_host = '';

# connection details
our $db_username = 'postfix_admin';
our $db_password = 'your_first_password';
our $db_name     = 'postfix';
our $vacation_domain = 'autoreply.mail.my.com';

# Set to 1 to enable logging to syslog.
our $syslog = 1;
# 2 = debug + info, 1 = info only, 0 = error only
our $log_level = 1;

# notification interval, in seconds
# set to 0 to notify only once
# e.g. 1 day ...
#my $interval = 60*60*24;
# disabled by default
our $interval = 60*60*24;

# perl will crash if the imported script doesn't end with a positive value .... wth
1;

Тобто за допомогою опції "our $interval" було описано відсилання автовідповіді кожному користувачу лише раз в добу. Дещо більше опцій можна знайти в самому скрипті /var/spool/vacation/vacation.pl

Наразі його потрібно увімкнути для Postfix Admin, щоб ним легко було управляти:

# vim /var/www/postfix-admin/config.inc.php
...
$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.mail.my.com';
...

Відредагуємо конфігураційний файл Postfix master.cf:

# vim /etc/postfix/master.cf
...
vacation  unix  -       n       n       -       -       pipe
  flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} ${recipient}
...

Та створимо /etc/postfix/transport з таким вмістом:

# vim /etc/postfix/transport
autoreply.mail.my.com vacation

Перевантажимо Postfix:

# postmap /etc/postfix/transport
# postconf -e 'vacation_destination_recipient_limit = 1'
# postfix reload

Управління автовідповідями через Postfix Admin виглядає наступним чином:






ALTERMIME

За допомогою alterMIME ми будемо додавати текст до всіх листів, нехай, це буде прохання про необхідність збереження комерційної таємниці. Проте за допомогою alterMIME також можна додавати в
транзитну пошту довільні заголовки, змінювати вміст існуючих заголовків, видаляти і замінювати вкладення в залежності від імені файлу і типу контенту.

Установимо програму:

# aptitude install altermime

Для запуску altermime-фільтрів будемо користуватись окремим користувачем:

# useradd -r -c "Postfix Filters" -d /var/spool/filter filter
# mkdir /var/spool/filter
# chown filter:filter /var/spool/filter
# chmod 750 /var/spool/filter

Створюємо скрипт /etc/postfix/disclaimers/disclaimer для запуску alterMIME, взявши за основу готовий приклад, який є в комплекті:

# mkdir /etc/postfix/disclaimers
# cp /usr/share/doc/altermime/examples/postfix_filter.sh /etc/postfix/disclaimers/disclaimer
# chgrp -R filter /etc/postfix/disclaimers
# chmod 750 /etc/postfix/disclaimer

За замовчуванням скрипт не розрізняє вхідні та вихідні листи, для того щоб
додавати повідомлення лише в вихідні листи скрипт потрібно трохи модифікувати:

# vim /etc/postfix/disclaimers/disclaimer

#!/bin/sh
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail

DISCLAIMER_ADDRESSES=/etc/postfix/disclaimers/disclaimer_addresses

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

# Clean up when done or when aborting.
trap "rm -f in.$$" 0 1 2 3 15

# Start processing.
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }

cat >in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# obtain From address
from_address=`grep -m 1 "From:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1`

if [ `grep -wi ^${from_address}$ ${DISCLAIMER_ADDRESSES}` ]; then
  /usr/bin/altermime --input=in.$$ \
                --disclaimer=/etc/postfix/disclaimers/disclaimer.txt \
                --disclaimer-html=/etc/postfix/disclaimers/disclaimer.html \
                --xheader="X-Copyrighted-Material: Please visit http://www.company.com/privacy.htm" || \
                 { echo Message content rejected; exit $EX_UNAVAILABLE; }
fi
$SENDMAIL "$@" <in.$$

exit $?

--disclaimer, --disclaimer-html - адреси до файлів, в котрих записано що саме додавати до повідомлень.

Створюємо список адрес, для котрих має бути активним цей підпис:

# vim /etc/postfix/disclaimers/disclaimer_addresses
test1@example.com
test2@example.com

Текст додаткового повідомлення поміщаємо в /etc/postfix/disclaimers/disclaimer.txt та /etc/postfix/disclaimers/disclaimer.html. В html-версію можна додати картинки і тд, тобто всі радості, що підтримує HTML.

Налаштовуємо Postfix для виклику alterMIME, в /etc/postfix/master.cf додаємо в рядок "smtp":

# vim /etc/postfix/master.cf 
...
-o content_filter=dfilt:
...

тобто маємо отримати в результаті:

smtp inet n - - - - smtpd
      -o content_filter=dfilt:

Та в кінець файлу додаємо:

dfilt     unix    -       n       n       -       -       pipe
      flags=Rq user=filter argv=/etc/postfix/disclaimers/disclaimer -f ${sender} -- ${recipient}

Не забуваємо перевантажувати Postfix після подібних змін:

# /etc/init.d/postfix restart

Для заміни або видалення вкладення необхідно змінити скрипт 
/etc/postfix/disclaimer, використавши інші опції запуску altermime: 

    "- remove = ім'я файлу" (видалення вкладення), 
    "- replace = ім'я файлу - with = файл для заміни" (заміна вкладення), 
    "- removeall" (видалення всіх вкладень), 
    "- alter-header = заголовок - alter-with = заміни - alter-mode = replace" (заміна заголовка), 
    "- xheader = заголовок" (додавання заголовка)


Посилання:
https://lelutin.ca/posts/installing_postfix_-_clamav_-_spamassassin_-_dovecot_-_postfixadmin_on_debian_squeeze/
http://www.xenlens.com/debian-wheezy-mail-server-postfix-dovecot-sasl-mysql-postfixadmin-roundcube-spamassassin-clamav-greylist-nginx-php5/
http://serion.co.nz/howto/howto-setup-mailserver-using-postfix-mysql-dovecot-postfixadmin-amavis-new
http://wiki2.dovecot.org/Pigeonhole/Sieve/Configuration
http://www.productionmonkeys.net/guides/qmail-server/content-filtering/sieve/sieve-plugins-roundcube
http://www.rosehosting.com/blog/how-to-set-up-server-side-email-filtering-with-dovecot-sieve-and-roundcube-on-a-centos-6-vps/
http://thelinuxforce.org/article/7
http://www.ussr.kiev.ua/ru/sortirovka-pisem-v-roundcube
http://wiki2.dovecot.org/MailboxSettings
http://www.opennet.ru/tips/info/2444.shtml
http://www.howtoforge.com/how-to-automatically-add-a-disclaimer-to-outgoing-emails-with-altermime-postfix-on-debian-squeeze
http://spamassassin.apache.org/full/3.1.x/doc/Mail_SpamAssassin_Conf.html
http://yakim.org.ua/images/stories/articles/SYakimchuck-MailServer.pdf

Немає коментарів:

Дописати коментар