Почтовый сервер на базе Postfix, Courier-IMAP, Cyrus-SASL, MySQL, clamav — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
(Полностью удалено содержимое страницы)
 
(не показаны 2 промежуточные версии этого же участника)
Строка 1: Строка 1:
При установке будем ориентироваться на наш любимый мануал: http://www.sys-adm.org.ua/mail/mail-howto-p1<br/>
 
Настройку будем производить для сервера с одним доменом. Система FreeBSD 9.0
 
  
 
'''1. Начинаем со стандартной связки Apache, MySQL, PHP, PHP-extension'''
 
# cd /usr/ports/www/apache22
 
# make install
 
 
# cd /usr/ports/databases/mysql55-server
 
# make install
 
 
# cd /usr/ports/lang/php52
 
# make install
 
 
# cd /usr/ports/lang/php52-extensions
 
# make install
 
 
После установки MySQL сразу придумываем имя БД, пользователя и пароль, т.к. использоваться они будут в конфигах, до того как будет создана БД.
 
 
 
'''2. Устанавливаем Openssl.''' Он нужен для генерации сертификатов/ключей, а также для поддержки SSL/TLS:
 
# cd /usr/ports/security/openssl/
 
# make install
 
 
 
'''3. Теперь ставим Cyrus-Sasl.''' Эта библиотека будет использоваться для SMTP-аутентификации, т.е. проверки логина/пароля по некоторому алгоритму, например PLAIN, LOGIN, CRAM-MD5:
 
# cd /usr/ports/security/cyrus-sasl2/
 
# make install
 
Выбираем нужное: MYSQL, LOGIN, PLAIN, CRAM, DIGEST
 
 
 
'''4. Собираем и настраиваем Courier-authlib''', эту библиотеку Courier-IMAP использует для аутентификации пользователей.
 
# cd /usr/ports/security/courier-authlib/
 
# make install
 
Выбираем нужное: AUTH-MYSQL
 
 
Для автозапуска authdaemond прописываем в /etc/rc.conf:
 
courier_authdaemond_enable="YES"
 
 
 
Рихтуем конфиги:
 
[/usr/local/etc/authlib/authdaemonrc]
 
 
authmodulelist="authmysql"
 
authmodulelistorig="authmysql"
 
daemons=5
 
authdaemonvar=/var/run/authdaemond
 
subsystem=mail
 
DEBUG_LOGIN=2
 
DEFAULTOPTIONS="wbnodsn=1"
 
LOGGEROPTS=""
 
 
[/usr/local/etc/authlib/authmysqlrc]
 
 
MYSQL_SERVER        localhost
 
MYSQL_DATABASE      postfix
 
MYSQL_USERNAME      postfix
 
MYSQL_PASSWORD      postfix
 
MYSQL_PORT          3306
 
MYSQL_OPT          0
 
MYSQL_CHARACTER_SET utf8
 
MYSQL_USER_TABLE    mailbox
 
#MYSQL_CRYPT_PWFIELD crypt
 
MYSQL_CLEAR_PWFIELD password
 
MYSQL_UID_FIELD    '1981'
 
MYSQL_GID_FIELD    '1981'
 
MYSQL_LOGIN_FIELD  username
 
MYSQL_HOME_FIELD    '/var/spool/mail'
 
MYSQL_NAME_FIELD    name
 
MYSQL_MAILDIR_FIELD maildir
 
MYSQL_QUOTA_FIELD  quota
 
MYSQL_WHERE_CLAUSE  active='1'
 
 
Обращаем внимание на значения полей MYSQL_UID_FIELD и MYSQL_GID_FIELD, здесь необходимо указывать uid и gid пользователя и группы virtual соответственно.<br/>
 
Если MySQL запускается на той же машине, что и courier-authlib можно использовать сокет, вместо указания порта и имени сервера. При этом не нужно инициализировать MYSQL_SERVER/MYSQL_PORT.
 
 
 
Стартуем authdaemond:
 
# /usr/local/etc/rc.d/courier-authdaemond start
 
Starting courier_authdaemond.
 
 
Если всё нормально, в логе должно быть:
 
Apr 27 15:09:48 test authdaemond: modules="authmysql", daemons=5
 
Apr 27 15:09:48 test authdaemond: Installing libauthmysql
 
Apr 27 15:09:48 test authdaemond: Installation complete: authmysql
 
 
 
'''5. Переходим к настройке courier-imap.'''
 
# cd /usr/ports/mail/courier-imap/
 
# make install
 
Выбираем нужное: TRASHQUOTA, AUTH-MYSQL
 
 
 
Рихтуем конфиги:
 
[/usr/local/etc/courier-imap/pop3d]
 
 
PIDFILE=/var/run/pop3d.pid
 
MAXDAEMONS=40
 
MAXPERIP=5
 
POP3AUTH="PLAIN LOGIN CRAM-MD5"
 
POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5"
 
POP3AUTH_TLS="PLAIN LOGIN CRAM-MD5"
 
POP3AUTH_TLS_ORIG="PLAIN LOGIN CRAM-MD5"
 
POP3_PROXY=0
 
PORT=110
 
ADDRESS=192.168.0.10
 
TCPDOPTS="-nodnslookup -noidentlookup"
 
LOGGEROPTS="-name=courier-imap"
 
POP3DSTART=YES
 
MAILDIRPATH=Maildir
 
 
[/usr/local/etc/courier-imap/imapd]
 
 
ADDRESS=0
 
PORT=143
 
MAXDAEMONS=40
 
MAXPERIP=5
 
PIDFILE=/var/run/imapd.pid
 
TCPDOPTS="-nodnslookup -noidentlookup"
 
LOGGEROPTS="-name=imapd"
 
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
 
IMAP_KEYWORDS=1
 
IMAP_ACL=1
 
IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"
 
IMAP_PROXY=0
 
IMAP_PROXY_FOREIGN=0
 
IMAP_IDLE_TIMEOUT=60
 
IMAP_MAILBOX_SANITY_CHECK=1
 
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
 
IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
 
IMAP_DISABLETHREADSORT=0
 
IMAP_CHECK_ALL_FOLDERS=0
 
IMAP_OBSOLETE_CLIENT=0
 
IMAP_UMASK=022
 
IMAP_ULIMITD=65536
 
IMAP_USELOCKS=1
 
IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index
 
IMAP_ENHANCEDIDLE=0
 
IMAP_TRASHFOLDERNAME=Trash
 
IMAP_EMPTYTRASH=Trash:7
 
IMAP_MOVE_EXPUNGE_TO_TRASH=0
 
SENDMAIL=/usr/sbin/sendmail
 
HEADERFROM=X-IMAP-Sender
 
IMAPDSTART=YES
 
MAILDIRPATH=Maildir
 
Если будем просматривать почту и с локалки и из мира, т.е. courier-imap будет слушать на всех активных интерфейсах, ставим ADDRESS=0<br/>
 
Если необходимо просматривать почту только через веб-интерфейс(imp), в поле ADDRESS=127.0.0.1<br/>
 
Если в системе много интерфейсов, а нужно привязать pop/imap сервер только к некоторым, то это можно сделать так:ADDRESS=0 PORT=192.168.127.1.110,127.0.0.1.110
 
 
 
Для автозапуска pop/imap добавляем в /etc/rc.conf:
 
courier_imap_pop3d_enable="YES"
 
courier_imap_imapd_enable="YES"
 
 
 
Запускаем pop/imap сервер:
 
# /usr/local/etc/rc.d/courier-imap-imapd start
 
Starting courier_imap_imapd.
 
# /usr/local/etc/rc.d/courier-imap-pop3d start
 
Starting courier_imap_pop3d
 
 
 
Проверяем:
 
# netstat -Aan | grep 110
 
cb276000 tcp4 0 0 *.110 *.* LISTEN
 
# netstat -Aan | grep 143
 
c5e0c768 tcp4 0 0 *.143 *.* LISTEN
 
 
 
'''6. Ну вот мы и добрались до Postfix.'''
 
# cd /usr/ports/mail/postfix28
 
# make install
 
Выбираем нужное: PCRE, SASL2, TLS, MYSQL, VDA
 
 
В конце установки отвечаем на вопрос:
 
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y
 
 
 
Отключаем запуск sendmail при старте системы в /etc/rc.conf:
 
sendmail_enable="NO"
 
sendmail_submit_enable="NO"
 
sendmail_outbound_enable="NO"
 
sendmail_msp_queue_enable="NO"
 
 
 
Отключаем опции sendmail /etc/periodic.conf
 
daily_clean_hoststat_enable="NO"
 
daily_status_mail_rejects_enable="NO"
 
daily_status_include_submit_mailq="NO"
 
daily_submit_queuerun="NO"
 
 
 
Редактируем конфигурационный файл postfix /usr/local/etc/postfix/main.cf:<br/>
 
<spoiler>
 
# LOCAL PATHNAME INFORMATION
 
#
 
# Указываем месторасположения директории очереди postfix. Также данная
 
# директория является корнем, когда postfix запускается в chroot окружении.
 
queue_directory = /var/spool/postfix
 
 
# Задает месторасположение всех postXXX команд (postmap, postconf, postdrop)
 
command_directory = /usr/local/sbin
 
 
# Задаем корень конфигурационных файлов, для более "быстрой навигации".
 
# Например, теперь можно использовать $base/header_checks вместо
 
# /usr/local/etc/postfix/header_checks. Мелочь, а приятно.
 
base = /usr/local/etc/postfix
 
 
# Задает месторасположение всех программ демонов postfix. Это программы,
 
# перечисленные в файле master.cf. Владельцем этой директории должен быть root
 
daemon_directory = /usr/local/libexec/postfix
 
 
# QUEUE AND PROCESS OWNERSHIP
 
#
 
# Задает владельца очереди postfix, а также большинства демонов postfix.
 
# В целях безопасности, необходимо использовать выделенную учетную запись.
 
# Т.е. от данного пользователя не должны запускаться какие-либо процессы
 
# в системе, а также он не должен являться владельцем каких-либо файлов.
 
mail_owner = postfix
 
 
# Права по умолчанию, использующиеся local delivery agent. Не указывайте
 
