※1.独自ドメインは取得しているものとする
※2.OSはcentOS7を想定
セキュアとは
今回利用することが出来るポート(送り付けるポート)番号は465か587。ポート番号自体は可変でも、メールのやり取りで通信を暗号化するとしたら、次の2つのプロトコルに大別される。
- SMTP over SSL(465)
SSLを利用して通信を最初から最後まで暗号化する。
- SMTP STARTTLS(587)
まず送信側と受信側で接続を行う。双方がSTARTTLSに対応している場合、通信の暗号化が行われます。入力は平文ですが通信自体が暗号化されます。
いずれにしてもエンド送信者から構築するMTA(Postfix)までの暗号化を保証するのみで、MTA間が暗号化されるかは各鯖の対応状況次第です。
必要なもの
- Postfix(MTA)
- SASL関連(不正中継を防ぐ認証システム)
- 証明書類
- 上記をインストール、設定
インストール、設定の前にここを見ておくといいかもです。
httpsをメールに読み替えるだけだと思えば楽です。
証明書類作成
今回はオレオレ認証局を作成します。
オレオレ認証局(root)秘密鍵作成
# openssl genrsa -out secretCA.key 2048
# chmod 400 secretCA.key
自己署名オレオレ認証局証明書作成
# openssl req -x509 -new -nodes -key secretCA.key -days 1024 -out secretCA.pem
SV秘密鍵作成
# openssl genrsa -out secret.key 2048
SV証明書署名要求作成
# openssl req -new -key secret.key -out server.csr
オレオレ認証局証明書とオレオレ認証局秘密鍵に基づいてSV証明書を発行
# openssl x509 -req -in server.csr -CA secretCA.pem -CAkey secretCA.key -CAcreateserial -out server.crt -days 500
今回は個人利用が目的のため、オレオレ認証局によるSSL通信を行っていますが、本来なら信頼のおける第三者による署名を行わなければ暗号化の意味がありません。
SASL設定
idとpasswordを要求するなどの認証、セキュリティ関連の処理を行うための層。
# yum install cyrus-sasl
平文で送信用(STARTTLSも設定するため)
# yum install cyrus-sasl-plain
MD5によるメッセージダイジェスト
# yum install cyrus-sasl-md5
Postfix設定
main.cfはPostfixの全体設定。
master.cfは各デーモン毎の設定。-oオプションでmain.cfの設定を上書きする。
Postfixインストール
# yum install postfix
main.cfを設定
# vi /etc/postfix/main.cf
各プロセスの実行者
mail_owner = postfix
ホストネーム。デフォはhostnameコマンドの結果が設定される。
myhostname = XXX.独自ドメイン
ドメイン名。取得したドメインを設定。
mydomain = 独自ドメイン
@以降のアドレスにドメインがないと補足。
myorigin = $mydomain
メールを受け取るインターフェースを指定
inet_interfaces = all
ipv4, ipv6両方に対応
inet_protocols = all
MUAや他のMTAから送信されたメールを自分宛として保存処理をするか、メール転送するかの判定。
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
受信したメッセージの宛先が、ローカルに存在するユーザかどうか。
local_recipient_maps = unix:passwd.byname $alias_maps
保存形式(同一ファイルか複数ファイル)
home_mailbox = Maildir/
宛先がローカル以外のメールの転送先。今回は目的の宛先が一つだけなのと、ここを介する必要があったので。
relayhost = [中継先ホスト名]:465 ※実装環境依存
telnet等で接続した時に表示されるバージョン情報。必要ないのでコメントアウト。あるいはunknownとか
# smtpd_banner = hogemoge ($mail_version)
sendmailコマンドのパス
sendmail_path = /usr/sbin/sendmail.postfix
newaliasコマンドのパス
newaliases_path = /usr/bin/newaliases.postfix
mailqコマンドのパス
mailq_path = /usr/bin/mailq.postfix
送信メッセージの一時格納場所のグループ
setgid_group = postdrop
#########################
saslの設定(認証部分)
#########################
dovecot認証ライブラリ(sasl)
smtpd_sasl_type = dovecot
認証ソケットファイルの場所。(/var/spool/postfixの相対パス)
smtpd_sasl_path = private/auth
sasl認証を有効化
smtpd_sasl_auth_enable = yes
パスワードファイルのパス
smtpd_sasl_password_maps = hash:/etc/postfix/sasl_passwd
認証時送信パスワードの暗号化。デフォでこの設定なので平文で送信する場合はnoanonymousのみ設定。
smtp_sasl_security_options = noanonymous, noplaintext
認証方法を試す順番
smtp_sasl_mechanism_filter = CRAM=MD5, PLAIN, LOGIN
認証時のレルムを設定
smtpd_sasl_local_domain = $myhostname
送信メールの制限設定。例:permit_mynetworksはローカルからのメールしか送信しない等
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
暗号化をクライアントに合わせる。自分しか使わない予定だけど、拡張性を優先。
smtpd_tls_security_level = may
証明書類のパス
smtpd_tls_key_file = secretCA.keyのパス
smtpd_tls_cert_file = server.crtのパス
smtpd_tls_CAfile = secretCA.pemのパス
ヘッダーサイズ指定
header_size_limit = 4096000
設定が完了したら起動。firewall設定。
# newaliases
# systemctl restart postfix.service
# systemctl restart saslauthd.service
# firewall-cmd --add-sevice=smtp
最終目標は自動月報送信スクリプト
会社で毎月必ず送信しなければならない月報を自動送信することが目標です。
こーいうの、本当下らない慣習だょ……
テストメールを送信する際にもおすすめ。
#!/bin/bash
TEMPSUBJECT="TEST MAIL";
BTEMPSUBJECT=`echo -n $TEMPSUBJECT | base64`;
SUBJECT="=?utf-8?B?$BTEMPSUBJECT?=";
BODYMSG="This is a test mail on SMTPS/STARTTLS";
SMTPHST=宛先ホスト名;
SMTPPRT="465"or"587";
MYDMIN=自ドメイン;
FRMADR=送信元メールアドレス;
TOADR=宛先メールアドレス;
USR=メールアドレスをbase64エンコード;
PASS=メールアドレス用パスワードをbase64エンコード;
(
echo "EHLO $MYDMIN"
sleep 1
echo "auth login"
echo "$USR"
echo "$PASS"
echo "mail from: $FRMADR"
echo "rcpt to: $TOADR"
echo "data"
echo "Content-Type: text/plain; charset=UTF-8"
echo "subject: $SUBJECT"
echo "from: $FRMADR"
echo "to: $TOADR"
echo ""
echo "$BODYMSG"
echo "."
echo "quit"
) | openssl s_client -connect ${SMTPHST}:${SMTPPRT} -crlf
最後の-crlfは注意。うちの会社のメールサーバはwindows上にあるらしく、改行コードの問題に気が付かず上手くいかなくてリアルに2~3日悩まされました。クソガ
長くなってしまったがこれで終了です。