/etc/postfix/main.cf
設定ファイルの最初のバージョンが作成されます。
mail.falcot.com
と答えるべきです。デフォルトで聞かれる質問は以上ですが、Falcot にとってこの状態の Postfix はまだ十分に設定されていません。このため、管理者は dpkg-reconfigure postfix
を実行してさらに多くのパラメータをカスタマイズします。
dpkg-reconfigure postfix
を実行したことで追加的に行われる質問の 1 つに、このマシンに関連するすべてのドメイン名を尋ねる質問があります。デフォルトで挙げられるドメイン名のリストには、マシンのフルネームといくつかの localhost
の同義語が含まれていますが、主要なドメイン名である falcot.com
を手作業で追加する必要があります。より一般的に言えば、この質問の回答には、通常 MX サーバを担当しているマシンに割り当てたすべてのドメイン名を含めるべきです。さらに言い換えれば、DNS の MX レコードを参照した際に電子メールを受け入れるサーバとして登録されているすべてのドメイン名を含めるべきです。この情報は最終的に Postfix 主要設定ファイル /etc/postfix/main.cf
の mydestination
変数に設定されます。
192.168.0.0/16
を追加しました。この質問が尋ねられなければ、以下の例に示す通り、設定ファイル中の関連する変数 mynetworks
にローカルネットワークを追加します。
procmail
. This tool allows users to sort their incoming email according to rules stored in their ~/.procmailrc
file. Both Postfix and Exim4 suggest procmail by default, but there are alternatives like maildrop or Sieve filters.
例 11.1 最初の /etc/postfix/main.cf
ファイル
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on # fresh installs. compatibility_level = 2 # TLS parameters 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
ファイルはかなり直接的な構文で対応付けを記述します。すなわち、各行には空白で分割された 2 つのフィールドが含まれます。最初のフィールドは仮想エイリアス名、2 番目のフィールドはリダイレクトする電子メールアドレスのリストです。@domain.com
特殊構文を使うことで、そのドメインに含まれるすべての残りの別名をカバーすることも可能です。
[email protected] [email protected] [email protected] [email protected], [email protected] # 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
the postfix table /etc/postfix/virtual.db
needs to be updated using 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
ファイルの構文はかなり直接的です。つまり、空白で分けられた 2 種類のフィールドで対応関係を表現します。最初のフィールドは仮想ドメインの 1 つに属する電子メールアドレスで、2 番目のフィールドは関連するメールボックスの場所です (これは virtual_mailbox_base 以下から見た相対ディレクトリパスを指定します)。メールボックスの名前がスラッシュ (/
) で終わっていた場合、電子メールは maildir フォーマットで保存されます。一方、そうでなければ伝統的な mbox フォーマットで保存されます。maildir フォーマットはメールボックスを保存するためにディレクトリ全体を使い、それぞれのメッセージは 1 つのファイルとして保存されます。これに対して、mbox フォーマットでは、メールボックス全体が 1 つのファイルに保存されます。「From
」(From
の後に 1 つの空白) で始まる行が新しいメッセージの始まる目印です。
# Jean 宛の電子メールは専用ディレクトリ内の 1 ファイルを # 1 メールに対応付ける maildir フォーマットで保存されます [email protected] falcot.org/jean/ # Sophie 宛の電子メールは 1 ファイルにすべてのメールを # 連結する伝統的な "mbox" ファイルに保存されます [email protected] falcot.org/sophie
soft_bounce = yes
directive. By prepending a reject-type directive with warn_if_reject
only a log message will be recorded instead of rejecting the request.
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
directive, used as the first rule, accepts all emails coming from a machine in the local network (as defined by the mynetworks
configuration variable).
warn_if_reject
modifier to the reject_unknown_client
directive: this modifier turns the rejection into a simple warning recorded in the logs. The administrators can then keep an eye on the number of messages that would be rejected if the rule were actually enforced, and make an informed decision later if they wish to enable such enforcement.
check_client_access
directive allows the administrator to set up a blacklist and a whitelist of email servers, stored in the /etc/postfix/access_clientip
file. Servers in the whitelist are considered as trusted, and the emails coming from there therefore do not go through the following filtering rules.
HELO
(or EHLO
) command, followed by the name of the sending email server. Checking the validity of this name can be interesting. To fully enforce the restrictions listed in smtpd_helo_restrictions
the smtpd_helo_required
option needs to be enabled. Otherwise clients could skip the restrictions by not sending any HELO
/EHLO
command.
例 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
指示文を使うことで、ローカルネットワーク上のすべてのマシンならば HELO
コマンドの引数にどのような名前を使っても良いことになります。これは重要です。なぜなら、一部の電子メールプログラムは SMTP プロトコルのこの部分を十分適切に尊重せず HELO
の引数に無意味な名前を使うからです。
reject_invalid_helo_hostname
rule rejects emails when the EHLO
announce lists a syntactically incorrect hostname. The reject_non_fqdn_helo_hostname
rule rejects messages when the announced hostname is not a fully-qualified domain name (including a domain name as well as a host name). The reject_unknown_helo_hostname
rule rejects messages if the announced name does not exist in the DNS. Since this last rule unfortunately leads to a lot of rejections, the administrators turned its effect to a simple warning with the warn_if_reject
modifier as a first step; they may decide to remove this modifier at a later stage, after auditing the results of this rule.
reject_rhsbl_helo
allows to specify a black list to check the hostname against an RHSBL.
permit_mynetworks
as the first rule has an interesting side effect: the following rules only apply to hosts outside the local network. This allows blacklisting all hosts that announce themselves as part of the falcot.com
network, for instance by adding a falcot.com REJECT You are not in our network!
line to the /etc/postfix/access_helo
file.
MAIL FROM
コマンドで申告されます。繰り返しになりますが、さまざまな異なる方法で送信者アドレスの有効性を判断します。
例 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
check_sender_access
ルールを使うことで、/etc/postfix/access_sender
テーブルで指定した一部の送信者を特別扱いすることが可能です。このルールは一部の送信者をホワイトリストやブラックリストに入れることを意味します。
reject_unknown_sender_domain
rule requires a valid sender domain, since it is needed for a valid address. The reject_unlisted_sender
rule rejects local senders if the address does not exist; this prevents emails being sent from an invalid address in the falcot.com
domain, and messages emanating from [email protected]
are only accepted if such an address really exists.
reject_non_fqdn_sender
ルールを使うことで、完全修飾ドメイン名を持たないアドレスから送信されたと称する電子メールを拒否します。具体的には、user@machine
からの電子メールを拒否します。すなわち、送信者アドレスは必ず [email protected]
または [email protected]
の形で申告されなければいけないということです。
reject_rhsbl_sender
rule reject senders based on a (domain-based) RHSBL service.
RCPT TO
コマンドで申告されます。送信者アドレスに対して行った確認よりも関係性は低いとは言うものの、受信者アドレスの正当性を確認することは当然です。
例 11.5 受信者アドレスの確認
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_unlisted_recipient, reject_non_fqdn_recipient, permit
reject_unauth_destination
は基本的なルールで、受け入れ要求のあったメッセージが自分の管理するユーザ宛であることを確認します。すなわち、このサーバにないアドレス宛のメッセージを拒否するということです。このルールを指定しなかった場合、サーバがスパマーによって迷惑メールを送信するための第三者中継サーバとして使われる可能性が出てきます。このため reject_unauth_destination
ルールは必須で、ルールリストの先頭に近い位置に置くのが最良です。そうすれば、メッセージの宛先をチェックする前に、他のルールがそのメッセージの受け入れを許可することを避けられます。
reject_unlisted_recipient
ルールを使うことで、存在しないローカルユーザ宛のメッセージを拒否するようになります。これは道理に適ったルールです。最後に、reject_non_fqdn_recipient
ルールを使うことで、完全修飾ドメイン名でないアドレスを拒否するようになります。さらに reject_non_fqdn_recipient
ルールを使った場合、jean
や jean@machine
宛の電子メールは送信できず、その代わりに [email protected]
や [email protected]
などの完全なアドレスを使うことが要求されます。
permit
directive at the end is not necessary. But it can be useful at the end of a restriction list to make the default policy explicit.
DATA
コマンドはメッセージ内容の前に送信されます。DATA
コマンドの後に送信されるメッセージ内容はさておき、厳密な意味では DATA
コマンドはいかなる情報も提供しません。とは言っても、確認することは可能です。
reject_unauth_pipelining
指示文を使うことで、1 つ前に送信されたコマンドに応答する前に送信者が次のコマンドを送ったメッセージを拒否するようになります。この防御はスパマーロボットの使う一般的な最適化に対抗するものです。なぜなら、スパマーはサーバからの応答の結果を気にせず、可能な限り短い時間で可能な限り大量の電子メールを送信することだけに注目しているからです。
RCPT TO
command by default.
EHLO
コマンドが原因でメッセージを拒否する場合でも、Postfix はメッセージの送信者と受信者を知った後に拒否応答を送信することを意味しています。こうすることで、すぐにトランザクションを拒否するよりも明確なログを残すことが可能です。加えて、多くの SMTP クライアントはトランザクションの最初の方の SMTP コマンドの失敗を予期していませんから、RCPT TO
の後に拒否応答を返したとしても問題になることは少ないです。
smtpd_delay_reject
rule.
例 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
(大量の電子メールを送信するソフトウェア) が見つかったら、メッセージを拒否します。2 番目の正規表現はメッセージの件名を操作します。そしてメッセージの件名にウイルス通知が含まれる場合、そのメッセージを拒否しない代わりにすぐに捨てます。
postgrey
はデーモンとして実行され、ポート 10023 番をリッスンします。この後 Postfix の設定に check_policy_service
ルールを追加することで、Postfix は postgrey
デーモンを使うようになります。
smtpd_recipient_restrictions = permit_mynetworks, [...] check_policy_service inet:127.0.0.1:10023
postgrey
daemon and send it information concerning the relevant message. On its side, Postgrey considers the IP address/sender/recipient triplet and checks in its database whether that same triplet has been seen recently. If so, Postgrey replies that the message should be accepted; if not, the reply indicates that the message should be temporarily rejected, and the triplet gets recorded in the database.
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
ファイル
# 無制限に受信するアドレス [email protected] permissive [email protected] permissive [email protected] permissive # 特権ユーザに対する積極的なフィルタリング [email protected] aggressive # メーリングリスト管理者用の特別なルール [email protected] reject_unverified_sender # デフォルトの greylisting 設定 falcot.com greylisting
clamav
from the homonymous package.
clamav-milter
はアンチウイルスと電子メールサーバのやり取りを仲介する作業を担当します。milter (mail filter の略) は電子メールサーバに対するインターフェースとして特別に設計されたフィルタプログラムです。milter は標準的なアプリケーションプログラミングインターフェース (API) を使います。API を使うことで電子メールサーバの外にあるフィルタを使うよりも性能が向上します。milter は 最初 Sendmail に導入されましたが、すぐ後に Postfix にも導入されました。
dpkg-reconfigure clamav-milter
を実行します。そして「Sendmail とのコミュニケーションインターフェイス」が表示されたら「inet:[email protected]
」と答えます。
dpkg-reconfigure clamav-base
を使えばいくつかの重要なパラメータをカスタマイズすることも可能です。
/etc/postfix/main.cf
に以下の指示文を追加するだけで簡単に設定できます。
# clamav-milter を使ったウイルスチェック smtpd_milters = inet:[127.0.0.1]:10002
systemctl reload postfix
should be run so that this change is taken into account.
include
directive it must have one.
Name: example.org Type: TXT TTL: 3600 Data: v=spf1 a mx -all
falcot.org
entry.
#
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
mail server can check the SPF record for incoming emails using the postfix-policyd-spf-python package, a policy agent written in Python. The file /usr/share/doc/postfix-policyd-spf-python/README.Debian
describes the necessary steps to integrate the agent into postfix, so we won't repeat it here.
/etc/postfix-policyd-spf-python/policyd-spf.conf
, which is fully documented in policyd-spf.conf(5) and /usr/share/doc/postfix-policyd-spf-python/policyd-spf.conf.commented.gz
. The main configuration parameters are HELO_reject
and Mail_From_reject
, which configure if emails should be rejected (Fail
) or accepted with a header being appended (False
), if checks fail. The latter is often useful, when the message is further processed by a spam filter.
Header_Type
must be set to AR
.
postfix
, adds a digital signature associated with the domain name to the header of outgoing emails. The receiving party can validate the message body and header fields by checking the signature against a public key, which is retrieved from the senders DNS records.
opendkim-genkey -s SELECTOR -d DOMAIN
. SELECTOR must be a unique name for the key. It can be as simple as "mail" or the date of creation, if you plan to rotate keys.
例 11.11 Create a private key for signing E-Mails from falcot.com
#
opendkim-genkey -s mail -d falcot.com -D /etc/dkimkeys
#
chown opendkim.opendkim /etc/dkimkeys/mail.*
/etc/dkimkeys/mail.private
and /etc/dkimkeys/mail.txt
and set the appropriate ownership. The first file contains the private key, and the latter the public key that needs to be added to the DNS:
Name: mail._domainkey Type: TXT TTL: 3600 Data: "v=DKIM1; h=sha256; k=rsa; s=email; p=[...]"
-b 1024
to chose a smaller keysize. If opendkim-testkey
succeeds, the entry has been successfully set up. The syntax of the entry is explained here:
SOCKET
and RUNDIR
must be chosen in /etc/default/opendkim
. Please note that SOCKET
must be accessible from postfix
in its chrooted environment. The further configuration is done in /etc/opendkim.conf
. The following is a configuration excerpt, which makes sure that the Domain
"falcot.com" and all subdomains (SubDomain
) are signed by the Selector
"mail" and the single private key (KeyFile
) /etc/dkimkeys/mail.private
. The "relaxed" Canonicalization
for both the header and the body tolerates mild modification (by a mailing list software, for example). The filter runs both in signing ("s") and verification ("v") Mode
. If a signature fails to validate (On-BadSignature
), the mail should be quarantined ("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
), domains (SigningTable
) and to specify internal or trusted hosts (InternalHosts
, ExternalIgnoreList
), which may send mail through the server as one of the signing domains without credentials.
/etc/postfix/main.cf
make postfix
use the filter:
milter_default_action = accept non_smtpd_milters = inet:localhost:12345 smtpd_milters = inet:localhost:12345
/etc/postfix/master.cf
instead.
/usr/share/doc/opendkim/
directory and the manual pages opendkim(8) and opendkim.conf(5).
_dmarc
and the action that should be taken when emails that contain your domain as the sending host fail to validate using DKIM and SPF.
#
host -t TXT _dmarc.gmail.com
_dmarc.gmail.com descriptive text "v=DMARC1; p=none; sp=quarantine; rua=mailto:[email protected]"
#
host -t TXT _dmarc.yahoo.com
_dmarc.yahoo.com descriptive text "v=DMARC1; p=reject; pct=100; rua=mailto:[email protected]; ruf=mailto:[email protected];"
reject
all emails pretending to be sent from a Yahoo account but missing or failing DKIM and SPF checks. Google Mail (Gmail) propagates a very relaxed policy, in which such messages from the main domain should still be accepted (p=none
). For subdomains they should be marked as spam (sp=quarantine
). The addresses given in the rua
key can be used to send aggregated DMARC reports to. The full syntax is explained here:
postfix
mail server can use this information too. The opendmarc package contains the necessary milter. Similar to opendkim SOCKET
and RUNDIR
must be chosen in /etc/default/opendmarc
(for Unix sockets you must make sure that they are inside the postfix chroot to be found). The configuration file /etc/opendmarc.conf
contains detailed comments and is also explained in opendmarc.conf(5). By default, emails failing the DMARC validation are not rejected but flagged, by adding an appropriate header field. To change this, use RejectFailures true
.
smtpd_milters
and non_smtpd_milters
. If we configured the opendkim and opendmarc milters to run on ports 12345 and 54321, the entry in /etc/postfix/main.cf
looks like this:
non_smtpd_milters = inet:localhost:12345,inet:localhost:54321 smtpd_milters = inet:localhost:12345,inet:localhost:54321
/etc/postfix/master.cf
instead.
saslpasswd2
コマンドを使います。saslpasswd2
コマンドはいくつかのパラメータを取ります。-u
オプションは認証するドメインを定義します。これは Postfix 設定の smtpd_sasl_local_domain
パラメータと一致しなければいけません。-c
オプションはユーザを作成します。-f
オプションは SASL データベースをデフォルト (/etc/sasldb2
) とは異なる場所に保存することが必要な場合にデータベースファイルの位置を指定します。
#
saslpasswd2 -u `postconf -h myhostname` -f /var/spool/postfix/etc/sasldb2 -c jean
[... jean のパスワードを 2 回入力します ...]
ln -sf /var/spool/postfix/etc/sasldb2 /etc/sasldb2
コマンドを使って /etc/sasldb2
を Postfix の使うデータベースを指すシンボリックリンクにします。
postfix
ユーザを sasl
グループに追加して、SASL アカウントデータベースにアクセスできるようにします。Postfix で SASL を有効化するには、いくつかの新しいパラメータが必要です。また、SASL 認証されたクライアントが自由に電子メールを送信することを許可するには、smtpd_recipient_restrictions
パラメータを設定します。
例 11.12 /etc/postfix/main.cf
の中で SASL を有効化
# Enable SASL authentication smtpd_sasl_auth_enable = yes # Define the SASL authentication domain to use smtpd_sasl_local_domain = $myhostname [...] # Adding permit_sasl_authenticated before reject_unauth_destination # allows relaying mail sent by SASL-authenticated users 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
command (some very old mail clients do), interoperability with them can be enabled using the broken_sasl_auth_clients
directive.