Почтовая система Postfix + DBmail + Tls + Cyrus SASL + Saslauthd + Pam-mysql + ClamAV + ClamSMTP + SpamAssassin + STunnel
Почтовая система Postfix + DBmail + Tls + Cyrus SASL + Saslauthd + Pam-mysql + ClamAV + ClamSMTP + SpamAssassin + STunnel
Продолжаю тему построения безопасной корпоративной почтовой системы. Часть 1. Архитектура почтовой системы на базе Postfix
MySQL
В качестве базы данных используем MySQL:
[geshifilter-code]
# cd /usr/ports/databases/mysql55-server
# make install clean
# echo 'mysql_enable="YES"' >> /etc/rc.conf
[/geshifilter-code]
Копируем файл настроек my.cnf. Для систем с 4GB RAM:
[geshifilter-code]
#cp /usr/local/share/mysql/my-innodb-heavy-4G.cnf /var/db/mysql/my.cnf
#/usr/local/etc/rc.d/mysql-server start
[/geshifilter-code]
Устанавливаем пароль для рута.
[geshifilter-code]
#mysql -u root
>UPDATE mysql.user SET Password=PASSWORD('пароль') WHERE User='root';
>FLUSH PRIVILEGES;
>exit;
#/usr/local/etc/rc.d/mysql-server restart
[/geshifilter-code]
DBMail
DBMail позволяет хранить почтовые сообщения в реляционных базах данных MySQL, PostgreSQL или QLite и осуществляет доставку сообщений MUA (Mail User Agent) посредством протоколов IMAP и POP3. Распространяется под лицензией GPL. Продукт написан для UNIX систем, тестировался на GNU Linux, FreeBSD, OpenSolaris, NetBSD и OSX.
Взаимодействие MTA (Mail Transport Agent) с базой данных может осуществляться двумя способами (демоны dbmail-smtp и dbmail-lmtpd):
- через pipe-интерфейс - на каждое входящее сообщение со стандартного входа (stdin) создается отдельный процесс UNIX.
- через UNIX-сокет или TCP-сокет. Приём сообщений от MTA осуществляется посредством протокола LMTP - на каждое входящее сообщение MTA создает только клиентский сокет, необходимое количество процессов к БД создается заранее.
Последней стабильной версией DBMail является 3.0.0-rc2, нестабильной - 2.3.6. На практике в версии 2.3.6 имелись проблемы с очищением базы данных, также периодически падал в корку dbmail-imapd. Из плюсов встроенная поддержка ssl.
Из портов на данный момент доступна версия 2.2.17. Возможность работы с ssl реализуем с помощью пакета stunnel.
[geshifilter-code]
# cd /usr/ports/mail/dbmail
# make install clean
[/geshifilter-code]
Создаем папку /var/run/dbmail для хранения идентификаторов процессов и назначаем владельцем папки nobody и группу nogroup:
[geshifilter-code]
# mkdir /var/run/dbmail
# chown nobody:nogroup /var/run/dbmail
[/geshifilter-code]
Правим rc.conf
[geshifilter-code]
# echo 'dbmail_pop3d_enable="YES"' >> /etc/rc.conf
# echo 'dbmail_pop3d_flags="-p /var/run/dbmail/dbmail-pop3d.pid"' >> /etc/rc.conf
# echo 'dbmail_lmtpd_enable="YES"' >> /etc/rc.conf
# echo 'dbmail_lmtpd_flags="-p /var/run/dbmail/dbmail-lmtpd.pid"' >> /etc/rc.conf
# echo 'dbmail_imapd_enable="YES"' >> /etc/rc.conf
# echo 'dbmail_imapd_flags="-p /var/run/dbmail/dbmail-imapd.pid"' >> /etc/rc.conf
[/geshifilter-code]
Создаем базу данных dbmail и пользователя.
[geshifilter-code]
# mysql -uroot -p
> CREATE DATABASE dbmail default character set "UTF8";
> GRANT ALL ON dbmail.* to dbmail@localhost identified by 'пароль';
> quit
# mysql -udbmail -p dbmail < /usr/local/share/dbmail/mysql/create_tables.mysql
[/geshifilter-code]
Создаем конфиг:
[geshifilter-code]
# cp /usr/local/etc/dbmail.conf-dist /usr/local/etc/dbmail.conf
[/geshifilter-code]
Правим строки:
[geshifilter-code]
driver = mysql
authdriver = sql
host = localhost
sqlport = 3306
sqlsocket = /tmp/mysql.sock
pass = пароль
pid_directory = /var/run/dbmail
TRACE_SYSLOG = 1
TRACE_STDERR = 3
[/geshifilter-code]
Запускаем:
[geshifilter-code]
# /usr/local/etc/rc.d/dbmail-lmtpd start
# /usr/local/etc/rc.d/dbmail-pop3d start
# /usr/local/etc/rc.d/dbmail-imapd start
[/geshifilter-code]
Добавляем пользователя и алиас:
[geshifilter-code]
# dbmail-users -a login@mydomain.ru -w пароль -m 200000000
# dbmail-users -c login@mydomain.ru -s login@mydomain.ru
[/geshifilter-code]
Чтобы восстановить удаленные письма, я составила sql запросы. Например, необходимо восстановить письма пользователя sveta@mydomain.ru за период с 2011-06-14 по 2011-06-15.
Для dbmail версий 2.2.x и 3.0.x просмотреть все сообщения за указанный период можно запросом:
[geshifilter-code]
SELECT psy.id as physmessage_id, msg.`status`, mb.messageblk, sub.subjectfield,psy.internal_date
FROM dbmail_messages msg
LEFT JOIN dbmail_mailboxes mbx ON msg.mailbox_idnr=mbx.mailbox_idnr,
dbmail_physmessage as psy LEFT JOIN dbmail_subjectfield as sub ON sub.physmessage_id=psy.id,
dbmail_messageblks mb,
dbmail_users usr
WHERE psy.id=mb.physmessage_id
and mbx.owner_idnr=usr.user_idnr and usr.userid like 'sveta%'
and mb.physmessage_id=msg.physmessage_id
and psy.id=msg.physmessage_id
and psy.internal_date between '2011-06-14 00:00:00' and '2011-06-15 23:59:59'
order by psy.internal_date DESC
[/geshifilter-code]
Чтобы пользователь заново получил письма, необходимо изменить статус сообщений с 2 (письма уже были доставлены пользователю почтовым агентом), на 0. Для dbmail версий 2.2.x и 3.0.x:
[geshifilter-code]
UPDATE dbmail_messages msg LEFT JOIN dbmail_mailboxes mbx ON msg.mailbox_idnr=mbx.mailbox_idnr,
dbmail_physmessage as psy LEFT JOIN dbmail_subjectfield as sub ON sub.physmessage_id=psy.id,
dbmail_messageblks mb,
dbmail_users usr
SET msg.status=0
WHERE psy.id=mb.physmessage_id
and mbx.owner_idnr=usr.user_idnr and usr.userid like 'sveta%'
and mb.physmessage_id=msg.physmessage_id
and psy.id=msg.physmessage_id
and psy.internal_date between '2011-06-14 00:00:00' and '2011-06-15 23:59:59'
[/geshifilter-code]
В случае, если необходимо найти удаленное письмо по теме или содержимому:
[geshifilter-code]
SELECT psy.id as physmessage_id, msg.`status`, mb.messageblk, sub.subjectfield,psy.internal_date
FROM dbmail_messages msg
LEFT JOIN dbmail_mailboxes mbx ON msg.mailbox_idnr=mbx.mailbox_idnr,
dbmail_physmessage as psy LEFT JOIN dbmail_subjectfield as sub ON sub.physmessage_id=psy.id,
dbmail_messageblks mb,
dbmail_users usr
WHERE psy.id=mb.physmessage_id
and mbx.owner_idnr=usr.user_idnr and usr.userid like 'sveta%'
and mb.physmessage_id=msg.physmessage_id
and psy.id=msg.physmessage_id
and psy.internal_date between '2011-06-14 00:00:00' and '2011-06-15 23:59:59'
and mb.messageblk like '%тема письма%'
order by psy.internal_date DESC
[/geshifilter-code]
Для dbmail версии 2.3.6 просмотреть все сообщения за указанный период можно запросом:
[geshifilter-code]
SELECT msg.message_idnr, msg.`status`,mim.`data`,sub.subjectfield,psy.internal_date
FROM dbmail_messages msg LEFT JOIN dbmail_mailboxes mbx ON msg.mailbox_idnr=mbx.mailbox_idnr,
dbmail_physmessage as psy,
dbmail_partlists as par,
dbmail_mimeparts as mim,
dbmail_subjectfield as sub,
dbmail_users usr
WHERE mbx.owner_idnr=usr.user_idnr
and psy.id=msg.physmessage_id
and par.physmessage_id=psy.id
and mim.id=par.part_id
and sub.physmessage_id=psy.id
and usr.userid like 'sveta%'
and psy.internal_date between '2011.06.14 00:00:00' and '2011.06.15 23:59:59'
order by psy.internal_date DESC
[/geshifilter-code]
Чтобы пользователь заново получил письма, необходимо изменить статус сообщений с 2 (письма уже были доставлены пользователю почтовым агентом), на 0. Для dbmail версии 2.3.6:
[geshifilter-code]
UPDATE dbmail_messages msg LEFT JOIN dbmail_mailboxes mbx ON msg.mailbox_idnr=mbx.mailbox_idnr,
dbmail_physmessage as psy,
dbmail_partlists as par,
dbmail_mimeparts as mim,
dbmail_subjectfield as sub,
dbmail_users usr
SET msg.status=0
WHERE mbx.owner_idnr=usr.user_idnr
and psy.id=msg.physmessage_id
and par.physmessage_id=psy.id
and mim.id=par.part_id
and sub.physmessage_id=psy.id
and usr.userid like 'sveta%'
and psy.internal_date between '2011.06.14 00:00:00' and '2011.06.15 23:59:59'
[/geshifilter-code]
Базу данных желательно периодически очищать. Для этого в планировщик заданий cron добавляем запуск dbmail-util.
Командой "crontab -e" открываем cron файл пользователя и добавляем:
[geshifilter-code]
SHELL=/usr/local/bin/bash
MAILTO=""
21 21 * * * /usr/local/bin/sudo /usr/local/sbin/dbmail-util -dy 2>&1 > /dev/null
22 21 * * * /usr/local/bin/sudo /usr/local/sbin/dbmail-util -py 2>&1 > /dev/null
23 21 * * * /usr/local/bin/sudo /usr/local/sbin/dbmail-util -ty 2>&1 > /dev/null
[/geshifilter-code]
Командой "dbmail-util -dy" прочитанные письма, имеющие в базе данных статус 2, помечаются на удаление, т.е статус становится 3. Далее командой "dbmail-util -py" удаляются все письма со статусом 3. Командой "dbmail-util -ty" проверяется целостность базы, т.е. из таблиц удаляются не связанные записи.
В версии dbmail 2.3.6 имелись проблемы с очищением таблицы dbmail_headervalue, поэтому для данной версии создаем скрипт clean_dbmail.php, например в папке пользователя /home/sveta/bin, со следующим содержимым:
[geshifilter-code]
<?php
$db=mysql_connect('localhost', 'dbmail', 'пароль');
mysql_select_db('dbmail', $db);
system('/usr/local/bin/sudo /usr/local/sbin/dbmail-util -dy');//помечаем письма, имеющие статус 2 (прочитанные), статусом 3 (на удаление)
system('/usr/local/bin/sudo /usr/local/sbin/dbmail-util -py'); // удаляем письма со статусом 3
system('/usr/local/bin/sudo /usr/local/sbin/dbmail-util -ty'); // удаляем из таблиц не связанные записи
//Вручную удаляем записи из таблицы dbmail_headervalue
$query = "delete FROM dbmail_headervalue where id NOT IN (SELECT DISTINCT(headervalue_id) FROM dbmail_header)";
mysql_query($query);
?>
[/geshifilter-code]
В планировщик заданий cron добавляем запуск скрипта clean_dbmail.php. Командой "crontab -e" открываем cron файл пользователя и добавляем:
[geshifilter-code]
SHELL=/usr/local/bin/bash
MAILTO=""
21 21 * * * /usr/local/bin/php /home/sveta/bin/clean_dbmail.php 2>&1 > /dev/null
[/geshifilter-code]
Каждый день в 21:21 будет запускаться скрипт очистки базы данных.
TLS
TLS - протокол , обеспечивающий защищённую передачу данных между узлами в сети Интернет. Использует комбинирование методов шифрования - ассиметричное для передачи ключа и симметричное для обмена данными.
Обмен ключами происходит на основе криптосистем с открытым ключом (ассиметричное шифрование), например RSA, DSA. Используется пара ключей: открытый (публичный) и соответствующий открытому секретный ключ. Открытый ключ может спокойно передаваться по небезопасному соединению. К минусам ассиметричного шифрования относят низкую скорость работы и невозможность применить к большим объемам данных. Поэтому для передачи данных используются симметричные алгоритмы шифрования(RC2, RC4, IDEA, DES, Triple DES или AES) - один ключ и для зашифровки и для расшифровки. Из минусов использования только симметричного шифрования - если станет известен ключ, то шифр поддается практически моментальной расшифровке.
Система посредством ассиметричного шифрования может использовать каждый раз отдельный симметричный ключ. ПО выбирает ключ рандомным образом. То есть, если будет раскрыт один ключ, то на последующие сессии это никак не повлияет.
Таким образом, большие объёмы данных шифруются симметричным шифром на сеансовом ключе, а с помощью асимметричного шифра передаётся только сам сеансовый ключ.
> 220 mail.mydomain.ru ESMTP Postfix
< EHLO [192.168.0.105]
> 250-mail.mydomain.ru
> 250-PIPELINING
> 250-SIZE 10240000
> 250-VRFY
> 250-ETRN
> 250-STARTTLS
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> 250 DSN
< STARTTLS
> 220 2.0.0 Ready to start TLS
< client hello
> server hello
> certificate
> key exchange
> certificate request
< certificate verification depth=1 verify=1 subject=/C=RU/ST=South Region/L=Volgograd/O=NAME Ltd/OU=NOC/CN=mail.mydomain.ru/emailAddress=admin@mydomain.ru
< certificate verification depth=0 verify=1 subject=/C=RU/ST=South Region/L=Volgograd/O=NAME Ltd/OU=IT/CN=test/emailAddress=test@mydomain.ru
< client certificate
< client key exchange
-------comment
Для того чтобы сгенерировать сеансовый ключ (т.н. общий секрет) для защищенного соединения, клиент шифрует случайно сгенерированную цифровую последовательность открытым ключом сервера и посылает результат на сервер(client key exchange). Только сервер может расшифровать полученную последовательность, используя свой закрытый ключ
------
< certificate verify
< finished
-------comment
содержит хеш и MAC (код аутентификации сообщения), сгенерированные на основе предыдущих сообщений handshake
------
> change cipher spec
-------comment
сообщение, которое указывает на то, что вся последующая информация будет зашифрована установленным в процессе handshake алгоритмом, используя общий секретный ключ
------
> finished
-------comment
Trusted TLS connection established from mafja[192.168.0.105]: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
С помощью асимметричного шифра передаётся сеансовый ключ, с помощью симметричного шифруются данные
------
< EHLO [192.168.0.105]
> 250-mail.mydomain.ru
> 250-PIPELINING
> 250-SIZE 10240000
> 250-VRFY
> 250-ETRN
> 250-AUTH LOGIN PLAIN
> 250-AUTH=LOGIN PLAIN
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> 250 DSN
< AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
> 235 2.7.0 Authentication successful
-------comment
SASL auth только для удаленного доступа
-----
< MAIL FROM:
> 250 2.1.0 Ok
< RCPT TO:
> 250 2.1.5 Ok
< DATA
> 354 End data with
> 250 2.0.0 Ok: queued as 3E1C83BA85C
< QUIT
> 221 2.0.0 Bye
Генерация сертификатов хорошо описана в статье Сергея Святкина.
Создаем необходимую структуру папок:
[geshifilter-code]
#mkdir /usr/local/ssl
#mkdir /usr/local/ssl/db
#mkdir /usr/local/ssl/ca
#mkdir /usr/local/ssl/clients
#touch /usr/local/ssl/db/index.txt
#echo "01" > /usr/local/ssl/db/serial
#cd /usr/local/ssl
[/geshifilter-code]
Скрипт для создания самоподписанного доверенного сертификата (Certificate Authority) /usr/local/ssl/make_ca.sh:
[geshifilter-code]
#!/bin/sh
openssl req -new -newkey rsa:4096 -nodes -keyout ./ca/ca.key -x509 -days 3650 -subj /C=RU/ST=South\ Region/L=Volgograd/O=org_name\ Ltd/OU=NOC/CN=mail.mydomain.ru/emailAddress=admin@mydomain.ru -out ./ca/ca.crt
[/geshifilter-code]
Запускаем скрипт:
[geshifilter-code]
#sh ./make_ca.sh
[/geshifilter-code]
Файл конфигурации для подписывания запросов на сертификацию /usr/local/ssl/ca.config:
[geshifilter-code]
[ ca ]
default_ca = CA_CLIENT
[ CA_CLIENT ]
dir = /usr/local/ssl
certs = $dir/clients
new_certs_dir = $dir/db
database = $dir/db/index.txt
serial = $dir/db/serial
certificate = $dir/ca/ca.crt
private_key = $dir/ca/ca.key
default_days = 3650
default_crl_days = 3
default_md = md5
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[/geshifilter-code]
Cкрипт для создания клиентских сертификатов /usr/local/ssl/make_client_cert.sh:
[geshifilter-code]
#!/bin/sh
openssl req -new -newkey rsa:4096 -nodes -keyout ./clients/client_$1.key -subj /C=RU/ST=South\ Region/L=Volgograd/O=org_name\ Ltd/OU=NOC/CN=$1/emailAddress=$2 -out ./clients/client_$1.csr;
openssl ca -config ca.config -in ./clients/client_$1.csr -out ./clients/client_$1.crt -batch;
openssl pkcs12 -export -in ./clients/client_$1.crt -inkey ./clients/client_$1.key -certfile ./ca/ca.crt -out ./clients/client_$1.p12 -passout pass:$3
[/geshifilter-code]
Запускаем скрипт:
[geshifilter-code]
#sh ./make_client_cert.sh login login@mydomain.ru password
[/geshifilter-code]
В результате выполнения скрипта будут созданы следующие файлы:
client_login.crt – файл клиентского сертификата
client_login.key – файл закрытого ключа
client_login.csr – запрос на подписание сертификата
client_login.p12 – клиентский сертификат для передачи клиенту
SASL + Saslauthd + Pam-mysql
Чтобы иметь возможность отправлять почту с любого ip-адреса существует несколько способов:
• SMTP-after-POP и SMTP-after-IMAP. Эти методы делегируют решение вопроса идентификации серверам POP и IMAP.
• SMTP-аутентификация - простое и независимое решение, его и будем использовать.
• Пересылка на основании сертификата.
• Использование виртуальных частных сетей (VPN) - доступ к почтовому серверу путем создания защищенной виртуальной сети.
Пакет Cyrus SASL (Simple Authentication and Security Layer) содержит простую аутентификацию и слой безопасности. Позволяет добавить поддержку аутентификации в протоколы,ориентированные на соединение (POP3, IMAP4, SMTP, FTP, telnet, ACAP, LDAPv3).
Устанавливаем:
[geshifilter-code]
#cd /usr/ports/security/cyrus-sasl2
#make install clean
[/geshifilter-code]
Опции LOGIN, PLAIN должны быть включены.
Обращение к базе данных для проверки пароля будем осуществлять с помощью демона авторизации Saslauthd, который позволяет верифицировать открытые (plaintext) пароли с помощью PAM (Pluggable Authentication Modules), LDAP, Kerberos, /etc/shadow для библиотеки Cyrus SASL.
[geshifilter-code]
# сd /usr/ports/security/cyrus-sasl2-saslauthd
# make install clean
# echo 'saslauthd_enable="YES"' >> /etc/rc.conf
[/geshifilter-code]
Создаем файл /usr/local/lib/sasl2/smtpd.conf со следующим содержимым:
[geshifilter-code]
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
log_level: 9
[/geshifilter-code]
Воспользуемся методом аутентификации PAM - набор разделяемых библиотек, которые позволяют интегрировать различные низкоуровневые методы аутентификации в виде единого высокоуровневого API.
Для этого необходимо дополнительно установить поддержку mysql в pam модуле:
[geshifilter-code]
# cd /usr/ports/security/pam-mysql
# make install clean
# cp /usr/local/lib/pam_mysql.so /usr/lib/
[/geshifilter-code]
Создаем файл /etc/pam.d/smtp следующего содержания:
[geshifilter-code]
auth required pam_mysql.so user=dbmail passwd=pass host=127.0.0.1 db=dbmail table=dbmail_users usercolumn=userid passwdcolumn=passwd crypt=0
account sufficient pam_mysql.so user=dbmail passwd=pass host=127.0.0.1 db=dbmail table=dbmail_users usercolumn=userid passwdcolumn=passwd crypt=0
[/geshifilter-code]
Убираем права "чтение для всех":
[geshifilter-code]
# chmod 640 /etc/pam.d/smtp
[/geshifilter-code]
Проверим наличие флага "-a pam" в стартовом скрипте /usr/local/etc/rc.d/saslauthd и допишем "-r" для комбинирования логина с доменом:
[geshifilter-code]
saslauthd_flags=${saslauthd_flags:-"-a pam -r"}
[/geshifilter-code]
Отсутствие флага "-r" приводит к ошибке аутентификации, которую можно наблюдать в файле /var/log/auth.log:
[geshifilter-code]
saslauthd[62642]: do_auth : auth failure: [user=login] [service=smtp] [realm=mydomain.ru] [mech=pam] [reason=PAM auth error]
[/geshifilter-code]
Запускаем saslauthd:
#/usr/local/etc/rc.d/saslauthd start
Для тестирования можно использовать утилиту testsaslauthd из порта /usr/ports/security/cyrus-sasl2.
[geshifilter-code]
# cd /usr/ports/security/cyrus-sasl2/work/cyrus-sasl-2.1.25/saslauthd
# make testsaslauthd
# testsaslauthd -u логин@домен -p пароль -s smtp
[/geshifilter-code]
ClamAV + ClamSMTP
Clam AntiVirus — пакет антивирусного ПО. ClamSMTP -- это служба SMTP-прокси, которая проверяет проходящие письма с помощью антивирусного ПО ClamAV.
Устанавливаем ClamAV и ClamSMTP:
[geshifilter-code]
# cd /usr/ports/security/clamav
# make install clean
# cd /usr/ports/security/clamsmtp
# make install clean
[/geshifilter-code]
Правим rc.conf:
[geshifilter-code]
# echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf
# echo 'clamav_freshclam_enable="YES"' >> /etc/rc.conf
# echo 'clamsmtpd_enable="YES"' >> /etc/rc.conf
[/geshifilter-code]
Создаем конфиги:
[geshifilter-code]
# cp /usr/local/etc/clamsmtpd.conf-sample /usr/local/etc/clamsmtpd.conf
# cp /usr/local/etc/clamd.conf.default /usr/local/etc/clamd.conf
# cp /usr/local/etc/freshclam.conf.default /usr/local/etc/freshclam.conf
[/geshifilter-code]
Настраиваем конфигурационный файл clamsmtp /usr/local/etc/clamsmtpd.conf :
[geshifilter-code]
# Порт, через который возвращается письмо, после проверки на вирусы
OutAddress: 10026
# Максимальное количество одновременных подключений. В настройках демона clamd должно быть указано аналогичное число подключений
MaxConnections: 200
# Время (в секундах) ожидания ответа от сети
TimeOut: 180
# Установка поддержки соединения может помочь на медленных каналах связи, когда timeout наступает быстрее, чем ClamAV успевает проверить файл на вирусы
KeepAlives: 0
# Отправка команды Xclient принимающему серверу. Может быть полезно при перенаправлении информации о соединении серверам, которые поддерживают эту возможность.
XClient: off
# Интерфейс и порт для ожидания входящих соединений
Listen: 0.0.0.0:10025
#Сокет для подключения к ClamAV
ClamAddress: /var/run/clamav/clamd.sock
# Заголовок, добавляемый к отсканированной почте
Header: X-Virus-Scanned: ClamAV using ClamSMTP
# Директория для временных файлов
TempDirectory: /tmp
# Это действие будет выполнено в случае нахождения вируса, drop – удалить e-mail, bounce – отклонить письмо, pass – пропустить письмо в почтовый ящик пользователя
Action: bounce
# Помещать файлы с вирусами в карантин (TempDirectory)
Quarantine: off
# От какого пользователя запускать clamsmtpd, сначала сервис стартует с правами root, далее сервис начинает работать с правами указанного пользователя в этой опции
User: clamav
# Скрипт, который будет выполняться при обнаружении вируса
VirusAction: /usr/local/etc/virus_action.sh
[/geshifilter-code]
Содержимое файла /usr/local/etc/virus_action.sh - отсылает уведомление об успешном удалении вируса:
[geshifilter-code]
#!/bin/sh
virmsg="/tmp/msg.body"
touch $virmsg
echo "Hello!" >> $virmsg
echo >> $virmsg
echo "ClamAv has been detect a virus" $VIRUS >> $virmsg
echo "in mail from: " $SENDER >> $virmsg
echo "to " $RECIPIENTS >> $virmsg
echo >> $virmsg
echo "Message has been killed" >> $virmsg
date "+%d-%m-%Y %H:%M:%S" >> $virmsg
#cat $virmsg | mail -s "Virus detected" $SENDER
cat $virmsg | mail -s "Virus detected" admin@mydomain.ru
rm -f $virmsg
[/geshifilter-code]
Делаем файл исполняемым:
[geshifilter-code]
# chmod 755 /usr/local/etc/virus_action.sh
[/geshifilter-code]
Конфигурационный файл ClamAV /usr/local/etc/clamd.conf:
[geshifilter-code]
# Журналирование работы сервиса в указанный файл
LogFile /var/log/clamav/clamd.log
#Блокировка файла лога. Защищает от многократного запуска демона. В случае необходимости запуска еще одного демона - надо скопировать конфиг, изменить в нем местоположение лога и запустить демона с указанием этого файла конфига. с
#LogFileUnlock yes
# Размер лог-файла. По-умолчанию: 1M.
LogFileMaxSize 20M
# Ставим в логе отметки времени. По-умолчанию: no
LogTime yes
# Пишем в лог сообщения о проверенных чистых файлах. По-умолчанию: no
#LogClean yes
# Используем системный лог (syslog). Может работать вместе с лог-файлом. По-умолчанию: no
#LogSyslog yes
# Определение типа сообщений для syslog. По-умолчанию: LOG_LOCAL6
#LogFacility LOG_MAIL
# Включаем подробное логирование. По-умолчанию: no
#LogVerbose yes
# Добавление в лог дополнительной информации об инфицированном файле, например, размер, хэш и название вируса.
#ExtendedDetectionInfo yes
# Идентификатор процесса. По-умолчанию: disabled
PidFile /var/run/clamav/clamd.pid
# Директория для хранения временных файлов
TemporaryDirectory /var/tmp
# Директория с файлами базы данных
DatabaseDirectory /var/db/clamav
# Only load the official signatures published by the ClamAV project.
# Default: no
# Загружать только официальные сигнатура, опубликованные для ClamAV проекта. По-умолчанию: no
#OfficialDatabaseOnly no
##
###Параметры сокетов -либо UNIX, либо TCP, но не одновременно
##
# Путь к unix-сокету.
LocalSocket /var/run/clamav/clamd.sock
# Установка группы на unix сокет. По-умолчанию: disabled (права пользователя, с которым запущен clamd)
#LocalSocketGroup virusgroup
# Права на unix сокет. По-умолчанию: disabled (доступен для всех)
#LocalSocketMode 660
# Удалять сокет, оставшийся от предыдущего неудачного запуска
FixStaleSocket yes
# TCP сокет для управления clamd. По-умолчанию: no
#TCPSocket 3310
# Ip-адрес, на котором будет работать сервис
#TCPAddr 127.0.0.1
# Максимальная очередь подключений, ожидающих обработки. По-умолчанию: 200
#MaxConnectionQueueLength 30
# Закрыть соединение при превышении предельного размера данных. Значение должно соответствовать ограничению на максимальный размер вложения. По-умолчанию: 25M
StreamMaxLength 30M
# Минимальный номер порта для приёма потока. По-умолчанию: 1024
#StreamMinPort 30000
# Максимальный номер порта для приёма потока. По-умолчанию: 2048
#StreamMaxPort 32000
# Максимальное количество одновременно запущенных потоков. По-умолчанию: 10
MaxThreads 20
# Время ожидания ответа от клиента. По-умолчанию: 120 секунд
ReadTimeout 300
# Время (в секундах), после истечения которого демон должен закрыть соединение, если клиент не отправляет никаких команд после установления соединения. По-умолчанию: 5
#CommandReadTimeout 5
# Время ожидания (в миллисекундах), если буфер заполнен. Надо оставить значение низким во избежание зависания clamd. По-умолчанию: 500
SendBufTimeout 200
# Максимальное количество пунктов в очереди (включая те, которые обрабатывает MaxThreads). Рекомендуемое значение параметра - двойное значение MaxThreads. Не нужно ставить большое значение, чтобы избежать исчерпывания файловых дескрипторов. Можно руководствоваться формулой MaxThreads*MaxRecursion+(MaxQueue-MaxThreads)+6 < RLIMIT_NOFILE (usual max is 1024)
По-умолчанию: 100
#MaxQueue 200
# Ожидание нового задания будет завершено по истечении этого времени (в секундах). По-умолчанию: 30
IdleTimeout 60
# Исключить из проверки файлы и директории
#ExcludePath ^/proc/
#ExcludePath ^/sys/
# Максимальное количество вложенных директорий. По-умолчанию: 15
MaxDirectoryRecursion 20
# Следовать по симлинкам директорий. По-умолчанию: no
FollowDirectorySymlinks yes
# Следовать по симлинкам файлов. По-умолчанию: yes
#FollowFileSymlinks yes
# Сканировать файлы и папки на других файловых системах. По-умолчанию: yes
#CrossFilesystems yes
# Промежуток времени (в секундах), через который производится проверка баз
SelfCheck 600
# Команда, выполняемая при обнаружении вируса. %v добавит в строку имя вируса.
#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v"
#VirusEvent /bin/echo "Virus found: %v" >> /var/log/clamav/virus.log
# Запуск ClamAV с правами указанного пользователя
User clamav
# Инициализировать права дополнительных групп
AllowSupplementaryGroups yes
# Завершаться при нехватке памяти
#ExitOnOOM yes
# Не уходить в фоновый режим. По-умолчанию: no
#Foreground yes
# Режим отладки
#Debug yes
# Хранить временные файлы (полезно при дебаг-режиме). По-умолчанию: no
#LeaveTemporaryFiles yes
# Обнаружение потенциально-нежелательных приложений (Possibly Unwanted Applications). По-умолчанию: no
#DetectPUA yes
# Исключить необходимые категории PUA. Список доступен на сайте //www.clamav.net/support/pua
#ExcludePUA NetTool
#ExcludePUA PWTool
# Включить только определенные категории PUA
#IncludePUA Spy
#IncludePUA Scanner
#IncludePUA RAT
# Использовать специфические алгоритмы для обработки, например, малварей и эксплоитов в графических форматах. По-умолчанию: yes
#AlgorithmicDetection yes
##
## Выполняемые файлы
##
# Cканировать формат PE; требуется для разархивации выполняемых файлов - UPX и др. По-умолчанию: yes
#ScanPE yes
# Обрабатывать файлы в формате ELF. По-умолчанию: yes
#ScanELF yes
# Clamav попытается обнаружить битые исполняемые файлы (оба PE и ELF) и пометит их как Broken.Executable. По-умолчанию: no
#DetectBrokenExecutables yes
##
## Документы
##
# Обрабатывать файлы в формате Microsoft Office и .msi. По-умолчанию: yes
#ScanOLE2 yes
# VBA макросы, для которых не были определены сигнатуры будут помечаться как "Heuristics.OLE2.ContainsMacros". По-умолчанию: no
#OLE2BlockMacros no
# Сканировать PDF файлы. По-умолчанию: yes
#ScanPDF yes
##
## Почта
##
# Сканирование почтовых файлов. По-умолчанию: yes
# ScanMail yes
# Сканировать сообщения, сформированные согласно RFC1341 из нескольких писем. Вам потребуется периодически очищать директорию $TemporaryDirectory/clamav-partial. Данная опция делает возможной DoS атаку на вашу систему. Никогда не используйте на загруженных серверах. По-умолчанию: no
#ScanPartialMessages yes
# Разрешаем анти-фишинг проверку сообщений на основании сигнатур. По-умолчанию: yes
#PhishingSignatures yes
# Разрешение эвристического анализа URL. По-умолчанию: yes
#PhishingScanURLs yes
# Блокировать скрытые HTTPS в URL, даже если URL не находится в базе данных. Его использование может привести к увеличению ложных срабатываний. По-умолчанию: no
#PhishingAlwaysBlockSSLMismatch no
# Блокировать маскируемый URL. Его использование может привести к увеличению ложных срабатываний. По-умолчанию: no
#PhishingAlwaysBlockCloak no
# Приоритет срабатывания эвристического сканера системы борьбы с фишингом, которые определяет прекратить сканирование после нахождения признаков фишинга или продолжить поиск вредоносного кода. По-умолчанию: no
#HeuristicScanPrecedence yes
##
## Система защиты от утечек (Data Loss Prevention)
##
# Включение модуля DLP. Cканировать утечку номеров кредитных карт и номеров социального обеспечения (USA). По-умолчанию: no
#StructuredDataDetection yes
# Количество номеров кредитных карт, найденных в файле, при котором срабатывает механизм DLP. По-умолчанию: 3
#StructuredMinCreditCardCount 5
# Количество социальных номеров (SSN), найденных в файле, при котором срабатывает механизм DLP. По-умолчанию: 3
#StructuredMinSSNCount 5
# Осуществлять поиск социальных номеров (SSN) в формате xxx-yy-zzzz. По-умолчанию: yes
#StructuredSSNFormatNormal yes
# Осуществлять поиск социальных номеров (SSN) в формате xxxyyzzzz. По-умолчанию: no
#StructuredSSNFormatStripped yes
##
## HTML
##
# Использовать специфические методы обработки HTML файлов. По-умолчанию:
ScanHTML yes
##
## Архивы
##
# Распаковывать архивы. По-умолчанию: yes
#ScanArchive yes
# Помечать зашифрованные архивы как вирусы. По-умолчанию: no
#ArchiveBlockEncrypted no
##
## Лимиты, защищающие систему от DoS атак, использующие архивы (archive bombs)
##
# Максимальный сканируемый размер после разархивации. По-умолчанию: 100M
#MaxScanSize 100M
# Файлы большего размера до разархивации и после не сканируются совсем. По-умолчанию: 25M
#MaxFileSize 30M
# Не проверять архив архивов глубже указанного уровня. По-умолчанию: 16
#MaxRecursion 10
#Извлекать из архива только первые файлы. По-умолчанию: 10000
#MaxFiles 15000
##
## Настройки Clamuko- on-access сканер вирусов, т.е. сканирует вирусы при открытии,
запуске, закрытии файла без участия пользователя. Необходима установка и настройка модуля dazuko.
##
#ClamukoScanOnAccess yes
#ClamukoScannerCount 3
#ClamukoMaxFileSize 10M
#ClamukoScanOnOpen yes
#ClamukoScanOnClose yes
#ClamukoScanOnExec yes
#ClamukoIncludePath /home
#ClamukoIncludePath /students
#ClamukoExcludePath /home/bofh
#ClamukoExcludePath /home/bofh
#Bytecode yes
#BytecodeSecurity TrustSigned
#BytecodeTimeout 1000
[/geshifilter-code]
Конфигурационный файл модуля обновления ClamAV /usr/local/etc/freshclam.conf:
[geshifilter-code]
# Расположение антивирусных баз
DatabaseDirectory /var/db/clamav
# Лог-файл
UpdateLogFile /var/log/clamav/freshclam.log
# Идентификатор процесса
PidFile /var/run/clamav/freshclam.pid
# Пользователь, с правами которого работать
DatabaseOwner clamav
# Учитывать права доступа для дополнительных групп
AllowSupplementaryGroups yes
# Зеркало антивирусных баз. Можно указывать несколько источников обновлений
DatabaseMirror database.clamav.net
# Число проверок на наличие изменений в день. По-умолчанию: 12 (каждые 2 часа)
#Checks 12
# Посылаем clamav команду перезагрузки
NotifyClamd /usr/local/etc/clamd.conf
[/geshifilter-code]
Остальные настройки были оставлены по умолчанию.
Запускаем:
[geshifilter-code]
# /usr/local/etc/rc.d/clamav-freshclam start
# /usr/local/etc/rc.d/clamav-clamd start
# /usr/local/etc/rc.d/clamsmtpd start
[/geshifilter-code]
SpamAssassin
SpamAssassin — эффективное средство для фильтрации спама.
Устанавливаем:
[geshifilter-code]
# cd /usr/ports/mail/p5-Mail-SpamAssassin/
# make install clean
[/geshifilter-code]
Правим rc.conf
[geshifilter-code]
# echo 'spamd_enable="YES"' >> /etc/rc.conf
# echo 'spamd_flags="-u spamd -H /var/spool/spamd"' >> /etc/rc.conf
[/geshifilter-code]
Создаем конфиг:
[geshifilter-code]
# cp /usr/local/etc/mail/spamassassin/local.cf.sample /usr/local/etc/mail/spamassassin/local.cf
[/geshifilter-code]
Содержимое файла /usr/local/etc/mail/spamassassin/local.cf:
[geshifilter-code]
# Метод защиты файлов базы
lock_method flock
# Доверенные сети
trusted_networks 192.168.0.0/24 127.0.0.0/8
#Белый список адресов. Письма с этих адресов не будут помечены как спам
whitelist_from *@google.com
# Добавляем запись к заголовку письма, если письмо определено как спам
rewrite_header subject [Possible SPAM]:
# Количество баллов, набрав которые письмо считается спамом. По-умолчанию: 5.0
required_score 5.0
# Сохранить спам-сообщение как вложение (0: off, 1: вложение MIME 2: вложение text/plain). По-умолчанию: 1
report_safe 0
# Использовать Bayes классификатор. По-умолчанию: 1
use_bayes 1
# Использовать авто-обучение. По-умолчанию: 1
bayes_auto_learn 1
# Сообщение с количеством баллов ниже данного порога, будет передано на обучение как "не спам" (ham-сообщение)
#bayes_auto_learn_threshold_nonspam 0.1. По-умолчанию: 0.1
# Сообщение с количеством баллов выше данного порога, будет передано на обучение как spam-сообщение. По-умолчанию: 12.0
#bayes_auto_learn_threshold_spam 12.0
# Не выполнять проверку по блэклистам. По-умолчанию: 0
#skip_rbl_checks 0
# Путь к базам Bayes
bayes_path /var/spool/filter/spamassassin/bayes
# Права доступа на файлы
bayes_file_mode 0770
# Локали, которые считать корректными для приходящих писем. Письма, не попадающие в этот список, будут помечены как возможный спам
ok_locales ru en
[/geshifilter-code]
Описание опций доступно в мануалах Mail::SpamAssassin::Conf, Mail::SpamAssassin::Plugin::AutoLearnThreshold.
Выполним команду обновления правил и запустим SpamAssassin:
[geshifilter-code]
# sa-update
# /usr/local/etc/rc.d/sa-spamd start
[/geshifilter-code]
Запуск SpamAssassin без выполнения обновления правил завершается ошибкой:
child process [1231] exited or timed out without signaling production of a PID file
Периодически можно проводить обучение на ham (чистые) и spam письма с помощью sa-learn. Необходимые письма можно помещать в специальную папку, например, спам письма в папку spam и чистые письма в папку ham, которые затем экспортировать из почтовой программы в mbox и "скармливать" sa-learn:
[geshifilter-code]
# sa-learn --showdots --mbox --spam ./spam
# sa-learn --showdots --mbox --ham ./ham
[/geshifilter-code]
Авто-обучение занимает некоторое время. По умолчанию требуется 200 ham-писем и 200 spam. После того, как spamassassin получить достаточно информации о типичном содержимом входящих писем, он начнет использовать полученные знания на практике, используя их при анализе всей входящей почты.
Если запуск sa-learn завершается с ошибками:
[geshifilter-code]
bayes: expire_old_tokens: locker: safe_lock: cannot create lockfile /var/spool/filter/spamassassin/bayes.mutex: No such file or directory
plugin: eval failed: bayes: (in learn) locker: safe_lock: cannot create lockfile /var/spool/filter/spamassassin/bayes.mutex: No such file or directory
Learned tokens from 0 message(s) (1 message(s) examined)
ERROR: the Bayes learn function returned an error, please re-run with -D for more information at /usr/local/bin/sa-learn line 494.
[/geshifilter-code]
В таком случае необходимо создать директорию /var/spool/filter/spamassassin и назначить владельцем пользователя spamd.
Postfix
Postfix – это агент передачи сообщений (MTA, message transport agent). Пересылает по протоколу SMTP сообщения от почтового клиента (MUA, mail user agent), к удаленному почтовому серверу. Также принимает сообщения от удаленных почтовых серверов, пересылает их другим MTA или доставляет в локальные почтовые ящики.
Устанавливаем:
[geshifilter-code]
# cd /usr/ports/mail/postfix
# make install clean
[/geshifilter-code]
Выбираем опции SASL2, TLS, MYSQL.
Отвечаем положительно на вопросы о добавлении пользователя postfix в группу mail и добавлении в mailer.conf.
Правим rc.conf:
[geshifilter-code]
# echo 'postfix_enable="YES"' >> /etc/rc.conf
# echo 'sendmail_enable=NONE' >> /etc/rc.conf
[/geshifilter-code]
Правим конфиг /usr/local/etc/postfix/main.cf:
[geshifilter-code]
#Каталог для размещения очереди писем
queue_directory = /var/spool/postfix
#Директория административных команд
command_directory = /usr/local/sbin
#Директория с дополнительными командами
daemon_directory = /usr/local/libexec/postfix
#Каталог файлов данных постфикса (кэш, случайные числа)
data_directory = /var/db/postfix
#Имя пользователя, с правами которого работает постфикс
mail_owner = postfix
#Имя системы, по умолчанию используется FQDN имя, получаемое с помощью gethostname();
myhostname = mail.mydomain.ru
#Имя домена
mydomain = mydomain.ru
#Имя, под которым Postfix будет представляться при взаимодействии с другими системами. Значение данной опции используется в ходе начальных переговоров с удаленным сервером, предусмотренных протоколом SMTP и для указания доменного имени в поле From, если соответствующие данные не были включены в это поле программой подготовки писем.
#Значение используется в адресе отправителя почты,если myorigin=mydomain.ru то вся почта будет из @mydomain.ru
myorigin = $mydomain
#Интерфейсы, на которых постфикс будет ждать smtp-соединения (принимать почту)
inet_interfaces = all
#Для каких доменов принимать почту
mydestination = $myhostname, localhost, $mydomain
#Списки наших локальных пользователей
local_recipient_maps = mysql:/usr/local/etc/postfix/dbmail_aliases.cf
#С каким кодом отклонять письма для несуществующих пользователей
unknown_local_recipient_reject_code = 550
#Подсети из которых почта принимается, не проходя многих проверок.Перекрывает параметр mynetworks_style.
#Список доверенных сетей, клиенты из доверенных сетей могут перенаправлять почту через почтовый сервер
mynetworks = 192.168.0.0/24, 127.0.0.0/8
#Приглашение почтового сервера
smtpd_banner = $myhostname ESMTP $mail_name
#Уровень детализации сообщений отладки
debug_peer_level = 2
#Внешняя программа, запускаемая в случае старта Postfx с опцией -D (дебаговый режим)
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
#Замена стандартного sendmail
sendmail_path = /usr/local/sbin/sendmail
#Команда перестройки псевдонимов
newaliases_path = /usr/local/bin/newaliases
#Путь к программе mailq, с ее помощью можно посмотреть почтовую очередь
mailq_path = /usr/local/bin/mailq
#Группа, с правами которой будут выполняться команды обработки почтовой очереди
setgid_group = maildrop
#Документация
html_directory = /usr/local/share/doc/postfix
#Мануалы
manpage_directory = /usr/local/man
#Примеры конфигов
sample_directory = /usr/local/etc/postfix
#Информационные файлы
readme_directory = /usr/local/share/doc/postfix
#Указываем, где postfix должен брать информацию об алиасах
virtual_alias_maps = mysql:/usr/local/etc/postfix/dbmail_aliases.cf
#Указываем, где postfix должен брать информацию о доменах
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/sql-virtual_mailbox_domains.cf
#Указываем, где postfix должен брать информацию о почтовых ящиках
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/sql-virtual_mailbox_maps_a.cf
#Агент доставки почты
virtual_transport = dbmail-lmtp:127.0.0.1:24
mailbox_transport = dbmail-lmtp:127.0.0.1:24
#Обработка почтового сообщения после размещения в очереди. В данном случае на 10025 порту слушает антивирус ClamAV
content_filter = scan:[127.0.0.1]:10025
#Размен почтового сообщения
message_size_limit = 16485760
#Отмена поиска MX- или A-записи для домена назначения
#disable_dns_lookups = yes
#**********************************TLS**********************************
# Cпрашивать сертификаты у клиентов
smtpd_tls_ask_ccert = yes
# Требовать от клиентов предоставления сертификатов. В этом случае Postfix не будет взаимодействовать по TLS с клиентом, не приславшим свой сертификат. Эта настройка не запрещает клиенту использовать незашифрованное SMTP соединение, если не задан параметр smtpd_enforce_tls
#smtpd_tls_req_ccert = yes
#Принудительное использование TLS
#smtpd_enforce_tls = yes
#Разрешить передачу в случае несовпадения параметра Common Name в серверном сертификате с полностью определенным доменным именем сервера
#smtp_tls_enforce_peername = no
#сообщать клиентам о поддержке TLS
smtpd_use_tls = yes
#Включать возможность авторизации только в режиме tls. Предоставляет SMTP AUTH только после открытия зашифрованного SMTP соединения.
smtpd_tls_auth_only = yes
#Уровень детализации логов в режиме tls
smtpd_tls_loglevel = 1
#Запрашивать заголовки сообщений с информацией о сертификатах и шифровании
smtpd_tls_received_header = yes
#Периодичность очистки кэша TLS-сессии
smtpd_tls_session_cache_timeout = 86400s
#Генератор случайных чисел для TLS
tls_random_source = dev:/dev/urandom
#Ключ
smtpd_tls_key_file = /usr/local/ssl/ca/ca.key
#Сертификат
smtpd_tls_cert_file = /usr/local/ssl/ca/ca.crt
#CA файл
smtpd_tls_CAfile = /usr/local/ssl/ca/ca.crt
#**********************************SASL**********************************
#Используем sasl для smtpd авторизации
smtpd_sasl_auth_enable = yes
#Плагин sasl, используемый для аутентификации
smtpd_sasl_type = cyrus
#Разрешаем не-стандартную(устаревшую) команду AUTH
broken_sasl_auth_clients = yes
#Список сетей которым SASL AUTH предлагаться не будет
smtpd_sasl_exceptions_networks = $mynetworks
#Опции для SASL-аутентификации. Запрещаем использовать анонимную аутентификацию при отсутствии шифрования.
smtpd_sasl_security_options = noanonymous
#Запрещаем анонимную аутентификацию в рамках сеанса TLS
smtp_sasl_tls_security_options = noanonymous
#Имя файла с настройками параметров аутентификации в директории sasl
smtpd_sasl_path = smtpd
#Запрашиваем у всех клиентов, открывающих SMTP соединение, выполнение команды HELO или EHLO
smtpd_helo_required = yes
#Ограничения в контексте команды RCPT TO
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
[/geshifilter-code]
Содержимое файла /usr/local/etc/postfix/sql-virtual_mailbox_domains.cf:
[geshifilter-code]
user = dbmail
password = pass
hosts = localhost
dbname = dbmail
query = SELECT DISTINCT 1 FROM dbmail_aliases WHERE SUBSTRING_INDEX(alias, '@', -1) = '%s'
[/geshifilter-code]
Содержимое файла /usr/local/etc/postfix/dbmail_aliases.cf:
[geshifilter-code]
user = dbmail
password = pass
hosts = localhost
dbname = dbmail
table = dbmail_aliases
select_field = alias
where_field = alias
[/geshifilter-code]
Содержимое файла /usr/local/etc/postfix/sql-virtual_mailbox_maps_a.cf:
[geshifilter-code]
user = dbmail
password = pass
hosts = localhost
dbname = dbmail
query = SELECT DISTINCT 1 FROM dbmail_aliases WHERE alias='%s'
[/geshifilter-code]
Правим конфиг /usr/local/etc/postfix/master.cf:
[geshifilter-code]
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
#clamsmtpd
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
smtp inet n - n - - smtpd -o content_filter=spamassassin
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
#qmgr fifo n - n 300 1 oqmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
-o smtp_fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
dbmail-lmtp unix - - n - - lmtp
-o disable_dns_lookups=yes
spamassassin unix - n n - - pipe user=nobody argv=/usr/local/bin/spamc -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}
[/geshifilter-code]
Когда Postfix уже сконфигурирован, необходимо создать базу данных псевдонимов alias.db:
[geshifilter-code]
# newaliases
[/geshifilter-code]
Запускаем Postfix:
[geshifilter-code]
# /usr/local/etc/rc.d/postfix start
[/geshifilter-code]
STunnel
STunnel позволяет обезопасить демоны и протоколы (POP, IMAP, LDAP, и т.д), не поддерживающие SSL.
Устанавливаем:
[geshifilter-code]
# cd /usr/ports/security/stunnel
# make install clean
[/geshifilter-code]
Создаем конфигурационный файл:
[geshifilter-code]
# cp /usr/local/etc/stunnel/stunnel.conf-sample /usr/local/etc/stunnel/stunnel.conf
[/geshifilter-code]
Правим /usr/local/etc/stunnel/stunnel.conf:
[geshifilter-code]
cert = /usr/local/ssl/ca/ca.crt
key = /usr/local/ssl/ca/ca.key
sslVersion = all
chroot = /var/tmp/stunnel
setuid = stunnel
setgid = nogroup
pid = /stunnel.pid
debug = 4
[pop3s]
accept = 995
connect = 110
;[imaps]
;accept = 993
;connect = 143
;[ssmtp]
;accept = 465
;connect = 25
;[https]
;accept = 443
;connect = 80
;TIMEOUTclose = 0
[/geshifilter-code]
Создаем директорию для chroot:
[geshifilter-code]
# mkdir /var/tmp/stunnel
# chown stunnel /var/tmp/stunnel
[/geshifilter-code]
Правим rc.conf:
[geshifilter-code]
# echo 'stunnel_enable="YES"' >> /etc/rc.conf
# echo 'stunnel_config="/usr/local/etc/stunnel/stunnel.conf"' >> /etc/rc.conf
# echo 'stunnel_pidfile="/var/tmp/stunnel/stunnel.pid"' >> /etc/rc.conf
[/geshifilter-code]
Запускаем:
[geshifilter-code]
# /usr/local/etc/rc.d/stunnel start
[/geshifilter-code]
Таким образом, на 995 порту stunnel ожидает POP3S соединения, дешифрует их и посылает на POP3 порт в незашифрованном виде.
|
Нажимая кнопку «Сохранить», я подтверждаю свою дееспособность, согласие на получение информации от NetK, согласие на обработку персональных данных в соответствии с Политикой конфиденциальности и Пользовательским соглашением.