今回の目標を確認

今回の目標を確認します。

  • rootパスワードの変更
  • SSH接続の設定変更
  • sudoの設定
  • 一般ユーザーの追加
  • システムのアップデート
  • iptablesの設定
  • WEBサーバーの設定
  • WEBページの設定
  • マルチドメインの設定
  • PHPの設定
  • MySQLの設定
  • Postfix/Dovecot/Postfix Adminの設定

メールを設定する前に

メールを設定するには、いくつかのアプリケーションインストールする必要があります。

Postfix 送信用メールサーバー
Dovecot 受信用メールサーバー
Postfix Admin メールのユーザーやドメインをGUIで管理するツール

設定ファイルの収集

仮インストールして設定ファイルを集めます。
mailsetというCookbookを作成します。

knife cookbook create mailset -o site-cookbooks

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/recipes/default.rb

%w{postfix dovecot dovecot-mysql cyrus-sasl}.each do |pkg|
    package pkg do
        action :install
    end
end

~/vagrantdir/sakuravps/chef-repo/nodes/sakuravps.json

(略)
  "recipe[mailset]"
(略)

仮想環境に反映させて、データを手に入れます。

$ knife solo bootstrap sakuravps

必要なファイル

必要なファイルは以下のものになります。

Postfix

/etc/postfix/main.cf
/etc/postfix/master.cf

Dovecot

/etc/dovecot/conf.d/10-mail.conf
/etc/dovecot/conf.d/20-pop3.conf
/etc/dovecot/conf.d/10-auth.conf
/etc/dovecot/conf.d/10-master.conf

Postfix Adminは、ファイルをダウンロードして、解凍すれば、設定ファイルを手に入れられます。

postfixadmin-2.91.tar.gz

Postfix Admin

/var/www/postfixadmin/config.inc.php
/var/www/postfixadmin/backup.php

templatesに入れる

これらを集めたら、とりあえず拡張子をerbに変えて、templatesディレクトリに入れましょう。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default

Database Cookbookのインストール

メールの設定に、データベースを使います。
recipe上で、MySQLのデータベースユーザーを作成する必要があります。
DatabaseというサードパーティCookbookで設定します。

database Cookbook – Chef Supermarket

Cookbookのバージョンを指定

いつものようにBerksfileに追記したいのですが、注意が必要です。

あまり分かっていませんが、現時点でのdatabase Cookbookの最新版である2.3.0では、上手く使えませんでした。
以前、使ったときは上手くいっていたので、仕様が変わったのかもしれません。
(どなたか、知っている方がいたら、教えてください)

そこで、バージョンを指定してインストールします。

~/vagrantdir/sakuravps/chef-repo/Berksfile

(略)
cookbook 'database', '~> 2.2.0'
$ berks install

設定ファイルの変更

取得したファイルを書き換えます。
以下のサイトを参考にさせていただきました。
ありがとうございます。

水銀室 PostfixとDovecotでメールサーバを構築する -CentOS最短構築支援-

Postfix 基本設定

メールサーバー構築(Postfix+Dovecot) – CentOSで自宅サーバー構築

Postfix + Dovecot 2 + PostfixAdmin + MySQL [がらくたネット]

ベリーキュート Blog » Blog Archive » PostfixAdminでバーチャルメールの構築

CentOS Postfixの基本設定

他多数

Postfixのファイル

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/main.cf.erb

myorigin = $myhostname
inet_interfaces = all
#inet_interfaces = localhost
mynetworks = 127.0.0.0/8
home_mailbox = Maildir/

(以下新規追加)
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

broken_sasl_auth_clients = yes

virtual_transport = virtual
virtual_mailbox_base = /home/<%= node["mailset"]["postfixadmindirectory"] %>
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 = <%= @uid %>
virtual_uid_maps = static:<%= @uid %>
virtual_gid_maps = static:<%= @gid %>

virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = yes

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/master.cf.erb

submission inet n       -       n       -       -       smtpd

(新規作成)
~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/mysql_virtual_alias_maps.cf.erb

user = <%= node["mailset"]["postfixadmindbuser"] %>
password = <%= node["mailset"]["postfixadmindbpasswd"] %>
hosts = localhost
dbname = <%= node["mailset"]["postfixadmindbname"] %>
table = alias
select_field = goto
where_field = address

(新規作成)
~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/mysql_virtual_domains_maps.cf.erb

