postfixadmin + postfix + dovecot 「CentOS 7」インストール

2021-06-18

CentOS 7でバーチャルドメイン対応のメールサーバー構築

Posfix + Dovecot + postfixadmin を利用してバーチャルドメイン対応のメールサーバーを構築しました。当初は「CentOS 8」での構築を考えましたが、CentOS 8 + Postfixadminの構成での情報が少なかったのでCentOS 7で構築しました。

OS及びミドルウェアのバージョンは以下のようになります

  • Cent OS 7.7
  • postfix 2.10.1
  • dovecot 2.2.36
  • postfixadmin 3.2
  • php 7.3
  • Apache 2.4.6

Apacheに関しては、既に構築済みとして進めています

Postfix インストール及び設定

Postfixのインストールに必要なパッケージをインストールします

$ sudo yum install gcc gcc-c++ pcre-devel zlib-devel make wget openssl-devel 
$ sudo yum install libxml2 libxml2-devel libxslt-devel libxslt libxslt-devel gd-devel 
$ sudo yum install perl-ExtUtils-Embed GeoIP-devel gperftools-devel flex libcap-devel

Postfixをインストールします

$ sudo yum install postfix cyrus-sasl-md5  libdbi-dbd-mysql cyrus-sasl-plain

Postfixで使用するユーザー(postfixadmin )と使用するDB(postfixadmin )を設定します

$ 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 '(パスワード)';
mysql> select host,user,password from mysql.user;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| postfixadmin       |
+--------------------+
2 rows in set (0.00 sec)
mysql> flush privileges;

postfixのバージョンドメインで使用するユーザーを作成します。
ユーザー名は「vuser」としてメールが配送されるディレクトリ「/home/vmailbox」をホームディレクトリとします

$ sudo mkdir /home/vmailbox
$ sudo groupadd -g 600 vuser
$ sudo useradd -g vuser -u 600 -d /home/vmailbox -s /sbin/nologin vuser
$ sudo chown vuser:vuser /home/vmailbox
$ sudo chmod 771 /home/vmailbox

Postfixの設定ファイルの「main.cf」を編集します
SMTP認証とバーチャルドメイン関係の設定は最終行に追加します

$ sudo cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org
$ sudo vim /etc/postfix/main.cf

myhostname = 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/vmailbox
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 = 600
virtual_uid_maps = static:600
virtual_gid_maps = static:600

# Mailbox limit(クォーターの設定はなし)
virtual_mailbox_limit = 0

# TLS
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.pem
smtpd_tls_key_file = /etc/pki/tls/certs/mail.pem

reject_clientのファイル生成します。このファイルは拒否したいクライアントのIPアドレスを追加していきます。スパム業者等で何回もアクセスしてくるIPアドレスを追加していけばいいかと思います。まだ使わないので空のファイル生成のみおこなっています

$ sudo touch /etc/postfix/reject_client
$ sudo postmap /etc/postfix/reject_client

バーチャルドメインに必要な各種ファイル再生します。

mysql_virtual_alias_maps.cf では、DBの接続ユーザー・パスワード・DB名を設定します

$ sudo vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfixadmin
password = xxxxxxx
hosts = localhost
dbname = postfixadmin
table = alias
select_field = goto
where_field = address

mysql_virtual_domains_maps.cf も同様に作成します

$ sudo vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfixadmin
password = xxxxxx
hosts = localhost
dbname = postfixadmin
table = domain
select_field = domain
where_field = domain
additional_conditions = and active = '1'

mysql_virtual_mailbox_maps.cf も同様に作成します

$ sudo vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfixadmin
password = xxxxxxx
hosts = localhost
dbname = postfixadmin
table = mailbox
select_field = maildir
where_field = username

25番ポートを使用せずSubmissionポートの587番でSMTP送信ができるように設定します。

変更箇所は以下になります

$ sudo cp -p /etc/postfix/master.cf /etc/postfix/master.cf.org
$ sudo vi /etc/postfix/master.cf

# 下記のコメントアウトを外します
submission inet n       -       n       -       -       smtpd

#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt

# 下記のコメントアウトを外します
  -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

Postfixで使用するSSL証明書を発行します。証明書の発行に関しての住所・連絡先は使用する環境で変更して下さい

$ sudo cd /etc/pki/tls/certs/
$ sudo make mail.pem
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Dovecot インストール及び設定

dovecotをyumでインストールします

$ sudo yum install dovecot dovecot-mysql

dovecotで使用するプロトコルを設定します。pop3 と imapのみを使用するので、そのプロトコルを設定します

$ sudo cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org
$ sudo vi /etc/dovecot/dovecot.conf
protocols = pop3 imap

dovecotの設定をおこないます。

# メールが配送されるディレクトリとそのユーザーなどを設定します
$ sudo cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.org
$ sudo vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/vmailbox/%d/%n
first_valid_uid = 600
first_valid_gid = 600

imapとpop3を有効にして、imaps,pop3sともport 0を追加してデフォルトポートを起動しないようにするする。

$ sudo cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.org
$ sudo vim /etc/dovecot/conf.d/10-master.conf
  # 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 = 0
    #ssl = yes
  }

10-auth.confを下記のように変更します

