Docker ベースの Maddy メール サービスをすばやく構築する
Docker ビルド
Maddy は GO 言語で開発された ALL-IN-ONE メール システムです. その主な機能は SMTP を介してメールを送受信することです. IMAP を介して, クライアントはそれにアクセスできます. DKIM, SPF, DMARC, DANE, MTA-STS もサポートしています.およびその他のメール関連のセキュリティおよびスパム対策プロトコル。
簡単に言うと、展開が非常に便利で、リソースの消費が少なく、電子メール サーバーの個人的な使用に非常に適しています。
プロジェクトのアドレス: master foxcpp/maddy (github.com) の maddy/maddy.conf
前提:
- パブリック IP とドメイン名を持つサーバーを用意する
- サーバーは次のポートを開きます: 143,25,465,587,993
参考:共通メールポート
example.com
ドメイン名は以下のデモンストレーションとして使用されており、実際には実際のドメイン名に置き換えられています。
1. SSL証明書の申請
https://sslforfree.comからmx1.example.com
証明書を申請し、ダウンロードcertificate.crt
して取得しますprivate.key
名前をそれぞれ およびcertificate.crt
に変更します(構成ファイルでデフォルトで指定されている名前)private.key
fullchain.pem
privkey.pem
2. docker 永続ディレクトリを作成し、構成ファイルをインポートする
maddy.confから公式のデフォルト構成ファイルをダウンロードし、その内容を変更します。
(hostname) = mx1.example.com
(primary_domain) = example.com
コンテナにデータマッピングを格納するディレクトリ maddydata を作成し、上記の証明書ファイルと maddy.conf を以下に配置します。
このときの maddydata のディレクトリ構成は以下のとおりです。
maddydata
├── certs
│ └── mx1.example.com
│ ├── fullchain.pem
│ └── privkey.pem
└── maddy.conf
3. Docker が Maddy を起動します
docker run \
--name maddy \
-e MADDY_HOSTNAME=mx1.example.com \
-e MADDY_DOMAIN=example.com \
-v /maddydata/certs:/etc/maddy/certs/ \
-v /maddydata:/data \
-p 25:25 \
-p 143:143 \
-p 587:587 \
-p 993:993 \
-d foxcpp/maddy:latest
docker サービスの開始に失敗した場合は、ログをdocker logs maddy
確認して理由を見つけてください
4.クラウドサーバーのDNS設定
より詳細な説明については、公式ドキュメントインストールと初期設定 - maddyを参照してください。
example.com
独自のドメイン名に変更する必要があることに注意してください
# A 记录
example.com. A 10.2.3.4
# MX 记录
example.com. MX 10 mx1.example.com.
# MX 域解析
mx1.example.org. A 10.2.3.4
# SPF
example.com. TXT "v=spf1 mx ~all"
example.com. TXT "v=spf1 mx ~all"
# _dmarc
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; ruf=mailto:[email protected]"
# _mta-sts. _smtp.tls
_mta-sts.example.com. TXT "v=STSv1; id=1"
_smtp._tls.example.com. TXT "v=TLSRPTv1;rua=mailto:[email protected]"
# 设置的值项目运行后自动生成,cat maddydata/dkim_keys/example.com_default.dns
default._domainkey.example.com. TXT "v=DKIM1; k=ed25519; p=xxxxxxxxxxxx"
IPV6 アドレスがある場合は、次のように構成することもできます。
example.com. AAAA 2001:beef::1 # IPV6 有就配置
mx1.example.org. AAAA 2001:beef::1 # IPV6 有就配置
各構成の詳細な分析については、次の部分を参照してください。
Maddy コマンドライン操作
マディコンテナに入ります:
docker exec -it maddy sh
Maddy は仮想ユーザーを使用するため、postfix や dovecot のようなシステム ユーザーを作成する必要はありません。ログイン アカウントと IMAP ローカル ストレージ アカウントを作成する必要があります。(ログインアカウントは、SMTPおよびIMAPログインの認証情報です)
# 创建一个 [email protected] 的登录账户
$ maddyctl creds create [email protected]
# 查看登录账户列表
$ maddyctl creds list
# 创建一个 [email protected] 邮件储存账户
$ maddyctl imap-acct create [email protected]
# 查看刚存储账户列表
$ maddyctl imap-acct list
# 可以看到账户下的邮件分类
$ maddyctl imap-mboxes list [email protected]
INBOX [\HasNoChildren]
Sent [\Sent \HasNoChildren]
Trash [\Trash \HasNoChildren]
Junk [\Junk \HasNoChildren]
Drafts [\Drafts \HasNoChildren]
Archive [\Archive \HasNoChildren]
# 可以查看当前账户对应分类接收到的邮件,一般收件在 INBOX 中
$maddyctl imap-msgs list [email protected] INBOX
ビルドが成功したかどうかをテストする
以前の Web メールボックス (たとえば、163) にログインし、作成したメールボックスにメールを[email protected]
送信します
メールを受信したかどうかを確認します。
$ maddyctl imap-msgs list [email protected] INBOX
UID 1: <[email protected]> - =?utf-8?B?dGVzdEBoYWhhY29kZS5jbg==?=
[\Recent], 2023-03-22 09:54:47 +0000 UTC
ドメイン名解決構成の基礎知識
メール システムでどのようなソフトウェアが使用されていても、メールに関連するドメイン名の解決はバイパスできません.メールに従事している限り、次のドメイン名の解決を構成する必要があります。
- MX レコード: メール サーバーを指すドメイン ネーム システムのベース レコード
- SPF レコード: ドメイン名を使用してメールを送信できるサーバーを指定します
- DKIM レコード: 送信された電子メールの内容の改ざんを防ぎます
- DMARC レコード: SPF と DKIM の検証が失敗した場合、受信者の処理ポリシーを指定し、指定されたメールボックスに報告します
- PTR レコード: つまり、IP アンチ分析、および IP に基づく逆ドメイン名検索。これはサプライヤーが行う必要があります。
MX レコード
MXレコードは、メールの送受信時に独自のメールサーバーアドレスを指定し、優先度を設定できるため、一般的にはmxレコードを2つ以上持つことが推奨されています()
域名 类型 值 优先级
example.com mx mx1.example.com 10
MX サブドメイン名に対応するレコードを設定します。
mx1.example.com A 10.2.3.4
設定後、dig コマンドを使用して以下を確認します。
dig mx example.com
PTR記録
ドメイン名からIPアドレスへのマッピングは順方向解決、IPアドレスからドメイン名へのマッピングは逆方向解決ですが、パブリックネットワークでは、IPアドレスの管理権限が事業者にあるため、DNSによる逆方向解決はできません。逆引きを追加すると、オペレータは、PTR (Pointer Record) レコードを介して IP アドレスをドメイン名にポイントします。メールサーバーのIPはPTR記録をしないため、送信後に迷惑メールとみなされる可能性が高いです。
サプライヤに連絡して追加したら、dig コマンドを使用して次のことを確認できます。
dig -x mx1.example.com
SPF レコード
SPF の正式名称は送信者、その主な機能は、送信メール サーバーと送信ドメイン名をバインドして、偽造された送信者を防止することです。SPF レコードの TXT レコードを使用して、メールの送信を許可するサーバーを指定します。相手がメールを受信すると、システムは送信ドメイン名を確認し、SPF レコードの IP を読み取り、確認後にさらにアクションを実行します。一貫しているかどうか。
例として、Google SPF レコードを取り上げます。
# dig txt gmail.com
gmail.com. 300 IN TXT "v=spf1 redirect=_spf.google.com"
# dig txt _spf.google.com
_spf.google.com. 300 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
# dig txt _netblocks.google.com
_netblocks.google.com. 300 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
SPF レコードは でv=spf1
始まりall
終わり、途中で ip4/ip6/a/mx/include/redirect などのキーワードを使用して IP 範囲を指定できます。SPF レコードの照合メカニズムでは、修飾子レコードの照合時に何をすべきかをサーバーに伝えます。一般的な修飾子は次のとおりです。
+
これは、修飾子が明示的に指定されていない場合のデフォルトです。-
無許可のホストからのメールを直接拒否するハード拒否。~
ソフト拒否では、メッセージを受け入れるか、スパムとしてマークすることができます。?
メールが受け入れられるかどうかに関係なく、ニュートラルです。
個人の電子メール設定により、mx レコードのサーバーが手紙を送信できるようになり、最終的に SPF レコードを次のように設定します。
example.com txt "v=spf1 mx -all"
DKIM レコード
DKIM レコードの主な機能は、メールが悪意を持って改ざんされるのを防ぎ、メール コンテンツの整合性を確保することです. 使用される方法は SSL に似ています. サーバーは公開鍵と秘密鍵のペアを生成し、秘密鍵はそれぞれに署名しますDKIM 署名 (DKIM-Signature ヘッダー) に挿入され、公開鍵はドメイン名レコードに格納されます. メール受信者は、メールを受信すると、DNS クエリを介して公開鍵を取得し、それを使用します.メールの署名を復号化するための公開鍵。これにより、メールの有効性と完全性が検証されます。
Docker は、DKIM 秘密鍵と、Maddy の実行後に追加される dns レコードを自動的に生成します。場所は次のとおりです。
dockerdata/dkim_keys/example.com_default.dns
default._domainkey.example.com txt "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0......"
DMARC レコード
DMARC は、既存の SPF および DKIM プロトコルに基づいており、検証に失敗した電子メールの処理ポリシーを宣言します。メール受信者はメールを受信すると、まずDNS経由でDMARCレコードを取得し、メール送信元に対してSPF検証とDKIM検証を行い、検証に失敗したメールをDMARCレコードに従って処理し、処理結果を送信者にフィードバックします。 .
_dmarc.nixops.me txt "v=DMARC1; p=quarantine; ruf=mailto:[email protected]"
p
: reject はメールを拒否します; none は処理しないことを意味します; quarantine はメールをスパムとしてマークします。ruf
: 偽造メールが検出され、受信者によってメールアドレスが報告されました
MTA-STS および TLS レポート
MTA-STS は MTA Strict Transport Security Protocol であり、送信された電子メールが TLS 経由で安全に送信され、中間者攻撃を防止するために使用されます。MTA-STS を有効にすると、送信者のメール サーバーは、次の条件が満たされた場合にのみメールを送信します。
- 有効な証明書で認証済み
- TLS 1.2 以上を使用して暗号化
もちろん、送信者が MTA-STS をサポートしていない場合でも、主に互換性のために電子メールを送信できます (man-in-the-middle 攻撃がある可能性があります)。
MTA-STS を有効にするための要件:
- ポリシー ファイルを作成し、HTTPS アクセスを提供する
- DNS を介して txt レコードを設定し、他のメール サービス プロバイダーに MTA-STS をサポートするよう伝えます。
ポリシー ファイル mta-sts.txt の内容は次のとおりです。
version: STSv1
mode: enforce
mx: mx1.nixops.me
mx: mx2.nixops.me
max_age: 86400
サブドメイン名を作成し、https を有効にします。最終的なアクセス パスは次のとおりです。
https://mta-sts.nixops.me/.well-known/mta-sts.txt
MTA-STS の TXT レコードを構成します。
_mta-sts.nixops.me TXT "v=STSv1; id=20211031T010101;"
一般 ID はタイムスタンプです。
DNSSEC、DNAME、CAA
MTA-STS を有効にすると、DANE は TLS 証明書が有効であることを確認でき、実際に DNS を介して CA の役割を果たします。DANE は、証明書が TLSA レコードを通じて信頼できることを宣言します. DANE は DNS プロトコルに基づいているため、ハイジャックされる可能性があります. したがって、DNSSEC を有効にして、送信中に変更されないようにする必要があります.
- DNSSEC を有効にするには、ドメイン名レジストラーと dns サービス プロバイダーの両方のサポートが必要です.DNS サービス プロバイダーで DNSSEC を有効にすることを選択し、提供された DS レコードをドメイン名レジストラーに入力します.
- TLSA 証明書生成ツールと PEM 形式の TLS 証明書を使用してTLSA レコードを生成します
- CAAレコード ヘルパーを使用して生成されたCAA レコード
TLS 証明書を保護するには:
- DNSSEC は転送中の DNS レコードを保護します
- DANE は、クライアント側で不適切に署名された証明書をブロックします
- CAA は、ドメイン名の証明書を発行できる認証局を指定します。
このステップでは、セキュリティを強化するために、構成を有効にすることを推奨できます。
参考
参考記事:
その他の参照リンクと便利なツール: