t4traw's blog

CentOS7にPostfix & Dovecot & Let's Enclypt環境をitamaeで構築する[2]

今回の一番のメイン、PostfixとDovecotのレシピを書きます。といっても、先人様が書いてきてくださった色々な情報を落とし込んでいるだけなんですけどねorz

事前準備: node.yml

今回必要なyamlに追加する項目はこちら

domain: example.com

だけです。

Postfixのレシピ

というわけで、まずはPostfixのレシピから書きます。

package 'postfix'

HOSTNAME = "mail.#{node[:domain]}"

file "/etc/postfix/main.cf" do
  action :edit
  block do |content|
    # メールサーバのホスト名(FQDN)を指定
    content.gsub!("#myhostname = host.domain.tld", "myhostname = #{HOSTNAME}")
    
    # メールサーバのドメイン名を指定
    content.gsub!("#mydomain = domain.tld", "mydomain = #{node[:domain]}")
    
    # メールアドレスを「ユーザ名@ドメイン名」の形式にする
    content.gsub!("#myorigin = $mydomain", "myorigin = $mydomain")
    
    # 全てのホストからメールを受信する
    content.gsub!(/^inet_interfaces\s=\s.*$/, "inet_interfaces = all")
    
    # 受信するドメイン宛のメールを指定する
    content.gsub!(/^mydestination.*?localhost$/, "mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain")
    
    # メールの格納フォーマットの指定
    content.gsub!("#home_mailbox = Maildir/", "home_mailbox = Maildir/")
    
    # 不要な情報を公開しない
    content.gsub!("#smtpd_banner = $myhostname ESMTP $mail_name", "smtpd_banner = $myhostname ESMTP unknown")
    
    # --------------------------------------------------
    # 追加設定項目
    # --------------------------------------------------
    additional_option = []
    
    # SASL認証を有効化
    additional_option << "smtpd_sasl_auth_enable = yes"
    additional_option << "smtpd_sasl_local_domain = $myhostname"
    
    # 認証にDovecotを指定
    additional_option << "smtpd_sasl_type = dovecot"
    additional_option << "smtpd_sasl_path = private/auth"
    
    # 認証を通過したものはリレーを許可する(permit_sasl_authenticated)
    additional_option << "smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
    
    # 受信メールサイズを10MBに制限
    additional_option << "message_size_limit = 10485760"

    # SSLで暗号化するため、TLSを有効化
    additional_option << "smtpd_use_tls = yes"

    # サーバ証明書と秘密鍵を指定(Let's encrypt)
    additional_option << "smtpd_tls_cert_file = /etc/letsencrypt/live/#{HOSTNAME}/fullchain.pem"
    additional_option << "smtpd_tls_key_file = /etc/letsencrypt/live/#{HOSTNAME}/privkey.pem"

    # 接続キャッシュファイルの指定
    additional_option << "smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache"

    # 存在しないユーザー宛メールの破棄
    additional_option << "local_recipient_maps ="
    additional_option << "luser_relay = unknown_user@localhost"

    content.concat << additional_option.join("\n")
  end
end

template "/etc/postfix/master.cf"

file "/etc/sasl2/smtpd.conf" do
  action :edit
  block do |content|
    content.gsub!("pwcheck_method: saslauthd", "pwcheck_method: auxprop")
  end
end

# Maildir形式で受信できるようにする
execute 'mkdir -p /etc/skel/Maildir/{new,cur,tmp}'
execute 'chmod -R 700 /etc/skel/Maildir'

# 存在しないユーザー宛のメールを破棄するための設定
execute 'echo unknown_user: /dev/null >> /etc/aliases'
execute 'newaliases'

service 'postfix' do
  action [:start, :enable]
end

あとはtemplate "/etc/postfix/master.cf"しているので、cookbooks/postfix/templates/etc/postfix/master.cfを作っておきます。

Dovecotのレシピ

メールサーバーとメールクライアントの通信のためにDovecotを設定します。ssl証明書が必要なのですが、Let’s Encryptを利用しました。(Let’s Encryptの設定に関してはこちらを参考に)

package 'dovecot'

HOSTNAME = "mail.#{node[:domain]}"

file "/etc/dovecot/conf.d/10-mail.conf" do
  action :edit
  block do |content|
    content.gsub!("#mail_location =", "mail_location = maildir:~/Maildir")
  end
end

file "/etc/dovecot/conf.d/10-ssl.conf" do
  action :edit
  block do |content|
    content.gsub!('ssl = required', 'ssl = yes')
    content.gsub!(/ssl_cert = .*$/, "ssl_cert = </etc/letsencrypt/live/#{HOSTNAME}/fullchain.pem")
    content.gsub!(/ssl_key = .*$/, "ssl_key = </etc/letsencrypt/live/#{HOSTNAME}/privkey.pem")
  end
end

file "delete default 10-master.conf" do
  path "/etc/dovecot/conf.d/10-master.conf"
  action :delete
end

template "/etc/dovecot/conf.d/10-master.conf"

file "/etc/dovecot/dovecot.conf" do
  action :edit
  block do |content|
    content.gsub!("#protocols = imap pop3 lmtp", "protocols = imap")
  end
end

execute "add mail server ports" do
  user "root"
  cmd = [
    'firewall-cmd --add-service=smtp --permanent --zone=public',
    'firewall-cmd --add-service=smtps --permanent --zone=public',
    'firewall-cmd --add-service=imaps --permanent --zone=public',
    'firewall-cmd --reload'
  ]
  command cmd.join('&&')
end

service 'dovecot' do
  action [:start, :enable]
end

service 'postfix' do
  action [:start, :enable]
end

で、こちらもtemplate "/etc/dovecot/conf.d/10-master.conf"しているので、cookbooks/dovecot/templates/etc/dovecot/conf.d/10-master.conf.erbを作っておきます。

自分の環境では、すべてimapを利用しているので、pop3は設定していません。

各設定の細かな解説などは他にもっと詳しい方が記事を書いているので、自分はそれをitamaeのレシピにしたらどんな感じかを記事にしておきます(excuteすごい使ってるけど)。

それでは。

※全体的なレシピもGitHubにpushしてあります。

t4traw/mailserver-itamae-recipe

カテゴリー

キーワード