Защищенная почтовая система

1. Введение.
Данный текст описывает создание защищенной почтовой системы, созданной с использованием: openssl, MySQL, Postfix, Cyrus-SASL, Courier-IMAP, Dr.Web CA/Server/User Certificates. 

Все нижеприведенное собрано на FreeBSD 4.9, но все это так же работает и на Linux.

2. Отказ от обязательств.
Всё, что описано в данном тексте вы используете на свой страх и риск. Я, как автор за ваши действия и любые потери, связанные с ними ответственности не несу.

3. Ссылки.
В данном how-to использовался материал:
* ISPMail-HOWTO. v.2.0 http://www.multik.ru/linux/ispmailv2
* Настройка postfix с возможностью шифрования и защиты от вирусов и спама (mail postfix freebsd imap cyrus sasl ssl virus spam tls mysql) http://www.opennet.ru/base/net/postfix_tls.txt.html

4. Openssl
Устанавливаем openssl из портов

# cd /usr/ports/security/openssl
# make all install clean

Для установки из исходников:

# tar zxvf openssl-0.9.7d.tar.gz
# cd openssl-0.9.7d
# make && make test && make install

далее необходимо прописать путь до новых библиотек openssl

# echo «/usr/local/ssl/lib» >> /etc/ld.so.conf

В большинстве дистрибутивов openssl устанавливается по умолчанию, так что можете воспользоваться и старыми библиотеками.

После установки openssl необходимо поправить openssl.cnf который лежит /usr/local/openssl/

--------------------------------------openssl.cnf----------- ------------------------------
[ CA_default ]

dir =. # Это каталог для работы с ssl
certs = $dir # Это где будут лежать сертификаты
crl_dir = $dir # Это где будут листы «отзывов подписей»
database = $dir/index.txt # Здесь index file для индексирования запросов на подпись
new_certs_dir = $dir # Сюда будут писать новые сертификаты
certificate = $dir/cacert.pem # Корневой сертификат
serial = $dir/serial # Серийный номер запроса
crl = $dir/crl.pem # Текущий лист отзывов подписей
private_key = $dir/ca.key # Секретный ключ для основного сертификата
RANDFILE = $dir/.rand #

default_days = 3650 # Количество дней действия сертификата
default_md = md5 # метод шифрования

[ req ]
# Секция основных опций
prompt = no # Брать параметры из конфига не интерактивный режим.
Если не указывать prompt no, то значения для параметров будут с читаны в интерактивном режиме (то бишь с клавиатуры), а значения параметров будут являться подсказками при вводе данных

[ req_distinguished_name ]
# В данной секции вносим свои данные которые будут использоваться по умолчанию при генерации запроса на подписание сертификата.
countryName = Country Name (2 letter code)
countryName_default = RU
countryName_min = 2
countryName_max = 2

stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Russian

localityName = Locality Name (eg, city)
localityName_default = Название города

0.organizationName = Organization Name (eg, company)
0.organizationName_default = Название организации

organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = ОТДЕЛ

[ usr_cert ]

basicConstraints=CA:FALSE
nsCertType = client, email
nsComment = «OpenSSL Generated Certificate „

[ v3_req ]

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]

subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true
nsCertType = sslCA, emailCA
------------------------------------------------------------ ----------------------------------

Дополнительные свойства, описанные в скрипте [v3_req] означают, что клиент может использовать сертификат для подписывания и шифрации, но его сертификат не является CA сертификатом. Для CA сертификата значение basicConstraits должно быть равно CA:TRUE (это обязательно!).
Поле nsCertType определяет дополнительные назначения данного ключа.
Для CA сертификатов обычно применяют следующие значения nsCertType: sslCA, emailCA.
Для ssl ключей серверов используется значение nsCertType = server
Полученный таким образом сертификат клиента будет содержать информацию о поставщике сертификата
Клиенту необходимо еще и перевести сертификаты в формат PKCS#12.

С настройкой openssl вроде разобрались, теперь приступим к созданию самих сертификатов.

Сначала генерируется закрытый ключ для будущего корневого сертификата:

# openssl genrsa -des3 -out ca.key 1024

des3 означает, что ключ будет зашифрован по алгоритму Triple-DES
ca.key — имя файла ключа
1024 — длина ключа в битах, не рекомендуется устанавливать ее больше данного значения, иначе могут быть проблемы с некоторыми реализациями SSL