# здесь привилегированного пользователя или владельца postfix.
 
default_privs = nobody
 
 
# INTERNET HOST AND DOMAIN NAMES
 
# Задает имя хоста в формате FQDN. По умолчанию, используется значение,
 
# возвращаемой функцией gethostname().
 
myhostname = mail.megapuper.ru
 
 
# Задает имя нашего домена. По умолчанию используется значение $myhostname
 
# минус первый компонент.
 
mydomain = megapuper.ru
 
 
# SENDING MAIL
 
# Данный параметр указывает имя домена, которое используется при отправлении
 
#  почты с этой машины. По умолчанию, используется имя локальной машины -
 
# $myhostname. Для согласованности между адресами отправителя и получателя,
 
# myorigin также указывает доменное имя, которое добавляется к адресу
 
# получателя для которого не указана доменная часть.
 
# myorigin = $myhostname (отправлять письма от: "test@megapuper.ru")
 
# myorigin = $mydomain (отправлять письма от: "test@megapuper.ru")
 
myorigin = $mydomain
 
 
 
# RECEIVING MAIL
 
#  Указывает адреса сетевых интерфейсов, на которых будет принимать почту
 
# наша почтовая система. По умолчанию используются все активные интерфейсы
 
# на машине. При изменении этого праметра необходимо перезапустить postfix
 
inet_interfaces = all
 
 
# Данный параметр указывает список доменов, для которых почта будет доставляться
 
# локально, а не пересылаться на другой хост. Не указывайте здесь виртуальные
 
# домены, для этого есть специальный параметр virtual_mailbox_domains
 
mydestination = $myhostname, localhost.$mydomain, localhost
 
 
 
# REJECTING MAIL FOR UNKNOWN LOCAL USERS
 
# Таблица просмотра со всеми именами и адресами локальных получателей.
 
local_recipient_maps = unix:passwd.byname $alias_maps
 
 
 
# TRUST AND RELAY CONTROL
 
#
 
# Данный параметр задает список "доверенных" клиентов, которые обладают
 
# некоторыми привилегиями. В частности доверенным SMTP клиентам дозволено
 
# пересылать почту через postfix. Если вы не доверяете никому, то оставьте
 
# только 127.0.0.0/8
 
mynetworks = 127.0.0.0/8, 192.168.0.0/24
 
 
 
# ALIAS DATABASE
 
#
 
# Данный параметр указывает список алиасов, используемый local delivery agent
 
# После внесения изменений в данный файл необходимо выполнить команду newaliases
 
# или postalias /etc/mail/aliases
 
alias_maps = hash:/etc/aliases
 
alias_database = hash:/etc/aliases
 
 
# SHOW SOFTWARE VERSION OR NOT
 
#
 
# Желательно сообщать как можно меньше информации о нашем почтовом сервере.
 
# Согласно требованиям SMTP протокола вы должны указать $myhostname вначале текста
 
smtpd_banner = $myhostname ESMTP
 
 
 
# DEBUGGING CONTROL
 
#
 
# Задает уровень информативности, когда имя или адрес SMTP клиента
 
# или сервера соответствует шаблону, заданному в параметре debug_peer_list.
 
# Следует использовать только во время отладки.
 
# debug_peer_list = 127.0.0.1, megapuper.ru
 
debug_peer_level = 7
 
 
# RESTRICTIONS
 
#
 
# client, helo, sender, recipient, data, end-of-data
 
#
 
 
 
# Дополнительные ограничения доступа  smtp сервера в контексте
 
# smtp запроса клиента
 
smtpd_client_restrictions =  permit_mynetworks,
 
                            permit_sasl_authenticated,
 
                            check_client_access hash:$base/client_access,
 
#Появились проблемы с хождением почты, пришлось закомментить эту строчку
 
#                            reject_unknown_client_hostname
 
 
 
# Дополнительные ограничения, применяемые сервером Postfix
 
# в контексте SMTP команды HELO
 
smtpd_helo_restrictions =      check_helo_access hash:$base/hello_access,
 
                                permit_mynetworks,
 
                                permit_sasl_authenticated,
 
                                reject_invalid_helo_hostname,
 
                                reject_non_fqdn_helo_hostname,
 
                                reject_unknown_helo_hostname
 
 
# Дополнительные ограничения, применяемые сервером Postfix
 
# в контексте команды MAIL FROM
 
smtpd_sender_restrictions =    permit_mynetworks,
 
                                check_sender_access hash:$base/sender_access,
 
                                reject_authenticated_sender_login_mismatch,
 
                                reject_unknown_sender_domain,
 
                                reject_unlisted_sender,
 
#Появились проблемы с хождением почты, пришлось закомментить эту строчку
 
#                              reject_unverified_sender
 
 
 
# Дополнительные ограничения, применяемые сервером Postfix
 
# в контексте команды RCPT TO
 
smtpd_recipient_restrictions =  permit_mynetworks,
 
                                permit_sasl_authenticated,
 
                                reject_unauth_destination,
 
                                check_recipient_access hash:$base/recipient_access,
 
                                reject_unlisted_recipient,
 
                                reject_unknown_recipient_domain,
 
                                reject_non_fqdn_recipient,
 
                                reject_unverified_recipient
 
 
# Отклонять команду ETRN
 
smtpd_etrn_restrictions = reject
 
 
 
# Заставляем отклонять почту с неизвестным адресом отправителя.
 
# Позволяет бороться с червями и некоторыми вирусами.
 
smtpd_reject_unlisted_sender = yes
 
 
 
# Отключает SMTP команду VRFY. В результате чего, невозможно определить
 
# существование определенного ящика. Данная техника (применение команды
 
# VRFY) используется спамерами для сбора имен почтовых ящиков.
 
disable_vrfy_command = yes
 
 
 
# Требуем чтобы адреса, передаваемые в SMTP командах MAIL FROM и RCPT TO
 
# заключались в <>, а также не содержали стилей или фраз RFC 822.
 
strict_rfc821_envelopes = yes
 
 
 
# Скрываем отображение имени таблицы получателей в ответе "User unknown"
 
# yes: User unknown in virtual mailbox table
 
# no: User unknown
 
show_user_unknown_table_name = no
 
 
# Данный адрес будет использоваться при проверки существования адреса отправителя.
 
address_verify_sender = <>
 
 
 
# Числовой код ответа SMTP сервера Postfix в случае, когда адрес
 
# получателя отвергнут ограничением reject_unverified_sender.
 
unverified_sender_reject_code = 550
 
 
 
# Требуем, чтобы удаленный SMTP клиент представлял себя
 
# в начале SMTP сессии с помощью команды HELO или EHLO.
 
smtpd_helo_required = yes
 
 
 
# Всегда отправлять EHLO вначале SMTP сессии
 
smtp_always_send_ehlo = yes
 
 
 
# Максимальное количество ошибок, которое может сделать удаленный SMTP клиент.
 
# При превышение данного числа Postfix разорвет соединение.
 
smtpd_hard_error_limit = 8
 
 
# Включаем поддержку sasl аутентификации
 
smtpd_sasl_auth_enable = yes
 
 
 
# Имя приложения, используемого для инициализации SASL сервера.
 
# Данный параметр задает имя конфигурационного файла. Имя smtpd
 
# будет соответсвовать конфигурационному файлу SASL - smtpd.conf.
 
smtpd_sasl_application_name = smtpd
 
 
 
# Включает функциональную совместимость с SMTP клиентами, которые
 
# используют устаревшую версию команды AUTH (RFC 2554),
 
# например, outlook express 4 и MicroSoft Exchange version 5.0.
 
broken_sasl_auth_clients = yes
 
 
 
# Отвергаем методы, позволяющие анонимную аутентификацию
 
smtpd_sasl_security_options = noanonymous
 
 
 
# Optional lookup table with the SASL login names
 
# that own sender (MAIL FROM) addresses
 
smtpd_sender_login_maps = mysql:$base/mysqlLookupMaps/sender.conf
 
 
 
# Указываем, где postfix должен брать информацию о алиасах
 
virtual_alias_maps = mysql:$base/mysqlLookupMaps/alias.conf
 
 
 
# Указываем, где postfix должен брать информацию о доменах
 
virtual_mailbox_domains = mysql:$base/mysqlLookupMaps/domain.conf
 
 
# Указываем, где postfix должен брать информацию о почтовых ящиках
 
virtual_mailbox_maps = mysql:$base/mysqlLookupMaps/mailbox.conf
 
virtual_mailbox_base = /var/spool/mail
 
 
# Настраиваем поддержку квот
 
virtual_mailbox_limit_maps = mysql:$base/mysqlLookupMaps/quota.conf
 
virtual_maildir_extended=yes
 
virtual_mailbox_limit_override=yes
 
virtual_create_maildirsize = yes
 
virtual_overquota_bounce = yes
 
virtual_maildir_limit_message="Sorry, the user's maildir has overdrawn his diskspace quota, please try again later"  # Ограничиваем максимальный размер письма до 10 Мб message_size_limit = 10240000
 
                                                                                                                      # 1981 - uid и gid пользователя и
 
                                                                                                                      # группы virtual соответственно
 
virtual_gid_maps = static:1981 virtual_uid_maps = static:1981 virtual_minimum_uid = 1000
 
</spoiler>
 
 
Указываем postfix, как производить аутентификацию пользователей. Для этого создаем файл smtpd.conf со следующим содержимым:
 
[/usr/local/lib/sasl2/smtpd.conf]
 
 
pwcheck_method: auxprop
 
mech_list: PLAIN LOGIN CRAM-MD5
 
auxprop_plugin: sql
 
sql_usessl: yes
 
sql_engine: mysql
 
sql_hostnames: localhost
 
sql_user: postfix
 
sql_passwd: postfix
 
sql_database: postfix
 
sql_select: select password from mailbox where username = '%u@%r'
 
log_level: 3
 
 
 
Инициализируем базу данных псевдонимов:
 
/usr/local/bin/newaliases
 
 
 
Создаем необходимые файлы:
 
# cd /usr/local/etc/postfix
 
# touch hello_access sender_access
 
