/etc/postfix/main.cf
.
mail.falcot.com
. Это единственный вопрос, задаваемый по-умолчанию, однако та конфигурация, которая с его помощью создаётся, не является достаточно полной для нужд Falcot, поэтому администраторы запускают команду dpkg-reconfigure postfix
для того, чтобы настроить больше параметров.
localhost
, но основной домен falcot.com
нужно добавить вручную. В общем, это все доменные имена, для который машина является MX сервером, другими словами — все доменные имена, для которых в DNS указано, что эта машина принимает электронную почту. Эта информация завершается переменной mydestination
в основном конфигурационном файле Postfix /etc/postfix/main.cf
.
192.168.0.0/16
для ответа по умолчанию. Если вопрос не задан, подходящая переменная в конфигурационном файле — mynetworks
. Смотрите пример внизу.
procmail
. Этот команда сортирует входящую почту в соответствии с правилами, хранящимися в файле ~/.procmailrc
. И Postfix, и Exim4 предлагают procmail по умолчанию, но есть альтернативы, такие как maildrop или Sieve фильтры.
Пример 11.1. Initial /etc/postfix/main.cf
file
# См. /usr/share/postfix/main.cf.dist для более полной версии с комментариями # Особенность Debian: Установка имени файла приведет к тому, что первая # строка этого файла будет использоваться как имя. Значение по умолчанию в Debian # /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # Добавление .domain - задача MUA. append_dot_mydomain = no # Раскомментируйте следующую строку, чтобы генерировать предупреждения "отложенной почты" #delay_warning_time = 4h readme_directory = no # См. http://www.postfix.org/COMPATIBILITY_README.html -- значение по умолчанию - 2 # для установок с нуля. compatibility_level = 2 # Параметры TLS smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs smtp_tls_security_level=may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = mail.falcot.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = mail.falcot.com, falcot.com, localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/16 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all default_transport = smtp relay_transport = smtp inet_protocols = all myorigin = /etc/mailname
virtual_alias_domains
и ссылается на файл сопоставления адресов в virtual_alias_maps
переменной.
virtual_alias_domains = falcotsbrand.com virtual_alias_maps = hash:/etc/postfix/virtual
/etc/postfix/virtual
описывает сопоставление с довольно простым синтаксисом: каждая строка содержит два поля, разделенные пробелом; Первое поле - имя псевдонима, второе поле - это список адресов электронной почты, куда оно перенаправляет. Специальный синтаксис @domain.com
покрывает все оставшиеся псевдонимы в домене.
webmaster@falcotsbrand.com jean@falcot.com contact@falcotsbrand.com laure@falcot.com, sophie@falcot.com # The alias below is generic and covers all addresses within # the falcotsbrand.com domain not otherwise covered by this file. # These addresses forward email to the same user name in the # falcot.com domain. @falcotsbrand.com @falcot.com
/etc/postfix/virtual
таблица postfix-а /etc/postfix/virtual.db
должна быть обновлена командой sudo postmap /etc/postfix/virtual
.
virtual_mailbox_domains
и ссылки на отображение почтового ящика в virtual_mailbox_maps
. Параметр virtual_mailbox_base
содержит каталог в котором будут храниться почтовые ящики.
virtual_mailbox_domains = falcot.org virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_mailbox_base = /var/mail/vhosts
virtual_uid_maps
параметр (соответственно virtual_gid_maps
) указывает файл, содержащий сопоставление между адресом электронной почты и пользователем системы (соответственно группой), который "владеет" соответствующим почтовым ящиком. Чтобы получить все почтовые ящики, принадлежащие одному и тому же владельцу/группе, синтаксис static:5000
присваивает фиксированный UID/GID (здесь его значение 5000).
/etc/postfix/vmailbox
довольно прост: два поля, разделённые пробелом. Первое поле - адрес электронной почты в одном из виртуальных доменов, а второе поле - расположение соответствующего почтового ящика (относительно каталога, указанного в virtual_mailbox_base. Если имя почтового ящика заканчивается символом слэш (/
), электронные письма будут храниться в формате maildir; в противном случае будет использоваться традиционный формат mbox. Формат maildir использует целый каталог для хранения почтового ящика, каждое отдельное сообщение хранится в отдельном файле. В формате mbox , с другой стороны, весь почтовый ящик хранится в одном файле, и каждая строка, начиная с “From
” (From
за ним следует пробел), сигнализирует о начале нового сообщения.
# Jean's email is stored as maildir, with # one file per email in a dedicated directory jean@falcot.org falcot.org/jean/ # Sophie's email is stored in a traditional "mbox" file, # with all mails concatenated into one single file sophie@falcot.org falcot.org/sophie
soft_bounce = yes
. Если перед директивой типа reject добавить warn_if_reject
, то вместо отклонения запроса будет записано только сообщение журнала.
smtpd_client_restrictions
контролирует, какие машины могут общаться с сервером электронной почты.
Пример 11.2. Ограничения, основанные на адресе клиента
smtpd_client_restrictions = permit_mynetworks, warn_if_reject reject_unknown_client_hostname, check_client_access hash:/etc/postfix/access_clientip, reject_rhsbl_reverse_client dbl.spamhaus.org, reject_rhsbl_reverse_client rhsbl.sorbs.net, reject_rbl_client zen.spamhaus.org, reject_rbl_client dnsbl.sorbs.net
permit_mynetworks
, используемая в качестве первого правила, принимает все электронные письма, поступающие от машины в локальной сети (как определено в переменной конфигурации mynetworks
).
warn_if_reject
директивой reject_unknown_client
: этот модификатор превращает отказ в простое предупреждение, записанное в журналах . Затем администраторы могут отслеживать количество сообщений, которые были бы отклонены, если бы правило действительно применялось, и позже принять обоснованное решение, если они захотят включить такое применение.
check_client_access
позволяет администратору настроить чёрный список и список серверов электронной почты, хранящихся в файле /etc/postfix/access_clientip
. Серверы в белом списке считаются доверенными, и поэтому электронные письма, поступающие оттуда, не проходят через следующие правила фильтрации.
HELO
(или EHLO
), за которой следует имя отправляющего почтового сервера. Проверка правильности этого имени может быть интересной. Для полного соблюдения ограничений, перечисленных в smtpd_helo_restrictions
, необходимо включить smtpd_helo_required
. В противном случае клиенты могли пропустить ограничения, не отправив ни одной команды HELO
/EHLO
.
Пример 11.3. Ограничения на имя, объявленное в EHLO
smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, warn_if_reject reject_unknown_helo_hostname, check_helo_access hash:/etc/postfix/access_helo, reject_rhsbl_helo multi.surbl.org
permit_mynetworks
позволяет всем машинам в локальной сети свободно представляться. Это важно, потому что некоторые почтовые программы недостаточно соблюдают эту часть протокола SMTP и могут представляться бессмысленными именами.
reject_invalid_helo_hostname
отклоняет электронные письма, когда EHLO
объявляет синтаксически неправильное имя хоста. Правило reject_non_fqdn_helo_hostname
отвергает сообщения, когда анонсированное имя хоста не является полностью квалифицированным доменным именем (включая доменное имя, а также имя хоста). Правило reject_unknown_helo_hostname
отвергает сообщения, если объявленное имя не существует в DNS. Поскольку это последнее правило, к сожалению, приводит к большому количеству отказов, администраторы изменили его действие на простое предупреждение с модификатором warn_if_reject
в качестве первого шага; они могут решить удалить этот модификатор на более позднем этапе, после проверки результатов этого правила.
reject_rhsbl_helo
позволяет указать чёрный список, чтобы проверить имя хоста на RHSBL.
permit_mynetworks
как первое правило имеет интересный побочный эффект: следующие правила применяются только к хостам за пределами локальной сети. Это позволяет занести в чёрный список все хосты, которые объявляют себя частью сети falcot.com
, например, путем добавления строки falcot.com REJECT Вы не в нашей сети!
к файлу /etc/postfix/access_helo
.
MAIL FROM
протокола SMTP; опять же, эта информация может быть проверена несколькими различными способами.
Пример 11.4. Проверки отправителя
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_sender, reject_unknown_sender_domain, reject_unlisted_sender, reject_non_fqdn_sender, reject_rhsbl_sender rhsbl.sorbs.net
/etc/postfix/access_sender
устанавливается особый режим для некоторых отправителей. Обычно это означает внесение некоторых отправителей в белый или чёрный список.
reject_unknown_sender_domain
требует действительного домена отправителя, поскольку он необходим для действительного адреса. Правило reject_unlisted_sender
отклоняет местных отправителей, если адреса не существует; это предотвращает отправку по электронной почте с недействительного адреса в домене falcot.com
, и сообщения, исходящие от joe.bloggs@falcot.com
принимаются только в том случае, если такой адрес действительно существует.
reject_non_fqdn_sender
отвергает электронные письма, предположительно приходящие с адресов без полного квалифицированного доменного имени. На практике это означает отказ от писем, поступающих от user@machine
: адрес должен быть объявлен как user@machine.example.com
или user@example.com
.
reject_rhsbl_sender
отвергает отправителей на основе (доменного) RHSBL сервиса.
RCPT TO
протокола SMTP. Эти адреса также требуют проверки, даже если это может быть менее релевантно, чем проверки, произведённые на адресе отправителя.
Пример 11.5. Проверки получателей
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_unlisted_recipient, reject_non_fqdn_recipient, permit
reject_unauth_destination
является основным правилом, которое требует, чтобы внешние сообщения были адресованы нам; сообщения, отправленные на адрес, не обслуживаемый этим сервером, отклоняются. Без этого правила сервер становится открытым релеем, который позволяет спамерам отправлять незапрошенные электронные письма; поэтому это правило является обязательным, и будет лучше всего включать его в начале списка проверок, так что никакие другие правила не могут разрешить сообщение до того, как его пункт назначения будет проверен.
reject_unlisted_recipient
отвергает сообщения, отправленные несуществующим местным пользователям, что имеет смысл. Наконец, правило reject_non_fqdn_recipient
отклоняет неполностью квалифицированные адреса; это делает невозможным отправку электронной почты на jean
или jean@machine
, и требует использования полного адреса вместо этого, например jean@machine.falcot.com
или jean@falcot.com
.
permit
в конце не обязательна. Но это может быть полезно в конце списка ограничений, чтобы сделать политику по умолчанию явной.
DATA
выдается перед содержимым сообщения. Она не предоставляет никакой информации как таковой, кроме объявления о том, что будет дальше. Она всё ещё может быть подвергнута проверке.
reject_unauth_pipelining
приводят к отклонению сообщения, если отправляющая сторона отправляет команду до того, как был отправлен ответ на предыдущую команду. Это защищает от обычной оптимизации, используемой роботами-спамерами, поскольку они обычно наплевательски относятся к ответам и сосредотачиваются только на отправке как можно большего количества электронных писем за максимально короткое время.
RCPT TO
.
EHLO
, Postfix знает отправителя и получателя при объявлении отклонения. Затем он может зарегистрировать в журнале более явное сообщение, чем это было бы, если бы транзакция была прервана с самого начала. Кроме того, ряд SMTP-клиентов не ожидают сбоев при выполнении ранних SMTP-команд, и эти клиенты будут меньше обеспокоены таким поздним отклонением.
smtpd_delay_reject
.
Пример 11.7. Включение фильтров на основе содержимого
header_checks = regexp:/etc/postfix/header_checks body_checks = regexp:/etc/postfix/body_checks
Пример 11.8. Пример файла /etc/postfix/header_checks
/^X-Mailer: GOTO Sarbacane/ REJECT I fight spam (GOTO Sarbacane) /^Subject: *Your email contains VIRUSES/ DISCARD virus notification
GOTO Sarbacane
(программное обеспечение для массовой рассылки электронной почты) найдено, сообщение отклоняется. Второе выражение управляет темой сообщения; если в нем упоминается уведомление о вирусе, мы можем решить не отвергать сообщение, а немедленно отказаться от него.
check_policy_service
в качестве дополнительного ограничения:
smtpd_recipient_restrictions = permit_mynetworks, [...] check_policy_service inet:127.0.0.1:10023
postgrey
и отправлять ему информацию о соответствующем сообщении. Со своей стороны, Postgrey учитывает триплет IP-адреса / отправителя / получателя и проверяет в своей базе данных, был ли этот же триплет замечен в последнее время. Если это так, Postgrey отвечает, что сообщение должно быть принято; если нет, в ответе указывается, что сообщение должно быть временно отклонено, и триплет записывается в базу данных.
smtpd_restriction_classes
и определяются так же, как smtpd_recipient_restrictions
. Директива check_recipient_access
затем определяет таблицу, сопоставляющую данному получателю соответствующий набор ограничений.
Пример 11.9. Определение классов ограничения в main.cf
smtpd_restriction_classes = greylisting, aggressive, permissive greylisting = check_policy_service inet:127.0.0.1:10023 aggressive = reject_rbl_client sbl-xbl.spamhaus.org, check_policy_service inet:127.0.0.1:10023 permissive = permit smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, check_recipient_access hash:/etc/postfix/recipient_access
Пример 11.10. Файл /etc/postfix/recipient_access
# Unfiltered addresses postmaster@falcot.com permissive support@falcot.com permissive sales-asia@falcot.com permissive # Aggressive filtering for some privileged users joe@falcot.com aggressive # Special rule for the mailing-list manager sympa@falcot.com reject_unverified_sender # Greylisting by default falcot.com greylisting
clamav
из одноимённого пакета.
clamav-milter
. milter (сокращаемый до mail filter ) - это программа фильтрации, специально предназначенная для взаимодействия с серверами электронной почты. Милтер использует стандартный интерфейс программирования приложений (API), который обеспечивает гораздо лучшую производительность, чем фильтры, внешние по отношению к серверам электронной почты. Милтеры были первоначально введены Sendmail, но Postfix вскоре последовал его примеру.
dpkg-reconfigure clamav-milter
. При запросе на “Communication interface with Sendmail”, ответ “inet:10002@127.0.0.1
”.
dpkg-reconfigure clamav-base
.
/etc/postfix/main.cf
:
# Virus check with clamav-milter smtpd_milters = inet:[127.0.0.1]:10002
systemctl reload postfix
, чтобы это изменение было учтено.
include
, она должна иметь её.
Name: example.org Type: TXT TTL: 3600 Data: v=spf1 a mx -all
falcot.org
.
#
host -t TXT falcot.org
falcot.org descriptive text "v=spf1 ip4:199.127.61.96 +a +mx +ip4:206.221.184.234 +ip4:209.222.96.251 ~all"
postfix
может проверять запись SPF на наличие входящих писем с помощью пакета postfix-policyd-spf-python, это - агент политики, написанный на Python. Файл /usr/share/doc/postfix-policyd-spf-python/README.Debian
описывает необходимые шаги для интеграции агента в postfix, поэтому не будем здесь повторяться.
/etc/postfix-policyd-spf-python/policyd-spf.conf
, который полностью документирован в policyd-spf.conf(5) и /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented.gz
. Основные параметры конфигурации: HELO_reject
и Mail_From_reject
, которые настраивают, следует ли отклонять электронные письма (Fail
) или принимать с добавлением заголовка (False
), если проверки не пройдут. Последнее часто бывает полезно, когда сообщение дополнительно обрабатывается спам-фильтром.
Header_Type
должен быть установлен на AR
.
postfix
добавляет цифровую подпись, связанную с именем домена, в заголовок исходящих писем. Получающая сторона может проверить текст сообщения и поля заголовка, проверив подпись по открытому ключу, который извлекается из DNS-записей отправителей.
opendkim-genkey -s SELECTOR -d DOMAIN
. SELECTOR должно быть уникальным именем ключа. Это может быть просто "mail" или дата создания, если вы планируете ротацию ключей.
Пример 11.11. Создать закрытый ключ для подписи электронных писем от falcot.com
#
opendkim-genkey -s mail -d falcot.com -D /etc/dkimkeys
#
chown opendkim.opendkim /etc/dkimkeys/mail.*
/etc/dkimkeys/mail.private
и /etc/dkimkeys/mail.txt
и установит для них соответствующие права владения. Первый файл содержит приватный (закрытый) ключ, а второй — публичный (открытый) ключ, который необходимо добавить в DNS:
Name: mail._domainkey Type: TXT TTL: 3600 Data: "v=DKIM1; h=sha256; k=rsa; s=email; p=[...]"
-b 1024
чтобы выбрать меньший размер ключа. Если opendkim-testkey
возвращает результат успешно, то запись успешно настроена. Синтаксис записи объясняется здесь:
SOCKET
и RUNDIR
должны быть выбраны в /etc/default/opendkim
. Заметьте что SOCKET
должен быть доступен из postfix
в его chroot среде. Дальнейшая настройка осуществляется в /etc/opendkim.conf
. Ниже приведен фрагмент конфигурации, который позволяет убедиться, что Domain
"falcot.com" и его субдомены (SubDomain
) подписаны Selector
"mail" и единственным приватным ключом (KeyFile
) /etc/dkimkeys/mail.private
. "relaxed" Canonicalization
как для заголовка, так и для тела письма допускает лёгкие модификации (например, с помощью программного обеспечения списка рассылки). Фильтр работает как при подписании ("s"), так и при проверке ("v") Mode
. Если подпись не проходит проверку (On-BadSignature
), почта должна быть помещена в карантин ("q").
[...] Domain falcot.com KeyFile /etc/dkimkeys/mail.private Selector mail [...] Canonicalization relaxed/relaxed Mode sv On-BadSignature q SubDomains yes [...] Socket inet:12345@localhost [...] UserID opendkim
KeyTable
), доменов (SigningTable
) и указать внутренние или доверенные хосты (InternalHosts
, ExternalIgnoreList
), которые могут отправлять почту через сервер как один из подписанных доменов без учётных данных.
/etc/postfix/main.cf
созданы postfix
используя это фильтр:
milter_default_action = accept non_smtpd_milters = inet:localhost:12345 smtpd_milters = inet:localhost:12345
/etc/postfix/master.cf
.
/usr/share/doc/opendkim/
и страницах руководства opendkim(8) и opendkim.conf(5).
_dmarc
и действия, которое следует предпринять, если электронные письма, содержащие ваш домен в качестве отправляющего хоста, не проходят проверку с использованием DKIM и SPF.
#
host -t TXT _dmarc.gmail.com
_dmarc.gmail.com descriptive text "v=DMARC1; p=none; sp=quarantine; rua=mailto:mailauth-reports@google.com"
#
host -t TXT _dmarc.yahoo.com
_dmarc.yahoo.com descriptive text "v=DMARC1; p=reject; pct=100; rua=mailto:d@rua.agari.com; ruf=mailto:d@ruf.agari.com;"
reject
все электронных писем, которые якобы отправлены с учётной записи Yahoo, но с отсутствующими или непройденными проверками DKIM и SPF. Google Mail (Gmail) пропагандирует очень мягкую политику, согласно которой такие сообщения из основного домена по-прежнему должны приниматься (p=none
). Для поддоменов они должны быть помечены как спам (sp=quarantine
). Адреса, указанные в ключе rua
могут использоваться для отправки агрегированных отчетов DMARC. Полный синтаксис описан здесь:
postfix
также может использовать эту информацию. Пакет opendmarc содержит необходимый milter. Подобно opendkim SOCKET
и RUNDIR
должен быть выбран в /etc/default/opendmarc
(для сокетов Unix вы должны убедиться, что они находятся внутри chroot postfix-а, чтобы их можно было найти). Конфигурационный файл /etc/opendmarc.conf
содержит подробные комментарии и также объясняется в opendmarc.conf(5). По умолчанию электронные письма, не прошедшие проверку DMARC, не отклоняются, а помечаются путем добавления соответствующего поля заголовка. Чтобы изменить это, используйте RejectFailures true
.
smtpd_milters
и non_smtpd_milters
. Если мы настроили milters opendkim и opendmarc для работы на портах 12345 и 54321, запись в /etc/postfix/main.cf
выглядит так:
non_smtpd_milters = inet:localhost:12345,inet:localhost:54321 smtpd_milters = inet:localhost:12345,inet:localhost:54321
/etc/postfix/master.cf
.
saslpasswd2
, которая принимает несколько параметров. Опция -u
определяет домен аутентификации, который должен соответствовать параметру smtpd_sasl_local_domain
в конфигурации Postfix. Опция -c
позволяет создать пользователя и -f
позволяет указать файл, который будет использоваться, если базу данных SASL необходимо хранить не в умолчальном расположении (/etc/sasldb2
).
#
saslpasswd2 -u `postconf -h myhostname` -f /var/spool/postfix/etc/sasldb2 -c jean
[... type jean's password twice ...]
/etc/sasldb2
в символическую ссылку, указывающую на базу данных, используемую Postfix, командой ln -sf /var/spool/postfix/etc/sasldb2 /etc/sasldb2
.
postfix
в группу sasl
, чтобы он мог получить доступ к базе данных учетных записей SASL. Для включения SASL также необходимо несколько новых параметров, а параметр smtpd_recipient_restrictions
необходимо настроить, чтобы клиенты, прошедшие проверку подлинности SASL, могли свободно отправлять электронные письма.
Пример 11.12. Включение SASL в /etc/postfix/main.cf
# Включить аутентификацию SASL smtpd_sasl_auth_enable = yes # Определить SASL домент аутентификации для использования smtpd_sasl_local_domain = $myhostname [...] # Добавить permit_sasl_authenticated перед reject_unauth_destination # разрешить ретранслировать почту, отправляемую SASL-аутентифицированными пользователями smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, [...]
/etc/postfix/master.cf
file. To turn off authentication at all for port 25 (smtpd
service) add the following directive:
smtp inet n - y - - smtpd [..] -o smtpd_sasl_auth_enable=no [..]
AUTH
(так делают некоторые очень старые почтовые клиенты), совместимость с ними можно включить с помощью директивы broken_sasl_auth_clients
.