www.mtkn.jp

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

mailserver.html (27614B)


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