# touch recipient_access client_access
 
# postmap hello_access
 
# postmap sender_access
 
# postmap recipient_access
 
# postmap client_access
 
# mkdir /usr/local/etc/postfix/mysqlLookupMaps
 
 
 
Создаём и правим файлы:
 
[/usr/local/etc/postfix/mysqlLookupMaps/alias.conf]
 
 
user = postfix
 
password = postfix
 
hosts = localhost
 
dbname = postfix
 
table = alias
 
select_field = goto
 
where_field = address
 
 
[ee /usr/local/etc/postfix/mysqlLookupMaps/domain.conf]
 
 
user = postfix
 
password = postfix
 
hosts = localhost
 
dbname = postfix
 
table = domain
 
select_field = domain
 
where_field = domain
 
additional_conditions = and active = '1' and backupmx = '0'
 
 
[/usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf]
 
 
user = postfix
 
password = postfix
 
hosts = localhost
 
dbname = postfix
 
table = mailbox
 
select_field = maildir
 
where_field = username
 
additional_conditions = and active = '1'
 
 
[/usr/local/etc/postfix/mysqlLookupMaps/quota.conf]
 
 
user = postfix
 
password = postfix
 
hosts = localhost
 
dbname = postfix
 
table = mailbox
 
select_field = quota
 
where_field = username
 
additional_conditions = and active = '1'
 
 
[/usr/local/etc/postfix/mysqlLookupMaps/sender.conf]
 
 
user = postfix
 
password = postfix
 
hosts = localhost
 
dbname = postfix
 
table = mailbox
 
select_field = username
 
where_field = username
 
additional_conditions = and active = '1'
 
 
 
Создаём группу и добавляем в неё пользователя:
 
# pw group add virtual -g 1981
 
# pw user add virtual -g virtual -s /sbin/nologin -u 1981
 
 
 
Создаем папку, где у нас будет храниться почта, и выставляем необходимые права:
 
# mkdir /var/spool/mail
 
# chown virtual:virtual /var/spool/mail/
 
# chmod 740 /var/spool/mail/
 
 
# chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/
 
# chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf
 
# chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/
 
 
 
Для автозапуска postfix добавляем в /etc/rc.conf:
 
postfix_enable="YES"
 
 
 
Запускаем postfix:
 
# /usr/local/etc/rc.d/postfix start
 
postfix/postfix-script: starting the Postfix mail system
 
 
 
'''7. Устанавливаем Postfixadmin, web-интерфейс для администрирования почтовика.'''
 
# cd /usr/ports/mail/postfixadmin
 
# make install
 
Выбираем: MYSQLI
 
 
 
Прописываем в конфиг апача Alias или виртуальный хост для postfixadmin.<br/>
 
Создаём БД postfix. Заводим пользователя и заводим ему пароль:
 
mysql> grant all on postfix.* to postfix@localhost identified by 'пароль';
 
 
 
Рихтуем конфиг config.inc.php:
 
$CONF['configured'] = true;
 
$CONF['setup_password'] = 'пароль_для_установки';
 
$CONF['default_language'] = 'ru';
 
$CONF['database_type'] = 'mysqli';
 
$CONF['database_host'] = 'localhost';
 
$CONF['database_user'] = 'postfix';
 
$CONF['database_password'] = 'пароль_БД';
 
$CONF['database_name'] = 'postfix';
 
$CONF['emailcheck_resolve_domain']='NO';
 
$CONF['encrypt'] = 'cleartext';
 
 
 
Заходим http://ip_address/postfixadmin/setup.php если всё хорошо, то в базе создадутся все необходимые таблицы.
 
 
Теперь надо ввести пароль отсюда: '''$CONF['setup_password'] = 'пароль_для_установки';'''
 
 
Нажать кнопочку и увидеть надпись, примерно такого содержания(это сгенерится <font color=blue>хэш_пароля</font>):
 
If you want to use the password you entered as setup password, edit config.inc.php and set
 
$CONF['setup_password'] = 'f191361d412caae0e72ac7e1b125e2c4:c74ef83b1bdeb6c8567d930fa57bf1084c55f27f';
 
 
Этот хэш надо внести вместо пароля сюда:
 
$CONF['setup_password'] = '<font color=blue>хэш_пароля</font>';
 
 
Ну и в итоге создаём суперадмина, используя ''''пароль_для_установки''''
 
 
После настройки удаляем setup.php и заходим на страничку админки: http://ip_address/postfixadmin/<br/>
 
Создаём домен и ящик админа.
 
 
Теперь можно переходить к созданию почтовых ящиков.
 
 
 
Протестируем сервер.
 
 
Проверим поддержку квот. Для этого отправим письмо пользователю test@megapuper.ru, у которого квота 1Мб, письмо с вложением ~3Мб.
 
May 15 12:08:40 servmp postfix/smtpd[35103]: connect from mail.mtel.su[213.129.127.98]
 
May 15 12:08:40 servmp postfix/smtpd[35103]: CFB78638E4E: client=mail.mtel.su[213.129.127.98]
 
May 15 12:08:40 servmp postfix/cleanup[35107]: CFB78638E4E: message-id=<op.wecmn2iqnx8338@finn>
 
May 15 12:08:45 servmp postfix/qmgr[23741]: CFB78638E4E: from=<test@mtel.su>, size=3274009, nrcpt=1 (queue active)
 
May 15 12:08:45 servmp postfix/smtpd[35103]: disconnect from mail.mtel.su[213.129.127.98]
 
