今秋リリースされたばかりの新鮮素材です。
CentOSで作るものといえば皆さんお分かりですね。
サーバーです。
今日はこのCentOS8を使ってメールサーバーを構築しましょう。
普段何気なく利用しているメールのサーバーを自分で構築したことがある人は少ないんじゃないでしょうか?
構築する際のワンポイントテクニックやセキュリティを高める秘訣を教えちゃいます!
前半は構築編です。
後半はプロトコルとセキュリティについての解説です。
後半は以下のリンクからどうぞ。
CentOS8産自家製メールサーバーのオープンソース仕立て ~SMTP認証と通信プロトコル解説を添えて~ 後編
目次
メニュー
・CentOS8でメールサーバーを構築する
・通信はSSLで暗号化する
・SMTP認証にはPAMを利用する
材料メモ(1人前~)
CentOS Linux release 8.0.1905 (なるべく旬の内に使う)
postfix-3.3.1-8.el8.x86_64
dovecot-2.2.36-5.el8_0.1.x86_64
cyrus-sasl-2.1.27-0.3rc7.el8.x86_64
cyrus-sasl-lib-2.1.27-0.3rc7.el8.x86_64
cyrus-sasl-plain-2.1.27-0.3rc7.el8.x86_64
独自ドメイン(お好きなものを)
下ごしらえ
CentOS8のイメージを使うには
さくらのVPSやConoHaVPSは標準でCentOS8のOSイメージを使用することができます。
今回使用したのはお名前VPSです。
価格とスペックの釣り合い、カスタムISOイメージを使用できることから採用しました。
具体的なやり方はこちらでどうぞ。
アカウントごとに割り振られるISOイメージ領域にSFTPでアップロードを行うことで使用できるようになります。
私は意識高くCLIでアップロードしました。
CentOS8のインストール
基本的にはCentOS7から変わっていません。
ディスク領域やパーティション設定はお好みで設定してください。
「ソフトウェアの選択」では最小限のインストールを選択します。
今回は追加で開発ツールとセキュリティツールもチェックを入れました。
ここについても自由で構いません。
sshd設定変更
まずやるべきこととしてsshdの設定を変更します。
VPSサービスによりますが、rootアカウントのパスワード認証はやめましょう。
以下はパスワード認証を無効化し、秘密鍵でログインする手順です。
rootアカウントでそもそもログインできないようにすると更にセキュリティは高くなります。
1 2 3 4 5 6 7 8 9 10 11 12 |
# vi /etc/ssh/sshd_config -- PasswordAuthentication yes ++ PasswordAuthentication no # mkdir /root/.ssh # chmod 700 /root/.ssh # cd /root/.ssh # ssh-keygen -t rsa # mv id_rsa.pub authorized_keys ### 今後はid_rsaを使ってログインをする |
パッケージの更新、時刻設定、SELinux無効
続いてパッケージの更新、時刻設定、SELinuxの無効を行います。
CentOSではパッケージ管理のコマンドがyumからdnfに変更されています。
ですが、yumコマンド自体は消えたわけではなく、yumを実行するとdnfコマンドが内部的には実行されるようになっています。
yumコマンドの中身とdnfコマンドの中身は完全に一緒です。
1 2 3 4 5 6 |
[root@v157-7-244-38 ~]# which yum /usr/bin/yum [root@v157-7-244-38 ~]# which dnf /usr/bin/dnf [root@v157-7-244-38 ~]# diff /usr/bin/yum /usr/bin/dnf [root@v157-7-244-38 ~]# |
では一気に設定していきましょう。
1 2 3 4 5 6 7 8 9 |
# vi /etc/selinux/config -- SELINUX=enforcing ++ SELINUX=disabled # timedatectl set-timezone Asia/Tokyo # dnf -y update # reboot |
ここまでで最低限の設定は終了です。
今回はインストール時に設定をしたので不要ですが、swap領域がなければこのタイミングで作成しましょう。
DNS設定
取得したドメインのDNS設定もここで済ましておきましょう。(反映に時間がかかるから)
今回はサブドメインを使用しないドメインをメールサーバーのドメインとしました。
AレコードでドメインとサーバーのIPを紐付け、MXレコードでメール配送先ホスト名をドメインに紐付けます。

