|
|
(не показано 17 промежуточных версий этого же участника) |
Строка 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:
| |
− | # touch /etc/periodic.conf
| |
− | [/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]
| |
− |
| |
− | # 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
| |
− |
| |
− |
| |
− | Указываем 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'] = 'mysql';
| |
− | $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 => 1, # is true in MYNETS by default, but let's make it explicit
| |
− | os_fingerprint_method => 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 => 1, # declare that mail was submitted by our smtp client
| |
− | allow_disclaimers => 1, # enables disclaimer insertion if available
| |
− | # notify administrator of locally originating malware
| |
− | virus_admin_maps => ["virusalert\@$mydomain"],
| |
− | spam_admin_maps => ["virusalert\@$mydomain"],
| |
− | warnbadhsender => 1,
| |
− | # forward to a smtpd service providing DKIM signing service
| |
− | forward_method => 'smtp:[127.0.0.1]:10027',
| |
− | # force MTA conversion to 7-bit (e.g. before DKIM signing)
| |
− | smtpd_discard_ehlo_keywords => ['8BITMIME'],
| |
− | bypass_banned_checks_maps => [1], # allow sending any file names and types
| |
− | terminate_dsn_on_notify_success => 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 => 'AM.PDP',
| |
− | auth_required_release => 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)$' => 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)
| |
− | '.' => [ # 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 => 5.0],
| |
− | [qr'^(greatcasino|investments|lose_weight_today|market\.alert)@'i=> 5.0],
| |
− | [qr'^(money2you|MyGreenCard|new\.tld\.registry|opt-out|opt-in)@'i=> 5.0],
| |
− | [qr'^(optin|saveonlsmoking2002k|specialoffer|specialoffers)@'i => 5.0],
| |
− | [qr'^(stockalert|stopsnoring|wantsome|workathome|yesitsfree)@'i => 5.0],
| |
− | [qr'^(your_friend|greatoffers)@'i => 5.0],
| |
− | [qr'^(inkjetplanet|marketopt|MakeMoney)\d*@'i => 5.0],
| |
− | ),
| |
− |
| |
− | # read_hash("/var/amavis/sender_scores_sitewide"),
| |
− |
| |
− | { # a hash-type lookup table (associative array)
| |
− | 'nobody@cert.org' => -3.0,
| |
− | 'cert-advisory@us-cert.gov' => -3.0,
| |
− | 'owner-alert@iss.net' => -3.0,
| |
− | 'slashdot@slashdot.org' => -3.0,
| |
− | 'securityfocus.com' => -3.0,
| |
− | 'ntbugtraq@listserv.ntbugtraq.com' => -3.0,
| |
− | 'security-alerts@linuxsecurity.com' => -3.0,
| |
− | 'mailman-announce-admin@python.org' => -3.0,
| |
− | 'amavis-user-admin@lists.sourceforge.net'=> -3.0,
| |
− | 'amavis-user-bounces@lists.sourceforge.net' => -3.0,
| |
− | 'spamassassin.apache.org' => -3.0,
| |
− | 'notification-return@lists.sophos.com' => -3.0,
| |
− | 'owner-postfix-users@postfix.org' => -3.0,
| |
− | 'owner-postfix-announce@postfix.org' => -3.0,
| |
− | 'owner-sendmail-announce@lists.sendmail.org' => -3.0,
| |
− | 'sendmail-announce-request@lists.sendmail.org' => -3.0,
| |
− | 'donotreply@sendmail.org' => -3.0,
| |
− | 'ca+envelope@sendmail.org' => -3.0,
| |
− | 'noreply@freshmeat.net' => -3.0,
| |
− | 'owner-technews@postel.acm.org' => -3.0,
| |
− | 'ietf-123-owner@loki.ietf.org' => -3.0,
| |
− | 'cvs-commits-list-admin@gnome.org' => -3.0,
| |
− | 'rt-users-admin@lists.fsck.com' => -3.0,
| |
− | 'clp-request@comp.nus.edu.sg' => -3.0,
| |
− | 'surveys-errors@lists.nua.ie' => -3.0,
| |
− | 'emailnews@genomeweb.com' => -5.0,
| |
− | 'yahoo-dev-null@yahoo-inc.com' => -3.0,
| |
− | 'returns.groups.yahoo.com' => -3.0,
| |
− | 'clusternews@linuxnetworx.com' => -3.0,
| |
− | lc('lvs-users-admin@LinuxVirtualServer.org') => -3.0,
| |
− | lc('owner-textbreakingnews@CNNIMAIL12.CNN.COM') => -5.0,
| |
− |
| |
− | # soft-blacklisting (positive score)
| |
− | 'sender@example.net' => 3.0,
| |
− | '.example.net' => 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</code>
| |
− |
| |
− |
| |
− | Перезапускаем 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}</code>
| |
− |
| |
− |
| |
− | Далее добавляем строку, определяющую транспорт 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. Список удалённых ящиков записывается в <code bash>/var/log\removed_mailbox.log</code>
| |
− |
| |
− |
| |
− | 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
| |