May 15 12:08:45 servmp postfix/virtual[35109]: CFB78638E4E: to=<test@megapuper.ru>, relay=virtual, delay=4.9, delays=4.7/0.01/0/0.18, dsn=5.2.2, status=bounced (maildir delivery failed: "Sorry, the user's maildir has overdrawn his
 
diskspace quota, please try again later") May 15 12:08:45 servmp postfix/cleanup[35107]: AEBF5638E54: message-id=<20120515120845.AEBF5638E54@mail.megapuper.ru> May 15 12:08:45 servmp postfix/bounce[35110]: CFB78638E4E: sender non-
 
delivery notification: AEBF5638E54 May 15 12:08:45 servmp postfix/qmgr[23741]: AEBF5638E54: from=<>, size=3685, nrcpt=1 (queue active) May 15 12:08:45 servmp postfix/qmgr[23741]: CFB78638E4E: removed
 
 
Как видно из log-а:
 
«status=bounced (maildir delivery failed: «Sorry, the user's maildir has overdrawn his diskspace quota, please try again later»)»
 
поддержка квот работает. Текст сообщения можно задать в main.cf в файле virtual_maildir_limit_message.
 
 
 
Теперь попробуем отправить письмо в мир, без аутентификации.
 
finn@/root#telnet mail.megapuper.ru 25
 
Trying 109.172.52.114...
 
Connected to mail.megapuper.ru.
 
Escape character is '^]'.
 
220 mail.megapuper.ru ESMTP
 
helo servmp.megapuper.ru
 
250 mail.megapuper.ru
 
mail from:<test@megapuper.ru>
 
250 2.1.0 Ok
 
rcpt to:<test@mtel.su>
 
554 5.7.1 <test@mtel.su>: Relay access denied
 
 
При этом в log-е должно быть следующее:
 
May 15 12:26:29 servmp postfix/smtpd[35230]: connect from mail.mtel.su[213.129.127.98]
 
May 15 12:27:26 servmp postfix/smtpd[35230]: NOQUEUE: reject: RCPT from mail.mtel.su[213.129.127.98]: 554 5.7.1 <test@mtel.su>: Relay access denied; from=<test@megapuper.ru> to=<test@mtel.su> proto=SMTP helo=<servmp.megapuper.ru>
 
 
Как видно из сообщения - «Relay access denied». Релей почты для пользователей, не прошедших аутентификацию запрещен.
 
 
 
Теперь пробуем отправить почту с несуществующего ящика внутри домена.
 
finn@/root#telnet mail.megapuper.ru 25
 
Trying 109.172.52.114...
 
Connected to mail.megapuper.ru.
 
Escape character is '^]'.
 
220 mail.megapuper.ru ESMTP
 
helo servmp.megapuper.ru
 
250 mail.megapuper.ru
 
mail from:<user@megapuper.ru>
 
250 2.1.0 Ok
 
rcpt to:<finn@mail.ru>
 
550 5.1.0 <finn@megapuper.ru>: Sender address rejected: User unknown
 
 
Как видно, сервер не разрешает отправлять почту с несуществующих адресов.
 
 
На этом базовую настройку МТА можно считать завершенной.
 
 
 
'''8. Установка clamav'''
 
 
Устанавливаем антивирус clamav, который будет проверять все почтовые сообщения на вирусы.
 
# cd /usr/ports/security/clamav
 
# make install
 
Выбираем нужное: ARC, ARJ, LHA, UNZOO, UNRAR, ICONV
 
 
 
Для автозапуска clamd вместе с системой прописываем в /etc/rc.conf:
 
clamav_clamd_enable="YES"
 
 
Редуктируем конфигурационный файл /usr/local/etc/clamd.conf:
 
LogFile /var/log/clamav/clamd.log
 
PidFile /var/run/clamav/clamd.pid
 
DatabaseDirectory /var/db/clamav
 
LocalSocket /var/run/clamav/clamd.sock
 
FixStaleSocket yes
 
User clamav
 
AllowSupplementaryGroups yes
 
ScanPDF yes
 
ScanMail yes
 
MaxFileSize 5M
 
 
 
Выставляем необходимые права и запускаем clamav
 
# chown -R clamav:clamav /var/log/clamav/
 
# chown -R clamav:clamav /var/run/clamav/
 
# chown -R clamav:clamav /var/db/clamav/
 
 
# /usr/local/etc/rc.d/clamav-clamd start
 
Starting clamav_clamd.
 
 
При этом в log-файле должно быть примерно следующее:
 
+++ Started at Mon Jul 23 14:56:30 2012
 
clamd daemon 0.97.4 (OS: freebsd8.2, ARCH: i386, CPU: i386)
 
Running as user clamav (UID 106, GID 106)
 
Log file size limited to 1048576 bytes.
 
Reading databases from /var/db/clamav
 
Not loading PUA signatures.
 
Bytecode: Security mode set to "TrustSigned".
 
Loaded 1277640 signatures.
 
LOCAL: Unix socket file /var/run/clamav/clamd.sock
 
LOCAL: Setting connection queue length to 200
 
Limits: Global size limit set to 5242880 bytes.
 
Limits: File size limit set to 5242880 bytes.
 
Limits: Recursion level limit set to 16.
 
Limits: Files limit set to 10000.
 
Archive support enabled.
 
Algorithmic detection enabled.
 
Portable Executable support enabled.
 
ELF support enabled.
 
Mail files support enabled.
 
OLE2 support enabled.
 
PDF support enabled.
 
HTML support enabled.
 
Self checking every 600 seconds.
 
Set stacksize to 1114112
 
No stats for Database check - forcing reload
 
Reading databases from /var/db/clamav
 
Database correctly reloaded (1277640 signatures)
 
 
 
После установки антивируса надо обновить антивирусные базы. Для этого используем freshclam, которая идет вместе с clamav. Редактируем конфиг:
 
[ee /usr/local/etc/freshclam.conf]
 
 
DatabaseDirectory /var/db/clamav
 
UpdateLogFile /var/log/clamav/freshclam.log
 
PidFile /var/run/clamav/freshclam.pid
 
DatabaseOwner clamav
 
AllowSupplementaryGroups yes
 
DatabaseMirror db.ru.clamav.net
 
Checks 24
 
NotifyClamd /usr/local/etc/clamd.conf
 
 
 
Ставим freshclam в автозагрузку:
 
clamav_freshclam_enable="YES"
 
 
и стартуем:
 
# /usr/local/etc/rc.d/clamav-freshclam start
 
 
 
В логе должно быть, примерно следующее:
 
Received signal: wake up
 
ClamAV update process started at Mon Jul 23 13:56:46 2012
 
main.cvd is up to date (version: 54, sigs: 1044387, f-level: 60, builder: sven)
 
daily.cld is up to date (version: 15168, sigs: 238519, f-level: 63, builder: guitar)
 
bytecode.cld is up to date (version: 188, sigs: 38, f-level: 63, builder: neo)
 
 
 
'''9. Установка и настройка spamassassin - антиспам'''
 
# cd /usr/ports/mail/p5-Mail-SpamAssassin
 
# make install
 
Выбираем нужное: AS_ROOT, SPAMC, SACOMPILE, SSL, GNUPG, MYSQL, SPF_QUERY
 
 
 
Ставим spamassassin в автозагрузку:
 
spamd_enable="YES"
 
 
 
и правим конфиг:
 
[ee /usr/local/etc/mail/spamassassin/local.cf]
 
 
rewrite_header Subject *****SPAM*****
 
report_safe 1
 
required_score 7.0
 
use_bayes 1
 
bayes_auto_learn 1
 
bayes_ignore_header X-Bogosity
 
bayes_ignore_header X-Spam-Flag
 
bayes_ignore_header X-Spam-Status
 
 
Это минимальный набор параметров, необходимый для проверки нашей системы. Для получения полного списка всех параметров, а также описания их назначения запускаем следующую команду:
 
# perldoc Mail::SpamAssassin::Conf
 
 
Запускаем:
 
# /usr/local/etc/rc.d/sa-spamd start
 
 
Jul 23 17:11:16 servmp spamd[11349]: logger: removing stderr method
 
Jul 23 17:11:16 servmp spamd[11351]: config: no rules were found! Do you need to run 'sa-update'?
 
Jul 23 17:11:17 servmp spamd[11349]: child process [11351] exited or timed out without signaling production of a PID file: exit 255 at /usr/local/bin/spamd line 2642.
 
 
Делаем:
 
# /usr/local/bin/sa-update
 
 
вторая попытка:
 
# /usr/local/etc/rc.d/sa-spamd start
 
 
Jul 23 17:13:07 servmp spamd[11378]: logger: removing stderr method
 
Jul 23 17:13:10 servmp spamd[11380]: Can't locate Mail/SpamAssassin/CompiledRegexps/body_0.pm in @INC (@INC contains: /var/db/spamassassin/compiled/5.012/3.003002 /var/db/spamassassin/compiled/5.012/3.003002/auto /usr/local/lib/perl5/
 
site_perl/5.12.4 /usr/local/lib/perl5/5.12.4/BSDPAN /usr/local/lib/perl5/site_perl/5.12.4/mach /usr/local/lib/perl5/5.12.4/mach /usr/local/lib/perl5/5.12.4) at (eval 901) line 1. Jul 23 17:13:11 servmp spamd[11380]: spamd: server
 
started on port 783/tcp (running version 3.3.2) Jul 23 17:13:11 servmp spamd[11380]: spamd: server pid: 11380 Jul 23 17:13:11 servmp spamd[11380]: spamd: server successfully spawned child process, pid 11384 Jul 23 17:13:11 servmp spamd
 
[11380]: spamd: server successfully spawned child process, pid 11385 Jul 23 17:13:11 servmp spamd[11380]: prefork: child states: IS Jul 23 17:13:11 servmp spamd[11380]: prefork: child states: II
 
 
 
# sa-compile
 
# spamassassin -D --lint
 
 
 
третья попытка:
 
# /usr/local/etc/rc.d/sa-spamd start
 
 
Jul 23 17:35:10 servmp spamd[12561]: logger: removing stderr method
 
Jul 23 17:35:12 servmp spamd[12563]: zoom: able to use 428/428 'body_0' compiled rules (100%)
 
Jul 23 17:35:13 servmp spamd[12563]: spamd: server started on port 783/tcp (running version 3.3.2)
 
Jul 23 17:35:13 servmp spamd[12563]: spamd: server pid: 12563
 
Jul 23 17:35:13 servmp spamd[12563]: spamd: server successfully spawned child process, pid 12564
 
Jul 23 17:35:13 servmp spamd[12563]: spamd: server successfully spawned child process, pid 12565
 
Jul 23 17:35:13 servmp spamd[12563]: prefork: child states: II
 
 
Всё нормально.
 
 
 
'''10. Установка amavisd-new'''
 
 
Устанавливаем amavisd-new, который является посредником между MTA (postfix) и различными фильтрами/сканерами (spamassassin, clamav)
 
# cd /usr/ports/security/amavisd-new
 
# make install
 
Выбираем нужное: BDB, MYSQL, SPAMASSASSIN, ALTERMIME, FILE, RAR, UNRAR, ARJ, UNARJ, LHA, ARC, CAB, RPM, ZOO, UNZOO, TNEF
 
 
 
Ставим amavisd в автозагрузку:
 
amavisd_enable="YES"
 
 
 
Редактируем конфиг /usr/local/etc/amavisd.conf:
 
<spoiler>
 
use strict;
 
 
# a minimalistic configuration file for amavisd-new with all necessary settings
 
#
 
#  see amavisd.conf-default for a list of all variables with their defaults;
 
#  for more details see documentation in INSTALL, README_FILES/*
 
#  and at http://www.ijs.si/software/amavisd/amavisd-new-docs.html
 
 
 
# COMMONLY ADJUSTED SETTINGS:
 
 
# @bypass_virus_checks_maps = (1);  # controls running of anti-virus code
 
# @bypass_spam_checks_maps  = (1);  # controls running of anti-spam code
 
# $bypass_decode_parts = 1;        # controls running of decoders&dearchivers
 
 
$max_servers = 2;            # num of pre-forked children (2..30 is common), -m
 
$daemon_user  = 'vscan';    # (no default;  customary: vscan or amavis), -u
 
$daemon_group = 'vscan';    # (no default;  customary: vscan or amavis), -g
 
 
$mydomain = 'megapuper.ru';  # a convenient default for other settings
 
 
# $MYHOME = '/var/amavis';  # a convenient default for other settings, -H
 
$TEMPBASE = "$MYHOME/tmp";  # working directory, needs to exist, -T
 
$ENV{TMPDIR} = $TEMPBASE;    # environment variable TMPDIR, used by SA, etc.
 
$QUARANTINEDIR = '/var/virusmails';  # -Q
 
# $quarantine_subdir_levels = 1;  # add level of subdirs to disperse quarantine
 
# $release_format = 'resend';    # 'attach', 'plain', 'resend'
 
# $report_format  = 'arf';        # 'attach', 'plain', 'resend', 'arf'
 
 
# $daemon_chroot_dir = $MYHOME;  # chroot directory or undef, -R
 
 
# $db_home  = "$MYHOME/db";      # dir for bdb nanny/cache/snmp databases, -D
 
# $helpers_home = "$MYHOME/var";  # working directory for SpamAssassin, -S
 
# $lock_file = "$MYHOME/var/amavisd.lock";  # -L
 
# $pid_file  = "$MYHOME/var/amavisd.pid";  # -P
 
#NOTE: create directories $MYHOME/tmp, $MYHOME/var, $MYHOME/db manually
 
 
$log_level = 0;              # verbosity 0..5, -d
 
$log_recip_templ = undef;    # disable by-recipient level-0 log entries
 
$do_syslog = 1;              # log via syslogd (preferred)
 
$syslog_facility = 'mail';  # Syslog facility as a string
 
          # e.g.: mail, daemon, user, local0, ... local7
 
 
$enable_db = 1;              # enable use of BerkeleyDB/libdb (SNMP and nanny)
 
$nanny_details_level = 2;    # nanny verbosity: 1: traditional, 2: detailed
 
#$enable_dkim_verification = 1;  # enable DKIM signatures verification
 
#$enable_dkim_signing = 1;    # load DKIM signing code, keys defined by dkim_key
 
 
@local_domains_maps = ( [".$mydomain"] );  # list of all local domains
 
 
@mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10
 
                  10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 );
 
 
#$unix_socketname = "$MYHOME/amavisd.sock";  # amavisd-release or amavis-milter
 
              # option(s) -p overrides $inet_socket_port and $unix_socketname
 
 
$inet_socket_port = 10024;  # listen on this local TCP port(s)
 
