構造図
基本環境
dnsレコード設定
linuxユーザー作成
データベース設定
postfixadmin-ドメインとアドレス管理
postfix-送信サーバー
dovecot-受信サーバー
spamassassin-スパム対策
postfix送信テスト
dovecot受信テスト
メールログの確認
メールアドレス作成
メールクライアント設定
ssl/tls暗号化
postfixのssl/tls設定
dovecotのssl/tls設定
ファイアウォール確認
ssl/tlsメールクライアント設定
迷惑メール振分防止dnsレコード設定
エラーログ確認
参考記事
#基本環境
CentOS-7.9.2009
Apache-2.4.6
php-8.0.10
MariaDB-10.6.4
example.comでLet'sEncryptによるSSL取得済み
#dnsレコード設定
ドメイン管理会社のDNSレコード設定にて操作
Aレコード
ホスト名:example.com
TYPE:A
TTL:3600
VALUE:***.***.***.***<IPアドレス>
ホスト名:mail.example.com
TYPE:A
TTL:3600
VALUE:***.***.***.***<IPアドレス>
MXレコード
ホスト名:example.com
TYPE:MX
TTL:3600
VALUE:mail.example.com
優先:10
ホスト名の正引き確認
bind-utilsインストール
# yum -y install bind-utils
正引き確認
# host mail.example.com
mail.example.com has address <IPアドレス>
#linuxユーザー作成
mailuserグループに属するmailuserユーザーを作成
uid=5000
gid=5000
# mkdir /home/mailuser
# groupadd -g 5000 mailuser
# useradd -g mailuser -u 5000 -d /home/mailuser -s /sbin/nologin mailuser
#データベース設定
###MySQLログイン
# mariadb -u root -p
Enter password:
******
MariaDB [(none)]>
###データベース「PostFixDB」作成
CREATE DATABASE PostFixDB character set utf8 collate utf8_bin;
###データベース一覧で確認
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| PostFixDB |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
8 rows in set (0.001 sec)
###Postfix用ユーザー「postfix」作成
MariaDB [(none)]> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '[MySQLユーザーパスワード]';
GRANT ALL ON PostFixDB.* TO "postfix"@"localhost";
###データベース「PostFixDB」に入る
MariaDB [(none)]> USE PostFixDB;
Database changed
MariaDB [PostFixDB]>
###ユーザー「postfix」の権限確認
MariaDB [PostFixDB]> SHOW GRANTS FOR postfix@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for postfix@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `postfix`@`localhost` IDENTIFIED BY PASSWORD '*205201BC4A2520ADFCF65CACEC977E2BCCD10174' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `PostFixDB`.* TO `postfix`@`localhost` |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
#postfixadmin-ドメインとアドレス管理
###PostfixAdmin-2.92動作せず
最初、参考記事コピペでPostfixAdmin-2.92インストールしたが、セットアップページが表示されない
調べると、php8.0には3.3.4以上でないと適合しないことが判明
https://github.com/postfixadmin/postfixadmin/releases
###PostfixAdmin-3.3.10動作せず
ならばと、最新バージョンPostfixAdmin-3.3.10インストールしたが、データベースのアップデート途中で書き換えエラー発生
ダウンロードページをよく見ると3.3.9と3.3.10には「bug fixes」の表記あるため回避し、PostfixAdmin-3.3.8 をインストール
###PostfixAdmin-3.3.8インストール成功
SSL通信で使えるように「example.com」配下へインストール
# cd /var/www/html/example.com
# wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.8.tar.gz
# ls /var/www/html/example.com
postfixadmin-3.3.8.tar.gz
# tar zxvf postfixadmin-3.3.8.tar.gz
# ls /var/www/html/example.com
postfixadmin-3.3.8.tar.gz postfixadmin-postfixadmin-3.3.8
# mv postfixadmin-postfixadmin-3.3.8 postfixadmin
###config.local.phpでの設定
config.inc.phpをコピーしてconfig.local.phpを作成
# cp /var/www/html/postfixadmin/config.inc.php /var/www/html/postfixadmin/config.local.php
config.local.phpに設定書き込み
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixa';
$CONF['database_password'] = '<パスワード>';
$CONF['database_name'] = 'PostFixDB';
templates_cディレクトリを作成
# mkdir /var/www/html/postfixadmin/templates_c
# ls /var/www/html/postfixadmin/
# chown -R apache:apache /var/www/html/postfixadmin/templates_c
# chmod 777 /var/www/html/postfixadmin/templates_c
# ls -l /var/www/html/postfixadmin/
###バーチャルホスト設定
バーチャルホスト設定がまだの場合は、以下を設定
<virtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html/example.com
RewriteEngine on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
<IfModule mod_ssl.c>
<virtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html/example.com
ServerAlias mail.example.com
AllowEncodedSlashes On
CustomLog logs/example.com.access.log combined
ErrorLog logs/example.com.error.log
<Directory /var/www/html/example.com>
SetEnv HTTP_X_FORWARDED_PROTO http
SetEnv REAL_HOST_NAME example.com
AllowOverride All
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</virtualHost>
</IfModule>
###ブラウザ操作
ブラウザでアクセス
https://example.com/postfixadmin/public/setup.php
SetupPasswordに任意のパスワードを入力し、Generate password hash
ボタンをクリック
表示されたパスワードをconfig.local.phpの$CONF[‘setup_password’] = ‘changeme’;内に入力
$CONF[‘setup_password’] = ‘*****’;
ブラウザをリロード
https://example.com/postfixadmin/public/setup.php
システム管理者の登録
Setup password
に先ほどと同じSetup passwordを入力
管理者
に連絡先メールアドレス
パスワード
に任意のログインパスワード
パスワード(確認)
に上記と同じパスワード
管理者追加
をクリック
PostfixAdminにログイン
https://nakatou.jp/postfixadmin/public/login.php
#postfix-送信サーバー
###Postfixインストール
# yum install gcc gcc-c++ pcre-devel zlib-devel make wget openssl-devel
# yum install libxml2 libxml2-devel libxslt-devel libxslt libxslt-devel gd-devel
# yum install perl-ExtUtils-Embed GeoIP-devel gperftools-devel flex libcap-devel
# yum install postfix cyrus-sasl-md5 libdbi-dbd-mysql cyrus-sasl-plain
###Postfix設定ファイルの編集
Postfixのファイル構造
/etc/postfix/main.cf
∟/etc/postfix/mysql_virtual_alias_maps.cf
∟/etc/postfix/mysql_virtual_domains_maps.cf
∟/etc/postfix/mysql_virtual_mailbox_maps.cf
/etc/postfix/master.cf
/etc/postfix/main.cfをバックアップの後、編集します
# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.cp
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
mydestination =
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown
# 最終行に追加します
# SMTP-Auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = $mydomain
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client truncate.gbudb.net,
check_client_access hash:/etc/postfix/reject_client,
permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
# Virtual Domains
local_transport = local
virtual_transport = virtual
virtual_mailbox_base = /home/mailuser
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_uid_maps = static:500
virtual_gid_maps = static:5000
# Mailbox limit(クォーターの設定はなし)
virtual_mailbox_limit = 0
/etc/postfix/master.cfをバックアップの後、編集します
# cp -p /etc/postfix/master.cf /etc/postfix/master.cf.cp
↓コメントアウト外す
submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
↓コメントアウト外す
-o smtpd_sasl_auth_enable=yes
###Postfix設定ファイルの作成
バーチャルドメイン各種ファイル作成
mysql_virtual_alias_maps.cf
user = postfix
password = ****
hosts = localhost
dbname = PostFixDB
table = alias
select_field = goto
where_field = address
mysql_virtual_domains_maps.cf
user = postfix
password = ****
hosts = localhost
dbname = PostFixDB
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'
mysql_virtual_mailbox_maps.cf
user = postfix
password = ****
hosts = localhost
dbname = PostFixDB
table = mailbox
select_field = maildir
where_field = username
reject_clientファイル生成
# sudo touch /etc/postfix/reject_client
# sudo postmap /etc/postfix/reject_client
###Postfix設定ファイルのチェック
# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
local_transport = local
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination =
mydomain = example.com
myhostname = example.com
mynetworks = 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP unknown
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client truncate.gbudb.net, check_client_access hash:/etc/postfix/reject_client, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
unknown_local_recipient_reject_code = 550
virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/mailuser
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual
virtual_uid_maps = static:5000
#dovecot-受信サーバー
###Dovecotインストール
# yum -y install dovecot dovecot-mysql
###サーバー内で権限変更
# chown -R mailuser:dovecot /etc/dovecot
# chmod -R o-rwx /etc/dovecot
###Dovecot設定ファイルの編集
ファイル構造
/etc/dovecot/dovecot.conf
∟ /etc/dovecot/local.conf
∟/etc/dovecot/dovecot-sql.conf.ext
dovecot.conf編集
cp -p /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.cp
protocols = imap pop3
↓コメントアウト入れる
#!include conf.d/*.conf
↓下記追加
!include_try local.conf
local.conf作成
/etc/dovecot/conf.d/以下のconf設定ファイルをまとめる
以下のファイルをひとまとめにし、システムアップデートに対応するため
10-mail.conf
10-master.conf
10-auth.conf
10-ssl.conf
20-pop3.conf
auth-sql.conf.ext
auth_debug_passwords = yes
auth_verbose = no
auth_debug = yes
listen = *
###from 10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = PLAIN LOGIN CRAM-MD5
###from 10-mail.conf
mail_location = maildir:/home/mailuser/%d/%n
mail_uid = mailuser
mail_gid = mailuser
mail_privileged_group = mailuser
first_valid_uid = 5000
first_valid_gid = 5000
mail_plugins = quota
###from 10-ssl.conf
ssl = no
###from 10-master.conf
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
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = mailuser
group = mailuser
}
unix_listener auth-userdb {
mode = 0600
user = mailuser
group = mailuser
}
user = dovecot
}
service auth-worker {
user = mailuser
}
###from auth-sql.conf.ext
protocol imap {
imap_client_workarounds = delay-newmail tb-extra-mailbox-sep
mail_plugins = $mail_plugins imap_quota
}
protocol pop3 {
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
}
}
dovecot-sql.conf.ext作成
driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=PostFixDB user=postfix password=****
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/mailuser/', maildir) as home, 5000 as uid, 5000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT userid AS username, domain FROM users
###オプション----ここから↓
上記local.confの作成しない場合、以下の編集・作成を行う
10-mail.conf編集
# cp -p /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.cp
mail_location = maildir:/home/mailuser/%d/%n
first_valid_uid = 5000
first_valid_gid = 5000
10-master.conf編集
# cp -p /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.cp
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
mode = 0660
}
inet_listener imap {
port = 143 ←有効化
}
inet_listener imaps {
#port = 993
#ssl = yes
}
inet_listener pop3 {
port = 110 ←有効化
}
inet_listener pop3s {
#port = 995
#ssl = yes
}
10-auth.conf編集
# cp -p /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.cp
#auth_mechanisms = plain
↓
auth_mechanisms = plain login
disable_plaintext_auth = no
↓コメントアウト外す
!include auth-system.conf.ext
!include auth-sql.conf.ext
10-ssl.conf編集
# cp -p /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.cp
ssl = no
20-pop3.conf編集
# cp -p /etc/dovecot/conf.d/20-pop3.conf /etc/dovecot/conf.d/20-pop3.conf.cp
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
mail_max_userip_connections = 1000
}
auth-sql.conf.ext作成
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
dovecot-sql.conf.ext作成
driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=PostFixDB user=postfix password=****
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/mailuser/', maildir) as home, 5000 as uid, 5000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT userid AS username, domain FROM users
###オプション----ここまで↑
###Dovecot設定ファイルのチェック
# doveconf -n
# 2.2.36 (1f10bfa63): /etc/dovecot/dovecot.conf
# OS: Linux 3.10.0-1160.41.1.el7.x86_64 x86_64 CentOS Linux release 7.9.2009 (Core) ext4
# Hostname: v157-7-134-162.myvps.jp
auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_gid = 5000
first_valid_uid = 5000
mail_location = maildir:/home/mailuser/%d/%n
mbox_write_locks = fcntl
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
driver = pam
}
passdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
passdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocols = imap pop3
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0660
user = postfix
}
}
service imap-login {
inet_listener imap {
port = 143
}
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 0
}
}
ssl = no
userdb {
driver = passwd
}
userdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
userdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocol pop3 {
mail_max_userip_connections = 1000
pop3_uidl_format = %08Xu%08Xv
}
#spamassassin-スパム対策
###spamassassinインストール
# yum -y install spamassassin
###spamassassinシステムユーザを作成
# groupadd spamd
# useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
# chown spamd:spamd /var/log/spamassassin
###spamassassin設定
smtp inet n - n - - smtpd
↓以下に変更
smtp inet n - n - - smtpd -o content_filter=spamassassin
↓以下を追加
spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
###Postfix有効化
Postfix自動起動設定
# systemctl enable postfix
Postfix自動起動設定の確認
# systemctl is-enabled postfix
enableが返ってきたらOK
Postfix再起動
# systemctl restart postfix
###Dovecot有効化
Dovecot自動起動設定
# systemctl enable dovecot
Dovecot自動起動設定の確認
# systemctl is-enabled dovecot
enableが返ってきたらOK
Dovecot再起動
# systemctl restart dovecot
###saslauthd有効化
saslauthd自動起動設定
# systemctl enable saslauthd
saslauthd自動起動設定の確認
# systemctl is-enabled saslauthd
enableが返ってきたらOK
saslauthd再起動
# systemctl restart saslauthd
###spamassassin有効化
spamassassin自動起動設定
# systemctl enable spamassassin
spamassassin自動起動設定の確認
# systemctl is-enabled spamassassin
enableが返ってきたらOK
spamassassin再起動
# systemctl restart spamassassin
#postfix送信テスト
ポート番号:
smtp 587
smtps 465
# telnet localhost 587
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 <サーバー名> ESMTP unknown
EHLO localhost
250-<サーバー名>
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL From: <送信元メールアドレス>
250 2.1.0 Ok
RCPT To: <送信先メールアドレス>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: <送信元メールアドレス>
To: <送信先メールアドレス>
Subject: Test Mail
This is a test.
.
250 2.0.0 Ok: queued as 8166B81020
quit
221 2.0.0 Bye
Connection closed by foreign host
送信先メールアドレスで着信したか、確認する
#dovecot受信テスト
ポート番号:
pop3 110
pops3 995
imap 143
imaps 993
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK ready.
USER <ユーザー名>
+OK
PASS <パスワード>
+OK
LIST
+OK
1 1366
.
RETR <メール番号>
+OK
Return-Path: <メールアドレス>
Received: from <送信元メールアドレス> (HELO aki) (192.168.1.1)
by 192.168.1.2 with SMTP; 9 Jul 2009 11:40:48 +0900
Subject:<件名>
From:<送信元メールアドレス>
To:<受信メールアドレス>
X-UIDL: 1234567890
<本文>
.
DELE <メール番号>
+OK
QUIT
+OK
Connection closed by foreign host.
#メールログの確認
# cat /var/log/maillog
# cat /var/log/dovecot.log
#メールアドレス作成
###Postfixadminで登録
https://example.com/postfixadmin/public/login.php
ドメイン登録
example.com
メールアドレス登録
info@example.com
###サーバー内にディレクトリが作成されていることを確認
ドメイン用ディレクトリ
# ls /home/mailuser/
example.com
メールアドレス用ディレクトリ
# ls /home/mailuser/example.com/
info
#メールクライアント設定
ローカル内のメールクライアントでメールアドレス設定
POP3とIMAP両方でテスト
POP3受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:STARTTLS
ポート番号:110
認証:PLAIN
IMAP受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:STARTTLS
ポート番号:143
認証:PLAIN
SMTP
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:STARTTLS
ポート番号:587
###送受信テスト
メールクライアント上でメール送受信テストを行う
POP3およびIMAPで設定し送受信テスト
#ssl/tls暗号化
example.comには、すでにLet'sEncryptでSSL証明書を発行済
###Let'sEncrypt自動更新後の再起動設定
PostfixとDovecotでこの証明書を利用するには、証明書更新後に再起動が必要のため設定
00 3 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
設定の確認
# crontab -l
00 3 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
00 5 * * * certbot renew -q --deploy-hook "systemctl restart httpd postfix dovecot"
#postfixのssl/tls設定
main.cf編集
# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.cp2
### SSL/TLS Settings
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/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
master.cf編集
# cp -p /etc/postfix/master.cf /etc/postfix/master.cf.cp2
↓コメントアウト外す
smtps 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=ORIGINATING
postfix設定の確認
# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = all
local_transport = local
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination =
mydomain = nakatou.jp
myhostname = mail.nakatou.jp
mynetworks = 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_security_level = may
smtpd_banner = $myhostname ESMTP unknown
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net, reject_rbl_client cbl.abuseat.org, reject_rbl_client truncate.gbudb.net, check_client_access hash:/etc/postfix/reject_client, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
unknown_local_recipient_reject_code = 550
virtual_alias_domains = $virtual_alias_maps
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/mailuser
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 0
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 5000
virtual_transport = virtual
virtual_uid_maps = static:5000
postfixエラーチェック
# postfix check
postfix再起動
# systemctl restart postfix
postfixステータス確認
# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
Active: active (running) since 月 2021-09-20 16:44:34 JST; 10s ago
Process: 13336 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
Process: 13355 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Process: 13349 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
Process: 13346 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
Main PID: 13426 (master)
CGroup: /system.slice/postfix.service
├─13426 /usr/libexec/postfix/master -w
├─13427 pickup -l -t unix -u
├─13428 qmgr -l -t unix -u
├─13429 smtpd -n smtp -t inet -u -o stress= -s 2
├─13430 proxymap -t unix -u
├─13431 anvil -l -t unix -u
└─13432 smtpd -n smtp -t inet -u -o stress= -s 2
ポート番号465でのリッスン確認
# netstat -nat
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN
LISTENになっていればオーケー
#dovecotのssl/tls設定
local.conf編集
cp -p /etc/dovecot/local.conf /etc/dovecot/local.conf.cp
###from auth-sql.conf.ext
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
}
}
###from 10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/example.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.jp/privkey.pem
###オプション----ここから↓
上記local.confを使用しない場合、以下の編集・作成を行う
10-ssl.conf編集
# cp -p /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.cp2
ssl = required
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem
10-master.conf編集
# cp -p /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.cp2
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
}
}
###オプション----ここまで↑
dovecot設定確認
# doveconf -n
# 2.2.36 (1f10bfa63): /etc/dovecot/dovecot.conf
# OS: Linux 3.10.0-1160.42.2.el7.x86_64 x86_64 CentOS Linux release 7.9.2009 (Core) ext4
# Hostname: v157-7-134-162.myvps.jp
auth_mechanisms = plain login
disable_plaintext_auth = no
first_valid_gid = 5000
first_valid_uid = 5000
mail_location = maildir:/home/mailuser/%d/%n
mbox_write_locks = fcntl
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocols = imap pop3
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0660
user = postfix
}
}
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 = required
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = # hidden, use -P to show it
userdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocol pop3 {
mail_max_userip_connections = 1000
pop3_uidl_format = %08Xu%08Xv
}
dovecot再起動
# systemctl restart dovecot
dovecotステータス確認
# systemctl status dovecot
● dovecot.service - Dovecot IMAP/POP3 email server
Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
Active: active (running) since 月 2021-09-20 17:49:15 JST; 14s ago
Docs: man:dovecot(1)
http://wiki2.dovecot.org/
Process: 13667 ExecStop=/usr/bin/doveadm stop (code=exited, status=0/SUCCESS)
Process: 13683 ExecStart=/usr/sbin/dovecot (code=exited, status=0/SUCCESS)
Process: 13679 ExecStartPre=/usr/sbin/portrelease dovecot (code=exited, status=0/SUCCESS)
Process: 13672 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
Main PID: 13685 (dovecot)
CGroup: /system.slice/dovecot.service
├─13685 /usr/sbin/dovecot
├─13686 dovecot/anvil
├─13687 dovecot/log
├─13689 dovecot/config
├─13690 dovecot/auth
└─13691 dovecot/auth -w
ポート番号POP3S用の995と、IMAPS用の993でのリッスン確認
# netstat -nat
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN
#ファイアウォール確認
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ftp http https imap pop3 smtp smtp-submission ssh
ports: 63963/tcp 61000-61005/tcp 443/tcp 993/tcp 80/tcp 25/tcp 465/tcp 587/tcp 995/tcp 110/tcp 143/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
services:
内に
imaps smtps pop3s
が含まれているか確認
含まれていない場合は追加
追加項目が1個の場合は{}外す
# firewall-cmd --add-service={smtps,imaps,pop3s} --permanent
success
設定の読み込み
# firewall-cmd --reload
success
設定の確認
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ftp http https imap imaps pop3 pop3s smtp smtp-submission smtps ssh
ports: 63963/tcp 61000-61005/tcp 443/tcp 993/tcp 80/tcp 25/tcp 465/tcp 587/tcp 995/tcp 110/tcp 143/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
imaps smtps pop3s
が含まれていることを確認
#ssl/tlsメールクライアント設定
ローカル内のメールクライアントでメールアドレス設定
POP3とIMAP両方でテスト
POP3受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:SSL/TLS
ポート番号:995
認証:PLAIN
IMAP受信
メールアドレス:info@example.com
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:SSL/TLS
ポート番号:993
認証:PLAIN
SMTP
ユーザー名:info@example.com
受信サーバー:mail@example.com
セキュリティ:SSL/TLS
ポート番号:465
###認証できない場合
エラーログ確認
cat /var/log/maillog
###送受信テスト
メールクライアント上でメール送受信テストを行う
POP3SおよびIMAPSで設定し送受信テスト
#迷惑メール振分防止dnsレコード設定
###SPFレコード設定
TXTレコード
ホスト名:example.com
TYPE:TXT
TTL:3600
VALUE:v=spf1 a:mail.example.com ~all
設定状況の確認
以下のウェブサイトにアクセス
https://www.kitterman.com/spf/validate.html
Is this SPF record valid - syntactically correct?以下に
Domain:example.com
SPF Record:v=spf1
を入力し、Check SPF record
をクリック
SPF record passed validation test with pySPF (Python SPF library)!
と表示されれば登録が成功している
Results – PermError SPF Permanent Error: Too many DNS lookups
と表示されれば不具合あり
###DKIM設定
▶︎インストール
EPELレポジトリが未インストールならインストール
# yum -y install epel-release
インストール前にopendkimパッケージの確認
# yum search opendkim
opendkim.x86_64 : A DomainKeys Identified Mail (DKIM) milter to sign and/or verify mail
が含まれているかを確認
opendkimパッケージの詳細を確認
# yum info opendkim
説明にメールに電子署名を行うためのパッケージであることが記載されているのを確認
opendkimパッケージインストール
# yum -y install opendkim
インストール状況の確認
# yum list installed | grep opendkim
libopendkim.x86_64 2.11.0-0.1.el7 @epel
opendkim.x86_64 2.11.0-0.1.el7 @epel
▶︎秘密鍵作成
フォルダ作成
# mkdir /etc/opendkim/keys/example.com
電子署名用のキーペア作成
opendkim-genkey -D <ファイル保存パス>/ -d <ドメイン名> -s <セレクタ名>
セレクタ名には作成日を6桁数字で入れるのがわかりやすい
# opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s 181026
作成状況の確認
# ls -al /etc/opendkim/keys/example.com/
合計 16
drwxr-xr-x 2 root root 4096 10月 26 10:09 .
drwxr-x--- 3 opendkim opendkim 4096 10月 26 10:08 ..
-rw------- 1 root root 891 10月 26 10:09 181026.private
-rw------- 1 root root 333 10月 26 10:09 181026.txt
キーペア(秘密鍵/公開鍵)ファイルの所有者変更
# chown -R opendkim:opendkim /etc/opendkim/keys/example.com/
変更状況の確認
# ls -al /etc/opendkim/keys/example.com/
合計 16
drwxr-xr-x 2 opendkim opendkim 4096 10月 26 10:09 .
drwxr-x--- 3 opendkim opendkim 4096 10月 26 10:08 ..
-rw------- 1 opendkim opendkim 891 10月 26 10:09 181026.private
-rw------- 1 opendkim opendkim 333 10月 26 10:09 181026.txt
公開鍵の確認
# cat /etc/opendkim/keys/example.com/181026.txt
181026._domainkey IN TXT ( "v=DKIM1; k=rsa;
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9rSuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuviCRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB" ) ; ----- DKIM key 181026 for example.com
公開鍵の見方
v=DKIM1: keyレコードのバージョン番号(指定する場合はDKIM1)
k=rsa: 電子署名の作成に利用できる鍵の形式、DKIMではRSAのみサポート
p=....: 公開鍵データ
▶︎公開鍵用レコードの登録
サーバーのDNSレコード設定ページより登録
ホスト名:<セレクタ名>._domainkey.<ドメイン名>
TYPE:TXT
TTL:3600
VALUE:v=DKIM1; k=rsa; p=<公開鍵データ>
▶︎ADSPレコード登録
ホスト名:_adsp._domainkey.<ドメイン名>
TYPE:TXT
TTL:3600
VALUE:dkim=unknown
▶︎DKIM設定の確認
公開鍵設定の確認
# dig <セレクタ名>._domainkey.<ドメイン名> txt
<<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> <セレクタ名>._domainkey.<ドメイン名> txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39057
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;<セレクタ名>._domainkey.<ドメイン名>. IN TXT
;; ANSWER SECTION:
<セレクタ名>._domainkey.<ドメイン名>. 500 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFOu6xDK9rSuttAbMNY9Cs2cmOWxUV48kMvalmFo0trkL6zoncBvYyCZ7z4o9F79cWPQCLSNLuviCRbS9k5LsZEr9M8nM+k+zqYQKh8ttTWMt5odvpcz6C4miQMJ/Cc2gfcpRQDFWWSqm2O6BhALV7p1tzUmbchLxtBRtjcMXXTQIDAQAB"
;; Query time: 2 msec
;; SERVER: 157.7.180.133#53(157.7.180.133)
;; WHEN: 金 10月 26 10:34:29 JST 2018
;; MSG SIZE rcvd: 315
ADSPレコード設定の確認
# dig _adsp._domainkey.<ドメイン名> txt
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> _adsp._domainkey.<ドメイン名> txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16470
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_adsp._domainkey.<ドメイン名>. IN TXT
;; ANSWER SECTION:
_adsp._domainkey.<ドメイン名>. 500 IN TXT "dkim=unknown"
;; Query time: 3 msec
;; SERVER: 157.7.180.133#53(157.7.180.133)
;; WHEN: 金 10月 26 10:34:58 JST 2018
;; MSG SIZE rcvd: 82
#エラーログ確認
cat /var/log/dovecot.log
cat /var/log/maillog
#参考記事
基本の流れ
https://ex1.m-yabe.com/archives/4606
telnet送信テスト
http://ash.jp/net/telnet_smtp.htm
telnet受信テスト
https://centossrv.com/memo/log/19.shtml
PostfixAdmin
https://ac-5.net/linux/postfixadmin
SPFレコード
https://www.kagoya.jp/howto/it-glossary/mail/spf/
DKIM
https://www.rem-system.com/dkim-postfix04/#6_opendkim
SSL/TLS設定
https://www.rem-system.com/mail-postfix03/
spamassassin
https://www.zealseeds.com/Infrastructure/server/mail/index.html
Domain Quota(未設定)
https://e-garakuta.net/techinfo/doku.php/linux/postfix-virtual