今回の目標を確認
今回の目標を確認します。
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は、ファイルをダウンロードして、解凍すれば、設定ファイルを手に入れられます。
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+Dovecot) – CentOSで自宅サーバー構築
Postfix + Dovecot 2 + PostfixAdmin + MySQL [がらくたネット]
ベリーキュート Blog » Blog Archive » PostfixAdminでバーチャルメールの構築
他多数
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 }
メールユーザーを識別のためにgidとuidを使うので、明示的に指定します。
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.jsonにrecipeなどを追記します。
postfixallowipの000.000.000.000にはアクセスを許可するIPアドレスを入れてください。
postfixhtpasswdには、コマンドラインで生成したものや、下記のWEBサービスなどで作成したものを入れてください。
.htaccess ファイルを簡単作成「.htaccess Editor」
.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を設定します。
$CONF['setup_password']が表示されるので、サーバーにアクセスしてconfig.inc.phpを書き換えます。
そのあと、管理者登録を行います。
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へ
今回、設定したrecipeをGitHubにアップしておきます。
https://github.com/tukumemorisan/sakuravps
最後まで見ていただき、ありがとうございました。
また、ご不明な点、間違いなどありましたらご連絡ください。
それでは、またねー。
コメント