はじめに
AWS EC2 のAmazon Linuxを想定し、Postfix、Dovecot、amavisd、Postfixadminで構築したときのメモです。
ドメインの登録、Elastic IPの割り当て、ポート 22, 25, 80, 143, 443, 465, 587, 993 は、開けてあるものとします。
メールサーバーの接続構成
タイプ | ポート番号 | 暗号化の種類 |
---|---|---|
SMTP | 25 | -- |
SMTPS | 465 | SSL/TLS |
SMTP | 587 | STARTTLS |
IMAP | 143 | STARTTLS |
IMAPS | 993 | SSL/TLS |
構築時の各バージョン
アプリなど | バージョン |
---|---|
Apache | 2.4.18 |
PHP | 5.6.19 |
Mysql | 5.6.29 |
Postfix | 2.6.6 |
Dovecot | 2.2.10 |
postfixadmin | 2.93 |
今回は、下記のような方法で サブドメインでアクセスするタイプになります。 | |
https://admin.ドメイン名/postfixadmin | |
WEBサーバーの構築
既に構築済みの場合は、読み飛ばしてかまわないです。
##インストール&サービスの登録
$ sudo yum install -y gcc httpd24 httpd24-devel mod24_ssl libcap-devel
$ sudo yum install -y php56 php56-mbstring php56-mcrypt php56-opcache php56-mysqlnd php56-gd php56-devel php56-imap
$ sudo chkconfig httpd on
mod_ruid2の作成
バーチャルホスト毎に、権限を変えたかったので、mod_ruid2を使います。
まずは、下記のサイトからDLし解凍しましょう。
$ wget https://github.com/mind04/mod-ruid2/archive/master.zip
$ unzip master.zip
$ sudo apxs -i -c -l cap mod-ruid2-master/mod_ruid2.c
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib64/httpd/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_ruid2.so
ビルド後、このようなメッセージがでれば、使用可能になります。
通常、自動でhttpd.conf内に書き込まれますが、無い場合、以下の物を書き込んでください。
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule ruid2_module modules/mod_ruid2.so
新規にpostfixadminで使用するバーチャルホストを作ります。
$ sudo vim apache:/etc/httpd/conf.d/admin.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName admin.ドメイン名:443
DocumentRoot /home/ec2-user/www/admin
<Directory "/home/ec2-user/www/admin">
Options -Indexes
Require all granted
Allow from all
AllowOverride All
</Directory>
<IfModule mod_ruid2.c>
RMode config
RUidGid ec2-user ec2-user
#RGroups apachetmp
</IfModule>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
<FilesMatch "\.(php)$">
SSLOptions +StdEnvVars
</FilesMatch>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/dmin_www_ssl_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ErrorLog logs/admin_www_ssl_err
</VirtualHost>
</IfModule>
個々の環境に合わせて設定してください。さらに、BASIC認証を付け加えても良いかもしれません。
ちなみに、/home/ec2-user/www/admin の中に、postfixadminを入れます。
ほかにも、phpMyAdminなど、管理者用のwebアプリを入れても良いかもしれません。
/home/ec2-user/www/admin の中に、下記の index.php をアップロードしてください。
<?php
header('HTTP', true, 404);
?>
404 (Not Found)
$ sudo service httpd start
webサーバーを起動後、**404 (Not Found)**が表示されているか確かめてください。
Mysqlの構築
##インストール&サービスの登録
$ sudo yum install -y mysql56 mysql56-server
$ sudo chkconfig mysqld on
$ sudo service mysqld start
phpMyAdminのすすめ
https://www.phpmyadmin.net/ より、ダウンロード&解凍し
/home/ec2-user/www/admin へphpMyAdminを入れることをおすすめします。
少し設定するだけで、直ぐに使用できます。詳しい説明は、ググってください。
メールサーバーで使用する、ユーザーとDBを作成
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfixのパスワード';
CREATE DATABASE postfix CHARACTER SET utf8;
GRANT ALL ON postfix.* to postfix@localhost;
メールサーバーの構築
##インストール&サービスの登録
$ sudo yum install -y postfix dovecot dovecot-mysql
$ sudo chkconfig postfix on
$ sudo chkconfig dovecot on
##MTAの切り変え
$ sudo alternatives --config mta
選択 コマンド
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.sendmail
2 /usr/sbin/sendmail.postfix
Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
2番を選択して終わり。
バーチャルドメイン用のユーザとメール用ディレクトリの作成
$ sudo groupadd -g 10000 vmail
$ sudo useradd -g vmail -u 10000 vmail -d /var/mail
$ sudo mkdir -p /var/mail/vhosts
$ sudo mkdir -p /var/mail/bin
$ sudo mkdir -p /var/mail/deleted-vhosts
$ sudo chmod -R 0700 /var/mail
$ sudo chown -R vmail:vmail /var/mail
smtpd用に暗号化ファイルを作る
dh2048.pemおよびdh512.pemは、Postfix SMTPサーバがEDH暗号で使うDHパラメータを持つファイル。
cert.pemは、PEMフォーマットの、Postfix SMTPサーバRSA証明書を持つファイル。
privkey.pemは、PEMフォーマットでの、Postfix SMTPサーバRSAプライベートキーを持つファイル。
$ sudo mkdir -p /etc/postfix/ssl/dhparams/
$ sudo openssl dhparam -out /etc/postfix/ssl/dhparams/dh2048.pem 2048
$ sudo openssl dhparam -out /etc/postfix/ssl/dhparams/dh512.pem 512
$ sudo mkdir -p /etc/postfix/ssl/selfsigned/
$ sudo openssl req -new -newkey rsa:4096 -days 3658 -sha256 -nodes -x509 \
-subj "/C=JP/ST=Shizuoka/L=Shizuoka/O=Mailserver certificate/OU=Mail/CN=www.ドメイン名/emailAddress=admin@ドメイン名" \
-keyout /etc/postfix/ssl/selfsigned/privkey.pem \
-out /etc/postfix/ssl/selfsigned/cert.pem
$ sudo chown -R vmail:vmail /var/mail
-subj は、個々の環境に合わせてください。
##postfixの設定
データベースへのアクセス用のクエリ作成
$ sudo mkdir -p /etc/postfix/mysql
virtual-alias-maps.cf
$ sudo vim /etc/postfix/mysql/virtual-alias-maps.cf
hosts = localhost
user = postfix
password = postfixのパスワード
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
virtual-mailbox-domains.cf
$ sudo vim /etc/postfix/mysql/virtual-mailbox-domains.cf
hosts = localhost
user = postfix
password = postfixのパスワード
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1
virtual-mailbox-maps.cf
$ sudo vim /etc/postfix/mysql/virtual-mailbox-maps.cf
hosts = localhost
user = postfix
password = postfixのパスワード
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
virtual-mailbox-limit-maps.cf
$ sudo vim /etc/postfix/mysql/virtual-mailbox-limit-maps.cf
user = postfix
password = postfixのパスワード
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
main.cfの編集
$ sudo vim /etc/postfix/main.cf
myhostname = mail.ドメイン名
mydomain = ドメイン名
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = localhost localhost.$mydomain
mynetworks = 127.0.0.0/8
header_checks = regexp:/etc/postfix/header_checks
mime_header_checks = regexp:/etc/postfix/header_checks
smtpd_banner = $myhostname ESMTP $mail_name
readme_directory = no
mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
biff = no
append_dot_mydomain = no
delay_warning_time = 4h
disable_vrfy_command = yes
message_size_limit = 51200000
mailbox_size_limit = 102400000
#
# ポストマスターに報告されるエラークラスのリスト
# 頻繁に送られて邪魔な場合は、コメントしてOK
#
notify_classes = resource, software
error_notice_recipient = admin@ドメイン名
#
# Smtp
#
smtp_tls_loglevel = 1
smtp_tls_security_level = may
#smtp_tls_CAfile =
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH
smtp_tls_note_starttls_offer = yes
#
# Smtpd
#
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_received_header = yes
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers = medium
#smtpd_tls_CAfile = $smtp_tls_CAfile
smtpd_tls_cert_file = /etc/postfix/ssl/selfsigned/cert.pem
smtpd_tls_key_file = /etc/postfix/ssl/selfsigned/privkey.pem
smtpd_tls_dh1024_param_file = /etc/postfix/ssl/dhparams/dh2048.pem
smtpd_tls_dh512_param_file = /etc/postfix/ssl/dhparams/dh512.pem
tls_preempt_cipherlist = yes
tls_random_source = dev:/dev/urandom
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
lmtp_tls_session_cache_database = btree:${data_directory}/lmtp_scache
#
# SASL
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
#
# Virtual mail box
#
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_minimum_uid = 10000
virtual_mailbox_base = /var/mail/vhosts
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual-alias-maps.cf
# 容量制限
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit = 102400000
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/virtual-mailbox-limit-maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#
# アクセス制限
#
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_rbl_client all.rbl.jp,
reject_rbl_client bl.spamcop.net,
reject_rbl_client zen.spamhaus.org
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname
smtpd_client_restrictions =
permit_mynetworks,
permit_inet_interfaces,
permit_sasl_authenticated
smtpd_sender_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain
mynetworks は、個々の環境に合わせてください。
header_checksの編集
ヘッダチェックファイルの設定をします。
$ sudo vim /etc/postfix/header_checks
/^Received:.*with ESMTPSA/ IGNORE
/^X-Originating-IP:/ IGNORE
/^X-Mailer:/ IGNORE
/^User-Agent:/ IGNORE
必要に応じて追加
$ sudo postmap /etc/postfix/header_checks
master.cfの編集
$ sudo vim /etc/postfix/master.cf
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_dh1024_param_file=/etc/postfix/ssl/dhparams/dh2048.pem
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
465 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=permit_sasl_authenticated,reject
Dovecotの設定
dovecot.confの編集
$ sudo vim /etc/dovecot/dovecot.conf
protocols = imap lmtp
listen = *
#mail_debug = yes
最初のうちは、** mail_debug = yes** で様子見したほうが良いかもしれません。
dovecot-sql.conf.extの作成
$ sudo vim /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfixパスワード
default_pass_scheme = SHA512-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT CONCAT('/var/mail/vhosts/', maildir) AS mail, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1'
10-auth.confの編集
$ sudo vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext
10-mail.confの編集
$ sudo vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/mail/vhosts/%d/%n/
maildir_stat_dirs=yes
mail_uid = 10000
mail_gid = 10000
first_valid_uid = 10000
last_valid_uid = 10000
mail_privileged_group = vmail
10-master.confの編集
$ sudo vim /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
service_count = 0
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0666
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
user = dovecot
}
service auth-worker {
user = vmail
}
10-ssl.confの編集
$ sudo vim /etc/dovecot/conf.d/10-ssl.conf
ssl_cert = </etc/postfix/ssl/selfsigned/cert.pem
ssl_key = </etc/postfix/ssl/selfsigned/privkey.pem
ssl_cipher_list = EECDH+AES:EDH+AES+aRSA
ssl_prefer_server_ciphers = yes
ssl_dh_parameters_length = 2048
15-mailboxes.confの編集
$ sudo vim /etc/dovecot/conf.d/15-mailboxes.conf
namespace inbox {
mailbox Drafts {
special_use = \Drafts
auto=subscribe
}
mailbox Junk {
special_use = \Junk
auto=subscribe
}
mailbox Trash {
special_use = \Trash
auto=subscribe
}
mailbox Sent {
special_use = \Sent
auto=subscribe
}
}
20-lmtp.confの編集
$ sudo vim /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
postmaster_address = postmaster@ドメイン名
mail_plugins = $mail_plugins
}
auth-sql.conf.extの編集
$ sudo vim /etc/dovecot/conf.d/auth-sql.conf.ext
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
Postfix & Dovecot 起動
$ sudo service postfix start
$ sudo service dovecot start
#postfixadmin
ここではバージョン2.93ですが、最新版を暖ダウンロードしてください。
$ wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.93/postfixadmin-2.93.tar.gz/download
$ mv ./download postfixadmin-2.93.tar.gz
$ tar xfvz postfixadmin-2.93.tar.gz
$ mv ./postfixadmin-2.93 /home/ec2-user/www/admin/postfixadmin
$ sudo mv /home/ec2-user/www/admin/postfixadmin/ADDITIONS/*.sh /var/mail/bin
$ rm -R /home/ec2-user/www/admin/postfixadmin/ADDITIONS
$ sudo chown -R vmail.vmail /var/mail/bin
$ sudo chmod 0700 /var/mail/bin/postfixadmin/*.sh
$CONF['configured'] = true;
$CONF['default_language'] = 'ja';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixパスワード';
$CONF['database_name'] = 'postfix';
$CONF['encrypt'] = 'dovecot:SHA512-CRYPT';
$CONF['dovecotpw'] = "doveadm pw -s SHA512-CRYPT";
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['mailbox_postcreation_script']='sudo -u vmail /var/mail/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script']='sudo -u vmail /var/mail/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script'] ='sudo -u vmail /var/mail/bin/postfixadmin-domain-postdeletion.sh';
自動でドメインディレクトリ&メールボックスディレクトリが作成および削除を、存在のシェルで対応しています。
postfixadmin-mailbox-postcreation.shの編集
/var/mail/vhosts/ドメイン名/、のメールボックスディレクトリを作成するシュル。
$ sudo vim /var/mail/bin/postfixadmin-mailbox-postcreation.sh
basedir=/var/mail/vhosts
mkdir -p -m 0700 "${parent}"
#maildirmake "$maildir"
mkdir -p -m 0700 $maildir/{new,cur,tmp,.Drafts,.Junk,.Trash,.Sent}
postfixadmin-mailbox-postdeletion.shの編集
/var/mail/vhosts/ドメイン名/、のメールボックスディレクトリを削除するシュル。
$ sudo vim /var/mail/bin/postfixadmin-mailbox-postdeletion.sh
basedir=/var/mail/vhosts
trashbase=/var/mail/deleted-vhosts
postfixadmin-domain-postdeletion.shの編集
/var/mail/vhosts 内のドメイン名のディレクトリを削除するシュル。
削除された、ドメインディレクトリは、/var/mail/deleted-vhosts へ日付付きで移動されます。
$ sudo vim /var/mail/bin/postfixadmin-domain-postdeletion.sh
basedir=/var/mail/vhosts
trashbase=/var/mail/deleted-vhosts
後の設定と構築は、ググると沢山出てくるので、後はお任せします。
接続テスト
$ sudo tail -f /var/log/maillog
2画面でログを見ながらテストすることをおすすめします。下記の5つのテストで、とくに問題が無ければ、PostfixとDovecotの設定は終了です。
SMTP port:25
$ telnet ドメイン名 25
Trying 52.196.8.213...
Connected to ドメイン名.
Escape character is '^]'.
220 ドメイン名 ESMTP Postfix
ehlo localhost
... 省略
quit
221 2.0.0 Bye
Connection closed by foreign host.
SMTP SSL/TLS port:465
$ openssl s_client -connect ドメイン名:465 -tlsextdebug
CONNECTED(00000003)
... 省略
220 ドメイン名 ESMTP Postfix
quit
221 2.0.0 Bye
closed
SMTP STARTTLS port:587
$ openssl s_client -connect ドメイン名:587 -starttls smtp -tlsextdebug
CONNECTED(00000003)
... 省略
250 DSN
quit
221 2.0.0 Bye
closed
IMAP STARTTLS port:143
$ openssl s_client -connect ドメイン名:143 -starttls imap -tlsextdebug
CONNECTED(00000003)
... 省略
. OK Pre-login capabilities listed, post-login capabilities have more.
1 logout
closed
IMAP SSL/TLS port:993
$ openssl s_client -connect ドメイン名:993 -tlsextdebug
CONNECTED(00000003)
... 省略
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
1 logout
closed
最後に
これで、無事メールの送受信ができるようになりました。
https://admin.ドメイン名/postfixadmin
メールソフトThunderbirdを使用したところ、自動設定で難なくメールの送受信ができました。
以上で終わりになります。