AC-5

某SEの雑記帳

メールサーバを作る(Postfix+PostfixAdmin)

      2016/05/10

環境

メールサーバのドメイン:example.jp
PostfixAdminのURL:http://example.jp/postfix/
データベースサーバ:localhost

構築前の準備

メール送信制限の解除とDNS逆引き設定の申請

AWS EC2をメールサーバとして利用する場合、標準では1日あたりのメール送信数は制限されています。
また、サーバのIPアドレスを逆引きした場合、amazonのドメインとなるのでスパムと判定される事があります。
制限の解除と逆引きの設定依頼を行うフォームがあるので、そこから申請します。
Request to Remove Email Sending Limitations
申請フォームは全て英語ですが、下記のサイトに日本語で手順が記載されています。
AWS EC2 Eメール上限緩和 / 逆引き(rDNS)設定 申請手順

MTAをPostfixへ変更する

デフォルトでのMTAはSendmailになっているので、Postfixに変更します。

Postfixのインストール

[root@test]# yum -y install postfix←postfixインストール

MTAの変更

[root@test]# alternatives --config mta←MTAの選択
There is 1 program that provides 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number: 1←現在インストールされているMTAが表示されるので、Postfixの番号を入力する(今回は1と入力する)

Postfixの起動

Sendmailを停止して、自動起動されないようにする。
その後、Postfixを起動して、自動起動設定を行う。

[root@test]# service stop sendmail←Sendmailの停止
[root@test]# chkconfig sendmail off←Sendmailの自動起動停止
[root@test]# service postfix start←Postfixの起動
[root@test]# chkconfig postfix on←Postfixの自動起動設定

dovecotのインストール

PostfixAdminをインストールする前にインストールしておく。
メールアドレス、パスワードの管理にMySQLを利用するので、mysql backendも導入する。

[root@test]# yum -y install dovecot dovecot-mysql←dovecot関連インストール

PostfixAdminのインストール

PostfixAdminとは、ドメイン、メールアドレス、パスワード、メールボックス名をデータベースで管理するためのWebアプリケーションです。
こちらを利用する事により、メールアドレスの追加等、ブラウザからGUIで設定する事が可能になります。
MTAの種類にはSendmail、Postfixの他にqmailも多く使われていますが、似たようなアプリケーションでqmailAdminというものもあります。

PostfixAdminのダウンロード

パッケージでは無いので、こちらからダウンロードして保存します。
今回はpostfixadmin-2.92.tar.gzを利用します。
ここでは、http://ドメイン名/postfixadmin/でアクセスできるように設定します。

最初はrootディレクトリにダウンロードしてから設置したのですが、そこでハマってしまいましたので、ここではhtmlディレクトリにダウンロードして設置します。
詳細は下記をご覧ください。
rootディレクトリで作成して移動したディレクトリがブラウザから表示できない

[root@test]# cd /var/www/html←htmlディレクトリに移動
[root@test html]# wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.92/postfixadmin-2.92.tar.gz←wgetでダウンロード
[root@test html]# tar zxvf postfixadmin-2.92.tar.gz←ダウンロードしたファイルを解凍する 
[root@test html]# mv postfixadmin-2.92 postfixadmin←リネームする

データベースの作成

ここからは解凍したディレクトリの中にあるINSTALL.TXTを参照しながら設定していきます。
まずはデータベースを作成します。

[root@test]# mysql -u root -p←MySQLに接続
Enter password:
mysql>CREATE DATABASE postfix;←postfixデータベース作成
mysql>CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfixpass';←postfixというユーザを作成し、パスワードを設定する(ここではpostfixpass)
mysql>GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';←ユーザpostfixにpostfixデータベースの権限を付与

PostfixAdminの設定ファイル作成

config.local.phpを新規作成します。
ディレクトリ内には既にconfig.inc.phpファイルがありますが、これを変更してしまうとPostfixAdminの更新があった場合に難しくなってしまいます。
config.local.phpがconfig.inc.phpの内容を上書きするようになっているので、変更する値のみをconfig.local.phpに記載します。

[root@postfix]# vi config.local.php←config.local.phpファイルを作成し「i」を押してインサートモードになる
<?php  
// 設定完了フラグ  
$CONF['configured'] = true;  

//日本語表示にする  
$CONF['default_language'] = 'ja';  

// データベース接続情報  
$CONF['database_type'] = 'mysqli';       // mysqlからmysqliに変更  
$CONF['database_host'] = 'localhost';    // mysqlのホスト名  
$CONF['database_user'] = 'postfix';      // postfixAdminで使用するデータベースのユーザ  
$CONF['database_password'] = 'postfixpass'; // パスワード  
$CONF['database_name'] = 'postfix';      // データベース名  

