メールサーバの構築 #2

Tech (Old)

前回の投稿では Postfix のインストールまで書いた。今回は、Let’s Encrypt のインストールや PostfixAdmin で使う Apache のインストールから始める。

Apache のインストールと Let’s Encrypt から証明書を取得

$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo apt -y install certbot
$ sudo apt -y install python3-certbot-apache
$ sudo vi /etc/apache2/sites-available/mail.hoge.com.conf
$ sudo a2ensite mail.hoge.com
$ sudo a2dissite 000-default
$ sudo systemctl restart apache2

以降で使うポート 80 と 443 を開いておく。Let’s Encrypt から証明書を取得するのに使う certbot をインストールする。Apache と連携して証明書を取得する python3-certbot-apache もインストール。python3-certbot-apache をインストールすると Apache もインストールされる。
Apache が使う、mail.hoge.com 用のサイト設定ファイルを作成する。ファイルの内容は以下のようにする。

<VirtualHost *:80>
        ServerName mail.hoge.com
        ServerAdmin webmaster@hoge.com
        DocumentRoot /var/www/html/

        ErrorLog ${APACHE_LOG_DIR}/mail.hoge.com.error.log
        CustomLog ${APACHE_LOG_DIR}/mail.hoge.com.access.log combined
</VirtualHost>

/var/www/html/index.html は適当な内容に修正しておく。
最後にブラウザでアクセスできるかを確認しておく。

ファイルの書込権などの関係で、ドキュメントルートを変更しても良いかもしれない(特にマルチドメインにするなどの時)。
例えば、/home/Sites/ に mail.hoge.com というディレクトリをつくり、その中に html ディレクトリをつくって、そこをドキュメントルートにすることとする。
まず、/etc/group に webstaff:x:2000:www-data,<初期アカウント> という行を追加する。
/home/Sites/ を作成。sudo mkdir /home/Sites して、sudo chgrp webstaff /home/Sitessudo chmod 2775 /home/Sites してディレクトリを作成、グループを webstaff に変更して GUID ビットを立てておく。
mkdir -p /home/Sites/mail.hoge.com/html して、そこに index.html を配置。
/etc/apache2/apache2.conf で /var/www/ と同じように /home/Sites/ を設定して、前記の /etc/apache2/sites-available/mail.hoge.com.conf の DocumentRoot を /home/Sites/mail.hoge.com/html/ にする。
sudo systemctl restart apache2 してドキュメントルートの変更を確認する。

$ sudo certbot certonly -a apache --agree-tos --no-eff-email --staple-ocsp --email <管理者のメールアドレス> -w /var/www/html -d mail.hoge.com

certbot で証明書を取得する。コマンド等についての詳細はユーザガイドを参照。
今回使用するコマンドは certonly で、これは証明書を取得または更新するコマンド。インストールはしない。ここでインストールしないというのは Apache などの Web サーバで使用できるように設定しないということ。コマンド run を使用すると Web サーバの設定をしてくれるみたいだが、設定は自分で書くのでここでは certonly を使う。
オプション -a について。-a apache は認証プラグインで Apache を使うよう指定している。認証時に web サーバにファイルを置いてやり取りするのだが、もしかしたら Apache の設定ファイルを読んでよしなにやってくれているかも。
オプション --agree-tos について。ACME サーバのサブスクライバアグリーメントに同意する。
オプション --no-eff-email について。Let’s Encrypt の運営母体の EFF とメールアドレスをシェアしない。EFF と関連するところからメールが来ることがないようになると思われる。
オプション --staple-ocsp について。OCSP Stapling を有効にする。OCSP は証明書の失効状態を取得するためのプロトコル。
オプション --email について。登録や復旧のやり取りの時に使われるメールアドレス。どうも複数使えるみたい。--email foo@hoge.com,bar@hoge.com みたいな感じで。
オプション -w について。ドキュメントルートの指定。-w /var/www/html で /var/www/html をドキュメントルートとして指定する。
オプション -d について。取得する証明書のホスト名。-d mail.hoge.com で mail.hoge.com の証明書を取得する。
-w-d は複数指定可能で、-w /var/www/hoge -d www.hoge.com -d hoge.com -w /var/www/fuga -d www.fuga.net -d fuga.net のように使える。
実行すると、/etc/letsencrypt/live/ 以下に証明書が保存される。

/lib/systemd/system/certbot.service

ExecStart=/usr/bin/certbot -q renew
 ↓
ExecStart=/usr/bin/certbot -q renew -post-hook "systemctl reload apache2 postfix dovecot"

証明書の更新時に Apache と Postfix、Dovecot を再起動する設定。

$ sudo systemctl daemon-reload

Postfix に Submission / smtps ポートも処理させる

証明書が準備できたので、Postfix で Submission ポート(587)と smtps ポート(465)も処理させる。

