postfix
dovecot
centos7
letsencrypt
メールサーバー構築

メールサーバ構築・独自ドメインのメールアドレス作成(4/4)~メールサーバのインストール~

目標

最終目標 :メールサーバを立てて、独自ドメインのメールアドレスを作成する
今回の目標:独自ドメインのメールアドレスで送受信ができるようになる

必要なものごと

  1. サーバーリソース確保→ 前回の記事
  2. 独自ドメイン取得  → 前回の記事
  3. サーバーと独自ドメインの紐付→ 前回の記事
  4. メールサーバのインストール・設定 → 今回はこれ

ちょっと事前準備

ここまで手探りでやってきて設定漏れが出てきたので、やります。(主にセキュリティ設定)
・ AWSへのSMTP利用申請
・ DNSへのSPFレコード登録
・ SSL証明書の取得

■ AWSへのSMTP利用申請

https://aws.amazon.com/forms/ec2-email-limit-rdns-request?catalog=true&isauthcode=true

AWSのサーバは、スパムの温床にならぬよう SMTP利用の際は申請が必要ですので、ここから申請しましょう。
(翌日には対応してもらえます)
利用理由は" For Learning SMTP Protocol."でOKもらえました。

■ DNSへのSPFレコード登録

メール受信(相手)側で送信ドメインを認証するためのレコードをSPFレコードといいます。
TXTレコードとして、DNSサーバに以下を登録。

image.png

これを登録することで、
受信側<osji.netと称してX.X.X.X からメール来たんだけどなりすましじゃない?
送信側<うち(osji.net)のメール送信担当は、mxレコードに登録してあるX.X.X.X だよ。
受信側<あ、X.X.X.X はほんとにosji.netのメールサーバなんだね。じゃあ受信するよ。
というようなやりとりが行えます。
これがないとGmailとかにメール受け取ってもらえませんので注意(ハマった)

■ SSL証明書の取得

こちらでなりすまし・盗聴・改ざん を防ぎます。
何と無料で証明書を発行していただける”Let's Encrypt” なる認証局があるとのことでそちらを利用します!
前提: ポート80 or 443の解放

1) Let's Encrypt のクライアントソフト cerbotをインストール

terminal
# yum install epel-release 
# yum install certbot python-certbot-apache

2) 証明書作成
-d でDNSに登録してあるホスト名、 -m で自分の連絡先アドレスを記載します。
--agree-tosは利用規約に同意、 -nは対話型プロンプトの省略。

terminal
# certbot certonly --standalone  -d mail.osji.net -m XXXX@gmail.com   --agree-tos -n

3) 証明書自動更新コマンドをcrontabに記載
証明書はそのままだと3か月で失効してしまうので、renewコマンドを定期的に実行しましょう。

crontab
00 12 01 * * /bin/certbot renew 1>/root/log/certbot/log.txt 2>&1

いよいよメールサーバ構築

ここまで長かった。
以下、作業は全部rootアカウントで行いました。

■ Dovecot

クライアント側でメールを読むことができる POP3/IMAP の機能を有する
Dovecotをインストールして、自動起動設定を済ませます。

terminal
# yum -y install dovecot
# systemctl  enable dovecot

設定ファイルの編集。変更箇所前後のみ抜粋

/etc/dovecot/dovecot.conf
# Protocols we want to be serving.
#protocols = imap pop3 lmtp
↓
protocols = imap pop3

↑ 利用するプロトコルを指定。せっかくSSLですが、まだPOP3"S"/IMAP"S"とは書きません。

/etc/dovecot/conf.d/10-master.conf
service 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
  }
}

↑ ここでSSL有効化、ポートを指定。 非SSLの通信はポート番号を0にすることで無効にします。

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

ssl_cert = </etc/letsencrypt/live/mail.osji.net/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.osji.net/privkey.pem