$ sudo vim /etc/dovecot/conf.d/10-auth.conf
#auth_mechanisms = plain
auth_mechanisms = plain login

# plaintextの認証を有効
disable_plaintext_auth = no

※以下の行を有効にします
!include auth-system.conf.ext
!include auth-sql.conf.ext

auth-sql.conf.extを以下のように設定します

$ sudo cp -p /etc/dovecot/conf.d/auth-sql.conf.ext /etc/dovecot/conf.d/auth-sql.conf.ext.org
$ sudo vim /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
}

dovecot-sql.conf.ext を設定します。DB名・DBユーザー・パスワード・クエリなどを設定します

$ sudo vim /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
default_pass_scheme = MD5-CRYPT
connect = host=localhost dbname=postfixadmin user=postfixadmin password=xxxxx
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

20-pop3.conf を下記のように設定します

$ sudo vim /etc/dovecot/conf.d/20-pop3.conf
  protocol pop3 {
    #pop3_uidl_format = %08Xu%08Xv
    pop3_uidl_format = %08Xu%08Xv    # ←コメント削除
  }
  mail_max_userip_connections = 1000

dovecotの自動起動及びサービスを起動します

$ sudo systemctl enable dovecot.service
$ sudo systemctl start dovecot
$ sudo systemctl list-unit-files -t service | grep dovecot
dovecot.service                                 enabled

saslauthdの自動起動及びサービスを起動します

$ sudo systemctl enable saslauthd.service
$ sudo systemctl start saslauthd
$ sudp systemctl list-unit-files -t service | grep saslauthd
saslauthd.service                                 enabled

postfixの自動起動及びサービスを起動します

$ sudo systemctl enable postfix.service
$ sudo systemctl start postfix
$ sudo systemctl list-unit-files -t service | grep postfix
postfix.service                                 enabled

PHP 7.3 インストール

PHPはyumでインストールされる5系ではなく、PHP 7.3をします

既存のPHPがインストールされている場合は削除する

$ sudo yum list installed | grep php
$ sudo yum remove php*

remi, epel レポジトリ設定します

$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install epel-release

remi, epel レポジトリを有効にして、php 7.3 インストールをします

$ sudo yum install --enablerepo=epel,remi,remi-php73 php php-devel php-mbstring php-mysql  php-pecl-ssh2
$ php -v
PHP 7.3.14 (cli) (built: Jan 21 2020 09:59:50) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies

php.iniの設定のタイムゾーンを日本に設定します

$ sudo vim /etc/php.ini
date.timezone = Asia/Tokyo

postfixadminをインストール

wgetでpostfixadmin 3.2をダウンロードして、圧縮ファイルを解凍してWEBディレクトリに移動します

$ sudo cd /usr/local/src
$ sudo wget http://nchc.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-3.2.tar.gz
$ sudo tar xzvf postfixadmin-3.2.tar.gz
$ sudo mv postfixadmin-3.2 /var/www/
$ sudo mv /var/www/postfixadmin-3.2/ /var/www/postfixadmin

# 所有者をapacheに変更しておきます
$ sudo chown apache:apache -R /var/www/postfixadmin

config.inc.phpを変更します。主にDB関係の設定をおこないます

$ sudo vim /var/www/postfixadmin/config.inc.php
<?php
$CONF['configured'] = true;
$CONF['default_language'] = 'ja';
$CONF['database_type'] = 'mysql';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'xxxxxxxx';
$CONF['database_name'] = 'postfixadmin';
$CONF['admin_email'] = '(管理者メールアドレス)';

postfixadmin.confを作成して、postfixadminに関するApacheの設定おこないます。必要に応じてIP制限・BASIC認証など行います。今回は何も設定をいれていません

$ sudo vi /etc/httpd/conf.d/postfixadmin.conf

<VirtualHost *:80>
  DocumentRoot "/var/www/html"
  ServerName example.com
  ErrorLog "logs/error_log"
  CustomLog "logs/access_log" common

  Alias /postfixadmin "/var/www/postfixadmin/public"
</VirtualHost>

apacheを再起動して設定を読み直します

$ sudo systemctl restart httpd

IP制限は「.htaccess」でおこなうの設定します

$ sudo vim /var/www/postfixadmin/.htaccess
Require all denied
Require ip xxx.xxx.xxx.xxx
Require ip xxx.xxx.xxx.xxx

ブラウザでpostfixadminのサイトにアクセスして管理者ユーザーの設定などの初期設おこないます。

「http://xxxxxxx.com/postfixadmin/setup.php」でブラウザでアクセスすると初期設定画面になります。

管理者のパスワードを行った後に、config.inc.phpにもその時に設定したパスワードのハッシュ値を追加します

$ sudo vi /var/www/postfixadmin/config.inc.php
$CONF['setup_password'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

また、WEBにアクセスると「ERROR: the templates_c directory doesn’t exist or isn’t writeable for the webserver」になる場合は、templates_c のディレクトリを作成し書込み権限をつけます。
ダウンロードしたpostfixadminのバージョンによっては、templates_c のディレクトリがない場合はあるようです

$ sudo mkdir /var/www/postfixadmin/templates_c 
$ sudo chmod 755 /var/www/postfixadmin/templates_c
$ sudo chown apache:apache /var/www/postfixadmin/templates_c