お名前.comで設定しました。こんな感じです。
余談ですがこのドメインは、新規サービスを作ろうとして先走って取得したドメインです。
形から入って中身が伴わないあるあるですね。
加熱殺菌(FireWall設定)
最低限必要なものだけ追加していきましょう。
今回追加するのは以下の4つ。
ここらの説明は最後に詳しく解説するので読み飛ばしてもらってOKです。
http(80/tcp)
Webサーバーを建てるわけではありません。
Let’s Encryptで証明書を取得する際に必要なので開放します。
smtp(25/tcp)
今回の主役。SMTP(Simple Mail Transfer Protocol)のポートです。
このポートが開いていないとメールの送信(受信も)ができません。
imaps(993/tcp)
IMAP(Internet Message Access Protocol) Over SSLのポート。
メーラーなどのクライアントがメールサーバーにアクセスし、サーバー上のメールを操作する際に使うポートです。
pop3s(995/tcp)
POP(Post Office Protocol) Over SSLのポート。
メーラーなどのクライアントがメールサーバーへメール取得する際に使うポートです。
submission(587/tcp)
今回の問題児。わかりにくくしているやつ。
クライアントからメールを送信する時に、SMTPにない認証機能を代わりにやるためのポートです。
設定
firewalldで設定を行います。
1 2 3 4 5 6 |
# firewall-cmd --zone public --permanent --add-service=http # firewall-cmd --zone public --permanent --add-port=25/tcp # firewall-cmd --zone public --permanent --add-port=587/tcp # firewall-cmd --zone public --permanent --add-port=993/tcp # firewall-cmd --zone public --permanent --add-port=995/tcp # firewall-cmd —reload |
–add-serviceでやるか–add-portでやるかはお好みで。
FireWallについても、CentOS8からはiptablesが標準でなくなった等の変更はありますが、firewalldは変わっていないのでここでは省略します。
調理
必要なソフトウェアのインストール
とりあえず心を無にして以下のコマンドでインストールしましょう。
それぞれが何かは後ほど解説します。
1 2 3 4 5 |
# dnf -y install postfix dovecot cyrus-sasl cyrus-sasl-plain # systemctl enable postfix # systemctl enable dovecot # systemctl enable saslauthd |
最小限のインストールであれば問題ないと思いますが、MTAがsendmailなどになっている場合はpostfixに変更しましょう。
MTAはメール転送エージェント(Message Transfer Agent)の略です。
1 2 3 4 5 6 7 8 9 10 11 |
### postfixを選択 [root@v157-7-244-38 postfix]# alternatives --config mta 1 プログラムがあり 'mta' を提供します。 選択 コマンド ----------------------------------------------- *+ 1 /usr/sbin/sendmail.postfix Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1 |
証明書の取得
SSL/TLS暗号化を行うにあたって、証明書を取得します。
Let’s Encryptを利用して無料で取得しましょう。
ソースをgithubからcloneし、依存パッケージをインストールします。
-dオプション以下はメールアドレスのドメインを指定します。
1 2 3 4 5 |
# git clone https://github.com/certbot/certbot # cd certbot # ./certbot-auto -n # ./certbot-auto certonly --standalone -d voicemaker.net -m ippei@geekfeed.co.jp |
証明書は
/etc/letsencrypt/live/voicemaker.net
以下にダウンロードされます。
postfixの設定
postfixはSMTPサーバーです。
その名の通り、単純にメールの送受信をやりとりするサーバーで本体とも言えます。
変更を行う箇所について解説していきます。
main.cf
myhostname
myhostnameはSMTPサーバーのFQDNを設定します。
今回の例ではメールサーバーにはサブドメインを使用していないので、FQDN=ドメイン名となります。
1 |
myhostname = voicemaker.net |
mydomain
mydomainはドメイン名を設定します。
FQDNが「mail.example.com」だとすると、ドメイン名は「example.com」です。
前述したように今回はFQDN=ドメイン名で設定します。
1 |
mydomain = voicemaker.net |
inet_interfaces
SMTPサーバーがListenするネットワークインターフェースアドレスを設定します。
どこから来たメールを受け付けるかです。
メールは色々なメールサーバーから届くのでallを設定します。
1 |
inet_interfaces = all |
mydestination
mydestinamtionはこのサーバーが、他のサーバーに転送せずにローカルに配送するドメインを指定します。
ここの設定は複数ドメインを1つのメールサーバーで受け取りたい時に便利です。
例えばこのサーバーでgeekfeed.xyzドメインのメールも受け取りたい場合、以下のように追記するだけです。
その場合、ippei@voicemaker.net宛のメールとippei@geekfeed.xyz宛のメールは同じメールボックスに入ります。
1 2 3 4 5 |
### voicemaker.netだけでいい mydestination = $myhostname, localhost.$mydomain, localhost ### geekfeed.xyzも受信したい mydestination = $myhostname, localhost.$mydomain, localhost, geekfeed.xyz |
local_recipient_maps
ローカルユーザー名参照先を指定して、それ以外のユーザーにメールが来た場合は拒否をする設定です。
簡単にいうと、以下ではLinuxユーザー名とaliasマップをローカルユーザー名参照先としていて、
Linuxユーザーにippeiがいた場合はメールを届けて、存在しないユーザーのsanpeiにメールが来たら拒否するよという設定です。
1 |
local_recipient_maps = unix:passwd.byname $alias_maps |
home_mailbox
home_mailboxはメールボックスファイルの、ユーザーのホームディレクトリからの相対パスを設定します。
Mailr/(スラッシュを必ず付ける)を設定するとqmail-style deliveryというのになるらしい。
1 2 3 4 5 |
home_mailbox = Maildir/ ### /home/ippei/Maildir/ 以下がメールボックスになる |
virtual_alias_maps
先程mydestinationで別ドメインのメールを受信する方法を説明しましたが、このvirtual_alias_mapsを設定することで、別ドメインにメールが来た際に転送する設定をすることができます。
それ以外にも、メーリングリスト設定などもすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
virtual_alias_maps = hash:/etc/postfix/virtual,regexp:/etc/postfix/virtual.users ###以下 /etc/postfix/virtual 設定例 # ippei@geekfeed.xyzへのメールをippei@voicemaker.netに転送する ippei@geekfeed.xyz ippei@voicemaker.net # contact@voicemaker.netへのメールをユーザーippeiとuchiに転送する contact@voicemaker.net ippei, uchi ###以下 /etc/postfix/virtual.users 設定例 # ippei0voicemaker.net ~ ippei9@voicemaker.netへのメールをippei@geekfeed.co.jpに転送する /^ippei\+[0-9]+(@voicemaker\.net)?$/ ippei@geekfeed.co.jp |
postfixのSSL/TLS設定
main.cfに以下の設定を追加します。
デフォルトで有効になっている設定もあると思うので、その場合は確認、修正をしてください。
1 2 3 4 5 6 7 8 9 10 11 12 |
# TLSを有効化する smtpd_tls_security_level = may # 証明書を指定 smtpd_tls_cert_file = /etc/letsencrypt/live/voicemaker.net/fullchain.pem # 秘密鍵を指定 smtpd_tls_key_file = /etc/letsencrypt/live/voicemaker.net/privkey.pem # セッションをキャッシュ smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_tls_scache # キャッシュされたセッションのタイムアウト時間を指定 smtpd_tls_session_cache_timeout = 3600s # ログレベルを指定 smtpd_tls_loglevel = 2 |
master.cf
以下の設定にします。
1 2 3 4 5 6 7 8 9 10 |
smtp inet n - n - - smtpd submission inet n - n - - smtpd -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject ### 以下変更なし |
設定が完了したら、postfixを再起動します。
1 |
# systemctl restart postfix |
dovecotの設定
dovecot.conf
dovecotはimapとpop3が通信可能なように設定します。
1 |
protocols = imaps pop3s |
10-master.conf
imapsとpop3sのポートを指定し、SSLを有効にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 } } |
10-ssl.conf
postfixと同様にSSLを有効化して証明書のpathを設定します。
1 2 3 |
ssl = required ssl_cert = </etc/letsencrypt/live/voicemaker.net/fullchain.pem ssl_key = </etc/letsencrypt/live/voicemaker.net/privkey.pem |
10-mail.conf
メールボックスの設定をします。
1 |
mail_location = maildir:~/Maildir |
設定変更を行ったあとには、dovecotを再起動します。
1 |
# systemctl restart dovecot |
saslauthdの設定
postfixでのSMTP認証にSASL(Simple Authentication and Security Layer)を利用します。
/etc/sasl2/smtpd.confを以下の設定にすることで、PAMをあ使用してUNIXユーザーでの認証が可能になります。
1 2 |
pwcheck_method: saslauthd mech_list: plain login |
設定後、saslauthdを再起動します。
1 |
# systemctl restart saslauthd |
試食(動作確認)
ユーザーの作成
まずはメールを受信するユーザーを作成します。
認証にはUNIXユーザー情報を使用するので、useraddコマンドで追加となります。
1 2 3 4 5 6 |
# useradd -s /sbin/nologin ippei [root@v157-7-244-38 postfix]# passwd ippei ユーザー ippei のパスワードを変更。 新しいパスワード: 新しいパスワードを再入力してください: passwd: すべての認証トークンが正しく更新できました。 |
shellの指定がnologinにするかはお好みで決めてください。
パスワードも忘れず設定しましょう。
メーラーへ登録
今回はGmailクライアントを使用してメールの送受信を行います。
まずは受信メールから設定すると楽です。
「メールの取得にセキュリティで保護された接続(SSL)を使用する。」にチェックを必ず入れましょう。
受信設定は確認メールなしで完了です。
以下は送信メールの設定です。
確認メールがGmailへ届くので、完了すると送信ができるようになります。
おわりに
以上でセキュリティ的に問題のないメールサーバーの構築は終了です。
コンフィグ関連の設定が結構ややこしいですね。
メールサーバーはサーバー構築の中でも結構レベルが高いと思います。
原因は、設定にあたって内部的な通信の仕組み等がわかっていないといけないからだと思います。
そういった部分について、後半の記事で解説して行こうと思いますのでぜひ読んでください!!
後半記事↓
CentOS8産自家製メールサーバーのオープンソース仕立て ~SMTP認証と通信プロトコル解説を添えて~ 後編
- 組織内のIPv4アドレス(EIP)を自動通知してコスト削減する - 2024-12-03
- 組織内のAWSコスト最適化のためにやっている7つのこと - 2024-12-01
- Amazon Connect Contact Lens + iPaaSで生成AI活用&他サービス連携を簡単に実現!– Amazon Connect アドベントカレンダー 2024 - 2024-12-01
- AWS Step Functionsの基本を再学習しました - 2024-09-23
- Amazon SESでバウンスメールを管理する - 2024-07-07