↑ 証明書ファイルと秘密鍵(Let'sEncryptで作成したもの)を指定。

/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login

↑ 認証は平文にするのが推奨値とのこと。(SSL通信なので、パスワードは漏れません)

/etc/dovecot/conf.d/0-mail.conf
mail_location = maildir:~/Maildir

↑ メールボックスの場所を指定します。
各ユーザのホームディレクトリ配下のMairdirが一般的。あとでPostfix側で設定します。

おしまい!!お疲れさまでした。

■ Postfix

Postfixはメール転送エージェントです。
Dovecotはサーバに届いたメールをクライアントが読み出すために動きますが、
Postfixはメールを送信したり、別のサーバから受け取るために使います。

CentOSの場合はデフォルトで入っているはずですが、念のため確認します。

terminal
# alternatives --config mta
There is 1 program that provides 'mta'.
  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

↑ * がついていればOK

terminal
#  systemctl is-enabled postfix
enabled

# systemctl stop postfix

↑ 自動起動の設定が入っていることを確認して、設定変更前にPostfixを終了します。

/etc/postfix/main.cf
myhostname = mail.osji.net
mydomain = osji.net

# メールアドレスの@より後ろを指定
myorigin = $mydomain

# 全てのホストからメールを受信する
inet_interfaces = all

# ipv4のみ有効
inet_protocols = ipv4

# @より後ろが何だったら自分宛てのメールと判断するか(これ以外はほかのサーバに転送)
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 存在しないユーザ宛のメールの受信を拒否する
local_recipient_maps = proxy:unix:passwd.byname $alias_maps

# メール送信時にメール転送サーバを使わない
relayhost =

# メールの格納ディレクトリ名(ユーザのホームディレクトリ配下)(さっきDovecotで指定したものにする)
home_mailbox = Maildir/

#SMTP接続時、 MTAがPostfixであることを公開しない(※)
smtpd_banner = $myhostname ESMTP

# VRFYコマンドの使用を禁止する
disable_vrfy_command = yes


####### TLS/SSL設定 ####### 

# TLS/SSLを有効化
smtpd_use_tls = yes

# 宛先のメールサーバが対応していれば暗号化する
smtp_tls_security_level = may

# 証明書と秘密鍵
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.osji.net/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.osji.net/privkey.pem

# TLS通信のログレベル(1: TLSハンドシェイクと証明書情報を保存)
smtpd_tls_loglevel = 1

# 接続のキャッシュファイルとキャッシュ保存時間
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s


####### SASL認証設定 ####### 

# SASL認証を有効化
smtpd_sasl_auth_enable = yes

# SASLライブラリとしてDovecot を指定(Dovecotの認証基盤をPostfixでも使わせてもらう)
smtpd_sasl_type = dovecot

# Dovecot SASL ライブラリの認証ソケットファイル
# ※/var/spool/postfix/ 配下
smtpd_sasl_path = private/auth

# 古いバージョンの認証を使うクライアントとの通信を許可
broken_sasl_auth_clients = yes


####### メール転送許可設定 ####### 

smtpd_recipient_restrictions =
    permit_mynetworks     # 同じネットワーク上からのメールは転送許可
    permit_sasl_authenticated # 認証を通過したものは転送許可
    reject_unauth_destination # 認証なしのものは転送拒否

↑ 長いですが頑張って設定します。
(※)SMTP接続成立時、最初にサーバが応答を返す時の文字列。
デフォルトだと"Postfix"の文字が入っていますので悪者に悟られないよう削除します。
(それ以外の文字列はSMTPプロトコルで指定されているため削除しない)
以下のようにTELNETで接続すると自分で見ることができます
image.png

/etc/postfix/master.cf
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

↑ 認証をSSL通信で行うようにします(コメントアウトを外せばOK)

telminal
# postmap /etc/postfix/access # 迷惑メール拒否設定用のテーブルをつくっておく

# postfix check # 何も表示されなければ変な設定はない…はず

↑最後の仕上げ! お疲れさまでした。

■ 起動とメール送受信

telminal
# systemctl  start  postfix
# systemctl  start  dovecot

↑無事起動したら…

telminal
# useradd testuser
# passwd testuser
# usermod -s /sbin/nologin testuser

↑OSのユーザーを作成して…(セキュリティのためSSH接続は不可に)

image.png
↑ クライアントに登録すれば!!!

メール送受信ができるようになってます!!!
ユーザを増やすと @より前も増えます。うれしい楽しい

注意事項

/var/log/maillog をこの後見てみるとわかるのですが、
SMTPサーバはインターネット上に公開するとめちゃめちゃ不正アクセスのターゲットになります。
せっかく取ったドメインがSPAM発信元にされてどこかのブラックリストに入ってしまう前に、
・ 適当なアカウントを放置しない(IDもpassも"test"みたいなユーザは変な人にログインされちゃいます)
・ Fail2ban(別記事)を入れるなど不審なアクセスをはじく対策を取る

などの対策を取るとよいと思います。

スライドにしたよ

やったこと全部某所でスライドにして発表したからよかったら見てください…
https://docs.google.com/presentation/d/15d5p5sz4xno-CJR08470v9qQLWa46Jp5VWnz6Cc2E-M/edit?usp=sharing