user = <%= node["mailset"]["postfixadmindbuser"] %>
password = <%= node["mailset"]["postfixadmindbpasswd"] %>
hosts = localhost
dbname = <%= node["mailset"]["postfixadmindbname"] %>
table = domain
select_field = domain
where_field = domain

(新規作成)
~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/mysql_virtual_mailbox_maps.cf.erb

user = <%= node["mailset"]["postfixadmindbuser"] %>
password = <%= node["mailset"]["postfixadmindbpasswd"] %>
hosts = localhost
dbname = <%= node["mailset"]["postfixadmindbname"] %>
table = mailbox
select_field = maildir
where_field = username

(新規作成)
~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/mysql_virtual_mailbox_limit_maps.cf.erb

user = <%= node["mailset"]["postfixadmindbuser"] %>
password = <%= node["mailset"]["postfixadmindbpasswd"] %>
hosts = localhost
dbname = <%= node["mailset"]["postfixadmindbname"] %>
table = mailbox
select_field = quota
where_field = username

Dovecotのファイル

(新規作成)
~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/dovecot-mysql.conf.erb

driver = mysql
default_pass_scheme = PLAIN
connect = dbname=postfix user=postfix host=localhost password=postfix
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT concat('/home/<%= node["mailset"]["postfixadmindirectory"] %>/', maildir) as home, <%= @uid %> as uid, <%= @gid %> as gid FROM mailbox WHERE username = '%u' AND active = '1'

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/10-mail.conf.erb

mail_location = maildir:/home/<%= node["mailset"]["postfixadmindirectory"] %>/%d/%n
first_valid_uid = <%= @uid %>
first_valid_gid = <%= @gid %>

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/20-pop3.conf.erb

pop3_uidl_format = %08Xu%08Xv

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/10-auth.conf.erb

disable_plaintext_auth = no
auth_mechanisms = plain login
#!include auth-system.conf.ext
!include auth-mysql.conf.ext

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/10-master.conf.erb

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

(新規作成)
~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/auth-mysql.conf.ext.erb

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

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

Postfix Adminのファイル

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/config.inc.php.erb

$CONF['configured'] = true;
$CONF['default_language'] = 'ja';
$CONF['database_user'] = '<%= node["mailset"]["postfixadmindbuser"] %>';
$CONF['database_password'] = '<%= node["mailset"]["postfixadmindbpasswd"] %>';
$CONF['database_name'] = '<%= node["mailset"]["postfixadmindbname"] %>';
$CONF['encrypt'] = 'cleartext';
$CONF['aliases'] = '100';
$CONF['mailboxes'] = '100';
$CONF['maxquota'] = '100';
$CONF['sendmail'] = 'NO';
$CONF['fetchmail'] = 'NO';
$CONF['show_footer_text'] = 'NO';
$CONF['emailcheck_resolve_domain']='NO';

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/backup.php.erb

session_cache_limiter('public');
require_once('common.php');

.htaccess/.htpasswdの設置

一般のユーザーが、Postfix Adminアクセスできてしまうのは良くないので、想定している環境以外からアクセスできないように.htaccessを設定します。
念のため.htpasswdも設定します。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/htaccess.erb


deny from all

Options -Indexes
AuthUserFile <%= node["mailset"]["postfixadmindir"] %>/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user 
order deny,allow
allow from <%= node["mailset"]["postfixallowip"] %>
deny from all

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/templates/default/htpasswd.erb

<%= node["mailset"]["postfixhtpasswd"] %>

メール専用のユーザー

メールを設定するためには、Linuxのユーザーが必要になります。

accountと同じようにdata_bagで処理したいと思います。
メール専用なので、accountとは別にmailディレクトリを作成しました。

~/vagrantdir/sakuravps/chef-repo/data_bags/mail/vuser.json

{
    "id":"vuser",
    "name":"vuser",
    "password":"$1$8kBaRzfA$HXMP3ZDpa66VpTIL69BGE1",
    "gid":5000,
    "uid":5000
}

メールユーザーを識別のためにgiduidを使うので、明示的に指定します。

recipe

仮インストールの記述は忘れて、新しく書いていきます。
templateのファイルが多いので、少し長く見えます。

~/vagrantdir/sakuravps/chef-repo/site-cookbooks/mailset/recipes/default.rb

u = data_bag_item("account","webmaster")
mail = data_bag_item("mail","vuser")

%w{postfix dovecot dovecot-mysql cyrus-sasl}.each do |pkg|
    package pkg do
        action :install
    end