// 管理者メールアドレス  
$CONF['admin_email'] = 'postmaster@example.jp';  

//標準の管理者メールアドレス  
$CONF['default_aliases'] = array (
      'abuse' = 'abuse@example.jp',
      'hostmaster' = 'hostmaster@example.jp',
      'postmaster' = 'postmaster@example.jp',
      'webmaster' = 'webmaster@example.jp'  
);  

// 自動応答ドメイン。これはDNSに設定しなくてもよい  
$CONF['vacation_domain'] = 'autoreply.example.jp';  

//mainメニューへのリンク  
$CONF['user_footer_link'] = "http://example.jp/postfix/main.php";  

// ページ下部にトップへ戻るリンク設定  
$CONF['footer_text'] = 'Return to TOP';  
$CONF['footer_link'] = 'http://example.jp/postfix/';
?>
[esc]でviを抜ける
:wq←保存して閉じる

templates_cのアクセス権限の変更

PostfixAdminはtemplates_cディレクトリのみに書込権限を必要としますので、
apacheから書込ができるように、templates_cディレクトリへのアクセス権を変更します。

[root@test postfixadmin]# chown -R apache templates_c←templates_cのアクセス権をapacheに変更

セットアップ画面へのアクセス

http://example.jp/postfix/setup.phpにブラウザでアクセスします。
この時にもし画面が真っ白になってしまった場合、config.local.phpにミスがあるかもしれませんので、apacheのログファイルを確認してください。
ログファイルの格納場所はhttpd.confで設定されていますが、通常ですと/var/log/httpd/error_logにあります。

[root@test]# tail -f /var/log/httpd/error_log←httpdのログの確認

動作に足りないモジュールがあったりする場合はエラーが表示されるので、インストールしてリロードしてつぶしていく
今回は下記のような表示になりました。

WS000000

Error: There is no database support in your PHP setupの解消

まずは「Error: There is no database support in your PHP setup」の部分です。
今回はPHP5.5に変更しているので、表示されているphp5-mysqlでは無く、リポジトリからphp-mysqlndをインストールする必要があります。

[root@test]#  yum -y install php-mysqlnd --enablerepo=remi-php55←php-mysqlndインストール
[root@test]# service httpd restart←apacheの再起動

これで再度ブラウザをリロードします。
そうすると管理用のテーブルがデータベースに作成されます。
WS000001
ただ、まだ「Warning: Depends on: IMAP functions – NOT FOUND」と出ているのが気になるので、これも綺麗にしたいと思います。
こちらもphp5.5を入れているので、remiのリポジトリを利用します。

[root@test]# yum -y install php-imap --enablerepo=remi-php55←php-imapインストール

ちなみにphp7をインストールしている場合は、remi70からインストールします。

[root@test]#  yum -y install php-imap --enablerepo=remi-php70←php-imapインストール
エラー: パッケージ: php-imap-7.0.6-3.el7.remi.x86_64 (remi-php70)←エラーが出た場合は要求されたパッケージをインストールする
             要求: libc-client.so.2007()(64bit)
[root@test]#  yum -y install libc-client --enablerepo=remi,epel←libc-clientインストール
[root@test]#  yum -y install php-imap --enablerepo=remi-php70←再度php-imapインストール

これで全てのチェックが完了し、以下のような画面が表示されました。

WS000002

システム管理者の登録

Change setup passwordに適当な文字列を入力し、[Generate password hash]ボタンをクリックします。ここで入力したパスワードは管理者の追加時に必要となります。
すると、ハッシュ化されたパスワードが表示されます。
WS000003
config.local.phpファイルにsetup_passwordを追記します。
config.inc.phpに$CONF[‘setup_password’] = ‘changeme’;という項目があるのですが、今回はconfig.inc.phpには手をつけないというルールで行っているので、config.local.phpを利用します。

[root@test postfixadmin]# vi config.local.php←viでconfig.local.phpを開く
$CONF['setup_password'] = '**********************';←ブラウザで表示された$CONF['setup_password']の部分を貼付ける

ブラウザに戻り、
Setup password:先ほどのパスワードを入力
管理者:自分のメールアドレスを入力
パスワード:任意のパスワードを入力
[管理者追加]を押し、管理者の追加を行います。
管理者の追加をしたら、http://example.jp/postfix/main.phpにアクセスし、作成した管理者メールアドレスとパスワードでログインします。
WS000004
ログインができたら、先ほどアクセスした、setup.phpは削除するかリネームしたり、パーミッションを落としてアクセス不可にしておきます。
今回はリネームしておきます。

