Користувальницькькі налаштування

Налаштування сайту


mailserver

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Both sides previous revision Попередня ревізія
Наступна ревізія
Попередня ревізія
mailserver [2015/03/31 10:59]
wombat [Ссылки] Greylisting
mailserver [2020/05/20 21:59] (поточний)
wombat [Фильтрация спама]
Рядок 1: Рядок 1:
 ====== MTA ====== ====== MTA ======
 +
 +===== Postfix =====
 +
 +В отлиие от sendmail, Postfix умеет хранить входящую почту в папках формата [[https://​en.wikipedia.org/​wiki/​Maildir | Maildir]]. Это может быть полезным для установки [[mailserver#​sqwebmail|веб-интерфейса]] к почтовому серверу без вспомогательного IMAP-сервера.
  
 http://​www.postfix.org/​features.html 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 ====== ====== IMAP ======
Рядок 14: Рядок 354:
  
 http://​www.squirrelmail.org/​about/​ http://​www.squirrelmail.org/​about/​
 +
 +
 +===== SqWebmail =====
  
 http://​www.courier-mta.org/​sqwebmail/​ http://​www.courier-mta.org/​sqwebmail/​
Рядок 21: Рядок 364:
   cd /​srv/​www/​cgi-bin/​   cd /​srv/​www/​cgi-bin/​
   ln -s /​usr/​lib/​cgi-bin/​sqwebmail   ln -s /​usr/​lib/​cgi-bin/​sqwebmail
 +  cd /srv/www
 +  ln -s /​usr/​share/​sqwebmail
  
  
mailserver.1427788793.txt.bz2 · В останнє змінено: 2015/03/31 10:59 by wombat