はじめに
AWS EC2 のCentos7を想定し、Postfix、Dovecot、amavisd、Postfixadminで構築したときのメモです。
ドメインの登録、Elastic IPの割り当て、ポート 22, 25, 80, 110, 443, 465, 587, 995 は、開けてあるものとします。
メールサーバーの接続構成
タイプ | ポート番号 | 暗号化の種類 |
---|---|---|
SMTP | 25 | -- |
SMTPS | 465 | SSL/TLS |
SMTP | 587 | STARTTLS |
POP3 | 110 | STARTTLS |
POP3S | 995 | SSL/TLS |
構築時の各バージョン
アプリなど | バージョン |
---|---|
Apache | 2.4.6 |
PHP | 7.0.5 |
Mysql | 5.6.30 |
Postfix | 2.10.1 |
Dovecot | 2.2.10 |
postfixadmin | 2.93 |
今回は、下記のような方法で サブドメインでアクセスするタイプになります。 | |
https://admin.ドメイン名/postfixadmin |
Webサーバーで扱う管理者の作成と権限
主に、phpAdmin、postfixadminなどで使用する
$ sudo groupadd -g 20000 webadmin
$ sudo useradd -g webadmin -u 20000 webadmin
$ sudo passwd webadmin
$ sudo -u webadmin mkdir -p /home/webadmin/www/public_html
$ sudo chown -R webadmin:webadmin /home/webadmin/www
webadminユーザーは、sudoでvmailユーザーのみ「sudo -u vmail」になれるようにする。
$ sudo vim /etc/sudoers.d/webadmin
# phpでexec()でsudoコマンドを有効にさせるために追加します。
Defaults:webadmin !requiretty
webadmin ALL=(vmail) NOPASSWD:ALL
suコマンドは、wheelグループに所属しているユーザのみ扱えるようにする。
$ sudo vim /etc/login.defs
末尾に追加
SU_WHEEL_ONLY yes
ファイルの編集
$ sudo vim /etc/pam.d/su
コメントを外す
auth required /lib/security/pam_wheel.so use_uid
WEBサーバーの構築
既に構築済みの場合は、読み飛ばしてかまわないです。
##インストール&サービスの登録
リポジトリ追加
php7を入れるのに必要。現時点でデフォルトで5.4
$ sudo yum install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Apache & php7
$ sudo yum install -y gcc httpd httpd-devel mod_ssl libcap-devel
$ sudo yum install --enablerepo=remi,remi-php70 php php-mbstring php-mcrypt php-opcache php-mysqlnd php-gd php-devel php-imap php-gd php-pdo php-pear
$ sudo systemctl enable httpd.service
phpの設定
$ sudo vim /etc/php.ini
date.timezone = 'Asia/Tokyo'
include_path = ".:/usr/share/php:/usr/share/pear"
mod_ruid2の作成
バーチャルホスト毎に、権限を変えたかったので、mod_ruid2を使います。
※mod_ruid2を有効にするには、SELinuxは無効にしてください。
まずは、下記のサイトからDLし解凍しましょう。
$ sudo yum install wget unzip
$ 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 /etc/httpd/conf.d/admin.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName admin.ドメイン名:443
ServerAlias ドメイン名
DocumentRoot /home/webadmin/www/public_html
<Directory "/home/webadmin/www/public_html">
Options -Indexes
Require all granted
Allow from all
AllowOverride All
</Directory>
<IfModule mod_ruid2.c>
RMode config
RUidGid webadmin webadmin
#RGroups apachetmp
</IfModule>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
ErrorLog logs/admin_ssl_err
</VirtualHost>
</IfModule>
個々の環境に合わせて設定してください。さらに、BASIC認証を付け加えても良いかもしれません。
ちなみに、/home/webadmin/www/public_html の中に、postfixadminを入れます。
ほかにも、phpMyAdminなど、管理者用のwebアプリを入れても良いかもしれません。
/home/webadmin/www/public_html の中に、下記の index.php をアップロードしてください。
<?php
header('HTTP', true, 404);
?>
404 (Not Found)
$ sudo systemctl start httpd.service
webサーバーを起動後、**404 (Not Found)**が表示されているか確かめてください。
Mysql5.6の構築
##インストール&サービスの登録
リポジトリの追加
php5.6を入れるのに必要。現時点でデフォルトで5.5になります。
$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
$ sudo yum -y install mysql-community-server mysql mysql-devel mysql-server mysql-utilities
$ sudo systemctl enable mysqld.service
$ sudo systemctl start mysqld.service
$ mysql -u root
初期設定
rootパスワードをきめ、匿名ユーザーの削除します。
mysql> UPDATE mysql.user SET Password=PASSWORD('ルートパスワード') WHERE User='root';
mysql> DELETE FROM mysql.user WHERE User = '';
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
phpMyAdminのすすめ
https://www.phpmyadmin.net/ より、ダウンロード&解凍し
/home/webadmin/www/public_html へphpMyAdminを入れることをおすすめします。
少し設定するだけで、直ぐに使用できます。詳しい説明は、ググってください。
メールサーバーで使用する、ユーザーとDBを作成
接続済みです。
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfixのパスワード';
mysql> CREATE DATABASE postfix CHARACTER SET utf8;
mysql> GRANT ALL ON postfix.* to postfix@localhost;
mysql> EXIT;
メールサーバーの構築
##インストール&サービスの登録
$ sudo yum install -y postfix dovecot dovecot-mysql
$ sudo systemctl enable postfix.service
$ sudo systemctl enable dovecot.service
##MTAの切り変え
初期状態で、sendmail.postfix なので、切り替える必要は無いです。
バーチャルドメイン用のユーザとメール用ディレクトリの作成
$ sudo groupadd -g 10000 vmail
$ sudo useradd -g vmail -u 10000 vmail /var/vmail
$ sudo mkdir -p -m 0700 /var/vmail/{vhosts,bin,deleted-vhosts}
$ sudo chown -R vmail:vmail /var/vmail
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
-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
recipient_delimiter = +
header_checks = regexp:/etc/postfix/header_checks
mime_header_checks = regexp:/etc/postfix/header_checks
smtpd_banner = ESMTP $mail_name
readme_directory = no
mailbox_command = procmail -a "$EXTENSION"
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/vmail/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 = pop3 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/vmail/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/vmail/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 pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0666
user = postfix
group = postfix
}
}
service auth {
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
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_dh_parameters_length = 2048
ssl_cipher_list = EECDH+AES:EDH+AES+aRSA
ssl_prefer_server_ciphers = yes
20-lmtp.confの編集
$ sudo vim /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
postmaster_address = postmaster@ドメイン名
mail_plugins = $mail_plugins
}
Postfix & Dovecot 起動
$ sudo systemctl start postfix.service
$ sudo systemctl start dovecot.service
#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/webadmin/www/public_html/postfixadmin
$ sudo mv /home/webadmin/www/public_html/postfixadmin/ADDITIONS/*.sh /var/vmail/bin
$ rm -R /home/webadmin/www/public_html/postfixadmin/ADDITIONS
$ sudo chown -R vmail:vmail /var/vmail/bin/
$ sudo sh -c "chmod 0700 /var/vmail/bin/*.sh"
config.inc.phpの編集
$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/vmail/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script']='sudo -u vmail /var/vmail/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script'] ='sudo -u vmail /var/vmail/bin/postfixadmin-domain-postdeletion.sh';
自動でドメインディレクトリ&メールボックスディレクトリが作成および削除を、存在のシェルで対応しています。
postfixadmin-mailbox-postcreation.shの編集
/var/vmail/vhosts/ドメイン名/、のメールボックスディレクトリを作成するシュル。
$ sudo vim /var/vmail/bin/postfixadmin-mailbox-postcreation.sh
basedir=/var/vmail/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/vmail/vhosts/ドメイン名/、のメールボックスディレクトリを削除するシュル。
$ sudo vim /var/vmail/bin/postfixadmin-mailbox-postdeletion.sh
basedir=/var/vmail/vhosts
trashbase=/var/vmail/deleted-vhosts
postfixadmin-domain-postdeletion.shの編集
/var/vmail/vhosts 内のドメイン名のディレクトリを削除するシュル。
削除された、ドメインディレクトリは、/var/vmail/deleted-vhosts へ日付付きで移動されます。
$ sudo vim /var/vmail/bin/postfixadmin-domain-postdeletion.sh
basedir=/var/vmail/vhosts
trashbase=/var/vmail/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
POP3 STARTTLS port:110
$ openssl s_client -connect ドメイン名:110 -starttls pop3 -tlsextdebug
CONNECTED(00000003)
... 省略
---
+OK Dovecot ready.
quit
closed
POP3 SSL/TLS pop3:995
$ openssl s_client -connect ドメイン名:995 -tlsextdebug
CONNECTED(00000003)
... 省略
+OK Dovecot ready.
quit
closed
最後に
これで、無事メールの送受信ができるようになりました。
https://admin.ドメイン名/postfixadmin
メールソフトThunderbirdを使用したところ、自動設定で難なくメールの送受信ができました。
以上で終わりになります。