Skip to Content
 Русский Русский    English English   

 

Почтовая система 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) - один ключ и для зашифровки и для расшифровки. Из минусов использования только симметричного шифрования - если станет известен ключ, то шифр поддается практически моментальной расшифровке.

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

Таким образом, большие объёмы данных шифруются симметричным шифром на сеансовом ключе, а с помощью асимметричного шифра передаётся только сам сеансовый ключ.

Алгоритм процедуры установления соединения по протоколу TLS (TLS Handshake)


> 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: SIZE=493
> 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 порт в незашифрованном виде.



Ваша оценка: Нет Средняя: 4.7 (22 голоса)

Нажимая кнопку «Сохранить», я подтверждаю свою дееспособность, согласие на получение информации от NetK, согласие на обработку персональных данных в соответствии с Политикой конфиденциальности и Пользовательским соглашением.