みなさんメリークリスマス!
私はあまり風邪を引かないと自認しているのですが、それって人と触れ合っていないからじゃない?という風邪より辛い事実に気付いてしまいました。
そんなことより今回は、世の中に解説が溢れかえっているPostfix+Dovecotによるメールサーバーの構築をやってみようかなと思っております。
WEBのインフラは構築したことあるけどメール環境はやったことなかったので、勉強がてらやってみます。
2019年も終わりなのでセキュアな感じにしていきたい。
さくらのVPS CentOS7
ドメイン: example.com
サーバーIP: 123.123.123.123
Postfix 2.10.1
Dovecot 2.2.36 (1f10bfa63)
certbot 1.0.0
sshで接続できていることを前提とします。
rootでの作業が多いのでrootで作業します。
SPFレコードはこの書き方が安定ですな。
Let’s Encryptってのは無料のSSL証明書を発行してくれるやつでして、certbot(certbot-auto)はそのクライアントとなります。
これはgitで持ってきます。
# カレントディレクトリはホームフォルダ(/root)
# certbotを取得します
git clone https://github.com/certbot/certbot.git
# /root/certbot
cd certbotcertbotは証明書を取得するために80番ポートを使用します。
そのため80番ポートの解放をしましょう。
# 80番ポート(http)の解放
firewall-cmd --add-service=http --permanentWEBサーバーと同居させずにただのメールサーバーとして使用するなら「standaloneモード」で証明書を取得します。
certbotが自身でWEBサーバーを立ててLet’s Encryptのサーバーとやりとりをするようです。
./certbot-auto certonly --standalone -d mail.example.com -m yourmail@gmail.com --agree-tos -nこれでmail.example.comの証明書が取得できます。
WEBサーバーと同居する場合には「webrootモード」で証明書を取得します。
standaloneと違って既存のWEBサーバーを使用してLet’s Encryptとやりとりをするようです。
./certbot-auto certonly --webroot -w /path/to/document_root -d mail.example.com -m yourmail@gmail.com --agree-tos -n/path/to/document_root配下に.well-known/acme-challengeというフォルダを作ってなんかやりとりするようですよ。
ls /etc/letsencrypt/live/mail.example.com/
cert.pem chain.pem fullchain.pem privkey.pemLet’s Encryptは確か3ヶ月とかで有効期限が切れてしまいますので、更新処理が必要となります。
# 更新処理
./certbot-auto renewこのコマンドで更新できるので、cronにこれを登録します。
今回は毎月1日の朝4時に更新をするように設定します。
また、更新の際にPostfixとDovecotを再起動します。
# cronを編集
crontab -e00 04 01 * * /root/certbot/certbot-auto renew -q -- deploy-hook "systemctl restart postfix dovecot"Postfixはメールをサーバー間で配送するアプリケーションです。
巷ではメールを送信するアプリケーションって書いてたりしますが、間違ってないけど言葉足らずと感じます。
まずはインストールですね。デフォルトで入ってることもあるので入ってたら設定の項まで飛んでね。
# Postfixインストール
yum install -y postfix
# Postfixをサービスに登録
systemctl enable postfix
# Postfixをとりあえずスタートさせとく
systemctl start postfix設定ファイルは/etc/postfixにあります。
言及のない項目に関してはデフォルトのままにしておいてください。
いじるのはmain.cfとmaster.cfです。
# 設定フォルダに移動
cd /etc/postfix
# main.cfのバックアップを作成
cp main.cf main.cf.backup
# master.cfのバックアップを作成
cp master.cf master.cf.backup多分以下の項目をセットすれば良いと思われる。
ドメイン名は適宜読み替えてね!
myhostname = mail.example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname,localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth #dovecotのsaslを使用
smtpd_sasl_type = dovecot #dovecotのsalsを使用
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_use_tls = true
smtpd_recipient_restrictions = 
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destinationsmtps     inet  n       -       n       -       -       smtpd #コメ外す
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes #コメ外す
  -o smtpd_sasl_auth_enable=yes #コメ外す
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject #コメ外す
#  -o milter_macro_daemon_name=ORIGINATINこれでとりあえずPostfixはOK!
Dovecotはメールクライアントからのリクエストに応じてメールをサーバーから手元のマシンに配信してくれます。
Dovecotはメールを受信するアプリケーションという説明がよくされていますが、こちらも言葉足らずに感じますね。
# Dovecotインストール
yum install -y dovecot
# Dovecotをサービスに登録
systemctl enable dovecot
# dovecotをとりあえずスタートさせとく
systemctl start dovecot設定ファイルは/etc/dovecotにあります。
Dovecotは設定ファイルがやたらと多いです。
変更するのは以下のファイルです。
dovecot.confconf.d/10-auth.confconf.d/10-mail.confconf.d/10-master.confconf.d/10-ssl.confprotocols = imaps pop3s # SSLのみ対応するのでimap pop3は書きませんdisable_plaintext_auth = no
auth_mechanisms = plain loginssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_cert_key = </etc/letsencrypt/live/mail.example.com/privkey.pemmail_location = maildir:~/Maildirservice imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
   mode = 0660
    user = postfix
    group = postfix
  }
}多分これで良いはず。
メールは[ユーザー名]@[ドメイン]という形になります。info@example.comのメールを受け取るinfoというユーザーを作ってみようと思います。
# ユーザーの作成 メール専用のためnologin
adduser -s /sbin/nologin -d /home/info info
# ユーザーの切り替え
su - info
# パスワード設定
passwd
# メールの実体を保存するディレクトリの作成
mkdir -p ~/info/Makedir/{new,cur,tmp}各種アプリを起動し直して、必要なポートを開放します。
必要なポートは以下
今時ならimap: 143/tcp、pop: 110/tcpは開けなくて大丈夫っぽい。
smtp: 25/tcpはメールの配送に使われるから開けとく必要があります。
あと各アプリをリロードして設定ファイルを読み込ませましょう。
# 開放
firewall-cmd --add-service={imaps,pop3,smtp,smtps} --permanent
firewall-cmd --reload
# 各アプリをリロード
systemctl reload postfix
systemctl reload dovecotメーラーへの登録に必要な情報は以下
もし登録が突っぱねられたらサーバー側の設定がどこかおかしい可能性があります。その場合は、
# ログチェック
systemctl status postfix -l
systemctl status dovecot -lのコマンドでログをチェックしてエラーを潰してあげてください。
あとはメールの送受信チェックをして完了となります。
25番ポートは開けなくて良いと思ってましたが、サーバー間の配送には使用されるんですね。
でも思ったより難しくないですね。バーチャルメールボックスなどの設定をする際は、この状態をベースとしてやってあげると理解が早そうです。
今時はWEB用レンタルサーバーを借りるとメールサービスも含まれているのでそれに甘えてきましたが、ベースとなる技術は抑えておくべきだなと改めて思いましたよ!
まぁ安定感を求めるならメールサーバーサービスを利用した方が良いかとは思いますが、メールをトリガーにするプログラムを書きたい時にはおもろいかもしれませんね!
ではまた来週!
        コータ=ザッカーバーグ
@kota_zuckerberg
バイクとプログラミングをこよなく愛する編集部の後方支援担当。 愛車はSUZUKI GSR250。 Illustratorの自動化からWEB制作、インフラの整備などをこなしていくうちに いつの間にかフルスタックエンジニアになっちゃった。 主な使用言語はphp, javascript, go, applescript。最近はjsに傾倒ぎみ。