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.keyfullchain.pemprivkey.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 を有効にして、送信中に変更されないようにする必要があります.

  1. DNSSEC を有効にするには、ドメイン名レジストラーと dns サービス プロバイダーの両方のサポートが必要です.DNS サービス プロバイダーで DNSSEC を有効にすることを選択し、提供された DS レコードをドメイン名レジストラーに入力します.
  2. TLSA 証明書生成ツールと PEM 形式の TLS 証明書を使用してTLSA レコードを生成します
  3. CAAレコード ヘルパーを使用して生成されたCAA レコード

TLS 証明書を保護するには:

  1. DNSSEC は転送中の DNS レコードを保護します
  2. DANE は、クライアント側で不適切に署名された証明書をブロックします
  3. CAA は、ドメイン名の証明書を発行できる認証局を指定します。

このステップでは、セキュリティを強化するために、構成を有効にすることを推奨できます。

参考

参考記事:

その他の参照リンクと便利なツール:

  1. https://mxtoolbox.com/
  2. https://www.mail-tester.com/
  3. https://aykevl.nl/apps/mta-sts/
  4. https://support.google.com/a/answer/10683907
  5. https://support.google.com/a/answer/2466563?hl=zh-ハンス
  6. https://service.mail.qq.com/cgi-bin/help?id=16

おすすめ

転載: blog.csdn.net/weixin_43734095/article/details/129725352