После того как ключ будет сгенерирован Вам предложат ввести для него пароль. Он должен отвечать Вашим требованиям безопасности, т.к. от длинны пароля зависит стойкость всех сертификатов подписанным вашим СА. Если вы забудете пароль, то не сможете выдавать новые сертификаты. Фактически, это означает, что ваш СА станет непригоден для использования, и вам нужно будет создавать его заново, а также выдать заново все клиентские сертификаты.

Затем создается собственно корневой сертификат ЦС. Корневой сертификат будет само подписанным, потому что он находится выше всех в создаваемой иерархии:

# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

-days 3650 — это количество дней от текущего дня, в течение этого срока сертификат будет считаться действующим.
ca.key — имя файла с закрытым ключом,созданным на предыдущем шаге
ca.crt — имя файла, в который будет записан созданный корневой сертификат ЦС.

В процессе создания сертификата вам будут задавать вопросы об информации, которая будет указана в созданном сертификате, обязательным является только ответ на Common Name, где имеет смысл указать название вашего ЦС.
Теперь есть пара из корневого сертификата ЦС и его закрытого ключа, и можно создать сертификаты для сервера и клиентов.

Начнем с сервера. Генерируем закрытый ключ:

# openssl genrsa -out server.key 1024

Ключ будет записан в файл server.key.

Генерируем запрос на сертификат:

# openssl req -new -key server.key -out server.csr

На этом этапе вам снова предложат заполнить информационные поля
сертификата. В поле Common Name следует указать полное определенное доменное имя (FQDN) вашего сервера (что-то вроде mail.sercer.home.ru или ip) чтобы почтовый клиент не выдавал предупреждение о неверности имени.

И наконец, выдаем сертификат и подписываем его закрытым ключом корневого ЦС:

# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

Вас попросят ввести пароль к закрытому ключу ЦС. Сертификат будет выдан на 3650 дней.
Ключ -CAcreateserial нужен для того, чтобы OpenSSL вел учет выдаваемым сертификатам в своей внутренней базе.
Файл запроса на сертификат server.csr можно удалить, скорее всего, он больше вам не понадобится.

Таким же образом генерируем сертификат для клиента, мне было лень постоянно набирать команды и быстренько накропал небольшой скриптик. Вот он сам:

------------------------------------------crt.sh------------ ------------------------------
#!/bin/sh
echo „Создаем сертификат для $1“
openssl genrsa -out $1.key 1024
openssl req -new -key $1.key -out $1.csr
# Вас попросят заполнить данные в поле Common Name для клиента можно вносить то что считаете нужным
openssl x509 -req -days 365 -in $1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out $1.crt
# здесь попросят ввести пароль на ключ корневого сертификата
openssl pkcs12 -export -inkey $1.key -certfile ca.crt -in $1.crt -out $1.p12
# Дальше Вас попросят ввести пароль, который понадобится впоследствии при установке этого сертификата (р12) на компьютер Windows.
openssl x509 -fingerprint -in $1.crt |grep MD5 |cut -d“=„ -f2 >>/usr/local/etc/postfix/relay_clientcerts
# Дальше это внесение хеша MD5 в базу для relay в файл relay_clientcerts
echo $1 $1mail.mydomain.ru >>/usr/local/etc/postfix/relay_clientcerts
echo „Сертификат для $1 создан“
------------------------------------------------------------ ----------------------------------

Ну вот с сертификатами закончили.

5. Установка MySQL

# cd /urs/ports/databases/mysql40-server
# make all install clean

Описание установки MySQL под Linux можно взять в статье „multik“ http://www.multik.ru/linux/ispmailv2 по установке mysql ни каких проблем не возникло.
Далее создаем почтовую базу (mail)

# mysql -u root
> create database mail;
> use mail;

создаем таблицу ссылок