[root@test postfixadmin]# mv setup.php setup_php←リネームすれば機能としては利用できなくなりますが、アクセスするとソースが表示されるので、削除してしまうのが一番安全です。

Nginxでエラー表示も出ずにログインできない場合は、セッションの設定を見なおしてみてください。
NginxでPHPのセッション変数が効かない

ドメインとメールアドレスの登録

管理者でログイン後、ドメイン一覧から新しいドメインの追加へいき、ドメインを登録します。

WS000005
ドメインは登録するドメイン:example.jp

ドメインを追加したら、アドレス一覧→アドレスの追加からメールアドレスを作成します。

Postfixの設定

PostfixAdminはあくまでデータベース上のアカウント情報を設定するインターフェースですので、入力した値をPostfixから参照しなければ動作しません。
ここからはPostfixの設定になります。

バーチャルホスト宛のメールは /var/spool/virtual/ 以下に配送するようにします。
例えば、user@domain.ltdのメール配送のディレクトリは、/var/spool/virtual/domain.ltd/user/ になります。

MailDir形式への変更

メールの配送方法をmbox形式からMailDir形式へ変更します。
ついでに、/etc/skel へMaildirを作成し、新規ユーザでも自動作成されるようにします。

バーチャルドメイン用のユーザとメール用ディレクトリの作成

[root@test]# adduser -u 10000 vmailuser -s /sbin/nologin←バーチャルドメイン用のユーザ作成(SSHでログインできないようにする)
[root@test]# mkdir /var/spool/virtual←メール用ディレクトリ作成
[root@test]# chown 10000:10000 /var/spool/virtual←作成したディレクトリの所有者とグループを作成したユーザに変更

データベースへのアクセス用のクエリ作成

DOCUMENTS/POSTFIX_CONF.txtを参考にすると、PostfixAdminで登録した情報を、postfixからMySQLに接続して取得するクエリを作成する必要があります。
以下の7ファイルを作成します。

[root@test]# mkdir /etc/postfix/sql←/etc/postfix/にsqlディレクトリを作成
[root@test]# cd /etc/postfix/sql←sqlディレクトリに移動(ここに格納していきます)

[root@test sql]# vi mysql_virtual_domains_maps.cf←mysql_virtual_domains_maps.cfファイル作成
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query          = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
#query          = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query           = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
#expansion_limit = 100

[root@test sql]# vi mysql_virtual_alias_domain_catchall_maps.cf←mysql_virtual_alias_domain_catchall_maps.cfファイル作成
# handles catch-all settings of target-domain
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

[root@test sql]# vi mysql_virtual_alias_domain_mailbox_maps.cf←mysql_virtual_alias_domain_mailbox_maps.cfファイル作成
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

[root@test sql]# vi mysql_virtual_alias_domain_maps.cf←mysql_virtual_alias_domain_maps.cfファイル作成
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

[root@test sql]# vi mysql_virtual_alias_maps.cf←mysql_virtual_alias_maps.cfファイル作成
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
#expansion_limit = 100

[root@test sql]# vi mysql_virtual_mailbox_maps.cf←mysql_virtual_mailbox_maps.cfファイル作成
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query           = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100

[root@test sql]# vi mysql_virtual_mailbox_limit_maps.cf←mysql_virtual_mailbox_limit_maps.cfファイル作成
user = postfix
password = postfixpass←データベースのpostfixユーザのパスワード
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'

バーチャルドメイン用メールボックスの設定

main.cfに下記の設定を追記して、バーチャルドメインのメールを配送できるようにします。

[root@test]# vi /etc/postfix/main.cf←postfix設定ファイル編集
# Virtual mailbox 基本設定
virtual_mailbox_base = /var/spool/virtual
virtual_minimum_uid = 100
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000

# メールアドレス関連情報の取得
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

# quota(容量制限)サポート設定。容量制限をしないなら不要
# 容量制限を越えた場合、送信元にエラーメールを返信する。
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 

ここまでの設定が終わったら、postfixを再起動します。

[root@test]# service postfix restart←postfix再起動

テストメール送信

テストメールを送信する為にmailコマンドでメールを送信します。
mailコマンドがインストールされていない場合は、yumでインストールします。

[root@test]# yum -y install mailx←mailxインストール
[root@test]# mail test@example.jp←test@example.jpにメール送信
subject:test←件名を入力してEnter
test mail←本文を入力してEnter
.←.を押すと送信完了

テストメールが送信されると、/var/spool/virtual/ドメイン名/アカウント名/new/以下にファイルが作成されます。
作成されていれば配信OKです。

