mailserver.html (26974B)
1 <h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1> 2 <time>2024-01-19</time> 3 4 <h2>はじめに</h2> 5 <p> 6 少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。\ 7 当時はドキュメントを追うのに必死で構築手順を整理できていなかった。\ 8 しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。\ 9 そこであらためてサーバーを構築し、その手順を確認することにした。\ 10 あいかわらずDNSの知識は自信がない。\ 11 セキュリティは自己責任で。\ 12 </p> 13 14 <h2>使うもの</h2> 15 <ul> 16 <li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li> 17 <li>OS: OpenBSD 7.4</li> 18 <li>ドメイン: ムームードメイン (mtkn.jpとする)</li> 19 <li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li> 20 <li>IMAPサーバー(MDA): Dovecot 2.3.20</li> 21 </ul> 22 23 <h2>メールの仕組み</h2> 24 <p> 25 メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのが\ 26 SMTPサーバーと呼ばれるソフトウェアである。\ 27 このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも\ 28 呼ばれる。\ 29 今回はMTAとしてOpenSMTPDというのを使う。\ 30 手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、\ 31 そこから受信側のMTAに転送される。\ 32 受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所\ 33 に保存する。\ 34 </p> 35 <p> 36 受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、\ 37 自分宛てのメールを確認する。\ 38 この時に使われるのがIMAPというプロトコルである\ 39 (POPというのもあるが今回は割愛)。\ 40 IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する\ 41 役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。\ 42 今回MDAとしてDovecotを使用する。\ 43 </p> 44 <p> 45 以上をまとめると以下のようになる: 46 </p> 47 <pre> 48 +------------+ +----------------+ 49 |MTA(mtkn.jp)|--SMTP->| MTA | 50 +------------+ +--example.com---+ 51 ^ | MDA | 52 | +----------------+ 53 | | 54 SMTP IMAP 55 | | 56 | v 57 +------------+ +----------------+ 58 |user@mtkn.jp| |user@example.com| 59 +------------+ +----------------+ 60 61 </pre> 62 <ol> 63 <li>メールを書く。</li> 64 <li>送信側のMTAに送る。</li> 65 <li>受信側のMTAに転送する。</li> 66 <li>受信者が受信側のMDAに新着メールの有無を確認する。</li> 67 </ol> 68 69 <p> 70 SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、\ 71 いくつかの方法で送信元の本人確認を行う。\ 72 その際第三者としてDNS及び、サーバーのIPアドレスを管理している人\ 73 (今回の場合はさくらインターネット)が登場する。\ 74 DNSにはドメインをIPアドレスにひもづける情報が登録できる。\ 75 またIPアドレスの管理人には、自分が借りているIPアドレスを\ 76 自分のドメインにひもづける情報を登録してもらう。\ 77 これらによって、メールの送信者がドメイン、IPアドレス双方から\ 78 確認できるので、なりすましを防止できる仕組みである。\ 79 </p> 80 81 <p> 82 最近はgmail等の大手がスパム対策を強化する一環として、\ 83 以下に述べるような本人確認をすべて通らなければ受信しない\ 84 ようにしているらしい。\ 85 </p> 86 87 <h2>MTAどうしのやりとり</h2> 88 <p> 89 以下、MTAどうしの通信内容をざっくり説明する。 90 </p> 91 92 <h3>Aレコード、MXレコードによる送信先の特定</h3> 93 <p> 94 MTAがメールを送信する際、まずは宛先のサーバーを\ 95 特定する必要がある。\ 96 この際に使用するのがDNSに登録されているMXレコードである。\ 97 送信元のMTAはまずDNSに宛先のドメインのMXレコード\ 98 を問い合わせる。\ 99 するとメールの送信先のドメイン名が分かるので、続いて\ 100 この送信先のIPアドレスを問い合わせる:\ 101 </p> 102 <pre> 103 MTA (mtkn.jp <i>sss.sss.sss.sss</i>) DNS 104 105 example.com宛のメールって 106 誰に送ったらええん? 107 ----------------------------------------> 108 109 mai.example.comやで(MXレコード) 110 <---------------------------------------- 111 112 mail.example.comってどこや? 113 ----------------------------------------> 114 115 <i>ddd.ddd.ddd.ddd</i>やで(Aレコード) 116 <---------------------------------------- 117 </pre> 118 <p> 119 次にこの宛先のMTAとの通信を開始する。\ 120 しかし受信側のMTA(example.com)は、\ 121 mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:\ 122 </p> 123 <pre> 124 MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) 125 こんちは。mtkn.jpです。 126 ----------------------------------------> 127 128 なりすましちゃうか確認したろ 129 </pre> 130 131 <h3>SPFレコードによる送信元の本人確認</h3> 132 <p> 133 受信側のMTAは、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。\ 134 このときに使うのがSPFレコードである。\ 135 このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいい\ 136 IPアドレスを指定する。\ 137 受信側のMTAは送信元のIPアドレスと、このレコードに\ 138 記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者\ 139 に認められているMTAかどうか判断できる。\ 140 </p> 141 <pre> 142 DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) 143 mtkn.jpを名乗るやつから連絡 144 来てるんやけどこいつ本物? 145 <---------------------------------------- 146 147 IPアドレスが<i>sss.sss.sss.sss</i> 148 やったら多分本物やわ。(SPFレコード) 149 ----------------------------------------> 150 151 よっしゃ 152 </pre> 153 154 <h3>PTRレコード</h3> 155 <p> 156 次は逆にIPアドレスからドメインを辿って本人確認する。\ 157 これに使われるのがPTRレコードである。\ 158 このレコードはIPアドレスの管理人(ここではさくらインターネット)\ 159 でないと登録できない。\ 160 しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを\ 161 提供しており、PTRレコードをきちんと設定した上でスパムメールを\ 162 送ると、自分の身元がバレるので、スパムの抑止に繋がる。\ 163 </p> 164 <pre> 165 DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) 166 <i>sss.sss.sss.sss</i>ってIPアドレスで 167 mtkn.jpってドメイン登録されてる? 168 <---------------------------------------- 169 170 されてるで。(PTRレコード) 171 ----------------------------------------> 172 173 よっしゃ 174 </pre> 175 176 <h3>DKIM</h3> 177 <p> 178 送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。\ 179 署名は公開鍵方式で行うが、この鍵をドメインキーというようである。\ 180 この署名が付いたメールをDKIM(DomainKey Identified Mail)という。\ 181 送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、\ 182 メール送信時に秘密鍵で署名する:\ 183 </p> 184 <pre> 185 MTA (mtkn.jp <i>sss.sss.sss.sss</i>) MTA (example.com <i>ddd.ddd.ddd.ddd</i>) 186 187 本人確認できたわ 188 おまたせ。 189 <---------------------------------------- 190 191 userさんにメール送るで。 192 署名も付けるで。 193 ----------------------------------------> 194 </pre> 195 <p> 196 受信側はDNSから送信側のドメイン鍵の公開鍵をダウンロードし、署名を確認する:\ 197 </p> 198 <pre> 199 DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) 200 mtkn.jpが署名付きでメール 201 くれたんやけどこの署名本物? 202 <---------------------------------------- 203 204 これで確認してみて(DKIM公開鍵) 205 ----------------------------------------> 206 207 よっしゃ 208 </pre> 209 210 <h3>DMARCレコード(上記の本人確認で詐欺だと発覚した場合)</h3> 211 <p> 212 この他DNSにはDMARCレコードというものを登録することができる。\ 213 これは、以上の本人確認により送信側がにせものであることが確認できた際、\ 214 受信側にどのような行動を取ってほしいかを記述するものである。\ 215 これにより例えば、自分を名乗る詐欺師がどこかにメールを送信した場合、\ 216 受信したサーバーから自分宛てに通報するように頼める\ 217 (この頼みが聞き入れられるかどうかは多分受信側MTAによる)。 218 </p> 219 <pre> 220 DNS MTA (example.com <i>ddd.ddd.ddd.ddd</i>) 221 mtkn.jpを名乗る詐欺師から 222 メールきたんやけどどないしょ? 223 <---------------------------------------- 224 225 ここ(postmaster@mtkn.jp)に通報や。 226 (DMARCレコード) 227 ----------------------------------------> 228 229 よっしゃ 230 </pre> 231 232 <h2>サーバーの設定</h2> 233 <h3>VPSの契約、ドメインの取得</h3> 234 <p> 235 VPSとドメインを契約する。\ 236 今回はVPSをさくらインターネットで、\ 237 ドメインをムームードメインでそれぞれ契約した。\ 238 さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい\ 239 (他のVPSを知らないので比較はできないが)。\ 240 ムームードメインは安い。管理画面も悪くはない。\ 241 以前お名前.comでも借りたことがあるが、こちらは広告のメールが\ 242 やたら届いてうっとうしかった記憶がある。\ 243 </p> 244 245 <h3>OpenBSDのインストール</h3> 246 <p> 247 さくらのVPSにOpenBSDをインストールする。\ 248 さくらインターネットが用意したISOがあるので、\ 249 OS再インストールの画面からそれを選べばすぐにインストールきる。\ 250 でもなんとなく気持悪いのでopenbsd.orgから本家をダウンロードした。\ 251 </p> 252 <p> 253 インストールのこまかい手順は割愛するが、\ 254 ひとつだけひっかかった点があるので書いておく。\ 255 インストール先のディスクをセットアップし、OSに必要なファイルを\ 256 インストールメディアからディスクにコピーすると以下のエラーがでて\ 257 カーネルパニックになった: 258 </p> 259 <pre><code>\ 260 wdc_atapi_start: not ready, st = 50 261 fatal protection fault in supervisor mode 262 trap type 4 code 0 rip ffffffff810081a9 cs 8 rflags 10282 cr 2 23a896000 cpl 6 rsp ffff80000e9df410 263 gsbase 0xffffffff81908ff0 kgsbase 0x0 264 panic: trap type 4, code=0, pc=ffffffff810081a9 265 syncing disks...18 18 18 18 18 18 18 18 266 </code></pre> 267 <p> 268 原因はあまり調べていないが、どうもインストールメディアの読み込みに失敗している\ 269 ようで、インストールに必要なファイルをウェブ上からダウンロードする方法\ 270 を選択すると問題なくインストールできた。 271 </p> 272 273 <h3>ファイアーフォールの設定</h3> 274 <p> 275 メールの送受信等に必要なポートを開ける:\ 276 </p> 277 <ul> 278 <li>TCP 22: ssh接続用</li> 279 <li>UDP 53: DNSとの通信用</li> 280 <li>TCP 25: SMTPの通信用</li> 281 <li>TCP 587: メールクライアントからMTAへの通信用(メール送信時)</li> 282 <li>TCP 993: メールクライアントからMDAへの通信用(メール受信時)</li> 283 <li>TCP 80, 443: <code>acme-client(1)</code>によるサーバー証明書の取得用</li> 284 </ul> 285 <p> 286 以上の設定を<code>/etc/pf.conf</code>に設定する: 287 </p> 288 <pre><code>\ 289 set skip on lo 290 291 block return # block stateless traffic 292 pass in log proto tcp from any to any port 22 #ssh 293 294 pass out proto udp from any to <i>DNSのIPアドレス</i> port 53 #DNS 295 pass out proto udp from any to any port 123 #ntp 296 297 pass proto icmp #ping 298 pass proto tcp from any to any port { 80, 443 } #www 299 pass proto tcp from any to any port { 25, 587, 993 } #mail 300 </code></pre> 301 <p> 302 <code>pf(4)</code>の設定を反映: 303 </p> 304 <pre><code>\ 305 # pfctl -f /etc/pf.conf 306 </code></pre> 307 308 <h3>DNSの設定</h3> 309 <h4>A, MX, SPF, DMARC</h4> 310 <p> 311 DNSのレコードを設定する。\ 312 ムームーDNSの場合、コントロールパネルにログインし、サイドバーから\ 313 ドメイン管理>ドメイン操作>ムームーDNSと進み、設定するドメインの変更ボタン\ 314 をクリックすると設定画面がでるので、以下のように設定する:\ 315 </p> 316 <table> 317 <thead> 318 <tr> 319 <th>サブドメイン</th> 320 <th>種別</th> 321 <th>内容</th> 322 <th>優先度</th> 323 </tr> 324 </thead> 325 <tbody> 326 <tr> 327 <td></td> 328 <td>A</td> 329 <td><i>sss.sss.sss.sss</i></td> 330 <td></td> 331 </tr> 332 <tr> 333 <td>mail</td> 334 <td>A</td> 335 <td><i>sss.sss.sss.sss</i></td> 336 <td></td> 337 </tr> 338 <tr> 339 <td></td> 340 <td>MX</td> 341 <td>mail.mtkn.jp</td> 342 <td>10</td> 343 </tr> 344 <tr> 345 <td></td> 346 <td>TXT</td> 347 <td>v=spf1 mx -all</td> 348 <td></td> 349 </tr> 350 <tr> 351 <td>_dmarc</td> 352 <td>TXT</td> 353 <td>v=DMARC1;p=reject;rua=mailto:postmaster@mtkn.jp</td> 354 <td></td> 355 </tr> 356 </tbody> 357 </table> 358 359 <p> 360 ひとつめのAレコードは、ドメイン名(mtkn.jp)にIPアドレス(<i>sss.sss.sss.sss</i>)を\ 361 紐付けるものである。\ 362 ふたつめはmail.mtkn.jpのIPアドレスを登録するものである。\ 363 みっつめのMXレコードは、このドメイン宛てのメール(user@mtkn.jp等)をどこの\ 364 サーバーに送信するかを決めるものである。上記の設定では、mail.mtkn.jpに送信\ 365 するようにしている。\ 366 以上の設定で、user@mtkn.jp宛てのメールは、mail.mtkn.jpというサーバーに\ 367 送信すればよいことが分かり、さらにこのサーバーのIPアドレスは<i>sss.sss.sss.sss</i>\ 368 であることも分かる。 369 </p> 370 <p> 371 次のTXTレコードはSPFレコードである。\ 372 v=spf1でSPFのバージョンを示し、mxでドメインのMXレコードに登録された\ 373 IPアドレスからの送信を許可し、-allでそれ以外のIPアドレスからの送信\ 374 を禁止している。 375 </p> 376 <p> 377 最後のものはDMARCレコードである。\ 378 v=DMARC1でバージョンを示し、p=rejectで、本人確認をクリアしなかったメール\ 379 について、その受信者が受信を拒否するように指定している。\ 380 rua=mailto:postmaster@mtkn.jpでは、本人確認をクリアしなかったメール\ 381 を受信した場合の通報先を指定している。\ 382 </p> 383 384 <h4>PTR</h4> 385 <p>\ 386 PTRレコードを設定する。\ 387 さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>\ 388 ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名\ 389 (mtkn.jp)を入力する。 390 </p> 391 392 <h3>OpenSMTPDの設定</h3> 393 <h4>ユーザーの作成</h4> 394 <p> 395 メールの送受信を担当するユーザーを作成する:\ 396 </p> 397 <pre><code>\ 398 # useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail 399 </code></pre> 400 401 <h4>サーバー証明書の取得</h4> 402 <p> 403 <code>httpd(8)</code>の設定ファイルを作成する。\ 404 <code>/etc/examples</code>からサンプルの設定ファイルをコピーして編集する。\ 405 変更箇所はドメイン名だけでいい。\ 406 編集後、httpdを起動する。\ 407 </p> 408 <pre><code>\ 409 # cp /etc/examples/httpd.conf /etc/ 410 # vi /etc/httpd.conf 411 # echo httpd_flags= >> /etc/rc.conf.local 412 # rcctl start httpd 413 # rcctl enable httpd 414 </code></pre> 415 416 <p> 417 続いて<code>acme-client(1)</code>を使ってLet's Encryptでサーバー証明書を発行する。\ 418 まずはこちらもサンプルの設定ファイルをコピーしてドメイン名を変更する。\ 419 その後、<code>acme-client(1)</code>を実行し、さらに<code>cron(8)</code>に\ 420 登録することで、証明書が自動で更新されるようにする。\ 421 </p> 422 <pre><code>\ 423 # cp /etc/examples/acme-client.conf /etc/ 424 # vi /etc/acme-client.conf 425 # acme-client -v mail.mtkn.jp 426 # crontab -e 427 </code></pre> 428 429 <pre><code>\ 430 #minute hour mday month wday [flags] command 431 ~ 2 * * * acme-client mail.mtkn.jp && rcctl restart smtpd 432 </code></pre> 433 434 <h4>ドメインキーの作成とDNSへの登録</h4> 435 <p> 436 OpenSMTPD用のDKIMフィルターをインストールする。 437 </p> 438 <pre><code>\ 439 # pkg_add opensmtpd-filter-dkimsign 440 </code></pre> 441 442 <p> 443 ドメインキーとしてRSAの秘密鍵と公開鍵を作成する。\ 444 DNSのTXTレコードの制約により、鍵の長さは1024ビットにする。 445 </p> 446 <pre><code>\ 447 # openssl genrsa -out /etc/mail/dkim/private.key 1024 448 # openssl rsa -in /etc/mail/dkim/private.key -pubout -out /etc/mail/dkim/public.key 449 # chown -r _dkimsign:_dkimsign /etc/mail/dkim 450 # chmod 0400 /etc/mail/dkim/private.key 451 </code></pre> 452 453 <p>\ 454 作成したドメインキーの公開鍵をDNSに登録する:\ 455 </p> 456 <table> 457 <thead> 458 <tr> 459 <th>サブドメイン</th> 460 <th>種別</th> 461 <th>内容</th> 462 <th>優先度</th> 463 </tr> 464 </thead> 465 <tbody> 466 <tr> 467 <td>selector1._domainkey.mail</td> 468 <td>TXT</td> 469 <td>v=DKIM1;k=rsa;p=<i>公開鍵</i></td> 470 <td></td> 471 </tr> 472 </tbody> 473 </table> 474 475 <p> 476 サブドメインのselector1は\ 477 以下のsmtpd.confで<code>filter-dkimsign</code>の-sオプションに 478 指定してものと同じものであれば他のものでもいい。\ 479 </p> 480 481 <h4>smtpd.confの設定</h4> 482 <p> 483 /etc/mail/smtpd.confを以下の通り変更:\ 484 </p> 485 <pre><code>\ 486 # 認証に使用するサーバー証明書と秘密鍵を"mtkn.jp"という名前で登録。 487 # 証明書のファイルは先程acme-client(1)で取得したもの。 488 pki mtkn.jp cert "/etc/ssl/mail.mtkn.jp.fullchain.pem" 489 pki mtkn.jp key "/etc/ssl/private/mail.mtkn.jp.key" 490 491 # テーブルの登録 492 # ローカルに届いたメールの転送を設定するテーブル 493 table aliases file:/etc/mail/aliases 494 # ユーザーの名前と暗号化されたパスワードのテーブル 495 table passwd file:/etc/mail/passwd 496 # メールの転送を設定するテーブル 497 table virtuals file:/etc/mail/virtuals 498 499 # フィルターの登録 500 # ドメインキーによる署名を付加するフィルター 501 filter dkim_sign proc-exec\\ 502 "filter-dkimsign -d mail.mtkn.jp -s selector1\\ 503 -k /etc/mail/dkim/private.key" user _dkimsign group _dkimsign 504 # DNSの逆引き(PTRレコード)ができなかった場合に受信を拒否するフィルター 505 filter check_rdns phase connect match !rdns disconnect "550 no rDNS." 506 # 正引き(Aレコード)と逆引き(PTRレコード)でDNSのレコードが一致しなかった 507 # 場合に受信を拒否するフィルター 508 filter check_fcrdns phase connect match !fcrdns disconnect "550 no FCrDNS." 509 510 # 各ネットワークインターフェース毎の処理を設定。 511 listen on socket 512 listen on lo0 513 # vio0というインターフェースの25番ポートに届いたものに関する設定。 514 # 外部からmtkn.jp宛に届いたものの処理である。 515 # 最初に登録した証明書と秘密鍵を使ってMTAの本人確認をし、 516 # 上で設定したDNSに関するフィルターを適応。 517 listen on vio0 port 25 tls pki mtkn.jp hostname "mail.mtkn.jp"\\ 518 filter { check_rdns, check_fcrdns } 519 # vio0というインターフェースのsubmission(587番)ポートに関する設定。 520 # mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される 521 # メールに関する設定。 522 # 上と同様に"mtkn.jp”という名前で登録されたpkiを使ってMTAの本人確認をし、 523 # "passwd"という名前で登録したパスワードで認証し、 524 # さらにドメインキーでメールに署名する。 525 listen on vio0 mask-src port submission smtps pki mtkn.jp\\ 526 hostname "mail.mtkn.jp" auth <passwd> filter dkim_sign 527 528 # 各種メールの処理を定義する。 529 # 各処理が実行される条件はこの後定義する。 530 # ローカルメールはデフォルトのまま 531 action "local_mail" mbox alias <aliases> 532 # 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。 533 action "domain" maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}"\\ 534 virtual <virtuals> 535 # 他のドメイン宛ては宛先へ転送。 536 action "outbound" relay 537 538 # どういう条件でどういう処理をするかを定義する。 539 # 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。 540 # ここでは/var/vmail/以下に振り分けて保存する。 541 match from any for domain mtkn.jp action "domain" 542 # このサーバー内でのメールはlocal_mailとして処理。 543 match from local for local action "local_mail" 544 # このサーバー内から他所へのメールは宛先に転送 545 match from local for any action "outbound" 546 # 外部から来た他所宛てのメールは認証されているものに限り転送。 547 # authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。 548 match auth from any for any action "outbound" 549 </code></pre> 550 551 <h4>各テーブルの作成</h4> 552 <p> 553 上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。\ 554 <code>/etc/mail/aliases</code>は特に変更しなくてもいい。\ 555 <code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを\ 556 保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:\ 557 </p> 558 <pre><code>\ 559 # echo user@mtkn.jp:$(smtpctl encrypt) >> /etc/mail/passwd 560 <i>パスワードを入力し、エンター、Ctrl-D</i> 561 </code></pre> 562 563 <p> 564 <code>/etc/mail/virtuals</code>にはメールの転送を設定できる。\ 565 以下のようにする:\ 566 </p> 567 <pre><code>\ 568 abuse@mtkn.jp user@mtkn.jp 569 postmaster@mtkn.jp user@mtkn.jp 570 webmaster@mtkn.jp user@mtkn.jp 571 user@mtkn.jp vmail 572 </code></pre> 573 <p> 574 この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。\ 575 abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど\ 576 必要なんかな? 577 </p> 578 579 <h3>Dovecotの設定</h3> 580 <p> 581 MDAとして<code>dovecot(1)</code>をインストールする。\ 582 </p> 583 <pre><code>\ 584 # pkg_add dovecot 585 </code></pre> 586 <p> 587 dhparamを作成する(時間がかかる): 588 </p> 589 <pre><code>\ 590 # openssl dhparam -out /etc/ssl/dh.pem 4096 591 </code></pre> 592 593 <p> 594 わかりにくい設定ファイルをどけてシンプルなものに書き直す: 595 </p> 596 <pre><code>\ 597 # mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig 598 # vi /etc/dovecot/dovecot.conf 599 </code></pre> 600 <p> 601 ドキュメントは公式ウェブサイトで確認できる。\ 602 分量が多すぎて読む気にならない。\ 603 サンプルの設定ファイルにも各項目の説明と既定値が書いてあるがこれも分かりにくい。\ 604 パスワードが漏洩するのはとりあえず避けたいので、<code>ssl = required</code>\ 605 と暗号化されていないIMAPを<code>port = 0</code>として無効にする。\ 606 他はとりあえず以下の設定で動く:\ 607 </p> 608 <pre><code>\ 609 # IPv4は全て監視 610 listen = * 611 612 # SSL接続のみ許可 613 ssl = required 614 615 # SSLに使用するファイル 616 ssl_cert = </etc/ssl/mail.mtkn.jp.fullchain.pem 617 ssl_key = </etc/ssl/private/mail.mtkn.jp.key 618 ssl_dh = </etc/ssl/dh.pem 619 620 # メールの保存場所は各ユーザーのホームディレクトリ。 621 # ホームディレクトリの場所は以下のuserdbで設定。 622 mail_location = maildir:~ 623 624 # パスワードのファイル。 625 # OpenSMTPDと共有。 626 passdb { 627 args = scheme=BLF-CRYPT /etc/mail/passwd 628 driver = passwd-file 629 } 630 631 # ユーザーの設定。 632 # ホームディレクトリは/var/vmail/<i>ドメイン</i>/<i>ユーザー名</i> 633 userdb { 634 args = uid=vmail gid=vmail home=/var/vmail/%d/%n 635 driver = static 636 } 637 638 # 使用するプロトコル。 639 protocols = imap lmtp 640 641 # SSLを使ったIMAPSのみを許可。 642 service imap-login { 643 inet_listener imaps { 644 port = 993 645 ssl = yes 646 } 647 # Disable imap 648 inet_listener imap { 649 port = 0 650 } 651 } 652 </code></pre> 653 <pre><code>\ 654 # rcctl start dovecot 655 # rcctl enable dovecot 656 </code></pre> 657 658 <p> 659 サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように\ 660 <code>cron(8)</code>に追加しておく: 661 </p> 662 <pre><code>\ 663 crontab -e 664 </code></pre> 665 666 <pre><code>\ 667 #minute hour mday month wday [flags] command 668 ~ 2 * * * acme-client mail.mtkn.jp && rcctl restart smtpd && rcctl reload dovecot 669 </code></pre> 670 671 <h3>テスト</h3> 672 <p> 673 手元のメールクライアントから送受信のテストをする。\ 674 特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。\ 675 以上の設定で、gmailへの送受信は問題なかった。\ 676 また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン\ 677 及び送受信できることも確認した。\ 678 </p> 679 680 <h2>参考文献</h2> 681 <ul> 682 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-1-what-is-email.html">Arch Linux mail server tutorial - part 1 - What is email?.unixsheikh.com</a></li> 683 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-2-opensmtpd-dovecot-dkimproxy-and-lets-encrypt.html">Arch Linux mail server tutorial - part 2 - OpenSMTPD, Dovecot, DKIMproxy, and Let's Encrypt.unixsheikh.com</a></li> 684 <li><a href="https://unixsheikh.com/tutorials/arch-linux-mail-server-tutorial-part-3-get-dns-right-it-is-important.html">Arch Linux mail server tutorial - part 3 - Get DNS right, it's important!.unixsheikh.com</a></li> 685 <li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li> 686 <li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li> 687 <li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li> 688 <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li> 689 <li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li> 690 <li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li> 691 <li><a href="https://doc.dovecot.org/">Dovecot manual — Dovecot documentation</a></li> 692 </ul>