2020年12月23日水曜日

メールサーバーをサクラVPS上構築

Postfix のインストール

さくらVPSのCentOSイメージには初期インストールされているので不要。
更新を行う
# yum -y update postfix

Dovecot のインストール

# yum install dovecot dovecot-mysql

postfixadminインストール

# cd /usr/local/src
# wget http://nchc.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-3.2.tar.gz
# tar xzvf postfixadmin-3.2.tar.gz
# mv postfixadmin-3.2 /var/www/html/postfixadmin
# cd /var/www/html/postfixadmin
# chown apache:apache -R /var/www/html/postfixadmin
# ln -s /var/www/html/postfixadmin/public /var/www/html/mySite/public/postfixadmin

/postfixadmin にアクセスできるように /var/www/html/mySite/public/.htaccess  rewrite ruleに下記追加(laravel使用しているため)
RewriteCond %{REQUEST_URI} !^/postfixadmin.*$

postfixadminためのDB設定

# mysql -u root -p
mysql> create database postfixadmin character set utf8 collate utf8_bin;
mysql> grant all privileges on postfixadmin.* to postfixadmin@'localhost' identified by 'passwd';

postfixadmin設定

/var/www/html/postfixadmin/config.local.php を作成

<?php
$CONF['configured'] = true;
$CONF['default_language'] = 'ja';
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'passwd';
$CONF['database_name'] = 'postfixadmin';
$CONF['encrypt'] = 'dovecot:CRAM-MD5';  <-- 暗号化パスワードで認証するため
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";
?>

postfixadmin setup

http://mySite/postfixadmin/setup.php にアクセス
下記メッセージが出てきました

Warning: Depends on: IMAP functions - NOT FOUND
To install IMAP support, install php5-imap
Without IMAP support, you won't be able to create subfolders when creating mailboxes.

指示通り、php-imapをインストール
# yum install php-imap
# systemctl restart httpd

再度setup.phpにアクセスして、Setup passwordを入れて、hashを作成します。
そして、画面上のメッセージ通り、/var/www/html/postfixadmin/config.local.php に$CONF['setup_password']を追加

If you want to use the password you entered as setup password, edit config.inc.php or config.local.php and set

$CONF['setup_password'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx';

画面上管理者情報入れて「管理者追加」ボタンをクリック

mail user用意

postfixadminを使用するには、postfixのvirtual domainを利用
# mkdir /home/vmailbox
# groupadd -g 600 vuser
# useradd -g vuser -u 600 -d /home/vmailbox -s /sbin/nologin vuser
# chown vuser:vuser /home/vmailbox
# chmod 771 /home/vmailbox

postfix設定用ファイル作成

postfixadminを使用するには、SQLから情報を取るため、postfixadmin提供してくるshell scriptからpostfixでSQLアクセス用ファイルを作成できる
# sh /var/www/html/postfixadmin/DOCUMENTS/POSTFIX_CONF.txt
Database host? (often localhost)

Database name?
postfixadmin
Database user?
postfixadmin
Database password?
passwd
...

# mv /tmp/postfixadmin-XXXX /etc/postfix/sql
# chmod +rx /etc/postfix/sql

postfix設定

/etc/postfix/main.cfを編集

不審IPからの接続は /etc/postfix/restricted_ipaddress に追加することでブロックできる

myhostname = mySite.com
mydomain = mySite.com

「inet_interfaces = all」の行頭にある#を削除して、この行を有効にします。
さらに、「inet_interfaces = 127.0.0.1」の行頭に#を追加し、この行を無効にします。

mydestination = localhost.$mydomain, localhost  <-- virtual_mailbox_domainsと重複ものないように

# security
disable_vrfy_command = yes
smtpd_client_restrictions = permit_mynetworks,
                            check_client_access texthash:/etc/postfix/restricted_ipaddress,
                            reject_invalid_hostname,
                            permit
smtpd_delay_reject = no  <-- これないとすぐrejectされないようで

#  SMTP AUTH
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot  <-- dovecot提供してくるsaslを利用認証行う、cyrus-saslを使う場合は不要(smtpd_sasl_pathも)
smtpd_sasl_path = private/auth

# postfixadmin
local_transport = local
virtual_transport = virtual
virtual_mailbox_base = /home/vmailbox
virtual_minimum_uid = 600
virtual_uid_maps = static:600
virtual_gid_maps = static:600
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/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

# TLS/SSL
smtpd_use_tls = yes
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/letsencrypt/live/mySite.com/fullchain.pem  <-- let's Encryptを使用
smtpd_tls_key_file = /etc/letsencrypt/live/mySite.com/privkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s

/etc/postfix/master.cfを編集

ポート587を使用できるように下記4行の行頭にある#を削除して、有効にします。
submission inet n       -       n       -       -       smtpd
-o smtpd_sasl_auth_enable=yes
-o smtpd_helo_restrictions=$mua_helo_restrictions
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
SSL通信のため、以下変更
# 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
↓ 4行のコメントアウトを取る
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再起動(もともと起動されている)

# systemctl restart postfix

dovecot設定

/etc/dovecot/dovecot.confを編集

protocols = imap pop3

/etc/dovecot/conf.d/10-mail.confを編集

mail_location = maildir:/home/vmailbox/%d/%n
first_valid_uid = 600
first_valid_gid = 600

/etc/dovecot/conf.d/10-auth.confを編集

disable_plaintext_auth = no
auth_mechanisms = cram-md5 plain login
下記2行の行頭にある#を削除して、有効にします。
!include auth-system.conf.ext
!include auth-sql.conf.ext

/etc/dovecot/conf.d/auth-sql.conf.ext 以下のようになっているか確認

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

/etc/dovecot/dovecot-sql.conf.extを作成

driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=postfixadmin user=postfixadmin password=passwd
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/vmailbox/', maildir) as home, 600 as uid, 600 as gid FROM mailbox WHERE username = '%u' AND active = '1'
iterate_query = SELECT userid AS username, domain FROM users

/etc/dovecot/conf.d/10-master.confを編集

# Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

/etc/dovecot/conf.d/10-ssl.conf 編集

ssl = yes
ssl_cert = </etc/letsencrypt/live/mySite.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mySite.com/privkey.pem

Dovecotの起動と自動起動設定

# systemctl start dovecot
# systemctl enable dovecot