end

service "sendmail" do
  action [ :disable, :stop ]
end

service "postfix" do
  supports :restart => true, :start => true
  action :enable
end

service "dovecot" do
  supports :restart => true, :start => true
  action :enable
end

execute "home_chmod" do
  command "chmod 771 /home/#{mail["name"]}"
  action :nothing
end

group mail["name"] do
    gid mail["gid"]
    action :create
end

user mail["name"] do
    shell "/sbin/nologin"
    gid mail["gid"]
    uid mail["uid"]
    home "/home/#{mail["name"]}"
    password mail["password"]
    supports :manage_home => true
    action :create
    notifies :run ,"execute[home_chmod]"
end

template "main.cf" do
  path "/etc/postfix/main.cf"
  source "main.cf.erb"
  mode 0644
  notifies :restart, "service[postfix]"
  variables({
     :gid => mail["gid"],
     :uid => mail["uid"]
  })
end

template "master.cf" do
  path "/etc/postfix/master.cf"
  source "master.cf.erb"
  mode 0644
  notifies :restart, "service[postfix]"
end

template "mysql_virtual_alias_maps.cf" do
  path "/etc/postfix/mysql_virtual_alias_maps.cf"
  source "mysql_virtual_alias_maps.cf.erb"
  mode 0644
  notifies :restart, "service[postfix]"
end

template "mysql_virtual_domains_maps.cf" do
  path "/etc/postfix/mysql_virtual_domains_maps.cf"
  source "mysql_virtual_domains_maps.cf.erb"
  mode 0644
  notifies :restart, "service[postfix]"
end

template "mysql_virtual_mailbox_maps.cf" do
  path "/etc/postfix/mysql_virtual_mailbox_maps.cf"
  source "mysql_virtual_mailbox_maps.cf.erb"
  mode 0644
  notifies :restart, "service[postfix]"
end

template "mysql_virtual_mailbox_limit_maps.cf" do
  path "/etc/postfix/mysql_virtual_mailbox_limit_maps.cf"
  source "mysql_virtual_mailbox_limit_maps.cf.erb"
  mode 0644
  notifies :restart, "service[postfix]"
end

template "dovecot-mysql.conf" do
  path "/etc/dovecot/dovecot-mysql.conf"
  source "dovecot-mysql.conf.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
  variables({
   :gid => mail["gid"],
   :uid => mail["uid"]
})
end

template "dovecot.conf" do
  path "/etc/dovecot/dovecot.conf"
  source "dovecot.conf.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
end

template "10-mail.conf" do
  path "/etc/dovecot/conf.d/10-mail.conf"
  source "10-mail.conf.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
  variables({
     :gid => mail["gid"],
     :uid => mail["uid"]
  })
end

template "20-pop3.conf" do
  path "/etc/dovecot/conf.d/20-pop3.conf"
  source "20-pop3.conf.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
end

template "10-auth.conf" do
  path "/etc/dovecot/conf.d/10-auth.conf"
  source "10-auth.conf.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
end

template "10-master.conf" do
  path "/etc/dovecot/conf.d/10-master.conf"
  source "10-master.conf.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
end

template "auth-mysql.conf.ext" do
  path "/etc/dovecot/conf.d/auth-mysql.conf.ext"
  source "auth-mysql.conf.ext.erb"
  mode 0644
  notifies :restart, "service[dovecot]"
end

execute "postfixadmin" do
  command <<-EOH
  wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.91/postfixadmin-2.91.tar.gz
  tar xzf postfixadmin-2.91.tar.gz
  mv postfixadmin-2.91 #{node["mailset"]["postfixadmindir"]}
  chown -R #{u["name"]}.apache #{node["mailset"]["postfixadmindir"]}
  chmod 755 #{node["mailset"]["postfixadmindir"]}
  chmod 775 #{node["mailset"]["postfixadmindir"]}/templates_c
  rm -f postfixadmin-2.91.tar.gz
  EOH
  action :run
  notifies :create, "template[config.inc.php]"
  notifies :create, "template[backup.php]"
  notifies :create, "template[htaccess]"
  notifies :create, "template[htpasswd]"
end

template "config.inc.php" do
  path "#{node["mailset"]["postfixadmindir"]}/config.inc.php"
  source "config.inc.php.erb"
  mode 0644
  action :nothing
end

template "backup.php" do
  path "#{node["mailset"]["postfixadmindir"]}/backup.php"
  source "backup.php.erb"
  mode 0644
  action :nothing