# $inet_socket_port = [10024,10026];  # listen on multiple TCP ports
 
 
$policy_bank{'MYNETS'} = {  # mail originating from @mynetworks
 
  originating =&gt; 1,  # is true in MYNETS by default, but let's make it explicit
 
  os_fingerprint_method =&gt; undef,  # don't query p0f for internal clients
 
};
 
 
# it is up to MTA to re-route mail from authenticated roaming users or
 
# from internal hosts to a dedicated TCP port (such as 10026) for filtering
 
$interface_policy{'10026'} = 'ORIGINATING';
 
 
$policy_bank{'ORIGINATING'} = {  # mail supposedly originating from our users
 
  originating =&gt; 1,  # declare that mail was submitted by our smtp client
 
  allow_disclaimers =&gt; 1,  # enables disclaimer insertion if available
 
  # notify administrator of locally originating malware
 
  virus_admin_maps =&gt; ["virusalert\@$mydomain"],
 
  spam_admin_maps  =&gt; ["virusalert\@$mydomain"],
 
  warnbadhsender  =&gt; 1,
 
  # forward to a smtpd service providing DKIM signing service
 
  forward_method =&gt; 'smtp:[127.0.0.1]:10027',
 
  # force MTA conversion to 7-bit (e.g. before DKIM signing)
 
  smtpd_discard_ehlo_keywords =&gt; ['8BITMIME'],
 
  bypass_banned_checks_maps =&gt; [1],  # allow sending any file names and types
 
  terminate_dsn_on_notify_success =&gt; 0,  # don't remove NOTIFY=SUCCESS option
 
};
 
 
$interface_policy{'SOCK'} = 'AM.PDP-SOCK'; # only applies with $unix_socketname
 
 
# Use with amavis-release over a socket or with Petr Rehor's amavis-milter.c
 
# (with amavis-milter.c from this package or old amavis.c client use 'AM.CL'):
 
$policy_bank{'AM.PDP-SOCK'} = {
 
  protocol =&gt; 'AM.PDP',
 
  auth_required_release =&gt; 0,  # do not require secret_id for amavisd-release
 
};
 
 
$sa_tag_level_deflt  = 2.0;  # add spam info headers if at, or above that level
 
$sa_tag2_level_deflt = 6.2;  # add 'spam detected' headers at that level
 
$sa_kill_level_deflt = 6.9;  # triggers spam evasive actions (e.g. blocks mail)
 
$sa_dsn_cutoff_level = 10;  # spam level beyond which a DSN is not sent
 
$sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From
 
# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off
 
$penpals_bonus_score = 8;    # (no effect without a @storage_sql_dsn database)
 
$penpals_threshold_high = $sa_kill_level_deflt;  # don't waste time on hi spam
 
$bounce_killer_score = 100;  # spam score points to add for joe-jobbed bounces
 
 
$sa_mail_body_size_limit = 400*1024; # don't waste time on SA if mail is larger
 
$sa_local_tests_only = 0;    # only tests which do not require internet access?
 
 
# @lookup_sql_dsn =
 
#  ( ['DBI:mysql:database=mail;host=127.0.0.1;port=3306', 'user1', 'passwd1'],
 
#    ['DBI:mysql:database=mail;host=host2', 'username2', 'password2'],
 
#    ["DBI:SQLite:dbname=$MYHOME/sql/mail_prefs.sqlite", '', ''] );
 
# @storage_sql_dsn = @lookup_sql_dsn;  # none, same, or separate database
 
 
# $timestamp_fmt_mysql = 1; # if using MySQL *and* msgs.time_iso is TIMESTAMP;
 
#  defaults to 0, which is good for non-MySQL or if msgs.time_iso is CHAR(16)
 
 
$virus_admin              = "virusalert\@$mydomain";  # notifications recip.
 
 
$mailfrom_notify_admin    = "virusalert\@$mydomain";  # notifications sender
 
$mailfrom_notify_recip    = "virusalert\@$mydomain";  # notifications sender
 
$mailfrom_notify_spamadmin = "spam.police\@$mydomain"; # notifications sender
 
$mailfrom_to_quarantine = ''; # null return path; uses original sender if undef
 
 
@addr_extension_virus_maps      = ('virus');
 
@addr_extension_banned_maps    = ('banned');
 
@addr_extension_spam_maps      = ('spam');
 
@addr_extension_bad_header_maps = ('badh');
 
# $recipient_delimiter = '+';  # undef disables address extensions altogether
 
# when enabling addr extensions do also Postfix/main.cf: recipient_delimiter=+
 
 
$path = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin';
 
# $dspam = 'dspam';
 
 
$MAXLEVELS = 14;
 
$MAXFILES = 1500;
 
$MIN_EXPANSION_QUOTA =      100*1024;  # bytes  (default undef, not enforced)
 
$MAX_EXPANSION_QUOTA = 300*1024*1024;  # bytes  (default undef, not enforced)
 
 
$sa_spam_subject_tag = '***Spam*** ';
 
$defang_virus  = 1;  # MIME-wrap passed infected mail
 
$defang_banned = 1;  # MIME-wrap passed mail containing banned name
 
# for defanging bad headers only turn on certain minor contents categories:
 
$defang_by_ccat{CC_BADH.",3"} = 1;  # NUL or CR character in header
 
$defang_by_ccat{CC_BADH.",5"} = 1;  # header line longer than 998 characters
 
$defang_by_ccat{CC_BADH.",6"} = 1;  # header field syntax error
 
 
 
# OTHER MORE COMMON SETTINGS (defaults may suffice):
 
 
$myhostname = 'mail.megapuper.ru';  # must be a fully-qualified domain name!
 
 
$notify_method  = 'smtp:[127.0.0.1]:10025';
 
$forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!
 
 
$final_virus_destiny      = D_DISCARD;
 
$final_banned_destiny    = D_DISCARD;
 
$final_spam_destiny      = D_PASS;  #!!!  D_DISCARD / D_REJECT
 
$final_bad_header_destiny = D_PASS;
 
$bad_header_quarantine_method = undef;
 
 
# $os_fingerprint_method = 'p0f:*:2345';  # to query p0f-analyzer.pl
 
 
## hierarchy by which a final setting is chosen:
 
##  policy bank (based on port or IP address) -> *_by_ccat
 
##  *_by_ccat (based on mail contents) -> *_maps
 
##  *_maps (based on recipient address) -> final configuration value
 
 
 
# SOME OTHER VARIABLES WORTH CONSIDERING (see amavisd.conf-default for all)
 
 
# $warnbadhsender,
 
# $warnvirusrecip, $warnbannedrecip, $warnbadhrecip, (or @warn*recip_maps)
 
#
 
# @bypass_virus_checks_maps, @bypass_spam_checks_maps,
 
# @bypass_banned_checks_maps, @bypass_header_checks_maps,
 
#
 
# @virus_lovers_maps, @spam_lovers_maps,
 
# @banned_files_lovers_maps, @bad_header_lovers_maps,
 
#
 
# @blacklist_sender_maps, @score_sender_maps,
 
#
 
# $clean_quarantine_method, $virus_quarantine_to, $banned_quarantine_to,
 
# $bad_header_quarantine_to, $spam_quarantine_to,
 
#
 
# $defang_bad_header, $defang_undecipherable, $defang_spam
 
 
 
# REMAINING IMPORTANT VARIABLES ARE LISTED HERE BECAUSE OF LONGER ASSIGNMENTS
 
 
@keep_decoded_original_maps = (new_RE(
 
  qr'^MAIL$',  # retain full original message for virus checking
 
  qr'^MAIL-UNDECIPHERABLE$', # recheck full mail if it contains undecipherables
 
  qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
 
# qr'^Zip archive data',    # don't trust Archive::Zip
 
));
 
 
$banned_filename_re = new_RE(
 
 
### BLOCKED ANYWHERE
 
# qr'^UNDECIPHERABLE$',  # is or contains any undecipherable components
 
  qr'^\.(exe-ms|dll)$',                  # banned file(1) types, rudimentary
 
# qr'^\.(exe|lha|cab|dll)$',              # banned file(1) types
 
 
### BLOCK THE FOLLOWING, EXCEPT WITHIN UNIX ARCHIVES:
 
# [ qr'^\.(gz|bz2)$'            => 0 ],  # allow any in gzip or bzip2
 
  [ qr'^\.(rpm|cpio|tar)$'      =&gt; 0 ],  # allow any in Unix-type archives
 
 
  qr'.\.(pif|scr)$'i,                    # banned extensions - rudimentary
 
# qr'^\.zip$',                            # block zip type
 
 
### BLOCK THE FOLLOWING, EXCEPT WITHIN ARCHIVES:
 
# [ qr'^\.(zip|rar|arc|arj|zoo)$'=> 0 ],  # allow any within these archives
 
 
  qr'^application/x-msdownload$'i,        # block these MIME types
 
  qr'^application/x-msdos-program$'i,
 
  qr'^application/hta$'i,
 
 
# qr'^message/partial$'i,        # rfc2046 MIME type
 
# qr'^message/external-body$'i,  # rfc2046 MIME type
 
 
# qr'^(application/x-msmetafile|image/x-wmf)$'i,  # Windows Metafile MIME type
 
# qr'^\.wmf$',                            # Windows Metafile file(1) type
 
 
  # block certain double extensions in filenames
 
  qr'^(?!cid:).*\.[^./]*[A-Za-z][^./]*.s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i,
 
 
# qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?'i, # Class ID CLSID, strict
 
# qr'\{[0-9a-z]{4,}(-[0-9a-z]{4,}){0,7}\}?'i, # Class ID extension CLSID, loose
 
 
  qr'.\.(exe|vbs|pif|scr|cpl)$'i,            # banned extension - basic
 
# qr'.\.(exe|vbs|pif|scr|cpl|bat|cmd|com)$'i, # banned extension - basic+cmd
 
# qr'.\.(ade|adp|app|bas|bat|chm|cmd|com|cpl|crt|emf|exe|fxp|grp|hlp|hta|
 
#        inf|ini|ins|isp|js|jse|lib|lnk|mda|mdb|mde|mdt|mdw|mdz|msc|msi|
 
#        msp|mst|ocx|ops|pcd|pif|prg|reg|scr|sct|shb|shs|sys|vb|vbe|vbs|vxd|
 
#        wmf|wsc|wsf|wsh)$'ix,                # banned extensions - long
 
# qr'.\.(asd|asf|asx|url|vcs|wmd|wmz)$'i,    # consider also
 
# qr'.\.(ani|cur|ico)$'i,                # banned cursors and icons filename
 
# qr'^\.ani$',                            # banned animated cursor file(1) type
 
# qr'.\.(mim|b64|bhx|hqx|xxe|uu|uue)$'i,  # banned extension - WinZip vulnerab.
 
);
 