smtp は基本 25 番ポートで通信をおこなう。通信を行うときは特に認証とかは必要ではない。というか、ドメイン間でメール配送しようとしたとき、認証なんてできんだろうという話。送信元が PC なら POP before SMTP とかで対応していたけれど、FreeBSD や Linux でおうちでメールサーバをあげるなどが可能になり、そこから大量に SPAM を発信することが可能になった。プロバイダとしては、おうちからの接続の時「宛先ポートが 25 の場合は接続させない」(OP25B)ことで、おうちサーバからの SPAM 発信を抑制するようになった。
そうすると、おうちの PC からのメールも送信できなくなるので、おうちの PC からは認証付き(SMTP-AUTH)の submission ポート(587)を使って送信するようになった。
smtps ポート(465)の方は Outlook 対策だったような気がするが、非標準ラッパーモード(/etc/services では Submission over TLS [RFC8314] と書かれている)を使うんだったか。

$ sudo vi /etc/postfix/master.cf

/etc/postfix/master.cf で submission と smtps の設定を行う。それぞれ設定はコメントアウトされているので、適宜、以下のような設定になるようにする。

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

設定ファイルの書式としては、行がホワイトスペースで始まる場合、前の行からの継続ということになるので、それぞれの塊が 1 行になる。
syslog_name は(多分)syslog に送られるときのタグみたいなもの。
smtpd_tls_security_level はこのオプションがないと TLS を使わない設定になる。encrypt の場合、クライアントは TLS 必須となる。may だとクライアントはTLS を使っても使わなくてもよい。
smtpd_sasl_auth_enable は no の場合に SASL 認証が無効(デフォルト)、yes のばあいに有効となる。
smtpd_relay_restrictions は Postfixが受け取ったメールを他のサーバへリレーするかどうかの設定。permit_sasl_authenticated はクライアントが認証されている場合リレーを許可。その他は reject する。
smtpd_sasl_type と smtpd_sasl_path は SASL 関連の設定。
smtps の方だけにある smtpd_tls_wrappermode は START TLS ではなく「非標準」のラッパーモードにする。実は内容がわかっていない…

$ sudo vi /etc/postfix/main.cf

続いて、/etc/postfix/main.cf の設定。こちらは全般の設定という感じ。

smtpd_tls_cert_file=/etc/letsencrypt/live/mail.hoge.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.hoge.com/privkey.pem
smtpd_tls_security_level=may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

以上の設定を反映させる(すでに行があればコメントアウトして追加、もしくは、修正)。
smtpd_tls_cert_file と smtpd_tls_key_file は証明書の設定。
smtpd_tls_security_level は前記の通り。May なのは、他の smtp サーバから配送されるとき(25 番ポートで送られてくるとき)認証なんてしないから May じゃないと受信できない。
smtpd_tls_loglevel は TLS に関する Postfix のロギング設定。デフォルトは 0 でロギングしない。1 は TLS ハンドシェイクと証明書の情報のロギングをする。2 は TLS ネゴシエーションのロギング。3 は TLS ネゴシエーションプロセスのロギング、4 は START TLS 以降の通信の完全なロギング。2 以上にはしないほうが良い。
smtpd_tls_session_cache_database は TLS セッションキャッシュファイルの名前を指定(btree や sdbm はデータベースの種類)。
ここまでの smtpd_ で始まるものは、受信時の設定。smtp_ で始まるのは送信時の設定。
smtp_tls_CApath は CA(認証局)関連のファイルを置いてある場所。
smtp_tls_security_level と smtp_tls_loglevel、smtp_tls_session_cache_database は smtpd_ で始まるものの受信時版。

smtpd_tls_mandatory_protocols は TLS がマストの場合に Postfix が受け入れる TLS プロトコルの指定。使えるのは “SSLv2” と “SSLv3″、”TLSv1″、”TLSv1.1″、”TLSv1.2″、”TLSv1.3” なので、!SSLv2, !SSLv3, !TLSv1, !TLSv1.1 となっているので TLSv1.2, TLSv1.3 と同義と思われる。
smtpd_tls_protocols は(とりあえず?)受け入れるプロトコル。
ここ、学習が必要ですね。

$ sudo systemctl restart postfix

Postfix を再起動する。

Dovecot のインストール・設定

Dovecot をインストールして設定する。imap と pop の両方をサポート、ローカル配送も Dovecot が行うようにする。

$ sudo apt install -y dovecot-core dovecot-imapd dovecot-pop3d

まずはインストール。とりあえず imap と pop の設定を行う。

/etc/dovecot/conf.d/10-mail.conf

mail_location = mbox:~/mail:INBOX=/var/mail/%u
 ↓
mail_location = maildir:~/Maildir

(とりあえず動作確認の間)メールの保存形式は maildir で、保存場所は ~/Maildir とする。

/etc/group

mail:x:8:
 ↓
mail:x:8:dovecot

ユーザ dovecot を mail グループに追加する。

$ sudo apt install -y dovecot-lmtpd

ローカル配送のモジュールを追加。

/etc/dovecot/conf.d/10-master.conf

service lmtp {
  unix_listener lmtp {
    #mode = 0666
  }

  # Create inet listener only if you can't use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
}
 ↓
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Create inet listener only if you can't use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
}

