ラズパイで作る自宅WEBサーバ構築
第8回 メールサーバ(Postfix/Dovecot) 設定・前編 2019.11.16 / 2021.07.29更新
今回はメールサーバー(Postfix)の設定を行います。
送信サーバーとしてPostfix、受信サーバーとして dovecot(ダヴコット) を使用します。
実際には、Postfix がメールの送信と着信監視も行っていて、着信するとサーバ内にメールを保存します。
それを取り出して提供するのが、dovecot です。
YouTube 動画でポイントを説明しています。上記画像をクリックすると再生できます。
本文では上記のような構成で説明しています。
Postfix の設定は多岐に渡り、また記述方法も多様ですので、参考にみてください。
また、複数ドメイン名に対応したVirtual設定は解説していません。
パッケージの有無を確認します
$ dpkg --get-selections | grep postfix
利用できるパッケージのバージョンの確認します
$ apt-cache show postfix
Package: postfix
Architecture: arm64
Version: 3.3.0-1
Postfix のインストール
$ sudo apt-get install postfix
メール設定の一般形式:[インターネットサイト] を選択します
システムメール名:example.jp ← 取得したドメイン名を入力してください
$ postconf | grep mail_version
mail_version = 3.3.0
myorigin を確認します
$ cat /etc/mailname
example.jp
/etc/postfix/main.cf の編集
下記の設定では、ルータ配下にある(LAN側)ノートパソコン(192.168.11.20)から送信を許可する設定になっています。
→第3回 Ubuntu 詳細設定 参照
許可するパソコンを追加する場合は、mynetworks に追加します。
$ sudo vi /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP unknown ← メールサーバ名の隠蔽化
myhostname = ns.example.jp
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, example.jp, localhost.example.jp, localhost
mynetworks = 192.168.11.21, 127.0.0.1,192.168.11.20
mailbox_size_limit = 1073741824 ← メールボックスサイズを1Gに制限
inet_protocols = ipv4 ← IPV4のみ
message_size_limit = 10485760 ← 送受信メールサイズを10Mに制限
home_mailbox = Maildir/ ← Maildir形式へ移行
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
↑受信者はUNIXアカウントもしくはローカルエイリアス
smtpd_client_restrictions =
permit_mynetworks,
reject_unknown_client, ← 逆引きができないホストの接続を拒否
permit
allow_mail_to_commands = alias, forward, include
default_privs = nobody ← 配送エージェントが使うデフォルト権限
【補足説明】
※ local_recipient_maps に「proxy:」を付けないと、メルアドに.(ドット)
例) hoge.hoge@example.jp
がある場合に受信拒否されてしまいます
Recipient address rejected: User unknown in local recipient table
※ allow_mail_to_commands に include を付加すると "| command" への配送が認められます
※ default_privs = nobody 外部ファイルまたはコマンドへの配送で、配送エージェントが使う デフォルトの権限です。特権ユーザや POSTFIX の所有者を指定してはいけません。
main.cf の内容を確認します。設定内容がダンプされ、末行に問題個所があれば出力されます
$ postconf -d (デフォルト値表示)
$ postconf
Postfix を再起動します
$ sudo service postfix restart
起動プロセスの確認
master, pickup, qmgr の3つのプロセスが起動していることを確認します。
$ ps -alx | grep master
$ ps -alx | grep pickup
$ ps -alx | grep qmgr
送信テスト
$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ns.example.jp ESMTP unknown
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
SMTPSのサーバ証明書と認証設定
証明書やサーバ用の秘密鍵は既存のものを利用した場合は、有効期限は 2029年までになっているようです。
SSL証明書の中身(期限のみ)を確認したい場合
$ openssl x509 -dates -noout -in /etc/ssl/certs/ssl-cert-snakeoil.pem
notBefore=May 20 21:00:27 2019 GMT
notAfter=May 17 21:00:27 2029 GMT
SSL証明書の中身(期限、フィンガープリント)を確認したい場合
$ openssl x509 -text -fingerprint -noout -in /etc/ssl/certs/ssl-cert-snakeoil.pem
※SSL証明書単体のcrtファイルも同じ方法で確認できます。
$ sudo vi /etc/postfix/main.cf
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
独自に証明書を作成する場合は、「SMTP 自己認証」などで検索すると、詳細に説明しているサイトを探すことができます。
Submissionポート(TCP587)の設定
現在、暗号化プロトコルSSL(Secure Sockets Layer)と呼ばれているものは、SSLの脆弱性を解消した次世代規格TLS(Transport Layer Security)です。
標準のSMTPポート番号は25です。
最初から全行程を暗号化するのが SMTP over SSL (ポート番号:465)です。
最初は平文で通信を始め、ネゴシエーション結果により途中から暗号化に転じるのが STARTTLS (25、587) です。
587番ポートはサブミッションポートと呼ばれています。
$ sudo vi /etc/postfix/master.cf
#submission inet n - y - - smtpd
#-o smtpd_tls_security_level=encrypt
↓コメントを外して編集
submission inet n - y - - smtpd
-o smtpd_tls_security_level=may
#smtps inet n - y - - smtpd
# -o smtpd_tls_wrappermode=yes
↓コメントを外す
smtps inet n - y - - smtpd
-o smtpd_tls_wrappermode=yes
※設定値を encrypt にしてしまうと、クライアントから接続時に
530 5.7.0 Must issue a STARTTLS command first
と必ずSTARTTLSをしてから送れ、と言われてしまうので、暗号化を必須としない may にしたほうが無難です。
SMTPポート(TCP25)の設定
STARTTLSはサブミッションポートの他、通常の25番ポートでも可能です。
通常のSMTPでSTARTTLSの設定を行うには、master.cfではなく main.cf を編集します。
$ sudo vi /etc/postfix/main.cf
smtpd_tls_security_level=may ← 追記します
平文でのやりとりが標準の25番ポートでは、暗号化できなくても仕方ないので、may を指定します。encrypt を指定してはいけません。
設定の反映とポートの確認
$ sudo systemctl restart postfix
$ sudo apt-get install net-tools
$ sudo netstat -anp | grep "master" | grep "0.0.0.0"
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 22620/master
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 22620/master
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 22620/master
開いているポートを確認します。
$ netstat -an | grep tcp | grep LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN
tcp 0 0 192.168.11.21:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp6 0 0 :::53 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
Submissionポートでの通信(STARTTLS)を確認します
1.送信元サーバーによるSMTPトランザクションの開始
2.EHLOへの応答により、通信相手サーバーがSTARTTLSに対応しているか判定
3.送信元と送信先のメールアドレスとメッセージの内容すべての暗号化通信開始
※.送信側・受信側両方がSTARTTLSに対応していないとメールは平文で送信されます
$ telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ns.example.jp ESMTP unknown
ehlo localhost
250-mail.example.com
250-STARTTLS ←ここを確認
250-AUTH DIGEST-MD5 NTLM CRAM-MD5
....
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
SMTP-AUTH(SASL2)の実装
もともとSMTPサーバには認証機能がありませんでした。
その認証を、普通にIDとパスワードを使ってやるのが「SMTP-AUTH(エスエムティーピー・オース)」です。
パッケージの確認とインストールを行います
$ dpkg --get-selections | grep sasl
libsasl2-2:arm64 install
libsasl2-modules:arm64 install
libsasl2-modules-db:arm64 install
$ apt-cache show sasl2-bin
Package: sasl2-bin
Architecture: arm64
Version: 2.1.27~101-g0780600+dfsg-3ubuntu2
$ sudo apt-get install sasl2-bin
◇テストユーザの作成
メールテスト用にユーザアカウントを1つ作っておきます。
$ sudo /usr/sbin/adduser --home /home/testuser --shell /bin/bash testuser
Enter new UNIX password: testpasswd
ログインできないユーザにします
$ sudo usermod -s /usr/sbin/nologin testuser
※testuser, testpasswd は任意に書き換えてください。
$ sudo saslpasswd2 -u example.jp -c testuser
Password: testpasswd
設定内容を確認します
$ sudo sasldblistusers2
testuser@example.jp: userPassword
※ユーザを削除する場合
$ sudo saslpasswd2 -u example.jp -d testuser
グループおよび権限を設定します
$ sudo chgrp postfix /etc/sasldb2
$ sudo chmod 640 /etc/sasldb2
Postfix が chroot環境で実行されているので、ハードリンクします(/etc/postfix/master.cf で確認)。
$ cd /var/spool/postfix/etc
$ sudo mv sasldb2 sasldb2_org ← 初期状態では sasldb2 はないかもしれません
$ sudo ln /etc/sasldb2 /var/spool/postfix/etc
Postfix に設定を追加します
$ sudo vi /etc/postfix/main.cf
smtpd_sasl_auth_enable=yes ←SMTP認証を使用する
smtpd_sasl_local_domain=example.jp
smtpd_recipient_restrictions=
permit_mynetworks,
permit_sasl_authenticated,
check_client_access hash:/etc/postfix/reject_client,
reject_unauth_destination
smtpd_sasl_security_options=noanonymous
※オプションの説明
permit_mynetworks:自サイトのネットワークからの接続を無条件で許可する
permit_sasl_authenticated:SMTP認証された接続を無条件で許可する
reject_unauth_destination:このサーバで配送終了とならないドメイン宛メール送信を却下する(不正中継対応)。
noanonymous:匿名での接続を拒否する
LOGIN認証や、PLAIN認証も含める場合には、「noanonymous」だけを設定します
設定を確認します
$ postconf
接続を確認します
$ telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ns.example.jp ESMTP unknown
ehlo localhost
250-ns.example.jp
:
250-AUTH PLAIN
:
quit
次回は、dovecot によるメール受信設定と迷惑メール防止について解説します。
|