Permission deniedが出てエラーになる場合

ここは少しハマりました。
mailコマンドでメール送信後、ディレクトリを確認してもvirtualディレクトリ以下に何も作成されません。
確認の為にメールログを見てみました。

[root@test]# tail -f /var/log/maillog←tailコマンドでログを確認
Aug 12 08:51:51 ip-172-31-26-192 postfix/qmgr[1484]: CA47962445: from=<root@ip-172-31-26-192.localdomain>, size=479, nrcpt=1 (queue active)
Aug 12 08:51:51 ip-172-31-26-192 postfix/virtual[13889]: warning: maildir access problem for UID/GID=10000/10000: create maildir file /var/spool/virtual/example.jp/test/tmp/1439369511.P13889.ip-172-31-26-192: Permission denied←パーミッションの問題でエラーが出ている
[root@test]# mailq←mailqコマンドでも確認
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
A381D62428      496 Wed Aug 12 04:14:23  root@ip-172-31-26-192.localdomain
(maildir delivery failed: create maildir file /var/spool/virtual/example.jp/test/tmp/1439369511.P13889.ip-172-31-26-192: Permission denied)←やはりパーミッションの問題でキューに溜まったままになっていました。
                                         test@example.jp

virtualのディレクトリのパーミッションを777にしてみたり、所有者を変更してみたり設定を見なおしてみたりと行ってみたのですが、改善されませんでした。
結論から言うと、SELinuxが影響していました。
SELinuxはセキュリティ管理をしてくれるとても大事なモジュールですが、慣れていないとSELinuxによる強力なアクセス制限によってインストール作業や運用業務でつまづくことがあります。

本来であればSELinuxを理解しなくてはいけないのですが、それは後にまわしてとりあえずはSELinuxを停止してしまいます。

[root@test]# setenforce 0←SELinux無効(有効にする場合は1)
[root@test]# getenforce←SELinuxの状態確認
permissive←SElinuxは警告を出力するが、アクセス制限は無効(有効の場合はenforcing 設定で無効になっている場合はdisabledが表示されます。)

この設定でSELinuxを無効にする事はできましたが、一時的な設定なので再起動すると元の設定に戻ってしまいます。
恒久的に無効にするには設定ファイルを変更する必要があります。

[root@test]# vi /etc/selinux/config←SELinux設定ファイル編集
#SELINUX=enforcing←SELinux有効をコメントアウト
SELINUX=disabled←SELinux無効を追記

これで再起動すると設定が適用されます。

メールの送信確認もしてみたところ、無事にディレクトリが作成され、ファイルが作成されていました。

dovecotの設定

postfixAdminで登録した情報を取得するためのクエリを作成します。
dovecot-sql.conf.extというファイルを新規作成します。

[root@test]# vi /etc/dovecot/dovecot-sql.conf.ext←dovecot-sql.conf.ext作成
#
# for postfixadmin
#
connect = host=localhost dbname=postfix user=postfix password=postfixpass←データベース接続情報(改行してはいけない)
driver = mysql

# Default password scheme.
# depends on your $CONF['encrypt'] setting:
# md5crypt  -> MD5-CRYPT
# md5       -> PLAIN-MD5
# cleartext -> PLAIN
default_pass_scheme = MD5-CRYPT

password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT CONCAT('/var/spool/virtual/', maildir) AS mail, 10000 AS uid, 10000 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active='1'

認証

メールアドレスとパスワードでPOP3またはIMAP認証可能にして、PAMでのユーザ認証は無効にします。
/etc/dovecot/conf.d/10-auth.confを変更します。

[root@test]# vi /etc/dovecot/conf.d/10-auth.conf←10-auth.conf編集
...
# STARTTLSで暗号化するので、plaintext認証を有効にする
disable_plaintext_auth = no←コメントアウトを外し、noにする
...

#コメントアウト
#!include auth-system.conf.ext

#コメントアウトを外す
!include auth-sql.conf.ext
...

/etc/dovecot/conf.d/auth-sql.conf.extを変更します。

[root@test]# vi /etc/dovecot/conf.d/auth-sql.conf.ext←/etc/dovecot/conf.d/auth-sql.conf.extの編集
# Authentication for SQL users. Included from auth.conf.
#
# <doc/wiki/AuthDatabase.SQL.txt>

passdb {
  driver = sql

  # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
  # 先程作成したdovecot-sql.conf.extファイルを指定
  args = /etc/dovecot/dovecot-sql.conf.ext
}

