社内メール環境 postfix+dovecot

#初めに
なかなか、シンプルなpostfix+dovecotの設定手順はない。
非常に単純にローカルLANでメールを使いたいだけなのだが、sslやら認証やらがようわからん。
次の構成となっている。

- ユーザはvirtual_mailboxなんで簡単にユーザを追加できる。
- とりあえず、メーラについては今はoutlookは使えないがthunderbirdが使える。 

#postfixとdovecotについて
利用したのは

- ubuntu 18.04.4
- dovecot 2.2.32
- postfix 3.3.0

## postfixとdovecot
postfixはメールを作成したものをmailboxに格納し、dovecotはpopやimapでそれを取り出すという仕組みになっている。
一般的にはunixではユーザがmailboxを持っているが、この方式だといちいちuseraddでpasswordを管理することになる。この方式だと、メールアドレスだけ一気に作成するにはめんどくさいし、へたすればsshでサーバに各メールユーザが入れるということになる。単純にメールだけを追加したいのであれば、virtual_mailboxという仕組みのを使うのが簡単である。

# postfixの設定
## /etc/posyfix/main.cf
virtual_mailbox以外の設定は以下のようなものである。
ここで重要なのはmydestinationになにも設定していないということだ。
もちろん、通常のメール(unix userを持っている人のメール）も受け付けるというのであれば#にしたmydestinationを有効化すればよい。ただ、virtual_mailboxは全く別のmail_domainを持っているのでそこと混同しないことが重要である。
なお、mynetworks の192.168.0.0/16は192.168.x.xのLANからのメーラ(thundebird)からアクセスする場合を想定しているのでlanの設定によって変更が必要だ。

```
myhostname = ubuntu.example.com
mydomain = example.com
#alias_maps = hash:/etc/aliases
#alias_database = hash:/etc/aliases
myorigin = $mydomain
#mydestination = $myorigin, localhost, $myhostname
mydestination = 
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/16
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
default_transport = error
relay_transport = error
inet_protocols = all
```

以下が、virtual_mailboxの設定である。
<pre>
virtual_mailbox_domains = mysite.org
virtual_mailbox_base = /var/spool/virtualm
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
</pre>


ここで、mailbox_baseは/var/spool/vairtualmを作成して作っており
そこを操作するのはuid=5000,gid=5000ということにしている。

## 他のディレクトリ等の作成
https://knowledge4linux.blogspot.com/2013/08/dovecot-passwd-file.html
にあるように

```shell
groupadd -g 5000 vmail
useradd -g 5000 -u 5000 -s /user/sbin/nologin vmail
mkdir /var/spool/virtualm
chown vmail:vmail /var/spool/virtualm
chmod 700 /var/spool/virtualm
```
ということでvmailというユーザを作成し、/var/spool/virtualmを作成ということになる。

さて、virtual_mailbox_maps = hash:/etc/postfix/vmailbox
であるが、/etc/postfix/vmailboxに次のような内容を格納する。

<pre>
test1@mysite.org MailDir/test1@mysite.org/
test2@mysite.org MailDir/test2@mysite.org/
</pre>
最初は追加したいメールアドレスであり、次は/var/spool/vairtualmの下のディレクトリ
構成である。できあがったあとで運用しているの内容をtreeで見てみるとこんなことになっている。

```
/var/spool/virtualm/
├── MailDir
│   ├── test1@mysite.org
│   │   ├── cur
│   │   │   └── 1582449895.V801Ia7428M764347.ubuntu:2,S
│   │   ├── dovecot-uidlist
│   │   ├── dovecot-uidvalidity
│   │   ├── dovecot-uidvalidity.5e523407
│   │   ├── dovecot.index.cache
│   │   ├── dovecot.index.log
│   │   ├── new
│   │   └── tmp
```
この/etc/postfix/vmailboxを作成したら
`postmap /etc/postfix/vmailbox`
っで設定する。この構成はdovecotでの定義と合わせる必要がある。

## ユーザを作成する時のテンプレートの設定？
<pre>
mkdir -p /etc/skel/MailDir/{new,cur,tmp}
chmod -R 700 /etc/skel/MailDir/
</pre>

# dovecotの設定
## 設定の概要
sslをnoにし、認証をpwファイルだけで簡単に設定する。
## /etc/dovecot/dovecot.conf
以下を変更追加。その下も追加変更部分だけを記述してある。
<pre>
auth_verbose = yes #追加
auth_debug = yes　#追加
mail_debug = yes　#追加
listen = *　#変更
</pre>
## /etc/dovecot/conf.d/10-auth.conf
<pre>
disable_plaintext_auth = no
auth_mechanisms = cram-md5 plain login
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext
</pre>
## /etc/dovecot/conf.d/10-mail.conf
<pre>
mail_location = maildir:/var/spool/virtualm/MailDir/%u
</pre>
## /etc/dovecot/conf.d/10-ssl.conf
'ssl=no'
## /etc/dovecot/conf.d/auth-passwdfile.conf.ext
<pre>
passdb {
  driver = passwd-file
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
}
userdb {
  driver = passwd-file
  args = /etc/dovecot/passwd
}
</pre>
## /etc/dovecot/conf.d/auth-passwdfile.conf.ext
すべてコメント

## 最終的なdoveconf -nの出力
ここは上の結果 'doveconf -n'を実行するところだが、途中authも設定し始めて
ちょと変な設定もでているかもしれない。service authあたりはいらないはずである。

```
# 2.2.33.2 (d6601f4ec): /etc/dovecot/dovecot.conf
# Pigeonhole version 0.4.21 (92477967)
# OS: Linux 4.15.0-76-generic x86_64 Ubuntu 18.04.4 LTS ext4
auth_debug = yes
auth_mechanisms = cram-md5 plain login
auth_verbose = yes
disable_plaintext_auth = no
listen = *
mail_debug = yes
mail_location = maildir:/var/spool/virtualm/MailDir/%u
mail_privileged_group = mail
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
  mailbox Sent {
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
  mailbox Trash {
    special_use = \Trash
  }
  prefix = 
}
passdb {
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
  driver = passwd-file
}
protocols = " pop3"
service auth-worker {
  user = root
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0666
    user = postfix
  }
  unix_listener auth-userdb {
    group = vmail
    mode = 0666
    user = vmail
  }
}
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
ssl = no
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_client_ca_dir = /etc/ssl/certs
ssl_key =  # hidden, use -P to show it
userdb {
  args = /etc/dovecot/passwd
  driver = passwd-file
}
```

## /etc/dovecot/passwd
これで動いた、{plain}の次は生のパスワードである。まあ、セキュリティ的には
最悪かもしれないが、これが言いたくて、ここまで書いた。
<pre>
test1@mysite.org:{plain}test1:5000:5000
test2@mysite.org:{plain}test2:5000:5000
</pre>
一般のwebの参考文章ではdoveadm pwで{CRAM-MD5}のハッシュを作成し、コピーしろとかなっているが、単に上の設定を入れておけば大丈夫である。ということは管理者にはパスワードがバレバレなので、メールを利用するメンバーは「メール間の秘密は守られない」という前提である。まあ、社内で使うには問題ないのではと思う。

ということで、このファイルと/etc/postfix/vmailboxをメンテしていけばどんどんメンバーを追加できるということである。ああ、よかったよかった。しかしここまでたどり着くのは長かった。