Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Павел Семенец
Строим бюджетный сервер для малых или средних компаний Часть 2
В предыдущей статье я рассказал о настройке Samba в качестве Primary Domain Controller. Сегодня мы поговорим о почтовом сервере Exim и обо всём, что связано с почтой в нашем комплексе.
Собираем антиспам-фильтр DSPAM
srv# cd /usr/posts/mail/dspam
srv# make config
[X] SYSLOG Logs via syslog
[X] DEBUG Enable debugging logging
[X] VERBOSE_DEBUG Enable debug in LOGDIR/dspam.debug
[X] SQLITE3 Use SQLite v3.x as back-end
[X] HASH Use hash driver
[X] TRUSTED_USERS Disable trusted user security
[X] VIRT_USERS Enable virtual users (needs SQL back-end)
[X] DOMAIN_SCALE File structure for multiple domains
[X] EXIM_LDA Use Exim as local delivery agent
|
После выставления опций компиляции требуется отредактировать Makefile. Данная операция необходима для изменения некоторых параметров компиляции, которые невозможно поменять через «make config».
Открываем Makefile в той же директории и ищем следующие строчки:
DSPAM_OWNER?= root
DSPAM_GROUP?= mail
DSPAM_HOME?= ${_VAR_DIR}/db/dspam
и меняем их следующим образом:
DSPAM_OWNER?= exim
DSPAM_GROUP?= exim
DSPAM_HOME?= /usr/local/dspam
Собираем DSPAM:
srv# make all install clean
Настраиваем DSPAM
srv# cat > /usr/local/etc/dspam.conf << EOF
Home /usr/local/dspam
StorageDriver /usr/local/lib/libsqlite3_drv.so
TrustedDeliveryAgent "/usr/local/sbin/exim -oMr spam-scanned" # Exim
OnFail error
Trust root
Trust exim
Trust mail
Trust mailnull
Trust smmsp
Trust daemon
Debug *
TrainingMode notrain
TestConditionalTraining on
Feature chained
Feature tb=5
Feature whitelist
Algorithm graham burton
PValue graham
Preference "spamAction=quarantine"
Preference "signatureLocation=message"
Preference "showFactors=on"
Preference "spamAction=tag"
Preference "spamSubject=SPAM"
AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold
SQLitePragma "synchronous = ON"
HashRecMax 98317
HashAutoExtend on
HashMaxExtents 0
HashExtentSize 49157
HashMaxSeek 100
IgnoreHeader X-Spam-Status
IgnoreHeader X-Spam-Scanned
IgnoreHeader X-Virus-Scanner-Result
Notifications off
PurgeSignatures 14
PurgeNeutral 90
PurgeUnused 90
PurgeHapaxes 30
PurgeHits1S 15
PurgeHits1I 15
LocalMX 127.0.0.1
SystemLog on
UserLog on
Opt out
MaxMessageSize 307200
ProcessorBias on
EOF
Директивы всех последующих файлов настройки были описаны мной в статье «Строим мультидоменный почтовый сервер с защитой от вирусов и спама» опубликованной в журнале «Системный Администратор» №1 за 2006 год (он-лайн версия доступна по ссылке: http://www.samag.ru/cgi-bin/go.pl?q=articles;n=01.2006;a=03). Обращу ваше внимание лишь на вопросы, имеющие отношение к OpenLDAP.
Собираем и конфигурируем Exim
Для того чтобы правильно настроить рассматриваемый MTA, нам понадобятся некоторые дополнительные опции в /etc/make.conf:
srv# pw groupadd exim
srv# pw useradd exim -g exim -d /dev/null -s /usr/sbin/nologin
Выясняем uid и gid созданного нами пользователя:
srv# id exim
uid=1001(exim) gid=1001(exim) groups=1001(exim)
|
Далее редактируем файл /etc/make.conf, вставляя в конец следующие строки:
PORTSDIR? = /usr/ports
.if ${.CURDIR} == {$PORTSDIR}/mail/exim
# Включаем поддержку OpenLDAP
WITH_OPENLDAP = yes
# Включаем автоматическое определение установленной версии OpenLDAP
WITH_OPENLDAP_VER = auto
# Включаем логирование через Syslog
LOG_FILE_PATH?= syslog
# Включаем поддежку сканирования сообщений через content_scan
WITH_CONTENT_SCAN = yes
# Включаем поддержку перекодировки
WITH_ICONV = yes
# Включаем поддержку по методу AUTH PLAIN и AUTH LOGIN
WITH_AUTH_PLAINTEXT = yes
# Устанавливаем кодировку по умолчанию для заголовков письма
WITH_DEFAULT_CHARSET?= koi8-r
# Отключаем поддержку IPV6
WITHOUT_IPV6 = yes
# Указываем, какую версию Berkley DB используем
WITH_DBD_VER? = 4
# Включаем поддержку Perl для внешних скриптов
WITH_PERL = yes
.endif
Собираем Exim:
srv# cd /usr/ports/mail/exim
srv# make all install clean
А теперь начинается самое сложное во всем этом комплексе – это настройка почтового MTA-агента на нормальную работу с OpenLDAP.
Первое, что нужно сделать, – это создать сертификат SSL для шифрования передаваемой информации между клиентом и сервером:
srv# cd /usr/local/etc/exim
srv# mkdir ssl
srv# cd ssl
srv# openssl req -x509 -newkey rsa:1024 -keyout mail.pem -out mail.pem -days 3650 -nodes
Отвечаем на вопросы, после чего меняем права доступа на сертификат:
srv# chmod 0400 mail.pem
srv# chown exim:exim mail.pem
Следующим этапом настройки будет создание собственной схемы в OpenLDAP для MTA Exim. Так как стандартной схемы не существует и Exim можно настроить как вздумается (в гибкости настройки разработчики MTA Exim нас не ограничивают) создаем схему следующего вида:
srv# cat > /usr/local/etc/openldap/schema/exim.schema << EOF
#$Id: exim.schema, v 0,2 2007/09/25
#(C) Created by Darkman
# Attributes
# Тут мы описываем атрибуты, куда будем записывать информацию
# о пользователях, перенаправлениях и всему прочему
# Имя домена.
attributetype ( 1.3.6.1.4.1.100058.1.1.1 NAME 'DName'
DESC 'Mail Domain Name'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# Тип домена (virtual,relay)
attributetype ( 1.3.6.1.4.1.100058.1.1.2 NAME 'DType'
DESC 'Mail Domain Type'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# MX-запись для доменов с типом relay
attributetype ( 1.3.6.1.4.1.100058.1.1.3 NAME 'MXHost'
DESC 'Forward Host Name'
EQUALITY caseIgnoreIA5Match
SUBSTR caseIgnoreIA5SubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# ID-аккаунт
attributetype ( 1.3.6.1.4.1.100058.1.1.4 NAME 'EUid'
DESC 'Exim user id default 1001'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# GID-акаунт
attributetype ( 1.3.6.1.4.1.100058.1.1.5 NAME 'EGid'
DESC 'Exim group id default 1001'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# Пароль акаунта
attributetype ( 1.3.6.1.4.1.100058.1.1.6 NAME 'Pass'
DESC 'User Clear Password'
EQUALITY octetStringMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )
# Имя акаунта
attributetype ( 1.3.6.1.4.1.100058.1.1.7 NAME 'UName'
DESC 'Mail username'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{50} )
# Домашняя директория аккаунта
attributetype ( 1.3.6.1.4.1.100058.1.1.8 NAME 'HomeDir'
DESC 'MailStore Home Dir'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE)
# Статус акаунта (active,disable)
attributetype ( 1.3.6.1.4.1.100058.1.1.9 NAME 'AcStatus'
DESC 'User Account Status (active,disable)'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
# Размер почтового ящика значения, заносится в Мб
attributetype ( 1.3.6.1.4.1.100058.1.1.10 NAME 'QuotaSize'
DESC 'User Quota Size Megabytes'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
# Запись о перенаправлениях почты (используется в таблице aliases)
attributetype ( 1.3.6.1.4.1.100058.1.1.11 NAME 'Rcpt'
DESC 'Aliases To'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# Описание записи
attributetype ( 1.3.6.1.4.1.100058.1.1.12 NAME 'Descr'
DESC 'Description Message'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# Запись об антиспам-фильтре (active,disable)
attributetype ( 1.3.6.1.4.1.100058.1.1.12 NAME 'AntiSpam'
DESC 'Active AntiSpam Service'
EQUALITY caseIgnoreIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
# Object class
# В этой секции файла мы описываем 4 объекта
# (EximVirtualForward, EximVirtualDomain, EximVirtualUser, EximVirtualAliases)
# и группируем атрибуты, описанные выше к каждому создаваемому объекту.
# Атрибуты, указанные в секции MUST (), обязательны к заполнению,
# атрибуты указанные в секции MAY (), не обязательны.
# Объект хранения виртуальных перенаправлений, обслуживаемых сервером
objectclass (1.3.6.1.4.1.100058.1.2.1 NAME 'EximVirtualForward'
SUP top STRUCTURAL
DESC ''
MUST ( Uname $ DName $ MXHost )
MAY ( Descr ))
# Объект хранения виртуальных доменов
# обслуживаемых сервером
objectclass (1.3.6.1.4.1.100058.1.2.2 NAME 'EximVirtualDomain'
SUP top STRUCTURAL
DESC ''
MUST ( DName $ DType )
MAY ( Descr ))
# Объект хранения виртуальных пользователей почтовой системы
objectclass (1.3.6.1.4.1.100058.1.2.3 NAME 'EximVirtualUser'
SUP top STRUCTURAL
DESC ''
MUST ( EUid $ EGid $ Pass $ UName $ HomeDir $ DName $ AcStatus $ QuotaSize $ AntiSpam)
MAY ( Descr ))
# Объект хранения алиасов пользователей почтовой системы
objectclass (1.3.6.1.4.1.100058.1.2.4 NAME 'EximVirtualAliases'
SUP top STRUCTURAL
DESC ''
MUST ( UName $ Rcpt $ DName )
MAY ( Descr ))
EOF
Так как более детальное описание данного файла выходит за пределы этой статьи и представляет самостоятельную тему для обсуждения, обратитесь к официальной документации по настройке сервера OpenLDAP за более подробной информацией.
Добавляем схему к OpenLDAP-серверу
srv# cd /usr/local/etc/openldap
Окрываем файл slapd.conf на редактирование и добавляем после строчки:
include /usr/local/etc/openldap/schema/dnsdomain2.schema
еще одну строку:
include /usr/local/etc/openldap/schema/exim.schema
сохраняем файл и перезапускаем сервисы:
srv# cd /usr/local/etc/rc.d/
srv# ./010.slapd.sh restart
srv# ./020.pdns.sh restart
srv# ./015.pdnsr.sh restart
srv# ./025.samba.sh restart
Создаем файл для заполнения хранилища почтового сервера
srv# cat > /usr/local/etc/ldapfiles/mail_base.ldiff << EOF
# Ветка для хранения записей почтового сервера
dn: ou=mail,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: mail
# Ветка для хранения записей о доменах, обслуживаемых MTA
dn: ou=domains,ou=mail,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: domains
# Ветка для хранения записей о виртуальных аккаунтах почтового сервера
dn: ou=users,ou=mail,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: users
# Ветка для хранения записей о алиасах почтового сервера
dn: ou=aliases,ou=mail,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: aliases
# Ветка для хранения записей о перенаправлениях почтового сервера
dn: ou=forward,ou=mail,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: forward
# Виртуальный домен example.com
dn: DName=example.com,ou=domains,ou=mail,dc=example,dc=com
objectClass: top
objectClass: EximVirtualDomain
DName: example.com
DType: virtual
Descr: Example Mail Domain
# alias перенаправления почты (postmaster@exampl.com to root@exampl.com)
dn: UName=postmaster,ou=aliases,ou=mail,dc=example,dc=com
objectClass: top
objectClass: EximVirtualAliases
UName: postmaster
Rcpt: root
Dname: example.com
# alias перенаправления почты (abuse@exampl.com to postmaster@exampl.com)
dn: UName=abuse,ou=aliases,ou=mail,dc=example,dc=com
objectClass: top
objectClass: EximVirtualAliases
UName: abuse
Rcpt: postmaster
DName: example.com
# alias перенаправления почты (info@example.com to postmaster@exampl.com)
dn: UName=info,ou=aliases,ou=mail,dc=example,dc=com
objectClass: top
objectClass: EximVirtualAliases
UName: info
Rcpt: postmaster
Dname: example.com
# Виртуальный пользователь root@example.com
dn: UName=root,ou=users,ou=mail,dc=example,dc=com
objectClass: top
objectClass: EximVirtualUser
UName: root
DName: example.com
EUid: 1001
EGid: 1001
Pass: passwd
HomeDir: /usr/local/vmail/example.com/root
AcStatus: active
AntiSpam: active
QuotaSize: 300
# Виртуальный пользователь test@example.com
dn: UName=test,ou=users,ou=mail,dc=example,dc=com
objectClass: top
objectClass: EximVirtualUser
UName: test
DName: example.com
EUid: 1001
EGid: 1001
Pass: passwd1
HomeDir: /usr/local/vmail/example.com/test
AcStatus: active
AntiSpam: active
QuotaSize: 300
EOF
Добавляем записи в OpenLDAP:
srv# ldapadd -x -D "cn=root,dc=example,dc=com" -w password -f mail_base.ldiff
add new entry "ou=mail,dc=example,dc=com"
...........
|
После этого мы получили в базе OpenLDAP данные, взаимосвязанные следующим образом:
dc=exmaple,dc=com
|--ou=mail,dc=example,dc=com
|--ou=domain,ou=mail,dc=example,dc=com
| |--Dname=example,ou=domain,ou=mail,dc=example,dc=com
|
|--ou=aliases,ou=mail,dc=example,dc=com
| |--Uname=postmaster,ou=aliases,ou=mail,dc=example,dc=com
| |--Uname=abuse,ou=aliases,ou=mail,dc=example,dc=com
| |--Uname=info,ou=aliases,ou=mail,dc=example,dc=com
|
|--ou=foreward,ou=mail,dc=example,dc=com
|
|--ou=users,ou=mail,dc=example,dc=com
|--Uname=root,ou=users,ou=mail,dc=example,dc=com
|--Uname=test,ou=users,ou=mail,dc=example,dc=com
|
Далее нам надо настроить MTA Exim для поиска учетной информации в этой структуре.
Создаем файл конфигурации MTA:
srv# cat > /usr/local/etc/exim/configure << EOF
Листинг файла вы найдете в разделе «Исходный код» на сайте www.samag.ru.
Давайте разберем, почему это все выглядит так страшно на первый взгляд. Для начала расскажу об особенностях поиска в OpenLDAP.
Существует три типа поиска LDAP в MTA Exim. Они ведут себя по-разному, когда обрабатывают результаты запроса:
- ldap – результат поиска должен возвращать только один элемент, иначе выдается ошибка;
- ldapdn – результат запроса содержит только один элемент, но при этом запрос должен вернуть dn, а не любые атрибуты со значением;
- ldapm – результат может содержать множество элементов, запрос возвращает все найденные элементы.
С запросами немножко сложнее. Для понимания приведу аналогию с SQL-запросом выборки из моей статьи.
Выборка обслуживаемых доменов:
SQL:
# Начало поиска
${
# Указываем, какой драйвер использовать для поиска
lookup mysql{
# Запрос в MySQL проверяет, существует ли запись
# в таблице domains о домене подключившегося
# пользователя с типом virtual
SELECT domain FROM domains WHERE domain='${domain}' AND type='virtual'
}
}
# Конец поиска
LDAP:
# Начало поиска
${\
# Указываем серверу о дополнительной обработке
# полученных результатов
sg{\
${\
# Указываем, какой драйвер использовать для поиска
lookup ldapm{\
# Макрос подключения
LDAP_AUTH \
# Указываем, в какой ветке OpenLDAP ищем
ldap:///ou=domains,ou=mail,dc=example,dc=com?\
# Указываем серверу, какой атрибут искать
DName?\
# Указываем серверу дополнительные критерии поиска
sub?\
# Описываем фильтр поиска в атрибутах записи
(&(objectClass=EximVirtualDomain)(DType=virtual))\
}\
}\
}\
# Выполняем обработку полученных результатов в данном случае
# заменяем символы конца строки «\n» на двоеточие « : »
{\n}{ : }\
}
# Конец запроса
Дополнительная обработка результатов требуется для приведения возвращаемых данных в надлежащий формат: ou=domains,ou=mail,dc=example,dc=com.
Будет содержаться 2 и более записей о доменах к примеру:
DName=example.com,ou=domains,ou=mail,dc=example,dc=com
DName=test.com,ou=domains,ou=mail,dc=example,dc=com
Отсюда тип поиска ldapm вернет их в следующем виде:
что в свою очередь не приемлемо для MTA Exim в директиве «domainlist local_domains». Для этого мы и производим замену конца cтроки на двоеточие, в конечном итоге получая:
domainlist local_domains = example.com : test.com |
Собираем ClamAV
srv# cd /usr/ports/secutiry/clamav
srv# make all install clean
[X] ARC Enable Arch arcvihe support
[X] ARJ Enable Arj arcvihe support
[X] LHA Enable LHA arcvihe support
|
Кофигурируем CamAV:
srv# cat > /usr/local/etc/clamd.conf << EOF
LogFile /var/log/clamav/clamd.log
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/db/clamav
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
User clamav
AllowSupplementaryGroups yes
ScanOLE2 yes
ScanMail yes
ScanHTML yes
ScanArchive yes
ArchiveMaxFileSize 15M
ArchiveMaxRecursion 10
ArchiveMaxFiles 1500
EOF
srv#cat > /usr/local/etc/freshclam.conf << EOF
DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose yes
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror database.clamav.net
NotifyClamd /usr/local/etc/clamd.conf
Debug yes
EOF
Запускаем ClamAV и Exim:
srv# cd /usr/local/etc/rc.d
srv# mv clamav_freshclam.sh 030.freshclam.sh
srv# mv clamav-clamd.sh 035.clamd.sh
srv# mv exim 040.exim.sh
Добавляем в файл /etc/rc.conf строчки для запуска антивирусного фильтра и почтового сервера:
clamav_freshclam_enable="YES"
clamav_clamd_enable="YES"
exim_enable="YES"
Запускаем сервисы:
srv# /usr/local/etc/rc.d/030.freshclam.sh start
srv# /usr/local/etc/rc.d/035.clamd.sh start
srv# /usr/local/etc/rc.d/040.exim.sh start
Cоздаем директорию, в которой будем хранить почту наших пользователей:
srv# mkdir /usr/local/vmail
srv# chown exim:exim /usr/local/vmail /var/spool/clientmqueue /var/spool/mqueue
Прверяем правильность настройки MTA. Для этого отправим письмо сами себе:
srv# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.test.com ESMTP Exim 4.53 Wed, 19 Oct 2005 16:49:58 +0400
ehlo mail.example.com
250-mail.example.com Hello localhost.example.com [127.0.0.1]
250-SIZE 10485760
250-PIPELINING
250-AUTH PLAIN LOGIN
250 HELP
mail from:user@example.com
250 OK
rcpt to:user@example.com
250 Accepted
data
354 Enter message, ending with "." on a line by itself
test
.
250 OK
quit
|
Следующим этапом проверяем методы аутентификации. Для каждой проверки с помощью Perl будем кодировать аутентификационный запрос согласно используемому методу.
Метод AUTH PLAIN:
srv# perl -MMIME::Base64 -e 'print encode_base64 ("root\@example.com\0root\@example.com\0passwd");'
DXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk==
|
Полученная строка и является нашей строкой аутентификации. Проверим это:
srv# telnet localhost 25
Trying localhost...
Connected to localhost.
Escape character is '^]'.
220 mail.example.com ESMTP Exim 4.53 Wed, 19 Oct 2005 16:49:58 +0400
ehlo mail.example.com
..................
..................
AUTH PLAIN DXNlckB0ZXN0LmNvbQB1c2VyQHRlc3QuY29tAHBhc3N3b3Jk==
235 Authentication succeeded
quit
|
Метод AUTH LOGIN:
# perl -MMIME::Base64 -e 'print encode_base64("root\@example.com");'
dXNlckB0ZXN0LmNvbQ==
# perl -MMIME::Base64 -e 'print encode_base64("passwd");'
dXNlckB0ZXN0LmNvbQ==
Проверяем:
srv# telnet localhost 25
Trying localhost...
Connected to localhost.
Escape character is '^]'.
220 mail.example.ru ESMTP Exim 4.68 Fri, 28 Sep 2007 18:12:15 +0400
ehlo mail.example.com
..................
..................
AUTH LOGIN
334 VXNlcm5hbWU6
dXNlckB0ZXN0LmNvbQ==
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 Authentication succeeded
quit
|
Проверяем SSL:
srv# openssl
srv# OpenSSL > s_client -host localhost -port 465
Если SSL-соединение прошло упешно, то мы с вами увиди приглашение Exim:
220 mail.example.ru ESMTP Exim 4.68 Fri, 28 Sep 2007 18:12:15 +0400 |
Собираем и конфигурируем Courier-IMAP
srv# cd /usr/ports/mail/courier-imap
srv# make all install clean
[X] OPENSSL Build with OpenSSL support
[X] TRASHQUOTA Include deleted mails in the quota
[X] AUTH_LDAP LDAP support
|
srv# cat > /usr/local/etc/auth-lib/authdaemonrc << EOF
authmodulelist="authldap"
authmodulelistorig="authldap"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=2
DEFAULTOPTIONS="wbnodsn=1"
LOGGEROPTS=""
EOF
srv# cat > /usr/local/etc/auth-lib/authldaprc << EOF
# Указываем, где находится OpenLDAP
LDAP_URI ldap://localhost
# Указываем, какую версию протокола используем
LDAP_PROTOCOL_VERSION 3
# Указываем, где искать информацию об акаунтах
# пользователей почтового сервера
LDAP_BASEDN ou=users,ou=mail,dc=example,dc=com
# Указываем, под каким пользователем подключаемся к OpenLDAP
LDAP_BINDDN cn=root,dc=example,dc=com
# Указываем, какой пароль у вышеуказанного пользователя
LDAP_BINDPW password
LDAP_TIMEOUT 5
# Так как пользователи виртуальные, отключаем
# авторизацию всех остальных пользователей на сервере
LDAP_AUTHBIND 0
# Указываем, в каком атрибуте находится логин пользователя
LDAP_MAIL UName
# Указываем фильтр для поиска
LDAP_FILTER (objectClass=EximVirtualUser)(AcStatus=active)
# Указываем uid и gid пользователей глобально
# для всего сервера
LDAP_GLOB_UID exim
LDAP_GLOB_GID exim
# Указываем атрибут домашней директории пользователя
LDAP_HOMEDIR HomeDir
# Указываем атрибут почтовой директории пользователя
LDAP_MAILDIR HomeDir
# Указываем атрибут, где хранится Квота на использование почтового ящика
LDAP_MAILDIRQUOTA QuotaSize
# Указываем атрибут хранения пароля
LDAP_CLEARPW Pass
LDAP_DEREF never
# Отключаем SSL-соединение с сервером
LDAP_TLS 0
# Разбиваем логин пользователя на составляющие,
# к примеру root@example.com будет разбит
# на #Uname=root,DNAme=example.com
LDAP_EMAILMAP (&(UName=@user@)(DName=@realm@))
# Указываем где и как искать информацию о почтовом
# ящике пользователя
LDAP_EMAILMAP_BASEDN ou=users,ou=mail,dc=example,dc=com
LDAP_EMAILMAP_ATTRIBUTE UName
LDAP_EMAILMAP_MAIL Uname
EOF
Добавляем строки в rc.conf для запуска Courier-IMAP:
courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_ssl_enable="YES"
courier_imap_imapd_enable="YES"
courier_imap_pop3d_ssl_enable="YES"
Конфигурируем сервисы pop3 и imap:
srv# cd /usr/local/etc/courier-imap
Настраиваем imap:
srv# cat > imapd << EOF
# Вписываем в файл следующее содержимое
ADDRESS=0
PORT=143
MAXDAEMONS=40
MAXPERIP=4
PIDFILE=/var/run/imapd.pid
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=imapd"
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
IMAP_KEYWORDS=1
IMAP_ACL=1
IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"
IMAP_PROXY=0
IMAP_PROXY_FOREIGN=0
IMAP_IDLE_TIMEOUT=60
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
IMAP_DISABLETHREADSORT=0
IMAP_CHECK_ALL_FOLDERS=0
IMAP_OBSOLETE_CLIENT=0
IMAP_UMASK=022
IMAP_ULIMITD=65536
IMAP_USELOCKS=1
IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index
IMAP_ENHANCEDIDLE=0
IMAP_TRASHFOLDERNAME=Trash
IMAP_EMPTYTRASH=Trash:7
IMAP_MOVE_EXPUNGE_TO_TRASH=0
SENDMAIL=/usr/sbin/sendmail
HEADERFROM=X-IMAP-Sender
IMAPDSTART=YES
MAILDIRPATH=Maildir
EOF
Настраиваем imap-ssl:
srv#cat > imapd-ssl << EOF
SSLPORT=993
SSLADDRESS=0
SSLPIDFILE=/var/run/imapd-ssl.pid
SSLLOGGEROPTS="-name=imapd-ssl"
IMAPDSSLSTART=YES
IMAPDSTARTTLS=YES
IMAP_TLS_REQUIRED=0
COURIERTLS=/usr/local/bin/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/usr/local/etc/courier-imap/shared/imapd.pem
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/usr/local/var/couriersslcache
TLS_CACHESIZE=524288
MAILDIRPATH=Maildir
EOF
Настраиваем pop3:
srv#cat > pop3d << EOF
PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
MAXPERIP=4
POP3AUTH=""
POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256"
POP3AUTH_TLS=""
POP3AUTH_TLS_ORIG="LOGIN PLAIN"
POP3_PROXY=0
PORT=110
ADDRESS=0
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=pop3d"
POP3DSTART=YES
MAILDIRPATH=Maildir
EOF
Конфигурируем pop3-ssl:
srv#cat > pop3d-ssl << EOF
SSLPORT=995
SSLADDRESS=0
SSLPIDFILE=/var/run/pop3d-ssl.pid
SSLLOGGEROPTS="-name=pop3d-ssl"
POP3DSSLSTART=YES
POP3_STARTTLS=YES
POP3_TLS_REQUIRED=0
COURIERTLS=/usr/local/bin/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/usr/local/etc/courier-imap/shared/pop3d.pem
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/usr/local/var/couriersslcache
TLS_CACHESIZE=524288
MAILDIRPATH=Maildir
EOF
Настраиваем сертификаты ssl:
srv# cat > imapd.cnf << EOF
RANDFILE = /usr/local/share/courier-imap/imapd.rand
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
[ req_dn ]
C=RU
ST=RU
L=Moscow
O=Exim Super Secure Server
OU= IMAP SSL Key
CN=mail.baby-country.ru
emailAddress=postmaster@example.com
[ cert_type ]
nsCertType = server
EOF
srv#cat > pop3d.cnf << EOF
RANDFILE = /usr/local/share/courier-imap/pop3d.rand
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
[ req_dn ]
C=RU
ST=RU
L=Moscow
O=Exim Super Secure Server
OU= POP3 SSL Key
CN=mail.baby-country.ru
emailAddress=postmaster@example.ru
[ cert_type ]
nsCertType = server
EOF
Создаем сетрификаты:
srv# cd /usr/local/share/courier-imap
srv# ./mkimapdcert
srv# ./mkpop3dcert
Копируем созданные сертификаты:
srv# cp imapd.pem /usr/local/etc/courier-imap/shared
srv# cp pop3d.pem /usr/local/etc/courier-imap/shared
Меняем права доступа:
srv# cd /usr/local/etc/courier-imap/shared
srv# chmod 0600 *
Запускаем Courier-IMAP
Переименовываем скрипты для запуска:
srv# cd /usr/local/etc/rc.d
srv# mv courier_authdaemond.sh 045.courier-auth.sh
srv# mv courier_imap_imapd.sh 050.courier-imap.sh
srv# mv courier_imap_pop3d.sh 055.courier-pop3d.sh
srv# mv courier_imap_imapd_ssl 060.courier-imaps.sh
srv# mv courier_imap_pop3d_ssl 065.courier_pop3ds.sh
Запускаем сервисы:
srv# ./045.courier-auth.sh start
srv# ./050.courier-imap.sh start
srv# ./055.courier-pop3d.sh start
srv# ./060.courier-imaps.sh start
srv# ./065.courier_pop3ds.sh start
Проверяем конфигурацию Courier-IMAP
Проверяем работу Courier-IMAP по протоколу POP3:
srv# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to mail.example.com.
Escape character is '^]'.
+OK Hello there.
user root@example.com
+OK Password required.
pass password
+OK logged in.
list
quit
|
Проверяем работу Courier-IMAP по протоколу IMAP:
srv# telnet 127.0.0.1 143
Trying 127.0.0.1...
Connected to mail.example.com.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA
IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready.
Copyright 1998-2005 Double Precision, Inc.
See COPYING for distribution information.
a001 login user@example.com passwd
a001 OK LOGIN Ok. # ответ сервера
a001 logout
* BYE Courier-IMAP server shutting down
a001 OK LOGOUT completed
Connection closed by foreign host.
|
Проверяем работу Courier-IMAP по протоколу POP3 через SSL-соединение:
srv# openssl
OpenSSL> s_client -host localhost -port 995
.....
.....
.....
Connected to mail.example.com.
+OK Hello there.
quit
|
Проверяем работу Courier-IMAP по протоколу IMAP через SSL-соединение:
OpenSSL> s_client -host localhost -port 993
......
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA
IDLE AUTH=PLAIN ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2005 Double Precision, Inc.
See COPYING for distribution information.
a001 login root@example.com passwd
a001 OK LOGIN Ok. // ответ сервера
a001 logout
* BYE Courier-IMAP server shutting down
a001 OK LOGOUT completed
closed
|
Ну вот и все, теперь можно создавать учетные записи пользователей почтовой системы.
Предупреждение! В данной конфигурации у антиспама отключена возможность автоматического обучения. Это сделано потому, что наблюдение за работой антиспам-фильтра в режиме автоматического обучения привело к выводу, что пользователи забывают следить за своим антиспам-фильтром или себя этим не утруждают, а настраивать фильтр глобально на весь сервер некорректно, поскольку у каждого пользователя разные понятия что такое спам, а что не спам. В связи с этим следует предупредить ваших пользователей, что все письма, которые являются спамом для них, требуется пересылать на почтовый ящик spam@example.com, а ошибочно помеченные как спам – на ящик nospam@example.com (в соответствие с настройками данной конфигурации).
Заключение
Итак, давайте разберем, что же мы получили в результате наших действий:
- гибкий в настройке и управлении почтовый сервер;
- защиту от вирусов;
- защиту от спама.
В следующей статье мы с вами поговорим про настройку proxy-сервера с собственной системой авторизации, разграничения доступа к сети Интернет, с ограничением трафика.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|