前回の投稿では 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/Sites
と sudo 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 のインストール。
コメント