Перейти к собственно контенту

Архив

Метка: Exim

Данная статья описывает настройку почтового сервера на ОС FreeBSD ( у меня стоит версия 11.1-STABLE ) на базе Exim в качестве SMTP сервера с поддержкой SpamAssasin и ClamAV, Dovecot в качестве POP3 / IMAP сервера, поддержкой SSL и веб интерфейсами Vexim для упрвавления ящиками и Roundcube в качестве почтового веб клиента. Данные будем хранить в MySQL

Установка Web сервера и сервера баз данных

Ставим nginx
# cd /usr/ports/www/nginx
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
nginx_enable="YES"

Ставим MySQL ( я выбрал MariaDB 10.1 )
# cd /usr/ports/databases/mariadb101-server
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
mysql_enable="YES"
Запускаем MySQL
# /usr/local/etc/rc.d/mysql-server start

Задаем пароль для root в MySQL ( в скобках сам пароль )
# mysqladmin -u root password 'password'

Ставим PHP ( отмечаем FPM )
# cd /usr/ports/lang/php71
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
php_fpm_enable="YES"

Приводим файл /usr/local/etc/php-fpm.conf к такмоу виду:
[global]
pid = run/php-fpm.pid
error_log = /var/log/php-fpm.log
events.mechanism = kqueue
include=/usr/local/etc/php-fpm.d/*.conf

Редактируем файл пула
# ee /usr/local/etc/php-fpm.d/www.conf
и приводим к такому виду
[www]
user = www
group = www
listen = /tmp/www.sock
listen.backlog = -1
listen.owner = www
listen.group = www
listen.mode = 0666
pm.status_path = /status
ping.path = /ping
pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 5000
security.limit_extensions = .php
chdir = /usr/local/www/
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[cgi.fix_pathinfo] = 0
php_admin_value[open_basedir] = /usr/local/www:/tmp:/usr/local/share/pear:/usr/local/mail:/var/www
php_admin_value[error_log] = /usr/local/www/logs/php-fpm-error.log
php_admin_value[memory_limit] (далее…)

В дополнение к статье по настройке почтового сервера на FreeBSD решил написать как настроить тоже самое, но на ОС CentOS 6.

Подключаем репозиторий Remi и Epel

rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
yum install yum-priorities
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Приводим файл /etc/yum.repos.d/epel.repo к такому виду

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

и файл /etc/yum.repos.d/remi.repo к такому виду:

[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority

[remi-test]
name=Les RPM de remi en test pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

Ставим MySQL , добавляем в атозагрузку и стартуем:

yum install mysql mysql-server
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start

Установим пароь для root в MySQL следующей командой:

mysql_secure_installation

Устанавливаем nginx ( да да, как и в прошлый раз мы обойдемся без тяжеловесного Apache и сделаем все на NGINX + PHP-FPM ), добавим в автозагрузку и стартуем
yum install nginx
chkconfig --levels (далее…)

Настраивал почтовый сервер,с Roundcube, и почему то не хотели отправляться письма, в логах exim показывал следующее:

rejected EHLO from localhost [127.0.0.1]: syntactically invalid argument(s): _

Чтоб избежать такой ошибки в конфиг exim добавляем:
helo_allow_chars = "_"

В дополнение к статье по настройке почтового сервера решил написать как настроить на этой же связке SSL соединение.

Создаем директорию для хранения наших сертификатов

deathstar# mdkir -p /usr/local/etc/ssl/certs

Генерируем сертификат утилитой OpenSSL ( ставим из портов если не установлена )

deathstar# cd /usr/local/etc/ssl/certs && openssl req -new -x509 -days 3650 -nodes -out mail.pem -keyout mail.key

И заполняем данные о сертификате ( пишем что угодно, но Common Name должно иметь значение вашего домена, в моем случае это адреса smtp и imap — mail.deathstar.name )

Далее пересобираем exim с поддержкой SSL если это не было сделано раньше и редактируем конфиг Exim

deathstar# ee /usr/local/etc/exim/configure

Описываем порты, на которыхбудет висеть Exim после строки MY_IP ( 25 и 465 для SSL )

daemon_smtp_ports = 25:465

Ниже описываем порт, на котором будет SSL

# TLS
tls_on_connect_ports = 465
tls_advertise_hosts = *
tls_certificate = /usr/local/etc/ssl/certss/mail.pem
tls_privatekey = /usr/local/etc/ssl/certs/mail.key
#auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

Здесь прописываются пути к сертификату, к ключу, и порт на котором будет SSL.
Для того чтобы запретить не SSL соединения расскоментируйте строку
auth_advertise_hosts
Сохраняем и перезапускаем Exim и пробуем почту на порту 465 с включенным SSL =)

Добавляем SSL в Dovecot

Перечисляем протоколы, которые будет обслуживать Dovecot:

protocols = imap pop3 imaps pop3s
….
Описываем сами протоколы, порты, на которых они будут висеть и пути к SSL сертификату и ключу
protocol imap {
listen=*:143
ssl_listen=*:993
ssl_cert_file=/usr/local/etc/ssl/certs/mail.pem
ssl_key_file=/usr/local/etc/ssl/certs/mail.key
}

protocol pop3 {
listen=*:110
ssl_listen=*:995
ssl_cert_file=/usr/local/etc/ssl/certs/mail.pem
ssl_key_file=/usr/local/etc/ssl/certs/mail.key
}

Включаем SSL, сменив

# SSL/TLS support: yes, no, required. (далее…)

Технология DomainKeys Identified Mail (DKIM) объединяет несколько существующих методов антифишинга и антиспама с целью повышения качества классификации и идентификации легитимной электронной почты. Вместо традиционного IP-адреса, для определения отправителя сообщения DKIM добавляет в него цифровую подпись, связанную с именем домена организации. Подпись автоматически проверяется на стороне получателя, после чего, для определения репутации отправителя, применяются «белые списки» и «чёрные списки».

В технологии DomainKeys для аутентификации отправителей используются доменные имена. DomainKeys использует существующую систему доменных имен (DNS) для передачи открытых ключей шифрования.

Проект DomainKeys начала несколько лет назад компания Yahoo, а проект Identified Internet Mail инициировала Cisco Systems. Около года неформальное объединение из десятка организаций, включая Yahoo, Cisco, EarthLink Inc., Microsoft Corp., PGP Corp., StrongMail Systems Inc., VeriSign Inc. и Sendmail Inc., работало над созданием новой спецификации DKIM. В июле 2005 года она была передана в IETF, для рассмотрения в качестве нового стандарта e-mail с целью борьбы с фишингом и спамом.

Нативная поддержка DKIM появилась в EXIM,начиная с версии 4.70, в версии 4.71 было исправлены проблемы при работе с DKIM, на данный момент exim доступен версии 4.77

Создаем каталог где будем хранить ключи
deathstar# mkdir /usr/local/etc/exim/dkim/
И создаем ключ
deathstar# openssl genrsa -out /usr/local/etc/exim/dkim/deathstar.name.key 1024
Выствляем права на чтение каталога с ключами
deathstar# chown mailnull:wheel /usr/local/etc/exim/dkim/
deathstar# chmod 640 /usr/local/etc/exim/dkim/

Теперь создаем публичный ключ
deathstar# openssl rsa -in /usr/local/etc/exim/dkim/deathstar.name.key -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDB+E6ldHf2KovD3DSAd1CiQQCe
TxB9pE4o+mLlBIMpF85L+bp3mhGCYe4eR68tVpEqwdewNQaP/kEhqQ0GlmMw1AdR
mGYga2qNbQZpGDQHL+n+/sVt6JzupZNYH3jAcZE2jW/jxBOXbu3dQKrR1Ma03HMF
5F//dkvoJTWDYs3kQwIDAQAB
-----END (далее…)

Иногда получается так,что почтовый сервер настраивается по умолчанию на формат mbox (хранение в одном файле),что имеет ряд своих минусов. В статье расскжу как мигрировать с mbox на maildir на связке Exim + Dovecot.

1) Конвертируем почту из mbox формата в .maildir
Для этого ставим утилиту mb2md из портов
deathstar# /usr/ports/mail/mb2md make install clean (FreeBSD)
или с репозиториев
deathstar@deathstar.name$: sudo aptitude install mb2md (Linux Debian)
И используем утииту так:
deathstar# mb2md -s /var/www/data/deathstar/email/deathstar.name/deathstar -d /var/www/data/deathstar/email/deathstar.name/deathstar/.maildir/

Где /var/www/data/deathstar/email/deathstar.name/deathstar — путь до файла mbox,тут же и будет каталог maildir.
Дописываем в конфиг /usr/local/ispmgr/etc/ispmgr.conf рядом с другими Option (после MTA и POP3)
Option MailDir
Заменям конфиг Dovecot

Настройка dovecot:

Заменяем в конфиге с пользователями mbox на maildir:

deathstar# cat dovecot.passwd | \
awk -F\: '{ print $1":"$2":"$3":"$4"::"$6":::maildir:"$6"/.maildir" }' > dovecot.passwd.new
mv dovecot.passwd.new dovecot.passwd

Находим конфиг exim и заменяем в нем строчку
file = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim4/passwd}}}}/mbox
на две строки
directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/etc/exim4/passwd}}}}/.maildir
maildir_format

Перезапускаем сервисы и проверяем работу.

!!!! Из-за неправильного отображения данных конфигов в WordPress выложил их здесь.
Устанавливаем fail2ban
deathstar# cd /usr/ports/secuity/py-fail2ban && make install clean
Правим конфиг
deathstar# ee /usr/local/etc/fail2ban/jail.conf
У меня он выглядит так
[DEFAULT]
# Какие IP игнорировать
ignoreip = 127.0.0.1
# Время бана в секундах
bantime = 600
# время проверки,за которое событие успеет повторится, чтоб отловить и забанить
findtime = 600
# кол-во неверных попыток
maxretry = 1
backend = auto

[ssh-ipfw]
enabled = true
# использовать фильтр из примеров
filter = bsd-sshd
# использовать /action.d/bsd-ipfw.conf
action = ssh-ipfw[localhost=78.24.219.97]
# Уведомление в Jabber :))
jabber-whois[name="SSH,IPFW", dest=deathstar@deathstar.name]
# Какой лог парсить
logpath = /var/log/auth.log
# Какой Ip игнорировать
ignoreip = 127.0.0.1

[exim-ipfw]
enabled = true
filter = exim
action = exim-ipfw[localhost=78.24.219.97]
jabber-whois[name="Exim,IPFW", dest=deathstar@deathstar.name]
logpath = /var/log/exim/mainlog
ignoreip = 127.0.0.1

[nginx-ipfw]
enabled = true
filter = nginx
action = nginx-ipfw[localhost=127.0.0.1]
jabber-whois[name="Nginx,IPFW", dest=deathstar@deathstar.name]
logpath = /home/deathstar/www/deathstar.name.access.log
ignoreip = 127.0.0.1

Для уведомления в Jabber должен быть установлен и настроен sendxmpp ( о нем я писал в предыдущих статьях)
Создаем файл /usr/local/etc/fail2ban/action.d/jabber-whois.conf с таким содержимым

[Definition]
actionstart = printf %%b "[Fail2Ban] : started
The jail
has been started successfully.\n
" | /usr/local/bin/sendxmpp ""

actionstop = printf %%b "[Fail2Ban] : stopped
The jail
has been stopped.\n
" | /usr/local/bin/sendxmpp ""

actioncheck =

actionban = printf %%b "[Fail2Ban] : banned
The IP
has just been banned by Fail2Ban after
(далее…)