# See http://support.microsoft.com/default.aspx?scid=kb;EN-US;q262631
 
# and http://www.cknow.com/vtutor/vtextensions.htm
 
 
 
# ENVELOPE SENDER SOFT-WHITELISTING / SOFT-BLACKLISTING
 
 
@score_sender_maps = ({ # a by-recipient hash lookup table,
 
                        # results from all matching recipient tables are summed
 
 
# ## per-recipient personal tables  (NOTE: positive: black, negative: white)
 
# 'user1@example.com'  => [{'bla-mobile.press@example.com' => 10.0}],
 
# 'user3@example.com'  => [{'.ebay.com'                => -3.0}],
 
# 'user4@example.com'  => [{'cleargreen@cleargreen.com' => -7.0,
 
#                          '.cleargreen.com'          => -5.0}],
 
 
  ## site-wide opinions about senders (the '.' matches any recipient)
 
  '.' =&gt; [  # the _first_ matching sender determines the score boost
 
 
  new_RE(  # regexp-type lookup table, just happens to be all soft-blacklist
 
    [qr'^(bulkmail|offers|cheapbenefits|earnmoney|foryou)@'i        =&gt; 5.0],
 
    [qr'^(greatcasino|investments|lose_weight_today|market\.alert)@'i=&gt; 5.0],
 
    [qr'^(money2you|MyGreenCard|new\.tld\.registry|opt-out|opt-in)@'i=&gt; 5.0],
 
    [qr'^(optin|saveonlsmoking2002k|specialoffer|specialoffers)@'i  =&gt; 5.0],
 
    [qr'^(stockalert|stopsnoring|wantsome|workathome|yesitsfree)@'i  =&gt; 5.0],
 
    [qr'^(your_friend|greatoffers)@'i                                =&gt; 5.0],
 
    [qr'^(inkjetplanet|marketopt|MakeMoney)\d*@'i                    =&gt; 5.0],
 
  ),
 
 
#  read_hash("/var/amavis/sender_scores_sitewide"),
 
 
  { # a hash-type lookup table (associative array)
 
    'nobody@cert.org'                        =&gt; -3.0,
 
    'cert-advisory@us-cert.gov'              =&gt; -3.0,
 
    'owner-alert@iss.net'                    =&gt; -3.0,
 
    'slashdot@slashdot.org'                  =&gt; -3.0,
 
    'securityfocus.com'                      =&gt; -3.0,
 
    'ntbugtraq@listserv.ntbugtraq.com'      =&gt; -3.0,
 
    'security-alerts@linuxsecurity.com'      =&gt; -3.0,
 
    'mailman-announce-admin@python.org'      =&gt; -3.0,
 
    'amavis-user-admin@lists.sourceforge.net'=&gt; -3.0,
 
    'amavis-user-bounces@lists.sourceforge.net' =&gt; -3.0,
 
    'spamassassin.apache.org'                =&gt; -3.0,
 
    'notification-return@lists.sophos.com'  =&gt; -3.0,
 
    'owner-postfix-users@postfix.org'        =&gt; -3.0,
 
    'owner-postfix-announce@postfix.org'    =&gt; -3.0,
 
    'owner-sendmail-announce@lists.sendmail.org'  =&gt; -3.0,
 
    'sendmail-announce-request@lists.sendmail.org' =&gt; -3.0,
 
    'donotreply@sendmail.org'                =&gt; -3.0,
 
    'ca+envelope@sendmail.org'              =&gt; -3.0,
 
    'noreply@freshmeat.net'                  =&gt; -3.0,
 
    'owner-technews@postel.acm.org'          =&gt; -3.0,
 
    'ietf-123-owner@loki.ietf.org'          =&gt; -3.0,
 
    'cvs-commits-list-admin@gnome.org'      =&gt; -3.0,
 
    'rt-users-admin@lists.fsck.com'          =&gt; -3.0,
 
    'clp-request@comp.nus.edu.sg'            =&gt; -3.0,
 
    'surveys-errors@lists.nua.ie'            =&gt; -3.0,
 
    'emailnews@genomeweb.com'                =&gt; -5.0,
 
    'yahoo-dev-null@yahoo-inc.com'          =&gt; -3.0,
 
    'returns.groups.yahoo.com'              =&gt; -3.0,
 
    'clusternews@linuxnetworx.com'          =&gt; -3.0,
 
    lc('lvs-users-admin@LinuxVirtualServer.org')    =&gt; -3.0,
 
    lc('owner-textbreakingnews@CNNIMAIL12.CNN.COM') =&gt; -5.0,
 
 
    # soft-blacklisting (positive score)
 
    'sender@example.net'                    =&gt;  3.0,
 
    '.example.net'                          =&gt;  1.0,
 
 
  },
 
  ],  # end of site-wide tables
 
});
 
 
@decoders = (
 
  ['mail', \&do_mime_decode],
 
  ['asc',  \&do_ascii],
 
  ['uue',  \&do_ascii],
 
  ['hqx',  \&do_ascii],
 
  ['ync',  \&do_ascii],
 
  ['F',    \&do_uncompress, ['unfreeze','freeze -d','melt','fcat'] ],
 
  ['Z',    \&do_uncompress, ['uncompress','gzip -d','zcat'] ],
 
  ['gz',  \&do_uncompress,  'gzip -d'],
 
  ['gz',  \&do_gunzip],
 
  ['bz2',  \&do_uncompress,  'bzip2 -d'],
 
  ['xz',  \&Amavis::Unpackers::do_uncompress,
 
          ['xzdec'. 'xz -dc', 'unxz -c', 'xzcat'] ],
 
  ['lzma', \&Amavis::Unpackers::do_uncompress,
 
          ['lzmadec', 'xz -dc --format=lzma',
 
            'lzma -dc', 'unlzma -c', 'lzcat', 'lzmadec'] ],
 
  ['lzo',  \&do_uncompress,  'lzop -d'],
 
  ['rpm',  \&do_uncompress, ['rpm2cpio.pl','rpm2cpio'] ],
 
  ['cpio', \&do_pax_cpio,  ['pax','gcpio','cpio'] ],
 
  ['tar',  \&do_pax_cpio,  ['pax','gcpio','cpio'] ],
 
  ['deb',  \&do_ar,          'ar'],
 
# ['a',    \&do_ar,          'ar'],  # unpacking .a seems an overkill
 
  ['zip',  \&do_unzip],
 
  ['7z',  \&do_7zip,      ['7zr','7za','7z'] ],
 
  ['rar',  \&do_unrar,      ['rar','unrar'] ],
 
  ['arj',  \&do_unarj,      ['arj','unarj'] ],
 
  ['arc',  \&do_arc,        ['nomarch','arc'] ],
 
  ['zoo',  \&do_zoo,        ['zoo','unzoo'] ],
 
  ['lha',  \&do_lha,        'lha'],
 
# ['doc',  \&do_ole,        'ripole'],
 
  ['cab',  \&do_cabextract,  'cabextract'],
 
  ['tnef', \&do_tnef_ext,    'tnef'],
 
  ['tnef', \&do_tnef],
 
# ['sit',  \&do_unstuff,    'unstuff'],  # broken/unsafe decoder
 
  ['exe',  \&do_executable, ['rar','unrar'], 'lha', ['arj','unarj'] ],
 
);
 
 
 