# "prefetch" user database means that the passdb already provided the
# needed information and there's no need to do a separate userdb lookup.
# <doc/wiki/UserDatabase.Prefetch.txt>
#userdb {
#  driver = prefetch
#}

userdb {
  driver = sql
  # 先程作成したファイルを指定
  args = /etc/dovecot/dovecot-sql.conf.ext
}

# If you don't have any user-specific settings, you can avoid the user_query
# by using userdb static instead of userdb sql, for example:
# <doc/wiki/UserDatabase.Static.txt>
#userdb {
  #driver = static
  #args = uid=vmail gid=vmail home=/var/vmail/%u
#}

SSL/TLSを使用可能にします。
/etc/dovecot/conf.d/10-ssl.confの編集を行います。

[root@test]# vi /etc/dovecot/conf.d/10-ssl.conf←/etc/dovecot/conf.d/10-ssl.confの編集
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
 ssl = yes

ローカルメールの設定

Postfixでのメール配送をMaildir形式にしたので、dovecotのデフォルトもMaildir形式にします。
mail_locationはローカルユーザ向けの設定なので、各ユーザのホームディレクトリを指定するようにします。

[root@test]# vi /etc/dovect/conf.d/10-mail.conf←10-mail.confの修正
mail_location = maildir:~/Maildir←コメントアウトを外して maildir:~/Maildirを追加

ここまで設定すれば、pop3,imapは使用できるようになります。
ただし、MUA(メーラー)がThunderBirdの場合、送信サーバの認証ができないとメールアカウント登録でエラーとなります。

Postfix用のSMTP認証用設定

PostfixでDovecotの認証を使用するための設定を追加します。
/etc/dovecot/conf.d/10-master.confを編集し、
設定後、dovecotを再起動し /var/spool/postfix/private/auth が作成されている事を確認します。

dovecot側の設定

[root@test]# cd /var/spool/postfix/private/←ディレクトリに移動
[root@test private]# ls -al←一覧を表示
drwx------.  2 postfix root    4096 Aug 12 09:43 .                                                                                                                                                                       drwxr-xr-x. 16 root    root    4096 Aug 10 08:46 ..                                                                                                                                                                      srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 anvil←authが無い事を確認
srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 bounce
srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 defer
srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 discard
....
[root@test private]# vi /etc/dovecot/conf.d/10-master.conf←10-master.confを編集
# Postfix smtp-auth
#unix_listener /var/spool/postfix/private/auth {
#  mode = 0666
#}
以上の記載を下記に変更
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
   mode = 0666
   user = postfix
   group = postfix
}
[root@test private]# service dovecot startdovecotを起動
Starting Dovecot Imap:                                     [  OK  ]
[root@test private]# chkconfig dovecot ondovecotの自動起動の設定
[root@test private]# ls -al←一覧を表示
drwx------.  2 postfix root    4096 Aug 12 09:43 .                                                                                                                                                                       drwxr-xr-x. 16 root    root    4096 Aug 10 08:46 ..                                                                                                                                                                      srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 anvil
srw-rw-rw-.  1 postfix postfix    0 Aug 13 03:51 auth←authが作成されている事を確認
srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 bounce
srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 defer
srw-rw-rw-.  1 postfix postfix    0 Aug 12 09:43 discard
....

postfix側の設定

[root@test]# vi /etc/postfix/main.cf←postfix設定ファイル編集
myhostname = mail.example.jp
mydomain = example.jp
myorigin = $myhostname
// 外部からのメールを受信可能にする
inet_interfaces = all

下記は追加
#
# SASL(SMTP認証) 有効化
#
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination
# 認証にdovecotを使用
smtpd_sasl_type = dovecot
# 認証用ソケット。/var/spool/postfix からの相対パス
smtpd_sasl_path = private/auth
# 一部MUAもサポート
broken_sasl_auth_clients = yes

#
# TLS(STARTTLS) 有効化
#
smtpd_use_tls = yes
smtld_tls_loglevel = 1
# dovecotの証明書を流用.正式な証明書があるならそちらを指定する。
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s

通常、メールを受信するドメインは、$mydestinationに指定するが、
バーチャルドメインで使用するドメインは、$mydestination に追加してはいけない

OB25B(Outbound Port 25 Blocking)対策

プロバイダによってはOB25Bにより、25番ポートでのメール送受信ができないので、サブミッションポートを使用可能にします。

[root@test]# vi /etc/postfix/master.cf←master.cfファイル編集
submission inet n       -       n       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_client_restrictions=permit_sasl_authenticated,reject

SASL認証を有効にし、サブミッションポートを利用しての送信は認証成功以外は送信拒否とします。

 - AWS, Linux, PHP