ローカル配送の設定を変更する。

/etc/postfix/main.cf

 ↓
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no

mailbox_transport は Postfix が配送されたメールをローカルに配送するときに Dovecot LMTP サーバを使うように指定する。mailbox_transport は smtputf8 プラグインをサポートしていないので、無効にする。

/etc/dovecot/conf.d/10-auth.conf

#disable_plaintext_auth = yes
 ↓
disable_plaintext_auth = yes

#auth_username_format = %Lu
 ↓
auth_username_format = %n

auth_mechanisms = plain
 ↓
auth_mechanisms = plain login

認証メカニズムの設定。
disable_plaintext_auth は SSL/TLS 暗号化を使わないときは平文での認証を無効にする設定。
auth_username_format は認証時のユーザ名の設定。%Lu はユーザ名を小文字にする、%n はアカウント名(メールアドレスの @ 以降があれば削除)する設定。
auth_mechanisms は認証メカニズム。plain は平文、login は Outlook が使う平文。

/etc/dovecot/conf.d/10-ssl.conf

ssl = yes
 ↓
ssl = required

ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key
 ↓
ssl_cert = </etc/letsencrypt/live/mail.hoge.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.hoge.com/privkey.pem

#ssl_prefer_server_ciphers = no
 ↓
ssl_prefer_server_ciphers = yes


 ↓
ssl_min_protocol = TLSv1.2

SSL/TLS 暗号化の設定。
ssl は SSL/TLS で通信するかどうかの設定。required は必須。yes は可能。no は不可能。
ssl_cert と ssl_key は証明書の設定。Let’s Encrypt で取得したものにする。
ssl_prefer_server_ciphers はどの暗号化スイートを使うのかを誰が決めるかの設定。yes にするとサーバが提示した暗号化スイートが優先される。
ssl_min_protocol は最低限必要な暗号化を設定する。TLSv1.2 とすると SSL やTLSv1、TLSv1.1 は使われない(どちらかというと OpenSSL の設定)。

/etc/ssl/openssl.cnf

providers = provider_sect
 ↓
#providers = provider_sect

OpenSSL 3.0 から FIPS provider という機能が入ったが、有効にしていると Dovecot に接続できないので変更。

/etc/dovecot/conf.d/10-master.conf

service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Users that have
  # full permissions to this socket are able to get a list of all usernames and
  # get the results of everyone's userdb lookups.
  #
  # The default 0666 mode allows anyone to connect to the socket, but the
  # userdb lookups will succeed only if the userdb returns an "uid" field that
  # matches the caller process's UID. Also if caller's uid or gid matches the
  # socket's uid or gid the lookup succeeds. Anything else causes a failure.
  #
  # To give the caller full permissions to lookup all users, set the mode to
  # something else than 0666 and Dovecot lets the kernel enforce the
  # permissions (e.g. 0777 allows everyone full permissions).
  unix_listener auth-userdb {
    #mode = 0666
    #user =
    #group =
  }

  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}

  # Auth process is run as this user.
  #user = $default_internal_user
}
 ↓
service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Users that have
  # full permissions to this socket are able to get a list of all usernames and
  # get the results of everyone's userdb lookups.
  #
  # The default 0666 mode allows anyone to connect to the socket, but the
  # userdb lookups will succeed only if the userdb returns an "uid" field that
  # matches the caller process's UID. Also if caller's uid or gid matches the
  # socket's uid or gid the lookup succeeds. Anything else causes a failure.
  #
  # To give the caller full permissions to lookup all users, set the mode to
  # something else than 0666 and Dovecot lets the kernel enforce the
  # permissions (e.g. 0777 allows everyone full permissions).
  #unix_listener auth-userdb {
    #mode = 0666
    #user =
    #group =
  #}

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}

SASL 認証の設定。Postfix が Dovecot の認証サーバを見つけられるようにする。

/etc/dovecot/conf.d/15-mailboxes.conf

  mailbox Drafts {
    special_use = \Drafts
  }
  mailbox Junk {
    special_use = \Junk
  }
 ↓
  mailbox Drafts {
    auto = create
    special_use = \Drafts
  }
  mailbox Junk {
    auto = create
    special_use = \Junk
  }

フォルダ Drafts と Junk を自動的に作成する(Sent と Trash は、送信時とゴミ箱に入れたときにそれぞれ自動的に作成される)。

$ sudo mkdir -p /etc/systemd/system/dovecot.service.d/
$ sudo vi /etc/systemd/system/dovecot.service.d/restart.conf
$ sudo systemctl daemon-reload

dovecot が落ちた時、自動的に再起動するようにする。
/etc/systemd/system/dovecot.service.d/restart.conf の内容は下記の通り。
systemd をリロードする。

/etc/systemd/system/dovecot.service.d/restart.conf

[Service]
Restart=always
RestartSec=5s

次回の記事は PostfixAdmin のインストール。

コメント

タイトルとURLをコピーしました