@av_scanners = (
 
 
['ClamAV-clamd',
 
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
 
  qr/\bOK$/m, qr/\bFOUND$/m,
 
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
 
);
 
 
@av_scanners_backup = (
 
 
  ### http://www.clamav.net/  - backs up clamd or Mail::ClamAV
 
  ['ClamAV-clamscan', 'clamscan',
 
    "--stdout --no-summary -r --tempdir=$TEMPBASE {}",
 
    [0], qr/:.*\sFOUND$/m, qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
 
 
);
 
 
1;  # insure a defined return value
 
</spoiler>
 
 
Запускаем amavisd:
 
#/usr/local/etc/rc.d/amavisd start
 
 
В логе примерно следующее:
 
<spoiler>
 
Jul 24 00:29:52 servmp amavis[93678]: Module Socket6            0.23
 
Jul 24 00:29:52 servmp amavis[93678]: Module Time::HiRes        1.9719
 
Jul 24 00:29:52 servmp amavis[93678]: Module URI                1.60
 
Jul 24 00:29:52 servmp amavis[93678]: Module Unix::Syslog        1.1
 
Jul 24 00:29:52 servmp amavis[93678]: Amavis::DB code      loaded
 
Jul 24 00:29:52 servmp amavis[93678]: SQL base code        NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: SQL::Log code        NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: SQL::Quarantine      NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Lookup::SQL code    NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Lookup::LDAP code    NOT loaded
 
Jul 24 00:29:52 servmp amavis[: Lookup::LDAP code    NOT loaded
 
Jul 24 00:29:52 servmp amavis93678]: AM.PDP-in proto code loaded
 
Jul 24 00:29:52 servmp amavis[93678]: SMTP-in proto code  loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Courier proto code  NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: SMTP-out proto code  loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Pipe-out proto code  NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: BSMTP-out proto code NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Local-out proto code loaded
 
Jul 24 00:29:52 servmp amavis[93678]: OS_Fingerprint code  NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: ANTI-VIRUS code      loaded
 
Jul 24 00:29:52 servmp amavis[93678]: ANTI-SPAM code      loaded
 
Jul 24 00:29:52 servmp amavis[93678]: ANTI-SPAM-EXT code  NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: ANTI-SPAM-C code    NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: ANTI-SPAM-SA code    loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Unpackers code      loaded
 
Jul 24 00:29:52 servmp amavis[93678]: DKIM code            loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Tools code          NOT loaded
 
Jul 24 00:29:52 servmp amavis[93678]: Found $file            at /usr/local/bin/file
 
Jul 24 00:29:52 servmp amavis[93678]: Found $altermime      at /usr/local/bin/altermime
 
Jul 24 00:29:52 servmp amavis[93678]: Internal decoder for .mail
 
Jul 24 00:29:52 servmp amavis[93678]: Internal decoder for .asc
 
Jul 24 00:29:52 servmp amavis[93678]: Internal decoder for .uue
 
Jul 24 00:29:52 servmp amavis[93678]: Internal decoder for .hqx
 
Jul 24 00:29:52 servmp amavis[93678]: Internal decoder for .ync
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .F    at /usr/local/bin/unfreeze
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .Z    at /usr/bin/uncompress
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .gz  at /usr/bin/gzip -d
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .bz2  at /usr/bin/bzip2 -d
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .xz  at /usr/bin/unxz -c
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .lzma at /usr/bin/xz -dc --format=lzma
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .lzo  at /usr/local/bin/lzop -d
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .rpm  at /usr/local/bin/rpm2cpio.pl
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .cpio at /bin/pax
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .tar  at /bin/pax
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .deb  at /usr/bin/ar
 
Jul 24 00:29:52 servmp amavis[93678]: Internal decoder for .zip
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .7z  at /usr/local/bin/7zr
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .rar  at /usr/local/bin/rar
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .arj  at /usr/local/bin/arj
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .arc  at /usr/local/bin/arc
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .zoo  at /usr/local/bin/zoo
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .lha  at /usr/local/bin/lha
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .cab  at /usr/local/bin/cabextract
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .tnef at /usr/local/bin/tnef
 
Jul 24 00:29:52 servmp amavis[93678]: Found decoder for    .exe  at /usr/local/bin/rar; /usr/local/bin/lha; /usr/local/bin/arj
 
Jul 24 00:29:52 servmp amavis[93678]: Using primary internal av scanner code for ClamAV-clamd
 
Jul 24 00:29:52 servmp amavis[93678]: Found secondary av scanner ClamAV-clamscan at /usr/local/bin/clamscan
 
Jul 24 00:29:52 servmp amavis[93678]: Deleting db files  in /var/amavis/db
 
Jul 24 00:29:52 servmp amavis[93678]: Creating db in /var/amavis/db/; BerkeleyDB 0.51, libdb 4.7
 
</spoiler>
 
 
 
Проверяем amavisd-new:
 
Trying 127.0.0.1...
 
Connected to localhost.
 
Escape character is '^]'.
 
220 [127.0.0.1] ESMTP amavisd-new service ready
 
quit
 
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
 
Connection closed by foreign host.
 
 
 
Теперь внесем изменения в файл <code bash>/usr/local/etc/postfix/master.cf</code>. Добавив следующие строчки:
 
smtp-amavis unix - - n - 2 smtp
 
    -o smtp_data_done_timeout=1200
 
    -o smtp_send_xforward_command=yes
 
    -o disable_dns_lookups=yes
 
    -o max_use=20
 
 
127.0.0.1:10025 inet n - n - - smtpd
 
    -o content_filter=
 
    -o local_recipient_maps=
 
    -o relay_recipient_maps=
 
    -o smtpd_restriction_classes=
 
    -o smtpd_delay_reject=no
 
    -o smtpd_client_restrictions=permit_mynetworks,reject
 
    -o smtpd_helo_restrictions=
 
    -o smtpd_sender_restrictions=
 
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
 
    -o mynetworks_style=host
 
    -o mynetworks=127.0.0.0/8
 
    -o strict_rfc821_envelopes=yes
 
    -o smtpd_error_sleep_time=0
 
    -o smtpd_soft_error_limit=1001
 
    -o smtpd_hard_error_limit=1000
 
    -o smtpd_client_connection_count_limit=0
 
    -o smtpd_client_connection_rate_limit=0
 
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks&lt;/code&gt;
 
 
 
Перезапускаем postfix. И снова проверяем amavisd
 
Trying 127.0.0.1...
 
Connected to localhost.
 
Escape character is '^]'.
 
220 [127.0.0.1] ESMTP amavisd-new service ready
 
mail from:<finn@megapuper.ru>
 
250 2.1.0 Sender <finn@megapuper.ru> OK
 
rcpt to:<postmaster@megapuper.ru>
 
250 2.1.5 Recipient <postmaster@megapuper.ru> OK
 
Data
 
354 End data with <CR><LF>.<CR><LF>
 
Subject: Test1 - Clean message
 
Hello world
 
.
 
250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 9D3E3638DE3
 
 
mail from:<finn@megapuper.ru>
 
250 2.1.0 Sender <finn@megapuper.ru> OK
 
rcpt to:<postmaster@megapuper.ru>
 
250 2.1.5 Recipient <postmaster@megapuper.ru> OK
 
Data
 
354 End data with <CR><LF>.<CR><LF>
 
Subject: Test 2 - Virus test pattern
 
 
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
 
.
 
250 2.7.0 Ok, discarded, id=01543-03-5 - INFECTED: Eicar-Test-Signature
 
quit
 
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
 
Connection closed by foreign host.
 
 
Как видно из сообщения - discarded, id=00950-02 - VIRUS: Eicar-Test-Signature , вирус он нашел.
 
 
Теперь необходимо указать postfix, чтобы он все письма для проверки передавал amavisd, для этого необходимо добавить следующую строку в main.cf:
 
content_filter=smtp-amavis:[127.0.0.1]:10024
 
 
 
Перезапускаем postfix и проверяем работу spamassassin:
 
# telnet localhost 25
 
Trying 127.0.0.1...
 
Connected to localhost.
 
Escape character is '^]'.
 
220 mail.megapuper.ru ESMTP
 
helo finn
 
250 mail.megapuper.ru
 
mail from:<finn@megapuper.ru>
 
250 2.1.0 Ok
 
rcpt to:<postmaster@megapuper.ru>
 
250 2.1.5 Ok
 
354 End data with <CR><LF>.<CR><LF>
 
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
 
.
 
250 2.0.0 Ok: queued as 19196638E83
 
quit
 
221 2.0.0 Bye
 
Connection closed by foreign host.
 
 
 
Смотрим логи:
 
# tail -f /var/log/maillog
 
Jul 25 17:46:28 servmp amavis[22943]: (22943-06) (!)run_av (ClamAV-clamd) FAILED - unexpected , output="/var/amavis/tmp/amavis-20120725T172001-22943-B8C3bK2r/parts: lstat() failed: Permission denied. ERROR\n"
 
Jul 25 17:46:28 servmp amavis[22943]: (22943-06) (!)ClamAV-clamd av-scanner FAILED: CODE(0x2845d2f8) unexpected , output="/var/amavis/tmp/amavis-20120725T172001-22943-B8C3bK2r/parts: lstat() failed: Permission denied. ERROR\n" at 
 
(eval 119) line 899.
 
Jul 25 17:46:28 servmp amavis[22943]: (22943-06) (!)WARN: all primary virus scanners failed, considering backups
 
 
 
Проблема возникает из-за того что clamav, не может получить доступ к папке где лежат письма на проверку для него т.к. amavis передает ему это путь в виде строки, а права по умолчанию на папку /var/amavis/ стоят drwxr-x—<br/>
 
Решается очень просто. Добавлением пользователя под которым запускается clamav (обычно clamav) в группу vsan:
 
# pw groupmod vscan -M clamav
 
 
 
Рестартим и смотрим снова:
 
Jul 26 13:10:39 servmp postfix/smtpd[43691]: connect from unknown[192.168.0.10]
 
Jul 26 13:10:47 servmp postfix/smtpd[43691]: 1976B638D9C: client=unknown[192.168.0.10]
 
Jul 26 13:11:00 servmp postfix/cleanup[44690]: 1976B638D9C: message-id=<20120726091047.1976B638D9C@mail.megapuper.ru>
 
Jul 26 13:11:00 servmp postfix/qmgr[24098]: 1976B638D9C: from=<finn@megapuper.ru>, size=414, nrcpt=2 (queue active)
 
Jul 26 13:11:01 servmp postfix/smtpd[44698]: connect from localhost[127.0.0.1]
 
Jul 26 13:11:01 servmp postfix/smtpd[44698]: 4331B638DFB: client=localhost[127.0.0.1]
 
Jul 26 13:11:01 servmp postfix/cleanup[44690]: 4331B638DFB: message-id=<20120726091047.1976B638D9C@mail.megapuper.ru>
 
Jul 26 13:11:01 servmp postfix/smtpd[44698]: disconnect from localhost[127.0.0.1]
 
Jul 26 13:11:01 servmp postfix/qmgr[24098]: 4331B638DFB: from=<finn@megapuper.ru>, size=1122, nrcpt=3 (queue active)
 
Jul 26 13:11:01 servmp amavis[41497]: (41497-20) Passed SPAM {RelayedTaggedInternal,Quarantined}, MYNETS LOCAL [192.168.0.10]:21767 [192.168.0.10] <finn@megapuper.ru> -> <finn@megapuper.ru>,<postmaster@megapuper.ru>, quarantine: spam-
 
bOWSrda6jH2q.gz, Queue-ID: 1976B638D9C, Message-ID: <20120726091047.1976B638D9C@mail.megapuper.ru>, mail_id: bOWSrda6jH2q, Hits: 1000.207, size: 414, queued_as: 4331B638DFB, 300 ms
 
Jul 26 13:11:01 servmp postfix/smtp[44696]: 1976B638D9C: to=<finn@megapuper.ru>, orig_to=<postmaster@megapuper.ru>, relay=127.0.0.1[127.0.0.1]:10024, delay=18, delays=18/0.01/0/0.31, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:
 
[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 4331B638DFB)
 
Jul 26 13:11:01 servmp postfix/smtp[44696]: 1976B638D9C: to=<postmaster@megapuper.ru>, relay=127.0.0.1[127.0.0.1]:10024, delay=18, delays=18/0.01/0/0.31, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0   
 
Ok: queued as 4331B638DFB)
 
Jul 26 13:11:01 servmp postfix/qmgr[24098]: 1976B638D9C: removed
 
Jul 26 13:11:01 servmp postfix/virtual[44700]: 4331B638DFB: to=<finn@megapuper.ru>, relay=virtual, delay=0.06, delays=0.02/0.03/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
 
Jul 26 13:11:01 servmp postfix/virtual[44700]: 4331B638DFB: to=<finn@megapuper.ru>, orig_to=<postmaster@megapuper.ru>, relay=virtual, delay=0.07, delays=0.02/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to maildir)
 
