Установка iRedMail на Ubuntu 14.04-minimal
Ставим то что нужно:
sudo su apt-get update && apt-get upgrade && apt-get install bzip2 bsdutils
Скачиваем и распаковываем:
wget https://bitbucket.org/zhb/iredmail/downloads/iRedMail-0.9.2.tar.bz2 --no-check-certificate tar xjf iRedMail-0.9.2.tar.bz2
переходим в папку и запускаем инсталляцию (с правами root):
cd iRedMail-0.9.2 bash iRedMail.sh
при установке место для ящиков оставляем по-умолчанию, сервер - nginx, backend для аккаунтов - OpenLDAP.
Дальше задаем пароли и указываем имена доменов.
Из компонент я ставил все, кроме SoGo.
После установки перезагружаемся.
Интеграция с AD
http://www.iredmail.org/docs/active.directory.html
Создаем в Active Directory пользователя с минимальными правами vmail. Проверяем что он может подключиться:
ldapsearch -x -h ad.example.com -D 'vmail' -W -b 'cn=users,dc=example,dc=com'
Тут ad.example.com это имя контроллера домена. На выходе должен быть список пользователей с аттрибутами.
Настройка AD для Postfix
Отключаем параметры, которые нам не нужны в данный момент:
postconf -e virtual_alias_maps='' postconf -e sender_bcc_maps='' postconf -e recipient_bcc_maps='' postconf -e relay_domains='' postconf -e relay_recipient_maps=''
Добавляем домен в список виртульных доменов.
postconf -e smtpd_sasl_local_domain='example.com' postconf -e virtual_mailbox_domains='example.com'
Прописываем файл настроек транспорта:
postconf -e transport_maps='hash:/etc/postfix/transport'
Прописываем файлы, в которых будет написано где в AD искать учетные записи разрешенных SMTP-отправителей, пользователей почты и почтовых групп:
postconf -e smtpd_sender_login_maps='proxy:ldap:/etc/postfix/ad_sender_login_maps.cf' postconf -e virtual_mailbox_maps='proxy:ldap:/etc/postfix/ad_virtual_mailbox_maps.cf' postconf -e virtual_alias_maps='proxy:ldap:/etc/postfix/ad_virtual_group_maps.cf'
Теперь создаем файлы настроек, прописанные в конфигурацию postfix предыдущими командами.
/etc/postfix/transport:
example.com dovecot
Для работы нужно сконвертировать текстовый файл в файл db, с которыми работает postfix:
cd /etc/postfix/ postmap ./transport
В /etc/postfix/transport прописан транспорт для домена. Определение транспорта dovecot хранится в файле /etc/postfix/master.cf.
Фильтры postfix
Как это работает. Когда postfix получает письмо (входящее или исходящее), он должен проверить, можно ли его доставлять и куда. Командами postconf мы прописали три фильтра, которые определяют разрешенных отправителей, виртуальные почтовые ящики для входящей почты и фильтры для групп.
Первый фильтр - фильтр разрешенных отправителей.
Его добавили в файл /etc/postfix/main.cf с помощью команды:
postconf -e smtpd_sender_login_maps='proxy:ldap:/etc/postfix/ad_sender_login_maps.cf'
В этом файле указаны параметры домена и OU из которой брать пользователей, а также параметры фильтрации. На вход данного фильтра подается почтовый адрес отправителя письма. В данном случае через фильтр пройдут только объекты из cn=users,dc=example,dc=com типа objectClass=person, у которых аттрибут mail будет равен значению поданному на вход фильтра %s.
Вернет фильтр аттрибут mail (строчка result_attribute=), объекта AD, удовлетворяющего фильтру query_filter=.
Если возвращенное значение result_attribute= соотвествует попавшему на вход фильтра %s, то postfix решает, что отправитель хороший.
/etc/postfix/ad_sender_login_maps.cf:
server_host = dc01.example.com # Domain Controller Name or IP server_port = 389 version = 3 bind = yes start_tls = no bind_dn = vmail # Учетка с правами чтения списка пользователей и групп домена с аттрибутами bind_pw = vmail_password # этой учеткиПароль search_base = cn=users,dc=example,dc=com # Где искать пользователей в домене scope = sub query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) result_attribute= mail debuglevel = 0
/etc/postfix/ad_virtual_mailbox_maps.cf:
server_host = dc01.example.com # Domain Controller Name or IP server_port = 389 version = 3 bind = yes start_tls = no bind_dn = vmail # Учетка с правами чтения списка пользователей и групп домена с аттрибутами bind_pw = vmail_password # этой учеткиПароль search_base = cn=users,dc=example,dc=com # Где искать пользователей и группы в домене scope = sub query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) result_attribute= mail result_format = %d/%s/Maildir/ debuglevel = 0
Тут в параметре result_format жестко прописывается формат пути к ящикам пользователей. В данном случае это %d - имя домена, %s% - имя ящика, которое подается на вход фильтра (может быть заменено на %u - имя пользователя до @). То есть в результате для пользователя postmaster - example.com/postmaster@example.com/Maildir/.
/etc/postfix/ad_virtual_group_maps.cf:
server_host = dc01.example.com # Domain Controller Name or IP server_port = 389 version = 3 bind = yes start_tls = no bind_dn = vmail # Учетка с правами чтения списка пользователей и групп домена с аттрибутами bind_pw = vmail_password # этой учетки Пароль search_base = cn=users,dc=example,dc=com # Где искать пользователей и группы в домене scope = sub query_filter = (&(objectClass=group)(mail=%s)) special_result_attribute = member leaf_result_attribute = mail # Без этого параметра в списке адресов группы будет и адрес самой группы result_attribute= mail # какой аттрибут возвращаем debuglevel = 0
В файле /etc/postfix/main.cf удалить строки типа check_policy_service inet:127.0.0.1:. Это указания на обработку писем разными политиками. Бывает полезно, если письма не приходят, а в журнале /var/log/mail.log сообщения типа Recipient address rejected: Greylisting in effect, please come back later;
Настройка AD для dovecot
Файл /etc/dovecot/dovecot-ldap.conf
hosts = domain_controller_name:389 ldap_version = 3 auth_bind = yes dn = vmail dnpass = vmail_password base = cn=users,dc=example,dc=com scope = subtree deref = never user_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) pass_filter = (&(userPrincipalName=%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/
Если у вас есть сертификат SSL для POP3, то путь к нему надо указать в /etc/dovecot/dovecot.conf, а если нет, то нужно отключить обязательное использование SSL. Для этого в /etc/dovecot/dovecot.confзадаем значения для двух параметров: ssl = yes (вместо required) и disable_plaintext_auth = no.
Рестарт dovecot:
service dovecot restart
Если адрес почтового ящика не соотвествует имени
Конфигурация, описаннная выше работает, если имя входа и имя ящика совпадают. Но что если это не так?. Например имя входа user@domain.com, а ящик - user.id@domain.com.
Значит нужно переписать фильтр в /etc/postfix/ad_virtual_mailbox_maps.cf:
server_host = dc01.example.com # Domain Controller Name or IP server_port = 389 version = 3 bind = yes start_tls = no bind_dn = vmail # Учетка с правами чтения списка пользователей и групп домена с аттрибутами bind_pw = vmail_password # этой учеткиПароль search_base = cn=users,dc=example,dc=com # Где искать пользователей и группы в домене scope = sub query_filter = (&(objectclass=person)(mail=%s)) result_attribute= mail result_format = %d/%u/Maildir/ debuglevel = 0
А /etc/dovecot/dovecot-ldap.conf должен выглядеть так:
hosts = dc01.example.com:389 ldap_version = 3 auth_bind = yes dn = vmail dnpass = vmail_password base = cn=users,dc=example,dc=com scope = subtree deref = never 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 = mail=user,userPassword=password default_pass_scheme = CRYPT user_attrs = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/
Тут в user_filer меняем userPrincipalName=%u на mail=%u, а в pass_attrs добавляем mail=user
Рестарт dovecot:
service dovecot restart
При этом, логиниться в web-интерейс надо по имени ящика.
Интеграция RoundCube в AD
Редактируем файлик /opt/www/roundcubemail/config/config.inc.php: В нижней части файлика приводим раздел Global LDAP address book к такому виду:
// Global LDAP address book. $config['ldap_public']["global_ldap_abook"] = array( 'name' => 'Global LDAP Address Book', 'hosts' => array('DC.your.domain.com'), 'port' => 389, 'use_tls' => false, 'ldap_version' => '3', 'network_timeout' => 10, 'user_specific' => false, // Search mail users under same domain. 'base_dn' => 'cn=users,dc=your_domain,dc=name', 'bind_dn' => 'vmail', 'bind_pass' => 'vmail_AD_password', 'hidden' => false, 'searchonly' => false, 'writable' => false, 'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'), // mapping of contact fields to directory attributes 'fieldmap' => array( 'name' => 'cn', 'surname' => 'sn', 'firstname' => 'givenName', 'title' => 'title', 'email' => 'mail:*', 'phone:work' => 'telephoneNumber', 'phone:mobile' => 'mobile', 'street' => 'street', 'zipcode' => 'postalCode', 'locality' => 'l', 'department' => 'departmentNumber', 'notes' => 'description', 'phone:workfax' => 'facsimileTelephoneNumber', 'photo' => 'jpegPhoto', ), 'sort' => 'cn', 'scope' => 'sub', 'filter' => '(&(objectclass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', 'fuzzy_search' => true, 'vlv' => false, // Enable Virtual List View to more efficiently fetch paginated data (if server supports it) 'sizelimit' => '0', // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. 'timelimit' => '0', // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. 'referrals' => false, // Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups 'group_filters' => array( 'departments' => array( 'name' => 'Mailing Lists', 'scope' => 'sub', 'base_dn' => 'cn=users,dc=domain,dc=name', 'filter' => '(objectClass=group)', 'name_attr' => 'cn', 'email' => 'mail', ), ), ); $config['autocomplete_addressbooks'] = array('sql', 'global_ldap_abook');
Еще надо отредактировать /opt/www/roundcubemail/config/defaults.inc.php. Тут поправить два параметра:
$config['username_domain'] = 'your.domain.name'; $config['mail_domain'] = 'your.domain.name';
Если не поправлять, то в веб-интерфейсе почта юзверя буде выглядеть как username@127.0.0.1
Добавляем мобильный скин в RoundCube
cd ~ mkdir ./roundcube-mobile cd ./roundcube-mobile/ wget -O Roundcube-Plugin-Mobile.zip https://github.com/messagerie-melanie2/Roundcube-Plugin-Mobile/archive/master.zip wget -O Roundcube-Skin-Melanie2-Larry-Mobile.zip https://github.com/messagerie-melanie2/Roundcube-Skin-Melanie2-Larry-Mobile/archive/master.zip wget -O Roundcube-Plugin-JQuery-Mobile.zip https://github.com/messagerie-melanie2/Roundcube-Plugin-JQuery-Mobile/archive/master.zip unzip ./Roundcube-Plugin-JQuery-Mobile.zip unzip ./Roundcube-Plugin-Mobile.zip unzip ./Roundcube-Skin-Melanie2-Larry-Mobile.zip sudo mkdir -p /opt/www/roundcubemail/skins sudo mkdir -p /opt/www/roundcubemail/plugins sudo mv ./Roundcube-Plugin-JQuery-Mobile-master /opt/www/roundcubemail/plugins/jquery_mobile sudo mv ./Roundcube-Plugin-Mobile-master /opt/www/roundcubemail/plugins/mobile sudo mv ./Roundcube-Skin-Melanie2-Larry-Mobile-master /opt/www/roundcubemail/skins/melanie2_larry_mobile
Теперь отредактируем файлик config.inc.php:
sudo nano /opt/www/roundcubemail/config/config.inc.php
и изменим содержимое строки config['plugins'], добавив туда mobile:
$config['plugins'] = array('managesieve', 'password','mobile');
Настройка виртуальных почтовых ящиков
Иногда нужно, чтобы у пользователя было два почтовых ящика. это называется virtual mailbox.
Как делать virtual mailbox средствами postfix описано тут: [http://www.postfix.org/VIRTUAL_README.html#virtual_alias].
Но администрировать это несколько неудобно.
Можно это сделать на базе AD.
Создается группа, в пределах OU, прописанного в конфигурации iRedMail - в этом гайдике это cn=Users,dn=domain,dn=name. Этой группе прописывается e-mail и пользователя, которому нужен этот второй e-mail добавляем в эту группу. Все. Письмо приходит на группу и отправляется всем пользователям в этой группе прописанным.
Включаем спаморезку и проверку антивирусом
sudo apt install amavisd-new spamassassin clamav-daemon sudo apt install opendkim postfix-policyd-spf-python sudo apt install pyzor razor sudo apt install arj cabextract cpio lhasa nomarch pax rar unrar unzip zip sudo adduser clamav amavis sudo adduser amavis clamav
По-умолчанию, спаморезка и антивирус выключены. Для начала нужно включить spamassasin - в файлике /etc/default/spamassassin выставить:
ENABLED=1
И выполнить:
sudo systemctl start spamassassin.service
Потом нужно отредактировать файлик /etc/amavis/conf.d/15-content_filter_mode. Там написано что нужно сделать.
Если у вас некоторый спам фильтруется, а некоторый проскакивает, то, возможно, нужно просто скорректировать пороговый spam level. Это можно сделать в файле /etc/amavis/conf.d/20-debian_defaults. Там есть группа параметров $sa_. Нужно уменьшить sa_kill_level_deflt. По умолчанию он 6.31. Я ставлю 4.0.
Чтобы спам удалялся нужно отредактировать файлик /etc/amavis/conf.d/20-debian_defaults. В нем найти параметр $final_spam_destiny и заменить его заначение на: $final_spam_destiny = D_DISCARD;
Отправка почты через SMTP Gmail
Ставим запчасти:
apt-get install mailutils libsasl2-2 ca-certificates libsasl2-modules
В файл /etc/postfix/main.cf нужно добавить:
relayhost = [smtp.gmail.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_CAfile = /etc/postfix/cacert.pem smtp_use_tls = yes
Создать и положить на место самоподписанный сертификат:
openssl req -new > new.ssl.csr openssl rsa -in privkey.pem -out new.cert.key openssl x509 -in new.ssl.csr -out new.cert.cert -req -signkey new.cert.key -days 9999 cp ./new.cert.cert /etc/postfix/cacert.pem && cp ./new.cert.key /etc/postfix/cacert.key
Создать файл /etc/postfix/sasl_passwd с паролем для Gmail с таким содержимым:
[smtp.gmail.com]:587 USERNAME@gmail.com:PASSWORD
Изменить права на него:
chmod 400 /etc/postfix/sasl_passwd postmap /etc/postfix/sasl_passwd
Применяем параметры и проверяем что получилось. Вместо you@example.com указываем почту куда уйдет тестовое сообщение:
sudo /etc/init.d/postfix reload echo "Test mail from postfix" | mail -s "Test Postfix" you@example.com
/etc/postfix/main.cf
Вот пример файла /etc/postfix/main.cf:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no myhostname = mail.autosys.tk alias_maps = hash:/etc/postfix/aliases alias_database = hash:/etc/postfix/aliases myorigin = mail.autosys.tk mydestination = $myhostname, localhost, localhost.localdomain relayhost = [smtp.gmail.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_CAfile = /etc/postfix/cacert.pem smtp_use_tls = yes mynetworks = 127.0.0.1, 192.168.77.0/24 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all #inet_protocols = all inet_protocols = ipv4 virtual_alias_domains = mydomain = mail.autosys.tk allow_percent_hack = no swap_bangpath = no mynetworks_style = host ######################################################## ##SMTPD Restricrions ######################################################## smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination smtpd_data_restrictions = reject_unauth_pipelining smtpd_reject_unlisted_recipient = yes smtpd_reject_unlisted_sender = yes smtpd_sender_restrictions = reject_unknown_sender_domain, reject_non_fqdn_sender, reject_unlisted_sender, permit_mynetworks, reject_sender_login_mismatch, permit_sasl_authenticated delay_warning_time = 0h maximal_queue_lifetime = 4h bounce_queue_lifetime = 4h proxy_read_maps = $canonical_maps $lmtp_generic_maps $local_recipient_maps $mydestination $mynetworks $recipient_bcc_maps $recipient_canonical_maps $relay_domains $relay_recipient_maps $relocated_maps $sender_bcc_maps $sender_canonical_maps $smtp_generic_maps $smtpd_sender_login_maps $transport_maps $virtual_alias_domains $virtual_alias_maps $virtual_mailbox_domains $virtual_mailbox_maps $smtpd_sender_restrictions smtp_data_init_timeout = 240s smtp_data_xfer_timeout = 600s smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, check_helo_access pcre:/etc/postfix/helo_access.pcre queue_run_delay = 300s minimal_backoff_time = 300s maximal_backoff_time = 4000s enable_original_recipient = no disable_vrfy_command = yes home_mailbox = Maildir/ allow_min_user = no message_size_limit = 15728640 virtual_minimum_uid = 2000 virtual_uid_maps = static:2000 virtual_gid_maps = static:2000 virtual_mailbox_base = /var/vmail transport_maps = hash:/etc/postfix/transport virtual_alias_maps = proxy:ldap:/etc/postfix/ad_virtual_group_maps.cf virtual_mailbox_domains = autosys.tk virtual_mailbox_maps = proxy:ldap:/etc/postfix/ad_virtual_mailbox_maps.cf sender_bcc_maps = recipient_bcc_maps = relay_domains = smtpd_sender_login_maps = proxy:ldap:/etc/postfix/ad_sender_login_maps.cf smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = autosys.tk broken_sasl_auth_clients = yes smtpd_sasl_security_options = noanonymous smtpd_recipient_restrictions = reject_unknown_recipient_domain, reject_non_fqdn_recipient, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10031 tls_random_source = dev:/dev/urandom mailbox_command = /usr/lib/dovecot/deliver virtual_transport = dovecot dovecot_destination_recipient_limit = 1 smtpd_sasl_type = dovecot smtpd_sasl_path = private/dovecot-auth content_filter = smtp-amavis:[127.0.0.1]:10024 smtp-amavis_destination_recipient_limit = 1 relay_recipient_maps = ####################################################### # SSL/TLS parameters ####################################################### smtpd_tls_cert_file = /etc/ssl/certs/iRedMail.crt smtpd_tls_key_file = /etc/ssl/private/iRedMail.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_tls_protocols = !SSLv2 !SSLv3 smtp_tls_protocols = !SSLv2 !SSLv3 lmtp_tls_protocols = !SSLv2 !SSLv3 smtpd_tls_mandatory_protocols = !SSLv2 !SSLv3 smtp_tls_mandatory_protocols = !SSLv2 !SSLv3 lmtp_tls_mandatory_protocols = !SSLv2 !SSLv3 smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA smtpd_tls_dh1024_param_file = /etc/ssl/dhparams.pem smtp_tls_security_level = may #smtp_tls_CAfile = $smtpd_tls_CAfile smtp_tls_loglevel = 0 smtp_tls_note_starttls_offer = yes smtpd_tls_security_level = may smtpd_tls_loglevel = 0 smtpd_tls_CAfile = /etc/ssl/certs/iRedMail.crt smtpd_tls_auth_only = yes # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client.
Настройка postfix для работы с SSL сертификатом let's encrypt
/etc/dovecot/dovecot.conf
ssl = required disable_plaintext_auth = yes ssl_cert = </etc/letsencrypt/live/njoror.squashedfly.eu/fullchain.pem ssl_key = </etc/letsencrypt/live/njoror.squashedfly.eu/privkey.pem
Тут важно обратить внимание на символы < перед путями к сертификату и ключу.
/etc/postfix/main.cf
smtpd_use_tls = yes smtp_use_tls = yes smtp_tls_security_level = may smtpd_tls_security_level = may smtpd_tls_ciphers = high smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes smtpd_tls_loglevel = 1 smtpd_tls_protocols = !SSLv2, !SSLv3 smtpd_tls_cert_file=/etc/letsencrypt/live/njoror.squashedfly.eu/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/njoror.squashedfly.eu/privkey.pem smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
Затем выполняем:
/etc/init.d/postfix reload
Если в файлике конфигурации есть повторяющиеся строки - убираем ненужное.
Для того, чтобы убедиться, что все корректно стратует - перезагружаемся.
После этого можно проверить, что наш сервер корректно предоставляет сертификат при подключении SSL.
Подключения IMAP через SSL проверяем так:
openssl s_client -showcerts -connect mail.example.com:993
Сервер должен ответить сертификатом.
Подключения POP3 через SSL проверяем так:
openssl s_client -showcerts -connect mail.example.com:995
Discussion