読者です 読者をやめる 読者になる 読者になる

ソフトウェアとハードウェアの境界

ホビー開発に関する誰得情報満載☆

バーチャルホストのメールサーバ①

I have a playful parsonality.

最近、記事の更新が滞っていたのだが、これは仕事で考えたいことがあまりにも多く、帰ってきてからもなかなかそのことが頭を離れなかったからである。 次から次へと楽しい問題が舞い降りて充実した時間を過ごしていた。 キャッシュネームサーバの設定、社内サーバ構築とグループウェアの設定、管理しているコンテンツの管理方法の変更などなど…。
なかでも3週間くらいかけてハァハァ言いながら取り組んだ課題が、メールサーバの構築であった。 社内のメールサーバがQmail軸のちょっと古い環境だったので、ナウい環境にしたいということだった。 メールサーバの構築は今までずっと避けてきた課題であったのだが、避けるのもおかしくなかったのだな、と納得がいくくらい難しかった。
まず初めてメールサーバを立てようと思った場合、絶対にどこかで問題が生じる。 誰かが書いてくれている記事を見つけて、それ通りにやってもうまくいかないことが多い。 自分のサーバ環境と記事を掲載している人のサーバ環境は全く異なることも原因の一つだったりするが、まず第一にぶち当たる問題は「メールプロトコルをちゃんと知らない」ことだ。 メールプロトコルをちゃんと理解したうえでメールサーバを立てる人って、そんなにいるのかなぁ?
そんなこんなで、サーバ環境を整えつつ、メールプロトコルを理解しつつ、Google先生上のたくさんの記事を見つつメールサーバを構築した。

で、見出しの「ボクの人格はふざけてます」のことだが、どのようにふざけているかというと、このメールサーバ構築という課題に取り組んでいるとき、仕事中も他の仕事は秒速で終わらせて帰宅後も睡眠時間を削ってsshで向き合って向き合って、もう君以外愛せない、たとえどんなエラーを吐いたとしてもぉーおー、とキンキキッズになれそうなくらい没頭していた。
1週間経った頃、あそうか、ボクは人格破綻者なんだ、とハッキリ理解できた。

各メールプロトコルとメールエージェントの理解

実際にメールサーバを立てる際に、どのエージェント(デーモン)がどのプロトコルをどのように扱っているのか、という範囲がわからなく時があった。 それぞれの境界線をはっきりさせておくと後々設定していく内容が理解しやすいと思う。

エージェントとプロトコルの関係

http://images.slideplayer.com/23/6641114/slides/slide_2.jpg
David Byers davby@ida.liu.se IDA/ADIT/IISLAB ©2003–2004 David Byers Electronic Mail PRINCIPLES – DNS – ARCHITECTURES – SPAM. - ppt download
より抜粋

  • MTA - Mail Transfer Agent
  • MDA - Mail Delivery Agent
  • MUA - Mail User Agent
  • MRA - Mail Retrieval Agent
  • MSA - Mail Submission Agent
  • MAA - Mail Access Agent

こんなエージェントあるんや、って言うようなエージェントがある。
Postfixは多分、MTAとMSAに特化してるんだと思う。
DovecotMDA、MRA、MAAを担ってるのかなという感じなのだが、実際各デーモンがどういった範囲でエージェントの作業をしているかはわかっていない…。

説明を少なめに、かつ分割します…

丁寧に書きすぎるとブログの範疇を超えてしまいそうなので、設定ファイルと簡潔な説明を心がけて記載しようと思う。
あまりにも設定数、設定ファイルが多い…。
というか、ちゃんとすべてをカバーして書けるかどうかも怪しい。
手順書というよりは、メモ書き程度で見るようにしてほしい。

環境

OS: CentOS Linux release 7.2.1511 (Core)

パッケージインストール
$ sudo yum -y install mariadb \
postfix \
postfix-ssl \
dovecot \
dovecot-mysql.x86_64 \
httpd \
php \
php-mysql \
php-mbstring \
php-pear \
php5-mcrypt \
php-mcrypt \
php-imap \
cyrus-sasl \
cyrus-sasl-plain \
cyrus-sasl-md5 \
libapache2-mod-php \
libapache2-mod-php5

Postfixの設定ファイル

/etc/postfix/main.cf
myhostname = [FQDN]
mydomain = [ドメイン名]
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = localhost.$mydomain, localhost
mynetworks = 192.168.0.0/24, 127.0.0.0/8, [アクセスを許可するIP]
relayhost = [プロバイダのsmtpサーバ]:587 #OP25B対策のため
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown

#SMTP-Auth Settings
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_mechanism_filter = plain
smtp_sasl_security_options = noanonymous
smtp_sasl_path = private/auth
smtp_sasl_tls_security_options = noanonymous
smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt

smtp_tls_security_level = may
smtp_tls_loglevel = 1

#SMTPS
local_transport = local
smtpd_use_tls = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain = [FQDN], [ドメイン名]
smtpd_client_restrictions = reject_rbl_client bl.spamcop.net

smtpd_tls_cert_file = /etc/postfix/mail.crt
smtpd_tls_key_file = /etc/postfix/mail.key
#smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
#smtpd_tls_key_file = /etc/postfix/mail.pem
#broken_sasl_auth_clients = yes
broken_sasl_auth_clients = no
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

smtpd_tls_security_level=encrypt
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s

#Virtual Domain w/MySQL
virtual_mailbox_base = /var/spool/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_transport = virtual
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
/etc/postfix/master.cf
smtp      inet  n       -       n       -       -       smtpd

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
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING  -
tlsmgr    unix  -       -       n       1000?   1       tlsmgr

OP25B対策

/etc/postfix/sasl_passwd

下記は、自分が契約しているプロバイダのメールアドレスとパスワードを設定する。 gmailを設定する方法もあるのだが、それは必要になった場合に書くようにしよう。

[smtpサーバ名]:ポート メールアドレス:パスワード

下記コマンドで/etc/postfix/sasl_passwd.dbが作成される。

$ sudo postmap /etc/postfix/sasl_passwd

main.confで設定したリレーホストへ接続し、ここで設定したプロバイダのメール認証情報で認証してメールリレーすることにより、OP25Bを回避して正しい相手先へメールを送信することができるようになる。

次回

PostfixからMariaDBへ発行するクエリの設定ファイルを書く。
メール設定がこれほどまでに大変だったとは、と痛感するドキュメント量になることであろう…。