Jul 26 13:11:01 servmp postfix/virtual[44700]: 4331B638DFB: to=<postmaster: 4331B638DFB: to=@megapuper.ru>, relay=virtual, delay=0.07, delays=0.02/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to maildir)
 
Jul 26 13:11:01 servmp postfix/qmgr[24098]: 4331B638DFB: removed
 
Jul 26 13:11:05 servmp postfix/smtpd[43691]: disconnect from unknown[192.168.0.10]
 
 
 
'''11. Установка и настройка Maia.'''
 
 
Maia-Mailguard утилита для настройки спам и антивирусных фильтров. Она позволяет устанавливать собственные настройки для фильтров спама и вирусов.
 
 
Ставим Pear(хранилище расширений и дополнений PHP):
 
# cd /usr/ports/devel/pear
 
# make install
 
 
 
Редактируем <code bash>/usr/local/etc/php.ini</code>:
 
;;;;;;;;;;;;;;;;;;;;;;;;;
 
; Paths and Directories ;
 
;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
; UNIX: "/path1:/path2"
 
include_path = ".:/usr/local/share/pear"
 
 
 
Ставим PEAR’s HTML Purifier:
 
# pear channel-discover htmlpurifier.org
 
# pear install hp/HTMLPurifier
 
 
 
Ставим Maia из портов:
 
# cd /usr/ports/security/maia
 
# make install
 
Выбираем нужное: APACHE, WEBHOST, MYSQL, POSTFIX, PFA, CLAMAV, SPAMASSASSIN остальное по желанию
 
 
<font color=red>НЕ ЗАКОНЧЕНО</font>
 
 
 
'''12. Дополнительные возможности Postfixadmin'''
 
 
 
<font color=blue>'''АВТООТВЕТЧИК'''</font>
 
 
Для настройки автоответчика надо создать пользователя vacation и группу vacation, от имени которых будет работать скрипт vacation.pl, создать домашнюю папку пользователя vacation, поместить в нее скрипт vacation.pl, а также соответствующим образом изменить владельца папки и права скрипта:
 
# pw groupadd vacation -g 65501
 
# pw useradd vacation -g vacation -s /sbin/nologin -u 65501
 
# mkdir /usr/local/etc/postfix/vacation
 
# cp /usr/local/www/postfixadmin/VIRTUAL_VACATION/vacation.pl /usr/local/etc/postfix/vacation
 
# chown -R vacation:vacation /usr/local/etc/postfix/vacation
 
# chmod 500 /usr/local/etc/postfix/vacation/vacation.pl
 
 
 
Теперь правим скрипт vacation.pl
 
our $db_type = 'mysql';
 
our $db_username = 'postfix';
 
our $db_password = 'postfix';
 
our $db_name = 'postfix';
 
our $vacation_domain = 'autoreply.megapuper.ru';
 
our $smtp_server = 'localhost'; 
 
our $smtp_server_port = 25;
 
our $interval = 0;
 
 
 
Добавляем определение транспорта vacation в файл /usr/local/etc/postfix/master.cf:
 
vacation    unix  -      n      n      -      -      pipe
 
    flags=Rq user=vacation argv=/usr/local/etc/postfix/vacation/vacation.pl -f ${sender} -- ${recipient}&lt;/code&gt;
 
 
 
Далее добавляем строку, определяющую транспорт vacation, в файл transport, находящийся в /usr/local/etc/postfix и являющийся таблицей транспортов:<code bash>
 
autoreply.megapuper.ru      vacation:
 
 
 
И выполняем:
 
# postmap transport
 
 
 
Домен autoreply.megapuper.ru является абстрактным, т.е. не нуждается в регистрации соответствующих записей в DNS, достаточно добавить запись об этом домене в файл /etc/hosts:
 
127.0.0.1    autoreply.megapuper.ru
 
 
 
Добавляем в /usr/local/etc/postfix/main.cf ранее созданную(измененную) таблицу транспортов:
 
transport_maps = hash:$base/vacation/transport
 
 
 
Остаётся подправить config.inc.php для включения функций управления автоответчиком в интерфейсе PostfixAdmin:
 
$CONF['vacation'] = 'YES';
 
$CONF['vacation_domain'] = 'autoreply.megapuper.ru';
 
$CONF['vacation_control'] = 'YES';
 
$CONF['vacation_control_admin'] = 'YES';
 
 
Перезапускаем Postfx командой postfix reload и начать пользоваться автоответчиком. При возникновении каких-либо проблем c работой скрипта vacation.pl смотрим /var/log/messages.
 
 
 
p.s.: Ошибка вида:
 
(expanded from): Command died with status 2:
 
"/usr/local/etc/postfix/vacation/vacation.pl". Command output: Can't locate MIME/EncWords.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.9/BSDPAN
 
говорит о том, что не хватает некоторых модулей Perl, которые доставим из портов.
 
 
 
<font color=blue>'''ОЧИСТКА ДИСКА'''</font>
 
 
По умолчанию, при удалении почтового ящика через Postfixadmin, он удаляется из базы, но остаётся физически на диске. Таким образом его приходится удалять руками. Данную траблу можно решить включением автоматического удаления ящиков с жесткого диска, если информация о них была предварительно удалена из базы данных через Postfixadmin.
 
<font color=red>НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ СКОПИРОВАТЬ КУДА-НИБУДЬ ВСЮ ПОЧТУ, ОТ ГРЕХА</font>
 
 
 
Добавляем запуск скрипта в крон:
 
0 0 * * * root /usr/local/www/postfixadmin/ADDITIONS/cleanupdirs.pl --delete
 
В данном случае диск очищается раз в сутки в 24:00. Список удалённых ящиков записывается в /var/log/removed_mailbox.log
 
 
 
p.s.: насколько я понял скрипт по умолчанию заточен на структуру расположения почтовых ящиков вида:
 
/var/spool/mail/domen/ящик
 
у меня так /var/spool/mail/ящик
 
 
При запуске прибил мне все ящики 
 
 
Поправленный скрипт(если папки расположены так /var/spool/mail/ящик) позаимствован отсюда http://www.sergeysl.ru/freebsd-postfixadmin/
 
#!/usr/bin/perl -w
 
 
use strict;
 
use DBI;
 
use File::Path;
 
use Getopt::Long;
 
### change settings as needed, see notes above #################################
 
our $root_path = "/var/spool/mail";
 
our $logfile = "/var/log/removed_maildirs.log";
 
our $db_hostname = "localhost";
 
our $db_port = "3306"; # this script currently supports MySQL only
 
our $db_database = "postfix";
 
our $db_username = "postfix";
 
our $db_password = "postfix";
 
 
 
### begin program ##############################################################
 
my(@dirs_to_delete, $logfile_open);
 
my $delete_old_dirs = 0; # do not delete by default, use cmdline to change this
 
my $print_also = 0; # also print items when deleting, use cmdline to change this
 
GetOptions ('delete' => \$delete_old_dirs, 'print' => \$print_also);
 
my $conn_info = "DBI:mysql:database=$db_database;hostname=$db_hostname;port=$db_port";
 
my $dbh = DBI->connect($conn_info, $db_username, $db_password)
 
or die $DBI::errstr;
 
opendir USERDIR, $root_path
 
or die "Unable to access directory '$root_path' ($!)";
 
foreach my $user_dir (sort readdir USERDIR) {
 
next if $user_dir =~ /^\./; # skip dotted dirs
 
push @dirs_to_delete, "$root_path/$user_dir"
 
if &check_dir("SELECT maildir FROM mailbox WHERE maildir = ?",
 
"$user_dir/"); # end slash needed for checkdir
 
}
 
closedir USERDIR;
 
$dbh->disconnect;
 
if (@dirs_to_delete) {
 
foreach my $to_delete (@dirs_to_delete) {
 
if ($delete_old_dirs == 1) {
 
$logfile_open = open LOGFILE, ">> $logfile"
 
or die "Unable to append logfile '$logfile' ($!)"
 
unless $logfile_open;
 
rmtree $to_delete;
 
print LOGFILE localtime() . " Deleting directory '$to_delete'\n";
 
print localtime() . " Deleting directory '$to_delete'\n"
 
if $print_also;
 
} else {
 
print localtime() . " Need to delete directory '$to_delete'\n";
 
}
 
}
 
}
 
close LOGFILE if $logfile_open;
 
sub check_dir {
 
my($query, $dir) = @_;
 
my $sth = $dbh->prepare($query);
 
my $num_rows = $sth->execute($dir);
 
$sth->finish;
 
($num_rows eq "0E0") ? 1 : 0;
 
}
 
 
 
'''ПОЛЕЗНЫЕ КОМАНДЫ'''
 
 
Вывод дефолтного значения параметра:
 
# postconf -d smtpd_sasl_auth_enable
 
smtpd_sasl_auth_enable = no
 
 
 
Вывод текущего значения параметра:
 
# postconf smtpd_sasl_auth_enable
 
smtpd_sasl_auth_enable = yes
 
 
 
Вывод версии postfix:
 
# postconf | grep ^mail_version
 
mail_version = 2.8.9
 
 
 
Просмотр текущей очереди сообщений:
 
# postqueue -p
 
 
 
Удаление всех писем из очереди:
 
# postsuper -d ALL
 
 
 
Повторная отправка сообщений, которые находятся в очереди:
 
# postqueue -f
 

Текущая версия на 17:47, 2 октября 2015