www.mtkn.jp

Manuscripts for my personal webpage.
git clone https://git.mtkn.jp/www.mtkn.jp
Log | Files | Refs | README

mailserver.html (26590B)


      1 <h1>メールサーバー構築 on OpenBSD with OpenSMTPD and Dovecot</h1>
      2 <time>2024-01-13</time>
      3 
      4 <h2>はじめに</h2>
      5 <p>
      6 少し前にさくらのVPSで独自ドメインのメールサーバーを構築した。\
      7 当時はドキュメントを追うのに必死で構築手順を整理できていなかった。\
      8 しかしスマホを使わない僕の数少い連絡手段なので、受信できなくなると困る。\
      9 そこであらためてサーバーを構築し、その手順を確認することにした。\
     10 </p>
     11 
     12 <h2>使うもの</h2>
     13 <ul>
     14 <li>VPS: さくらのVPS (IPアドレスを<i>sss.sss.sss.sss</i>とする)</li>
     15 <li>OS: OpenBSD 7.4</li>
     16 <li>ドメイン: ムームードメイン (mtkn.jpとする)</li>
     17 <li>SMTPサーバー(MTA): OpenSMTPD 7.4.0</li>
     18 <li>IMAPサーバー(MDA): Dovecot 2.3.20</li>
     19 </ul>
     20 
     21 <h2>メールの仕組み</h2>
     22 <p>
     23 メールの送受信にはSMTPというプロトコルが使われ、この通信を担うのが\
     24 SMTPサーバーと呼ばれるソフトウェアである。\
     25 このサーバーはメールの転送を担うので、MTA(Mail Transfer Agent)とも\
     26 呼ばれる。
     27 今回はMTAとしてOpenSMTPDというのを使う。
     28 手元のパソコン等で書いたメールは、SMTPの通信で送信側のMTAに送られ、\
     29 そこから受信側のMTAに転送される。\
     30 受信側のMTAでは届いたメールをユーザーごとにふりわけ、所定の場所\
     31 に保存する。\
     32 </p>
     33 <p>
     34 受信側のユーザーは、手元のパソコン等から受信側のサーバーに繋ぎ、\
     35 自分宛てのメールを確認する。\
     36 この時に使われるのがIMAPというプロトコルである\
     37 (POPというのもあるが今回は割愛)。\
     38 IMAPによるこの通信を担うのがIMAPサーバーで、メールを配達する\
     39 役割を担うことから、MDA(Mail Delivery Agent)とも呼ばれる。\
     40 今回MDAとしてDovecotを使用する。\
     41 </p>
     42 <p>
     43 以上をまとめると以下のようになる:
     44 </p>
     45 <pre>
     46 +------------+        +----------------+
     47 |MTA(mtkn.jp)|--SMTP->|      MTA       |
     48 +------------+        +--example.com---+
     49      /|\              |      MDA       |
     50       |               +----------------+
     51       |                       |
     52      SMTP                    IMAP
     53       |                       |
     54       |                      \|/
     55 +------------+        +----------------+
     56 |user@mtkn.jp|        |user@example.com|
     57 +------------+        +----------------+
     58 
     59 </pre>
     60 <ol>
     61 <li>メールを書く。</li>
     62 <li>送信側のMTAに送る。</li>
     63 <li>受信側のMTAに転送する。</li>
     64 <li>受信者が受信側のMDAに新着メールの有無を確認する。</li>
     65 </ol>
     66 
     67 <p>
     68 SMTPサーバーどうしが通信する際、スパムメールをフィルタリングする為、\
     69 いくつかの方法で送信元の本人確認を行う。\
     70 その際第三者としてDNS及び、サーバーのIPアドレスを管理している人\
     71 (今回の場合はさくらインターネット)が登場する。\
     72 DNSにはドメインをIPアドレスにひもづける情報が登録できる。\
     73 またIPアドレスの管理人には、自分が借りているIPアドレスを、\
     74 自分のドメインにひもづける情報を登録してもらう。\
     75 これらによって、メールの送信者がドメイン、IPアドレス双方から\
     76 確認できるので、オレオレ詐欺を防止できる仕組みである。\
     77 </p>
     78 
     79 <p>
     80 最近はgmail等の大手がスパム対策を強化する一環として、\
     81 以下に述べるような本人確認をすべて通らなければ受信しない\
     82 ようにしているらしい。\
     83 </p>
     84 
     85 <h3>Aレコード、MXレコードによる送信先の特定</h3>
     86 <p>
     87 SMTPサーバーがメールを送信する際、まずは宛先のサーバーを\
     88 特定する必要がある。\
     89 この際に使用するのがDNSに登録されているMXレコードである。\
     90 送信元のSMTPサーバーはまずDNSに宛先のドメインのMXレコード\
     91 を問い合わせる。\
     92 するとメールの送信先のドメイン名が分かるので、続いて\
     93 この送信先のIPアドレスを問い合わせる:\
     94 </p>
     95 <pre>
     96 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 DNS
     97 
     98     example.com宛のメールって
     99     誰に送ったらええん?
    100     ---------------------------------------->
    101 
    102               mai.example.comやで(MXレコード)
    103     <----------------------------------------
    104 
    105     mail.example.comってどこや?
    106     ---------------------------------------->
    107 
    108                <i>ddd.ddd.ddd.ddd</i>やで(Aレコード)
    109     <----------------------------------------
    110 </pre>
    111 <p>
    112 次にこの宛先のMTAとの通信を開始する。\
    113 しかし受信側のMTA(example.com)は、\
    114 mtkn.jpを名乗るサーバーが本当にmtkn.jpかどうか確認する必要がある:\
    115 </p>
    116 <pre>
    117 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    118     こんちは。mtkn.jpです。
    119     ---------------------------------------->
    120 
    121                    オレオレ詐欺ちゃうか確認
    122                    するからちょっとまってな。
    123     <----------------------------------------
    124 </pre>
    125 
    126 <h3>SPFレコードによる送信元の本人確認</h3>
    127 <p>
    128 受信側のMTAはまず、自分に連絡してきたサーバーが本人かどうかをDNSに問い合わせる。\
    129 このときに使うのがSPFレコードである。\
    130 このレコードにはドメインの所有者が、自分のドメインからメールを送信してもいい\
    131 IPアドレスを指定する。\
    132 受信側のMTAは送信元のIPアドレスと、このレコードに\
    133 記載されているIPアドレスを比べることで、送信側のMTAがドメインの所有者\
    134 に認められているMTAかどうか判断できる。\
    135 </p>
    136 <pre>
    137 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    138                  mtkn.jpを名乗るやつから連絡
    139                  来てるんやけどこいつ本物?
    140     <----------------------------------------
    141 
    142     IPアドレスが<i>sss.sss.sss.sss</i>
    143     やったら多分本物やわ。(SPFレコード)
    144     ---------------------------------------->
    145 
    146                                      よっしゃ
    147 </pre>
    148 
    149 <h3>PTRレコード</h3>
    150 <p>
    151 次は逆にIPアドレスからドメインを辿って本人確認する。\
    152 これに使われるのがPTRレコードである。\
    153 このレコードはIPアドレスの管理人(ここではさくらインターネット)\
    154 でないと登録できない。\
    155 しかし、IPアドレスを借りるにあたって、自分の名前やら住所やらを\
    156 提供しており、PTRレコードをきちんと設定した上でスパムメールを\
    157 送ると、自分の身元がバレバレになるので、スパムの抑止に繋がる。\
    158 </p>
    159 <pre>
    160 DNS                                          MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    161 	    <i>sss.sss.sss.sss</i>ってIPアドレスで
    162             mtkn.jpってドメイン登録されてる?
    163     <----------------------------------------
    164 
    165     されてるで。(PTRレコード)
    166     ---------------------------------------->
    167 
    168                                      よっしゃ
    169 </pre>
    170 
    171 <h3>DKIM</h3>
    172 <p>
    173 送信側MTAが本人であることを証明するため、受信側に送るメールに署名する。\
    174 署名は公開鍵方式で行うが、この鍵をドメインキーというようである。\
    175 この署名が付いたメールをDKIM(DomainKey Identified Mail)という。\
    176 送信側はあらかじめDNSにドメインキーの公開鍵を登録しておき、\
    177 メール送信時に秘密鍵で署名する:\
    178 </p>
    179 <pre>
    180 MTA (mtkn.jp <i>sss.sss.sss.sss</i>)                 MTA (example.com <i>ddd.ddd.ddd.ddd</i>)
    181 
    182                         本人確認できたわ
    183                         おまたせ。
    184     <----------------------------------------
    185 
    186     userさんにメール送るで。
    187     ---------------------------------------->
    188 
    189                                        送れ。
    190     <----------------------------------------
    191 
    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>VPSの契約、ドメインの取得</h2>
    233 <p>
    234 VPSとドメインを契約する。\
    235 今回はVPSをさくらインターネットで、\
    236 ドメインをムームードメインでそれぞれ契約した。\
    237 さくらのVPSは好きなISOからOSをインストールでき、管理画面も分かりやすい\
    238 (他のVPSを知らないので比較はできないが)。\
    239 ムームードメインは安い。管理画面も悪くはない。\
    240 以前お名前.comでも借りたことがあるが、こちらは広告のメールが\
    241 やたら届いてうっとうしかった記憶がある。\
    242 </p>
    243 
    244 <h2>OpenBSDのインストール</h2>
    245 <p>
    246 さくらのVPSにOpenBSDをインストールする。\
    247 さくらインターネットが用意したISOがあるので、\
    248 OS再インストールの画面からそれを選べばすぐにインストールが\
    249 開始できる。\
    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 <h2>ファイアーフォールの設定</h2>
    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
    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 <h2>DNSの設定</h2>
    309 <h3>A, MX, SPF, DMARC</h3>
    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 <h3>PTR</h3>
    385 <p>\
    386 PTRレコードを設定する。\
    387 さくらのVPSの場合、VPS管理画面にログインし、ネットワーク>\
    388 ホスト名逆引き登録と進み、カスタムホスト名に自分のドメイン名\
    389 (mtkn.jp)を入力する。
    390 </p>
    391 
    392 <h2>OpenSMTPDの設定</h2>
    393 <h3>ユーザーの作成</h3>
    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 <h3>サーバー証明書の取得</h3>
    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 <h3>ドメインキーの作成とDNSへの登録</h3>
    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 </tr>
    473 </tbody>
    474 </table>
    475 
    476 <p>
    477 サブドメインのselector1は\
    478 以下のsmtpd.confの<code>filter-dkimsign</code>の-sオプションと\
    479 同じものであれば他のものでもいい。\
    480 </p>
    481 
    482 <h3>/etc/mail/smtpd.confの設定</h3>
    483 <p>
    484 /etc/mail/smtpd.confを以下の通り変更:\
    485 </p>
    486 <pre><code>\
    487 # 認証に使用するサーバー証明書と秘密鍵を"mtkn.jp"という名前で登録。
    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の逆引きができなかった場合に受信を拒否するフィルター
    505 filter check_rdns phase connect match !rdns disconnect "550 no rDNS."
    506 # 正引きと逆引きでDNSのレコードが一致しなかった場合に受信を拒否するフィルター
    507 filter check_fcrdns phase connect match !fcrdns disconnect "550 no FCrDNS."
    508 
    509 # 各ネットワークインターフェース毎の処理を設定。
    510 listen on socket
    511 listen on lo0
    512 # vio0というインターフェースの25番ポートに届いたものに関する設定。
    513 # 外部からmtkn.jp宛に届いたものの処理である。
    514 # 最初に登録した証明書と秘密鍵を使って通信を暗号化し、
    515 # 上で設定したDNSに関するフィルターを適応。
    516 listen on vio0 port 25 tls pki mtkn.jp hostname "mail.mtkn.jp"\\
    517 	filter { check_rdns, check_fcrdns }
    518 # vio0というインターフェースのsubmission(587番)ポートに関する設定。
    519 # mtkn.jpのユーザー(e.g. user@mtkn.jp)から任意の人宛に送信される
    520 # メールに関する設定。
    521 # 上と同様に"mtkn.jp”という名前で登録されたpkiを使って暗号化し、
    522 # "passwd"という名前で登録したパスワードで認証し、
    523 # さらにドメインキーでメールに署名する。
    524 listen on vio0 mask-src port submission smtps pki mtkn.jp\\
    525 	hostname "mail.mtkn.jp" auth <passwd> filter dkim_sign
    526 
    527 # 各種メールの処理を定義する。
    528 # 各処理が実行される条件はこの後定義する。
    529 # ローカルメールはデフォルトのまま
    530 action "local_mail" mbox alias <aliases>
    531 # 自分のドメイン宛のメールは/var/vmail/以下に振り分けてmaildir形式で保存。
    532 action "domain" maildir "/var/vmail/%{dest.domain:lowercase}/%{dest.user:lowercase}"\\
    533 	virtual <virtuals>
    534 # 他のドメイン宛ては宛先へ転送。
    535 action "outbound" relay
    536 
    537 # どういう条件でどういう処理をするかを定義する。
    538 # 任意の送信元から自分のドメイン宛ては上で定義したdomainという処理をする。
    539 # ここでは/var/vmail/以下に振り分けて保存する。
    540 match from any for domain mtkn.jp action "domain"
    541 # このサーバー内でのメールはlocal_mailとして処理。
    542 match from local for local action "local_mail"
    543 # このサーバー内から他所へのメールは宛先に転送
    544 match from local for any action "outbound"
    545 # 外部から来た他所宛てのメールは認証されているものに限り転送。
    546 # authを忘れると多分このサーバー経由で迷惑メールが送られる危険がある。
    547 match auth from any for any action "outbound"
    548 </code></pre>
    549 
    550 <h3>各テーブルの作成</h3>
    551 <p>
    552 上記の設定ファイルの<code>table</code>で指定したテーブルを作成する。\
    553 <code>/etc/mail/aliases</code>は特に変更しなくてもいい。\
    554 <code>/etc/mail/passwd</code>にはメールアカウントと暗号化されたパスワードを\
    555 保存する。パスワードの暗号化には<code>smtpctl(8)</code>を使う:\
    556 </p>
    557 <pre><code>\
    558 # echo user@mtkn.jp:$(smtpctl encrypt) >> /etc/mail/passwd
    559 <i>パスワードを入力し、エンター、Ctrl-D</i>
    560 </code></pre>
    561 
    562 <p>
    563 <code>/etc/mail/virtuals</code>にはメールの転送を設定できる。\
    564 以下のようにする:\
    565 </p>
    566 <pre><code>\
    567 abuse@mtkn.jp         user@mtkn.jp
    568 postmaster@mtkn.jp    user@mtkn.jp
    569 webmaster@mtkn.jp     user@mtkn.jp
    570 user@mtkn.jp          vmail
    571 </code></pre>
    572 <p>
    573 この設定で、例えばabuse@mtkn.jp宛てのメールがuser@mtkn.jpに転送される。\
    574 abuse, postmaster, webmasterはなんか一応作っとけみたいに書いてたけど\
    575 必要なんかな?
    576 </p>
    577 
    578 <h2>Dovecotの設定</h2>
    579 <p>
    580 MDAとして<code>dovecot(1)</code>をインストールする。\
    581 </p>
    582 <pre><code>\
    583 # pkg_add dovecot
    584 </code></pre>
    585 <p>
    586 dhparamを作成する(時間がかかる):
    587 </p>
    588 <pre><code>\
    589 # openssl dhparam -out /etc/ssl/dh.pem 4096
    590 </code></pre>
    591 
    592 <p>
    593 わかりにくい設定ファイルをどけてシンプルなものに書き直す:
    594 </p>
    595 <pre><code>\
    596 # mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
    597 # vi /etc/dovecot/dovecot.conf
    598 </code></pre>
    599 <p>
    600 ドキュメントは公式ウェブサイトで確認できる。\
    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 = &lt;/etc/ssl/mail.mtkn.jp.fullchain.pem
    617 ssl_key = &lt;/etc/ssl/private/mail.mtkn.jp.key
    618 ssl_dh = &lt;/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 # lmtpはいらんかも。
    640 protocols = imap lmtp
    641 
    642 # SSLを使ったIMAPSのみを許可。
    643 service imap-login {
    644   inet_listener imaps {
    645     port = 993
    646     ssl = yes
    647   }
    648   # Disable imap
    649   inet_listener imap {
    650     port = 0
    651   }
    652 }
    653 </code></pre>
    654 <pre><code>\
    655 # rcctl start dovecot
    656 # rcctl enable dovecot
    657 </code></pre>
    658 
    659 <p>
    660 サーバーの証明書が更新される際に<code>dovecot(1)</code>も再読み込みされるように\
    661 <code>cron(8)</code>に追加しておく:
    662 </p>
    663 <pre><code>\
    664 crontab -e
    665 </code></pre>
    666 
    667 <pre><code>\
    668 #minute hour    mday    month   wday    [flags] command
    669 ~ 2 * * * acme-client mail.mtkn.jp && rcctl restart smtpd && rcctl reload dovecot
    670 </code></pre>
    671 
    672 <h2>テスト</h2>
    673 <p>
    674 手元のメールクライアントから送受信のテストをする。\
    675 特にgmail等に送った際に迷惑メールに分類されないかどうか確認する。\
    676 以上の設定で、gmailへの送受信は問題なかった。\
    677 また、<code>neomutt(1)</code>、<code>thunderbird(1)</code>からログイン\
    678 及び送受信できることも確認した。\
    679 </p>
    680 
    681 <h2>参考文献</h2>
    682 <ul>
    683 <li><a href="https://man.openbsd.org/smtpd">smtpd(8).OpenBSD Manual Pages</a></li>
    684 <li><a href="https://man.openbsd.org/smtpd.conf">smtpd.conf(5).OpenBSD Manual Pages</a></li>
    685 <li><a href="https://man.openbsd.org/httpd">httpd(8).OpenBSD Manual Pages</a></li>
    686 <li><a href="https://man.openbsd.org/httpd.conf">httpd.conf(5).OpenBSD Manual Pages</a></li>
    687 <li><a href="https://man.openbsd.org/acme-client">acme-client(1).OpenBSD Manual Pages</a></li>
    688 <li><a href="https://man.openbsd.org/acme-client.conf">acme-client.conf(5).OpenBSD Manual Pages</a></li>
    689 <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>
    690 <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>
    691 <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>
    692 </ul>