end

template "htaccess" do
  path "#{node["mailset"]["postfixadmindir"]}/.htaccess"
  source "htaccess.erb"
  mode 0644
  owner u["name"]
  group "apache"
  action :nothing
end

template "htpasswd" do
  path "#{node["mailset"]["postfixadmindir"]}/.htpasswd"
  source "htpasswd.erb"
  mode 0644
  owner u["name"]
  group "apache"
  action :nothing
end

nodes

nodes/sakuravps.jsonrecipeなどを追記します。
postfixallowip000.000.000.000にはアクセスを許可するIPアドレスを入れてください。
postfixhtpasswdには、コマンドラインで生成したものや、下記のWEBサービスなどで作成したものを入れてください。

.htaccess ファイルを簡単作成「.htaccess Editor」

htpasswdファイル生成(作成)

.htpasswd生成ツール(MD5対応)|株式会社エン・PCサービス|システム開発・Webサイト制作・ITコンサルティング

~/vagrantdir/sakuravps/chef-repo/nodes/sakuravps.json

(略)
"recipe[mailset]"
  ],
  "mailset": {
    "postfixadmindir": "/var/www/html/exmaple.com/postfix",
    "postfixadmindbuser": "postfix",
    "postfixadmindbname": "postfix",
    "postfixadmindbpasswd": "postfix",
    "postfixadmindirectory":"vuser",
    "postfixallowip":"000.000.000.000",
    "postfixhtpasswd":"morisan:5elc13aaro3kk"
  },
(略)

Postfix Adminの初期設定

ブラウザからアクセスして、初期設定をします。
この段階では、仮想環境での作業ですからhostsファイル書き換えてアクセスすると良いでしょう。

c:¥windows¥system32¥drivers¥etc¥hosts

192.168.33.10 exmaple.com

setup passwordの設定

Postfix Adminをインストールしたアドレスのsetup.phpにアクセスし、setup passwordを設定します。

http://exmaple.com/postfix

cygwin-chef-sakura6_01

$CONF['setup_password']が表示されるので、サーバーにアクセスしてconfig.inc.phpを書き換えます。

cygwin-chef-sakura6_02

そのあと、管理者登録を行います。
login.phpに移動して、管理者としてログインできれば完了です。

この設定は、本番環境でも行う必要があります。

さくらVPSへ

さくらVPS契約が完了したら、コントロールパネルにログインし、仮想サーバ操作からサーバーを起動します。

さくらVPSにknife solo prepareを実行するために~/.ssh/configに追記します。
[さくらVPSのIP]には、契約したIPアドレスを入れてください。

~/.ssh/config

Host [さくらVPSのIP]
HostName [さくらVPSのIP]
User root
StrictHostKeyChecking no
IdentitiesOnly no

これは、仮想環境で行ったことと同じです。

$ knife solo prepare [さくらVPSのIP]
Bootstrapping Chef...
Enter the password for root@[さくらVPSのIP]:

nodesの新しいファイルに、sakuravps.jsonの内容をコピーします。

~/vagrantdir/sakuravps/chef-repo/nodes/[さくらVPSのIP].json

反映してみましょう。
何度かパスワードを聞かれますが、コピペして進めてください。
10回くらい聞かれます)

$ knife solo cook [さくらVPSのIP]

無料期間とDNSについて

すでにさくらVPSを契約している方もおられると思いますが、2週間お試し無料期間中は、Port25(メール送信用ポート)が使えません。
メールの送信テストの際は、本契約して起きましょう。
また、DNSのAレコード、MXレコードの設定を忘れないようにしてください。

エラーについて

さくらVPSを初期化(OS再インストール)して、Chefを実行しようとすると、エラーがでる場合があります。
明確な理由が分かりませんでしたが、一定期間経つとアクセスできると思います。
(OS再インストールが、まだ終わっていなかったというオチだと嫌ですね…)

ERROR: RuntimeError: Unable to connect to [さくらVPSのIP]

そのあと、以下のようなエラーが出ることがあります。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
(略)

これは以下のコマンドで解消する必要があります。

$ ssh-keygen -R [さくらVPSのIP]

GitHubへ

今回、設定したrecipeGitHubにアップしておきます。

https://github.com/tukumemorisan/sakuravps

最後まで見ていただき、ありがとうございました。
また、ご不明な点、間違いなどありましたらご連絡ください。

それでは、またねー。