Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Наступна ревізія | Попередня ревізія | ||
mailserver [2013/11/08 12:45] wombat створено |
mailserver [2020/05/20 21:59] (поточний) wombat [Фильтрация спама] |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
+ | ====== MTA ====== | ||
+ | |||
+ | ===== Postfix ===== | ||
+ | |||
+ | В отлиие от sendmail, Postfix умеет хранить входящую почту в папках формата [[https://en.wikipedia.org/wiki/Maildir | Maildir]]. Это может быть полезным для установки [[mailserver#sqwebmail|веб-интерфейса]] к почтовому серверу без вспомогательного IMAP-сервера. | ||
+ | |||
+ | http://www.postfix.org/features.html | ||
+ | |||
+ | === Ограничение скорости отправки писем === | ||
+ | |||
+ | Антиспам-системы многих сервисов проводят контроль скорости отправки электронной почты. Поэтому когда Postfix отправляет письма "слишком быстро", его могут заблокировать из-за подозрения в рассылке спама. Чтобы этого избежать, нужно установить следующие ограничения в файле настроек | ||
+ | |||
+ | <file cf '/etc/postfix/main.cf'> | ||
+ | ... | ||
+ | #default_destination_concurrency_limit=2 | ||
+ | #default_destination_rate_delay=1m | ||
+ | #default_destination_concurrency_limit=2 | ||
+ | #mlmmj_destination_rate_delay=0s | ||
+ | smtp_destination_concurrency_limit=2 | ||
+ | smtp_destination_rate_delay=10m | ||
+ | </file> | ||
+ | |||
+ | === Просмотр и очистка очереди === | ||
+ | |||
+ | sudo postqueue -p | ||
+ | |||
+ | sudo postsuper -d 95E0AA21E68 | ||
+ | |||
+ | где ''95E0AA21E68'' -- это уникальный номер письма в очереди (показывается командой ''postqueue -p'') | ||
+ | |||
+ | Для удаления **всех** писем в очереди можно задать команду: | ||
+ | | ||
+ | sudo postsuper -d ALL | ||
+ | |||
+ | Для удаления только **отложенных** писем из очереди: | ||
+ | |||
+ | sudo postsuper -d ALL deferred | ||
+ | |||
+ | |||
+ | ==== Самодельный транспорт ==== | ||
+ | |||
+ | В файле конфигурации Postfix ''/etc/postfix/master.cf'' перечислен список и параметры так называемых "транспортов" для сообщений разного типа. В этот список можно добавить и свой собственный транспорт. Рассмотрим на примере обычного bash-скрипта, который будет изменять заголовок письма ''From:''. | ||
+ | |||
+ | Сначала нужно указать Postfix расположение файла, в котором будут перечислены наши транспорты. Это указывается в файле ''/etc/postfix/main.cf''((http://www.postfix.org/postconf.5.html#transport_maps)): | ||
+ | |||
+ | <file bash "/etc/postfix/main.cf"> | ||
+ | transport_maps = hash:/home/user/mytransports | ||
+ | </file> | ||
+ | |||
+ | Теперь нужно создать собственно сам файл с перечислением наших дополнительных транспортов. Его формат выглядит примерно так: | ||
+ | |||
+ | <file '' "/home/user/mytransports"> | ||
+ | abonent1@server.com transport1:parameter1 | ||
+ | abonent2@server.com transport1:parameter2 | ||
+ | abonent3@server.com transport2:parameter1 | ||
+ | abonent4@server.com discard | ||
+ | abonent5@server.com transport1:parameter1 | ||
+ | </file> | ||
+ | |||
+ | В этом файле указываетя, каким из транспортов доставлять письма, **ПРИ**шедшие на тот или иной адрес нашего сервера. ''transport1'' и ''transport2'' здесь просто названия наших транспортов. Они могут быть любые, и цифры в них совсем не обязательны. ''parameter1'' и ''parameter2'' -- это параметры, которые будут переданы нашему транспорту в виде аргумента. Как видно, они могут быть одинаковыми или разными для разных адресов -- в зависимости от задачи. ''discard'' здесь -- один из встроенных транспортов Postfix, который попросту выбрасывает письмо и делает вид, что успешно его доставил. Т.е. все письма, приходящие в такой конфигурации на адрес ''abonent4@server.com'' будут молча удаляться. | ||
+ | |||
+ | После создания или изменения этого файла, необходимо сконвертировать его в формат базы данных, которую сможет читать Postfix: | ||
+ | |||
+ | postmap mytransports | ||
+ | |||
+ | При этом появится (или обновится, если уже был) файл ''mytransports.db''. | ||
+ | |||
+ | Теперь, когда мы придумали название транспорта и указали, какие письма через него нужно проводить, нужно описать этот транспорт в файле ''/etc/postfix/master.cf'': | ||
+ | |||
+ | <file bash "/etc/postfix/master.cf"> | ||
+ | transport1 unix - n n - - pipe | ||
+ | flags=ORhu user=myuser argv=/home/user/from-filter1.sh $nexthop | ||
+ | |||
+ | transport2 unix - n n - - pipe | ||
+ | flags=ORhu user=myuser argv=/home/user/from-filter2.sh $nexthop | ||
+ | </file> | ||
+ | |||
+ | Здесь названия транспортов ''transport1'' и ''transport2'' должны точно совпадать с теми, которые мы описали в файле транспортов ''/home/user/mytransports'', имя пользователя ''myuser'' -- это системный пользователь, от имени которого будет запущен скрипт ''/home/user/from-filter1.sh''. Переменная ''nexthop'' хранит значение того параметра, который мы указывали в нашем файле транспортов (''parameter1'', ''parameter2'' и т.п.). Поскольку тип транспорта здесь указан как ''pipe'', письмо будет передано нашему скрипту в стандартный ввод. И обрабатывать его в теле скрипта нужно с учётом этого. | ||
+ | |||
+ | Пример такого скрипта, который заменяет поле ''From:'' приведён ниже: | ||
+ | |||
+ | <file bash "/home/user/from-filter1.sh"> | ||
+ | #!/bin/bash | ||
+ | |||
+ | NEXTHOP=$@ | ||
+ | |||
+ | TEMPFILE=`tempfile` | ||
+ | |||
+ | # Если передан параметр "parameter1" | ||
+ | # (что соответствует в нашем примере письмам, пришедшним НА адреса | ||
+ | # abonent1@server.com и abonent5@server.com | ||
+ | if [ $NEXTHOP == "parameter1" ] | ||
+ | then | ||
+ | while IFS= read -r LINE; | ||
+ | do | ||
+ | if [[ $LINE == From:* ]] | ||
+ | then | ||
+ | # Заменим строку отправителя так, чтобы его адрес был <parameter1@server.com> | ||
+ | printf '%s\n' "$LINE" | sed -e 's/"//g' | sed -e 's/^From: \(.*\)/From: "\1" <parameter1@server.com>/' >> ${TEMPFILE} | ||
+ | else | ||
+ | printf '%s\n' "$LINE" >> ${TEMPFILE} | ||
+ | fi | ||
+ | done | ||
+ | |||
+ | |||
+ | |||
+ | # Если передан параметр "parameter2" | ||
+ | # (что соответствует в нашем примере письмам, пришедшним НА адрес | ||
+ | # abonent2@server.com | ||
+ | elif [ $NEXTHOP == "parameter2" ] | ||
+ | then | ||
+ | while IFS= read -r LINE; | ||
+ | do | ||
+ | if [[ $LINE == From:* ]] | ||
+ | then | ||
+ | # Заменим строку отправителя так, чтобы его адрес был <parameter2@server.com> | ||
+ | printf '%s\n' "$LINE" | sed -e 's/"//g' | sed -e 's/^From: \(.*\)/From: "\1" <parameter2@server.com>/' >> ${TEMPFILE} | ||
+ | else | ||
+ | printf '%s\n' "$LINE" >> ${TEMPFILE} | ||
+ | fi | ||
+ | done | ||
+ | |||
+ | |||
+ | # Во всех остальных случаях просто скопируем письмо без изменений во временный файл | ||
+ | else | ||
+ | cat - > ${TEMPFILE} | ||
+ | fi | ||
+ | |||
+ | # Здесь любое действие с полученным и обработанным письмом | ||
+ | # Например, передача его в один из списков рассылки mlmmj: | ||
+ | cat ${TEMPFILE} | /usr/bin/mlmmj-receive -F -L /var/spool/mlmmj/$NEXTHOP | ||
+ | |||
+ | rm ${TEMPFILE} | ||
+ | </file> | ||
+ | |||
+ | Разумеется, права на запуск этого скрипта должны быть у системного пользователя ''myuser'', которого мы указали в файле ''/etc/postfix/master.cf'' выше. | ||
+ | |||
+ | После всех этих манипуляций с транспортами, нужно перезагрузить конфигурацию Postfix: | ||
+ | |||
+ | sudo /etc/init.d/postfix reload | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== SASL-аутентификация ==== | ||
+ | |||
+ | Для того, чтобы Postfix принимал письма для дальнейшей пересылки с других компьютеров (например, с нашего же домашнего почтового клиента), нужно обеспечить аутентификацию пользователей, так как без неё он будет либо принимать письма ото всех подряд, либо ни от кого. | ||
+ | |||
+ | Инструкция по настройке SASL-аутентификации находится здесь: http://www.postfix.org/SASL_README.html | ||
+ | |||
+ | Сначала надо проверить, какие реализации SASL поддерживает Postfix в нашей системе: | ||
+ | |||
+ | sudo postconf -a | ||
+ | cyrus | ||
+ | dovecot | ||
+ | |||
+ | Видим, что их две: ''cyrus'' и ''dovecot''. Далее будем рассматривать вариант с ''cyrus''. | ||
+ | |||
+ | Установим необходимые библиотеки и инструменты. В Debian это: | ||
+ | |||
+ | sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin libsasl2-modules-db | ||
+ | |||
+ | Запустим службу аутентификации и проверим на подлинность какого-либо пользователя, имеющегося в системе: | ||
+ | |||
+ | sudo systemctl -l restart saslauthd | ||
+ | sudo testsaslauthd -u username -p password | ||
+ | 0: OK "Success." | ||
+ | |||
+ | Если видим надпись ''OK "Success."'', значит, служба запущена, отвечает на запросы и выполняет проверки. | ||
+ | |||
+ | Далее нужно внести изменения в настройки самого Postfix: | ||
+ | |||
+ | <file conf /etc/postfix/main.cf> | ||
+ | smtp_tls_security_level = may | ||
+ | smtp_tls_cert_file = /etc/ssl/certs/mymailserver.cert | ||
+ | smtp_tls_key_file = /etc/ssl/private/mymailserve.key | ||
+ | smtp_tls_note_starttls_offer = yes | ||
+ | smtpd_tls_security_level = may | ||
+ | smtpd_tls_cert_file = /etc/ssl/certs/mymailserver.cert | ||
+ | smtpd_tls_key_file = /etc/ssl/private/mymailserver.key | ||
+ | |||
+ | smtpd_sasl_auth_enable = yes | ||
+ | smtpd_sasl_type = cyrus | ||
+ | smtpd_sasl_path = smtpd | ||
+ | broken_sasl_auth_clients = yes | ||
+ | smtpd_sasl_security_options = noplaintext, noanonymous | ||
+ | smtpd_sasl_tls_security_options = noanonymous | ||
+ | smtpd_sender_login_maps = hash:/etc/postfix/controlled_envelope_senders | ||
+ | smtpd_relay_restrictions = permit_mynetworks, | ||
+ | reject_sender_login_mismatch, | ||
+ | permit_sasl_authenticated, | ||
+ | defer_unauth_destination | ||
+ | |||
+ | </file> | ||
+ | |||
+ | Если мы хотим проверять подлинность пользователей, указанных в базе данных ''/etc/sasldb2'', в файле ''/etc/postfix/sasl/smtpd.con'' указываем метод ''auxprop'' с плагином ''sasldb'': | ||
+ | |||
+ | <file conf /etc/postfix/sasl/smtpd.conf> | ||
+ | #pwcheck_method: saslauthd | ||
+ | #mech_list: PLAIN LOGIN | ||
+ | |||
+ | pwcheck_method: auxprop | ||
+ | auxprop_plugin: sasldb | ||
+ | mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM | ||
+ | </file> | ||
+ | |||
+ | Редактировать базу данных ''/etc/sasldb2'' можно при помощи команды ''saslpasswd2'': | ||
+ | |||
+ | sudo saslpasswd2 -c -u mydomain.com username | ||
+ | |||
+ | Просмотреть список всех пользователей в базе можно командой: | ||
+ | sudo sasldblistusers2 | ||
+ | |||
+ | Далее необходимо обеспечить доступ Postfix к этой базе для проверки. Для этого нужно сменить группу -владельца этого файла и добавим Postfix в эту группу: | ||
+ | sudo chown :sasl /etc/sasldb2 | ||
+ | sudo usermod -a -G sasl postfix | ||
+ | |||
+ | <note important>Важно заметить, что именем пользователя при такой проверке является полное выражение вида ''username@mydomain.com'', а не просто ''username''.</note> | ||
+ | | ||
+ | Далее, мы, вероятно, хотим, чтобы Postfix не позволял пользователям (даже зарегистрированным) указывать посторонние адреса в поле ''From:'' отправляемых писем. Для этого мы ограничим возможности пользователя в указании своего адреса, и укажем, кто каким адресом имеет право пользоваться. | ||
+ | |||
+ | В конфигурации Postfix этому соответствуют параметр ''reject_sender_login_mismatch'' и путь к файлу-таблице, содержащему соответствие пользователей и адресов ''smtpd_sender_login_maps''. В этот файл нужно внести в первую колонку - адрес пользователя, указанный им в письме, а во вторую колонку -- имя этого пользователя в базе SASL: | ||
+ | |||
+ | <file conf /etc/postfix/controlled_envelope_senders> | ||
+ | # envelope sender owners (SASL login names) | ||
+ | john@example.com john@example.com | ||
+ | helpdesk@example.com john@example.com, mary@example.com | ||
+ | postmaster admin@example.com | ||
+ | @example.net barney, fred, john@example.com, mary@example.com | ||
+ | </file> | ||
+ | |||
+ | Далее нужно преобразовать эту таблицу из простого текстового файла в базу данных: | ||
+ | |||
+ | cd /etc/postfix/ | ||
+ | sudo postmap controlled_envelope_senders | ||
+ | |||
+ | И наконец, можно перезапустить Postfix с новыми настройками и посмотреть, что вышло: | ||
+ | |||
+ | sudo postfix reload | ||
+ | |||
+ | Теперь можно проверить, принимает ли сервер подключения и предоставляет возможности SSL-аутентификации ((пример взят отсюда: http://www.postfix.org/SASL_README.html#server_test)) | ||
+ | |||
+ | telnet server.example.com 25 | ||
+ | ... | ||
+ | 220 server.example.com ESMTP Postfix | ||
+ | EHLO client.example.com | ||
+ | 250-server.example.com | ||
+ | 250-PIPELINING | ||
+ | 250-SIZE 10240000 | ||
+ | 250-ETRN | ||
+ | 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 | ||
+ | 250 8BITMIME | ||
+ | AUTH PLAIN AHRlc3QAdGVzdHBhc3M= | ||
+ | 235 Authentication successful | ||
+ | |||
+ | Причём эти строки вводятся со стороны клиента: | ||
+ | EHLO client.example.com | ||
+ | AUTH PLAIN AHRlc3QAdGVzdHBhc3M= | ||
+ | |||
+ | Если сервер отвечает на указанном порту и показывает доступные методы аутентификации, значит, всё настроено правильно. | ||
+ | |||
+ | |||
+ | |||
+ | ====== Фильтрация спама ====== | ||
+ | |||
+ | Для осуществления фильтрации почты можно установить программу [[http://www.courier-mta.org/maildrop/ | Maildrop]]. | ||
+ | |||
+ | Фильтры этой программы настраиваются в файле ''/etc/courier/maildroprc''. Например: | ||
+ | |||
+ | <file bash "/etc/courier/maildroprc"> | ||
+ | if (/^X-Spam-Status:.*YES.*/) | ||
+ | { | ||
+ | exception { | ||
+ | to "Maildir/.SPAM/" | ||
+ | } | ||
+ | } | ||
+ | </file> | ||
+ | |||
+ | Такой фильтр будет доставлять все письма, в заголовке которых поле ''X-Spam-Status:'' содержит слово "''YES''", в подпапку ''SPAM'' в почтовом каталоге пользователя. Такой заголовок письма может выставлять какая-либо служба проверки почты. Например, [[https://spamassassin.apache.org/|SpamAssassin]]. | ||
+ | |||
+ | Для того, чтобы почтовый сервер Postfix пропускал все письма через фильтры Maildrop, нужно внести следующие изменения в конфигурацию Postfix((http://www.postfix.org/MAILDROP_README.html)): | ||
+ | |||
+ | <file bash "/etc/postfix/main.cf"> | ||
+ | maildrop_destination_recipient_limit = 1 | ||
+ | virtual_mailbox_domains = some.domain someother.domain | ||
+ | virtual_transport = maildrop | ||
+ | virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox | ||
+ | virtual_alias_maps = hash:/etc/postfix/virtual_alias | ||
+ | </file> | ||
+ | |||
+ | <file bash "/etc/postfix/virtual_mailbox"> | ||
+ | user1@some.domain ...text here does not matter... | ||
+ | user2@some.domain ...text here does not matter... | ||
+ | user3@someother.domain ...text here does not matter... | ||
+ | </file> | ||
+ | |||
+ | <file bash "/etc/postfix/virtual_alias"> | ||
+ | postmaster@some.domain postmaster | ||
+ | postmaster@someother.domain postmaster | ||
+ | </file> | ||
+ | |||
+ | <file bash "/etc/postfix/master.cf"> | ||
+ | maildrop unix - n n - - pipe | ||
+ | flags=ODRhu user=vmail argv=/path/to/maildrop -d ${recipient} | ||
+ | </file> | ||
+ | |||
+ | Если же требуется всего лишь фильтрация писем, доставляемых в папки локальных пользователей (у которых есть учётная запись в операционной системе), можно не изменять конфигурации Postfix, а просто записать в файл ''~/.forward'' такую строку (включая кавычки!): | ||
+ | |||
+ | <file bash "~/.forward"> | ||
+ | "|/usr/bin/maildrop -d ${USER}" | ||
+ | </file> | ||
+ | |||
+ | |||
+ | === SpamAssassin === | ||
+ | |||
+ | == Установка == | ||
+ | |||
+ | В Debian GNU/Linux нужно установить пакеты [[https://packages.debian.org/stable/mail/spamassassin | spamassassin]] и [[https://packages.debian.org/stable/mail/spamc | spamc]]. | ||
+ | |||
+ | == Настройка == | ||
+ | |||
+ | Чтобы письма, доставляемые в папки локальных пользователей дополнительно проходили проверку службой SpamAssassin, файл ''~/.forward'' должен иметь следующее содержание: | ||
+ | |||
+ | <file bash "~/.forward"> | ||
+ | "|/usr/bin/spamc|/usr/bin/maildrop -d ${USER}" | ||
+ | </file> | ||
+ | |||
+ | |||
+ | Если spamc будет выдавать в логи такую ошибку: | ||
+ | |||
+ | spamc[17863]: connect to spamd on ::1 failed, retrying (#1 of 3): Connection refused | ||
+ | |||
+ | то устранить её можно, создав следующий файл((https://www.linuxquestions.org/questions/linux-server-73/spamassassin-trouble-4175503795/#post5163972)): | ||
+ | |||
+ | <file conf /etc/mail/spamassassin/spamc.conf> | ||
+ | -d 127.0.0.1 | ||
+ | </file> | ||
+ | |||
+ | |||
+ | ====== Фильтр исходящей почты ====== | ||
+ | |||
+ | http://www.postfix.org/FILTER_README.html | ||
+ | |||
+ | |||
+ | ====== IMAP ====== | ||
+ | |||
+ | http://wiki2.dovecot.org/ | ||
+ | |||
+ | http://wiki2.dovecot.org/QuickConfiguration | ||
+ | |||
+ | http://www.brennan.id.au/12-Sendmail_Server.html | ||
+ | |||
+ | ====== Web-интерфейс ====== | ||
+ | |||
+ | http://www.squirrelmail.org/about/ | ||
+ | |||
+ | |||
+ | ===== SqWebmail ===== | ||
+ | |||
+ | http://www.courier-mta.org/sqwebmail/ | ||
+ | |||
+ | https://lists.debian.org/debian-user/2002/11/msg03898.html | ||
+ | |||
+ | cd /srv/www/cgi-bin/ | ||
+ | ln -s /usr/lib/cgi-bin/sqwebmail | ||
+ | cd /srv/www | ||
+ | ln -s /usr/share/sqwebmail | ||
+ | |||
+ | |||
+ | ====== SPF ====== | ||
+ | |||
+ | http://www.openspf.org/ | ||
+ | |||
+ | http://www.openspf.org/FAQ/Common_mistakes | ||
+ | |||
+ | http://serverfault.com/questions/369460/what-are-spf-records-and-how-do-i-configure-them | ||
+ | |||
+ | ====== Ссылки ====== | ||
+ | |||
+ | http://xmodulo.com/mail-server-ubuntu-debian.html | ||
+ | |||
+ | https://www.linode.com/docs/email/running-a-mail-server | ||
+ | |||
+ | https://wiki.debian.org/Postfix | ||
+ | |||
+ | http://www.postfix.org/documentation.html | ||
+ | |||
+ | ===== Greylisting ===== | ||
+ | |||
+ | http://www.ukr.net/mta/std3.html | ||
+ | |||
+ | https://www.fsf.org/about/systems/greylisting | ||
+ | |||