> CREATE TABLE alias (
address varchar (255) NOT NULL default '',
goto text NOT NULL,
domain varchar (255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint (4) NOT NULL default '1',
PRIMARY KEY (address),
KEY address (address)
) TYPE=MyISAM COMMENT='Postfix Admin — Virtual Aliases';

Добавляем записи в таблицу

> INSERT INTO alias VALUES ('root@mydomain.ru','admin@mydomain.ru','','0000-00-00 00:00:00','0000-00-00 00:00:00',1);

Создаем таблицу обслуживаемых доменов

> CREATE TABLE domain (
domain varchar (255) NOT NULL default '',
description varchar (255) NOT NULL default '',
aliases int (10) NOT NULL default '-1',
mailboxes int (10) NOT NULL default '-1',
maxquota int (10) NOT NULL default '-1',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint (4) NOT NULL default '1',
PRIMARY KEY (domain),
KEY domain (domain)
) TYPE=MyISAM COMMENT='Postfix Admin — Virtual Domains';

Тоже добавим запись

> INSERT INTO domain VALUES ('mydomain.ru','My Domains',-1,-1,-1,'0000-00-00 00:00:00','0000-00-00 00:00:00',1);

Создаем таблицу с пользователями

> CREATE TABLE mailbox (
id int (11) NOT NULL default '0',
username varchar (255) NOT NULL default '',
password varchar (255) NOT NULL default '',
name varchar (255) NOT NULL default '',
maildir varchar (255) NOT NULL default '',
quota int (10) NOT NULL default '-1',
domain varchar (255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint (4) NOT NULL default '1',
PRIMARY KEY (id),
KEY username (id)
) TYPE=MyISAM COMMENT='Postfix Admin — Virtual Mailboxes';

Внесем в нее запись

> INSERT INTO mailbox VALUES (1500,'admin@mydomain.ru','password','admin','/var/spool/postfix/vmail/admin@mydomain.ru/',-1,'','2004-05-24 02:10:00','0000-00-00 00:00:00',1);

Устанавливаем ограничения на доступ к базе

> grant select on mail.* mail@localhost indentified by 'password';

На этом с mysql все.


6. Cyrus-sasl2

# cd /usr/ports/security/cyrus-sasl2
# make -DWITH_MYSQL -DWITHOUT_OTP -DWITHOUT_CRAM -DWITHOUT_DIGEST -DWITHOUT_NTLM
после того, как cyrus-sasl2 собрался, то стандартно:
# make install clean

Для Linux:
Так же воспользуемся статьей „multik“ http://www.multik.ru/linux/ispmailv2
При установке ни каких проблем не возникло.
После того как пакет установился создаем символьную ссылку

# ln -s /usr/local/lib/sasl2 /usr/lib/sasl2

Это позволит в дальнейшем избежать разного рода неприятностей.
В /usr/local/lib/sasl2 создаем файл smtpd.conf следующего содержания:

----------------------------------------------smtpd.conf---- ---------------------------
pwcheck_method: auxprop
password_format: crypt
sql_engine: mysql
sql_user: admin
sql_passwd: password
sql_hostnames: localhost
sql_database: mail
sql_select: select password from mailbox where username='%u@mydomaun.ru'
sql_verbose: yes
log_level: 9
------------------------------------------------------------ ------------------------------

Ну вот с cyrus-sasl2 мы и закончили.

7. Теперь переходим непосредственно к Postfix

Устанавливаем из портов
# cd /usr/ports/mail/postfix && make all install clean

При установке в меню выбираем поддержку SASL2, TLS и MYSQL.
Если есть необходимость в персональных почтовых квотах, то в версии 
2.1.5 появился пункт VDA.

Затем в /etc/rc.conf исправим:

sendmail_enable=„NONE“
inetd_enable=„NO“

затем правим в /etc/defaults/periodic.conf::

daily_clean_hoststat_enable=„NO“
daily_status_mail_rejects_enable=„NO“
daily_status_include_submit_mailq=„NO“
daily_submit_queuerun=„NO“

далее сделаем симлинк для автоматического запуска postfix во время
загрузки системы:

# cd /usr/local/etc/rc.d
# ln -s /usr/local/sbin/postfix postfix.sh

Для Linux необходимо скачать postfix-2.1.5.tar.gz + 
pfixtls-0.8.18-2.1.0-0.9.7d.tar.gz + postfix-2.1.5-trash.patch.gz
(postfix-2.1.5-trash.patch.gz качаем вот отсюда 
http://web.onda.com.br/nadal/) 

и стандартно

# tar zxvf postfix-2.1.5.tar.gz
# tar zxvf pfixtls-0.8.18-2.1.0-0.9.7d.tar.gz
# tar zxvf postfix-2.1.5-trash.patch.gz

затем накладываем патч

# patch -p0 < pfixtls-0.8.18-2.1.0-0.9.7d/pfixtls.diff
# patch –p1 < postfix-2.1.5-trash.patch
# cd / postfix-2.1.5
# make -f Makefile.init makefiles
'CCARGS=-DDEF_SAMPLE_DIR=\“/etc/mail/sample\» -DHAS_MYSQL
-I/opt/mysql/include/mysql -DUSE_SASL_AUTH -I/usr/local/include/sasl 
-DUSE_SSL
-I/usr/local/ssl/include' 'AUXLIBS=-L/opt/mysql/lib/mysql -lmysqlclient
-L/usr/local/lib -lsasl2 -lz -lm -L/usr/local/ssl/lib -lssl -lcrypto'

Если Вы используете установленные из дистрибутива openssl и mysql, то 
необходимо поправить пути.

После установки правим /usr/local/etc/postfix/main.cf (в linux это 
/etc/postfix/main.cf)

---------------------------------------main.cf---------------------------------------- 

#============ General Section ================================

queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
mail_owner = postfix
setgid_group = maildrop
unknown_local_recipient_reject_code = 450
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix/samples
sendmail_path = /usr/local/sbin/sendmail
mailq_path = /usr/local/bin/mailq

#============ Alias Section ==================================

alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases

#=========== Host Section ===================================

myhostname = mail.mydomain.ru
mydomain = mydomain.ru
mynetworks = 127.0.0.0/8
myorigin = $mydomain
mydestantion = $myhostname, localhost.$mydomain, $mydomain

#========= Debug Section ==================================

debug_peer_level = 9
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5

#=========== SQL Section ====================================
# В данной секции описываем где лежать конфигурационные файлы для 
виртуального сервера.

virtual_mailbox_base = /
virtual_transport_maps = hash:/usr/local/etc/postfix/sql/transport
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/sql/domains.mysql
virtual_alias_maps = mysql:/usr/local/etc/postfix/sql/alias.mysql
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/sql/mailbox.mysql
virtual_uid_maps = mysql:/usr/local/etc/postfix/sql/uid.mysql
virtual_minimum_uid = 1000 # Это min uid пользователя
virtual_gid_maps = static:126 # Это номер группы maildrop

#============ Access Section =================================
# включаем плагин sasl2 для smtpd авторизации
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
# Указываем путь где лежит конфиг для sasl
smtp_sasl_password_maps = mysql:/usr/local/etc/postfix/sql/sasl.mysql

smtp_use_tls = yes # использовать transport layer security для отправки 
почты
smtpd_tls_auth_only = yes # включать возможность авторизации только в 
режиме tls. Для полного шифрования всего трафика используйте опцию 
smtpd_enforce_tls

smtpd_use_tls = yes # использовать tls для приема почты
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/ssl/server.key # Указываем, где лежит ключ 
сервера
smtpd_tls_cert_file = /etc/ssl/server.crt # Указываем путь до 
сертификата сервера
smtpd_tls_CAfile = /etc/ssl/ca.crt # Путь до корневого сертификата
smtpd_tls_loglevel = 1 # Уровень записи в лог. Меняется от 0 до 4
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s # Тайм-аут для кэш
tls_random_source = dev:/dev/urandom # Установки генератора случайных 
чисел.
smtpd_tls_ask_ccert = yes # Запрос на сертификат клиента.
relay_clientcerts = hash:/usr/local/etc/postfix/relay_clientcerts

smtpd_banner = ESMTP READY!! !! ALL CONNECTION LOGGED!! !!
smtpd_client_restrictions = permit_mynetworks
smtpd_sender_restrictions = permit_mynetworks
smtpd_recipient_restrictions = permit_mynetworks, permit_mx_backup, 
permit_tls_clientcerts, reject # принимать письма от: от сетей указанных 
в параметре mynetworks, от клиентов с сертификатами, отшивать письма от 
всех остальных.

#============================== Quota ====================================

virtual_mailbox_limit_maps = mysql:/usr/local/etc/postfix/sql/quota.mysql
virtual_maildir_extended=yes
virtual_mailbox_limit_override=yes
virtual_create_maildirsize = yes
virtual_overquota_bounce = yes
virtual_maildir_limit_message= «The users's mailbox is out of limit. Try 
again later»

#======================= CLAMAV ==========================================

content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings

#======================== Security Section ===============================

html_directory = no
readme_directory = no
allow_untrusted_routing = no
disable_vrfy_command = yes # Блокируем Проверку через «expn 
логин_пользователя» или «vrfy логин_пользователя“

smtpd_helo_required = yes # требуем представиться
smtpd_helo_restrictions = permit_mynetworks
smtp_always_send_ehlo = yes
header_checks = regexp:/usr/local/etc/postfix/header_checks
body_checks = regexp:/usr/local/etc/postfix/body_checks
mime_header_checks = regexp:/usr/local/etc/postfix/body_checks
bounce_size_limit = 10000 # запрет на отправление всего тела письма при 
ошибке
message_size_limit = 5120000 # Ограничение на размер письма

------------------------------------------------------------------------------------------------------------------ 

Для использования SASL авторизации main.cf
smtpd_recipient_restrictions = permit_mynetworks, 
permit_sasl_authenticated, permit_mx_backup, reject

Для сертификатов main.cf
smtpd_recipient_restrictions = permit_mynetworks, permit_tls_clientcerts,
permit_mx_backup, reject
------------------------------------------------------------------------------------------------------------------ 

Теперь приступим к редактированию master.cf

----------------------------------------- master.cf 
--------------------------------------------------
smtp inet n — n — — smtpd -o content_filter=filter:dummy
# -o content_filter=filter:dummy это для антивируса DrWeb
smtps inet n — n — — smtpd -o smtpd_enforce_tls=yes -o 
smtpd_sasl_auth_enable=yes -o content_filter=filter:dummy # Поднимаем 
защищенное соединение smtp-ssl (465 порт)
-o smtpd_enforce_tls=yes шифруем весь передаваемый трафик
-o smtpd_sasl_auth_enable=yes # включить авторизацию только в режиме TLS

filter unix — n n — — pipe
flags=R user=drweb argv=/usr/local/sbin/drweb-postfix -f ${sender}—
${recipient}
# это настройка фильтра для работы DrWeb
-------------------------------------------------------------------------------------------------------- 



Далее согласно секции SQL и Quota в main.cf создадим каталог ssl а в нем 
файлы

# mkdir -pv /usr/local/etc/postfix/sql
# cat > /usr/local/etc/postfix/sql/transport
mydomain.ru virtual:

# cat > /usr/local/etc/postfix/sql/domains.mysql
user = admin
password = password
hosts = localhost
dbname = mail
table = domain
select_field = description
where_field = domain

# cat > /usr/local/etc/postfix/sql/alias.mysql
user = admin
password = password
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address

# cat > /usr/local/etc/postfix/sql/mailbox.mysql
user = admin
password = password
hosts = localhost
dbname = mail
table = mailbox
select_field = maildir
where_field = username

# cat > /usr/local/etc/postfix/sql/uid.mysql
user = admin
password = password
hosts = localhost
dbname = mail
table = mailbox
select_field = id
where_field = username

# cat > /usr/local/etc/postfix/sql/sasl.mysql
user = admin
password = password
hosts = localhost
dbname = mail
table = mailbox
select_field = password
where_field = username

# cat > /usr/local/etc/postfix/sql/quota.mysql
user = admin
password = password
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username


Далее создадим каталог для почтовых ящиков

# mkdir -pv /var/spool/postfix/vmail/
# chown postfix:maildrop /var/spool/postfix/vmail/
# chmod 770 /var/spool/postfix/vmail/

Анализируя заголовки почтового сообщения выясняется, что postfix очень 
много знает:
1. User-Agent: Mozilla Thunderbird 0.7.3 (Windows/20040803)
2. Resent-X-Antivirus: Checked by Dr.Web [version: 4.31, engine: 4.31, 
virus records: 47385, updated: 14.03.2004]
3. Received: from ххххх.ru (хххх.yyyyy.zzzz [192.168.X.Y]) by хххх.ru 
(Postfix) with ESMTP id E644DE4060

В общем как видно из заголовков на почтовом сервере используется Postfix 
и установлена антивирусная защита Dr.Web При чем видно какая версия 
антивируса используется и когда в последний раз обновлялась антивирусная 
база. Так же видно, какой внутренний IP у пользователя и какого 
почтового агента использует он использует.

Так что с час мы его сделаем менее разговорчивым, для этого мы добавили 
в main.cf следующую строку header_checks и далее настроим фильтр

Вот пример header_checks

-------------------------------- header_checks ----------------------------
/21cn.*\..*\..*/i 553 AUTO_NODE spam
/hanmail.*\..*\..*/i 553 AUTO_NODE spam
/^From: ххх@test.ru/ REJECT
/^Received:.*192\.168\.128.*/ IGNORE
/^Received:.*127\.0\.0\.1.*/ IGNORE
/^X-AntiVirus:/ IGNORE
/^X-Mailer:/ IGNORE
/^User-Agent:/ IGNORE

Так же настроим Postfix для фильтрации вложений, т.е. приучим 
пользователей упаковывать вложения.
Для это мы добавим второй фильтр, это body_checks

Вот для примера мой body_checks

------------------------------ body_checks ------------------------------
#attachments
/^ (.*)name=\“ (.*)\. (cpl|exe|doc|xls|lnk|dll|shs|vbe|hta|com|vbs|vbe|js|jse|bat|cmd|vxd|scr|shm|pif|chm|cpl)\»$/ 
REJECT 554 Attachment type not allowed. File «$2» has unacceptable 
extension «$3»
-------------------------------------------------------------------------

К сожалению, фильтры не всегда срабатывают, это зависит от следующего:
1. При использовании Clamav то его заголовок не удается исправить, так 
как он добавляет свои заголовки после того как письмо пройдет через 
фильтр header_checks.
2. Фильтр body_checks не сработает, если имя вложенного файла на русском 
языке, т.к. почтовый клиент закодирует имя файла в base64.

На этом пока и закончим с настройкой postfix.

8. DrWeb
я поставил из портов

# cd /usr/ports/security/drweb
# make all install clean

# cd /usr/ports/security/drweb-postfix
# make all install clean

Под Linux качаем свежую версию с сайта www.drweb.ru
затем стандартно

# tar drweb-4.31.4.tar.gz
# cd drweb-4.31.4
#. /configure && make && make install
# cd.. 

Ставим клиента drweb для postfix

# tar drweb-postfix-4.29.12-F-linux.tar.gz
# cd drweb-postfix
#. /configure && make && make install

Настройку DrWeb я пропускаю так как в дистрибутиве идет достаточно подробное описание настройки.

8.1 Кто по ряду причин не может или не хочет использовать Dr.Web ставим Clamav.

я поставил из портов

# cd /usr/ports/security/clamav
# make all install clean

после того как clamav установился 

# cd /usr/ports/security/clamsmtp
# make all install clean

Далее создаем или правим конфиг /usr/local/etc/clamd.conf и /usr/local/etc/clamsmtpd.conf
Вот мой конфиг clamd.conf 

---------------------------------------- clamd.conf ------------------------------------------------------
LogFile /var/log/clamav/clamd.log
LogTime
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /tmp
DatabaseDirectory /usr/local/share/clamav
LocalSocket /var/run/clamav/clamd
FixStaleSocket
StreamMaxLength 20M
MaxThreads 20
ReadTimeout 300
IdleTimeout 60 
MaxDirectoryRecursion 20
User clamav
AllowSupplementaryGroups
DetectBrokenExecutables
ScanOLE2
ScanMail
ScanHTML
ScanArchive
ScanRAR
ArchiveMaxFileSize 15M
ArchiveBlockEncrypted
------------------------------------------------------------ ---------------

Вот мой конфиг clamsmtpd.conf

---------------------------- clamsmtpd.conf ---------------------------------
OutAddress: 10026
MaxConnections: 64
TimeOut: 180
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd
ScanHeader: X-AV-Checked: ClamAV using ClamSMTP
TempDirectory: /tmp
User: clamav
------------------------------------------------------------ -----------------

Затем поправим /etc/rc.conf необходимо добавить следующие строки.

# cat >> /etc/rc.conf 
clamav_clamd_enable='YES'
clamsmtpd_enable='YES'

затем правим /usr/local/etc/postfix/master.cf

------------------------------------------ master.cf -----------------------------------------------------------
scan unix  —  — n  — 16 smtp -o smtp_send_xforward_command=yes
127.0.0.1:10026 inet n — n  — 16 smtpd 
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_head er_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
------------------------------------------------------------ -----------------------------

Для обновления антивирусной базы 2 раза в сутки.

# freshclam -d -c 2 -l /var/log/clamav/update.log


После того как все настроили перегружаем систему.

9. Приступаем к заключительному этапу настройки (courier-imap)
Устанавливаем courier-imap из портов

# cd /usr/ports/mail/courier-imap
# make -DWITH_MYSQL install clean

Для Linux

# tar zxvf cyrus-sasl-2.1.15.tar.gz
# cd cyrus-sasl-2.1.15
#. /configure --with-mysql-libs=/opt/mysql/lib/mysql --with-mysql-includes=/opt/mysql/include/mysql && make && make install

Внесем небольшие изменения

# cd /usr/local/etc/courier-imap (для linux /usr/lib/courier-imap/etc)
# cp authdaemonrc.dist authdaemonrc
# cp authmysqlrc.dist authmysqlrc
# cp authdaemonrc.dist authdaemonrc
# cp authmysqlrc.dist authmysqlrc
# cp pop3d.dist pop3d
# cp pop3d-ssl.dist pop3d-ssl
# cp pop3d.cnf.dist pop3d.cnf
# cp imapd.dist imapd
# cp imapd-ssl.dist pop3d-ssl
# cp pop3d.cnf.dist pop3d.cnf
# cd /usr/local/etc/rc.d
# rm courier-imap-imapd.sh.sample
# rm courier-imap-pop3d.sh.sample
# rm courier-imap-imapd-ssl.sh.sample
# rm courier-imap-pop3d-ssl.sh.sample
# ln -s /usr/local/libexec/courier-imap/pop3d.rc pop3d.sh
# ln -s /usr/local/libexec/courier-imap/pop3d-ssl.rc pop3d-ssl.sh
# ln -s /usr/local/libexec/courier-imap/imapd.rc imapd.sh
# ln -s /usr/local/libexec/courier-imap/imapd-ssl.rc imap-ssl.sh

Далее поправим /usr/local/etc/courier-imap/authdaemonrc:

authmodulelist= «authmysql»
authmodulelistorig= «authcustom authuserdb authmysql authpam»
daemons=5
version= «
authdaemonvar=/usr/local/var/authdaemon

редактируем /usr/local/etc/courier-imap/authmysqlrc:

MYSQL_SERVER localhost
MYSQL_USERNAME admin
MYSQL_PASSWORD password
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE mailbox
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD id
MYSQL_GID_FIELD 126
MYSQL_LOGIN_FIELD name
MYSQL_HOME_FIELD maildir
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir

редактируем /usr/local/etc/courier-imap/pop3d:

PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=11
MAXPERIP=3
AUTHMODULES=„authdaemon“
AUTHMODULES_ORIG=„authdaemon“
POP3AUTH=„LOGIN PLAIN CRAM-MD5“
POP3AUTH_ORIG=„LOGIN PLAIN CRAM-MD5 CRAM-SHA1“
POP3AUTH_TLS=„LOGIN PLAIN CRAM-MD5“
POP3AUTH_TLS_ORIG=„LOGIN PLAIN CRAM-MD5“
PORT=110
ADDRESS=0
TCPDOPTS=„-nodnslookup -noidentlookup“
POP3DSTART=YES
MAILDIRPATH=Maildir

редактируем /usr/local/etc/courier-imap/pop3d-ssl:

SSLPORT=995
SSLADDRESS=0
SSLPIDFILE=/var/run/pop3d-ssl.pid
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/share/courier-imap/pop3d.pem
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/usr/local/var/couriersslcache
TLS_CACHESIZE=524288

редактируем /usr/local/etc/courier-imap/imapd:

ADDRESS=0
PORT=143
MAXDAEMONS=11
MAXPERIP=3
PIDFILE=/var/run/imapd.pid
TCPDOPTS=„-nodnslookup -noidentlookup“
AUTHMODULES=„authdaemon“
AUTHMODULES_ORIG= «authdaemon
DEBUG_LOGIN=0
IMAP_CAPABILITY= «IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE»
IMAP_KEYWORDS=1
IMAP_CAPABILITY_ORIG= «IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE»
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_ULIMITD=65536
IMAP_USELOCKS=1
IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/inde x
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

редактируем /usr/local/etc/courier-imap/imapd-ssl:

SSLPORT=993
SSLADDRESS=0
SSLPIDFILE=/var/run/imapd-ssl.pid
IMAPDSSLSTART=YES
IMAPDSTARTTLS=YES
IMAP_TLS_REQUIRED=1
COURIERTLS=/usr/local/bin/couriertls
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1
TLS_CERTFILE=/usr/local/share/courier-imap/imapd.pem
TLS_TRUSTCERTS=/usr/local/openssl/certs/
TLS_VERIFYPEER=NONE
TLS_CACHEFILE=/usr/local/var/couriersslcache
TLS_CACHESIZE=524288

Создадим сертификат для courier-imap

# cp /etc/ssl/server.key /usr/local/share/courier-imap/imapd.pem
# cat /etc/ssl/server.crt >> /usr/local/share/courier-imap/imapd.pem
# dd if=/dev/urandom of=/usr/local/share/courier-imap/imapd.rand count=1
# openssl gendh -rand /usr/local/share/courier-imap/imapd.rand 1024 >> /usr/local/share/courier-imap/imapd.pem
# cp /usr/local/share/courier-imap/imapd.pem /usr/local/share/courier-imap/pop3d.pem

Наружу у меня светяться только 25 465 993 995 порты соответственно в локалке 110 и 143 порты.


10. Теперь приступим к испытаниям

# telnet mail.mydomain.ru 25
Trying mail.mydomain.ru…
Connected to mail.mydomain.ru.
Escape character is '^]'.
220 ESMTP READY!! !! ALL CONNECTION LOGGED!! !!
ehlo test
250-mail.mydomain.ru
250-PIPELINING
250-SIZE 5120000
250-ETRN
250-STARTTLS
250 8BITMIME
starttls
220 Ready to start TLS
quit

quit
Connection closed by foreign host

В общем TLS работает.

11. Настрока Mozilla Thunderbird (почтовый клиент)
Далее передаем пользовательский сертификат в формате PKS#12 (к примеру user.p12) Далее в Thunderbird (почтовый клиент mozilla)? Правка? ≥ ?Настройки? ≥? Безопасность? ≥ Сертификаты? жмем на кнопку упорядочить сертификаты и на в кладке? Личные сертификаты? жмем кнопку ?Восстановить? далее Вас попросят ввести пароль на программное устройство, далее попросят ввести пароль на сертификат. Далее в свойствах учетной записи (? Правка? ≥? Параметры учетной записи? ≥? Параметры сервера выставляем что необходимо использовать либо TLS, либо SSL. Далее в пункте? Защита? указываем что необходимо использовать полученный сертификат и наконец? Сервер исходящей почты (SMTP) необходимо указать что использовать или TLS или SSL.

Далее пишем письмо сами себе и смотрим в полученном письме его заголовки должно быть следующее (это если использовать Kmail)
Received: from user.mydomain.ru
(using TLSv1 with cipher RC4-MD5 (128/128 bits))
(Client CN «user», Issuer «mail.mydomain.ru „ (verified OK))
Date: Wed, 25 Aug 2004 16:11:14 +0400
User-Agent: KMail/1.5.3
MIME-Version: 1.0

А вот что в заголовках если письмо отправлено Thunderbird
Received: from [user.mydomain.ru]
(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
(Client CN „test“, Issuer «mydomain.ru“ (verified OK))
Date: Tue, 24 Aug 2004 14:05:00 +0400
User-Agent: Mozilla Thunderbird 0.7.3 (Windows/20040803)
X-Accept-Language: ru-ru, ru
MIME-Version: 1.0

В почтовых логах мы видим
Aug 27 09:49:11 mail postfix/smtpd[2275]: connect from unknown[user.mydomain.ru]
Aug 27 09:49:11 mail postfix/smtpd[2275]: setting up TLS connection from unknown[user.mydomain.ru]
Aug 27 09:49:11 mail postfix/smtpd[2275]: fingerprint=EF:8E:31:CB:C5:89:6C:10:52:61:50:D4:1E:DC:1F:46
Aug 27 09:49:11 mail postfix/smtpd[2275]: Verified: subject_CN=user, issuer=mail. mydomain.ru
Aug 27 09:49:11 mail postfix/smtpd[2275]: TLS connection established from unknown[user.mydomain.ru]: TLSv1 with cipher RC4-MD5 (128/128 bits)
Aug 27 09:49:11 mail drweb-postfix: dwlib: scan[2285]: message (/tmp/drweb.tmp.xaqtX1) sent by user@mydomain.ru is passed

12. Заключение.
После того как мы убедились что письма идут подписанные пользовательским сертификатом, так что получатель письма может быть уверен, что в связке отправитель-сервер не было никого лишнего и письмо никем не было прочитано.

На этом я заканчиваю, в дальнейшем каждый доведет свою систему под себя.