CentOS 6.6 内に、オープンソース「PostfixAdmin+Postfix+Dovecot2+ClamAV+SpamAssassin+Amavisd-new+SSL/TLS」構成にて、バーチャルドメイン&スパムフィルター対応のメールサーバーを構築します。(2015/06/28作成)
ulleo / Pixabay
◆構築要件
メールサーバ設定概要 サーバアドレス:mail.offline-net.com サーバOS:CentOS6.6 送信サーバ:Postfix(SMTP-Auth over SSL) 受信サーバ:Dovecot(IMAPS,POP3S)
暗号化なし 暗号化あり プロトコル名 ポート番号 プロトコル名 ポート番号 POP3 110 POP3s 995 IMAP4 143 IMAP4s 993 SMTP 25/587 SMTPs 465
0.環境
$ cat /etc/redhat-release CentOS release 6.6 (Final)
1.PostfixAdminの設定
Postfix Admin http://sourceforge.net/projects/postfixadmin/ Download & install $ wget -O postfixadmin-2.92.tar.gz http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.92/postfixadmin-2.92.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fpostfixadmin%2F&ts=1434964296&use_mirror=cznic $ tar zxvf postfixadmin-2.92.tar.gz $ sudo cp -rfp postfixadmin-2.92 /var/www/html $ sudo ln -s /var/www/html/postfixadmin-2.92/ /var/www/html/postfixadmin $ sudo chown daemon:daemon -R /var/www/html/postfixadmin-2.92 /var/www/html/postfixadmin $ sudo chown daemon:daemon -h /var/www/html/postfixadmin
バーチャルドメインメールを保存する「ディレクトリ」「ユーザー」の作成します。
$ sudo groupadd -g 5000 virtual $ sudo useradd -g 5000 -u 5000 virtual
PostfixAdminで使用するDB、Userの作成、データベースを「postfix」ユーザーを「postfix」で作成します。
mysql> create database postfix DEFAULT CHARACTER SET utf8; mysql> grant all privileges on postfix.* to postfix@localhost identified by "ユーザーのパスフレーズ"; mysql> flush privileges; mysql> exit;
PostfixAdminセットアップURL: http://セットアップサイト名/postfixadmin/setup.php ----- Warning: Depends on: IMAP functions - NOT FOUND To install IMAP support, install php5-imap Without IMAP support, you won't be able to create subfolders when creating mailboxes. ----- php-imap が不足している場合はインストールします。
2.Postfixの初期設定
下記コマンドで「mysql」と表示されているのでMySQLに対応していることが確認できます。
$ sudo postconf -m btree cidr environ hash ldap mysql nis pcre proxy regexp static unix btree cidr environ hash ldap mysql nis pcre proxy regexp static unix
PostfixからMySQLへアクセスする為のファイルを作成します。
$ sudo vi /etc/postfix/mysql_virtual_alias_maps.cf user = postfix password = DBパスワード hosts = localhost dbname = postfix table = alias select_field = goto where_field = address
$ sudo vi /etc/postfix/mysql_virtual_domains_maps.cf user = postfix password = DBパスワード hosts = localhost dbname = postfix table = domain select_field = domain where_field = domain additional_conditions = and active = '1'
$ sudo vi /etc/postfix/mysql_virtual_mailbox_maps.cf user = postfix password = DBパスワード hosts = localhost dbname = postfix table = mailbox select_field = maildir where_field = username
$ sudo vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cf user = postfix password = DBパスワード hosts = localhost dbname = postfix table = mailbox select_field = quota where_field = username #additional_conditions = and active = '1'
3.SSL/TLSの設定
サーバー用秘密鍵・自己証明書の作成(SSL/TLS用)
$ cd /etc/pki/tls/certs $ sudo cp -p Makefile Makefile.ORG
サーバー用証明書有効期限を1年から10年に変更
$ sudo sed -i 's/365/3650/g' Makefile
サーバー用秘密鍵・自己証明書の作成
$ sudo make mail.offline-net.com.crt
---(以下を入力)--------------------------- Enter pass phrase:1234(←表示されません) Verifying – Enter pass phrase:1234(←表示されません) Enter pass phrase for server.key:1234(←表示されません) Country Name (2 letter code) [GB]:JP State or Province Name (full name) [Berkshire]:<空エンター> Locality Name (eg, city) [Newbury]:<空エンター> Organization Name (eg, company) [My Company Ltd]:<空エンター> Organizational Unit Name (eg, section) []:<空エンター> Common Name (eg, your name or your server’s hostname) []:mail.offline-net.com Email Address []:<空エンター>
サーバー用秘密鍵からパスワード削除
$ sudo openssl rsa -in mail.offline-net.com.key -out mail.offline-net.com.key ---(以下を入力)--------------------------- Enter pass phrase for server.key:1234(←表示されません)
サーバー用秘密鍵の場所を変更
$ sudo mv /etc/pki/tls/certs/mail.offline-net.com.key /etc/pki/tls/private/
4.Postfixの設定ファイルを編集(main.cf)
$ sudo cp -p /etc/postfix/{main.cf,main.cf.ORG} $ sudo vi /etc/postfix/main.cf
# 以下コメントアウト #inet_interfaces = localhost #inet_protocols = all #mydestination = $myhostname, localhost.$mydomain, localhost # 最終行に追加 myhostname = mail.offline-net.com # サーバーのホスト名 inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost relay_domains = $mydestination home_mailbox = Maildir/ smtpd_banner = $myhostname ESMTP unknown # Virtual Domain w/MySQL local_transport = local virtual_transport = procmail # メールの配送はprocmail procmail_destination_recipient_limit = 1 virtual_mailbox_base = /home/virtual 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 = 5000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 maximal_backoff_time = 800s minimal_backoff_time = 100s bounce_queue_lifetime = 60m maximal_queue_lifetime = 60m message_size_limit = 20480000 #virtual_mailbox_limit = 51200000 virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes virtual_overquota_bounce = yes virtual_mailbox_limit_inbox = yes # End Virtual Domain w/MySQL # SMTP-Auth smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_local_domain = $myhostname smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes # End SMTP-Auth # SpamAssasin + procmail mailbox_command = /usr/bin/procmail # End SpamAssasin + procmail # amavisd-new content_filter=smtp-amavis:[127.0.0.1]:10024 # End amavisd-new # TLS/SSL smtpd_use_tls = yes smtpd_tls_cert_file = /etc/pki/tls/certs/mail.offline-net.com.crt smtpd_tls_key_file = /etc/pki/tls/private/mail.offline-net.com.key smtpd_tls_loglevel = 1 smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache smtpd_tls_session_cache_timeout = 3600s smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination smtpd_tls_security_level = may smtpd_tls_auth_only = yes # End TLS/SSL # Send TLS smtp_tls_security_level = may # End Send TLS
新規ユーザーが追加されたらホームディレクトリに Mairdir/ を自動で作成されるようにします。
$ sudo mkdir -p /etc/skel/Maildir/{new,cur,tmp} $ sudo mkdir -p /etc/skel/Maildir/.Spam/{new,cur,tmp} ※スパム専用メールボックス $ sudo chmod -R 700 /etc/skel/Maildir/
5.Postfixの設定ファイルを編集(master.cf)
$ sudo cp -p /etc/postfix/{master.cf,master.cf.ORG} $ sudo vi /etc/postfix/master.cf #以下コメントアウトを解除 / smtps(SMTP-Auth over SSL)を有効化 #smtps inet n - n - - smtpd # -o smtpd_tls_wrappermode=yes # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject #最終行に追加 # amavisd-new smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 # End amavisd-new # procmail procmail unix - n n - - pipe flags=R user=virtual argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc # End procmail
ルックアップテーブルの作成
$ sudo postmap /etc/postfix/access
設定に誤りがないかチェック(なにも表示されなければOKです)
$ sudo postfix check
6.dovecot2の設定
$ sudo yum install dovecot dovecot-mysql cyrus-sasl
$ sudo cp -p /etc/dovecot/{dovecot.conf,dovecot.conf.ORG} $ sudo vi /etc/dovecot/dovecot.conf #以下変更 #protocols = imap pop3 lmtp ↓ protocols = imap pop3
dovecot2の設定ファイルは「/etc/dovecot/dovecot.conf」であるが、「/etc/dovecot/conf.d/」直下に「.conf」ファイルを作成すれば自動読み込みされる。「00-base.conf」というファイルを作成し設定します。
$ sudo vi /etc/dovecot/conf.d/00-base.conf # debug auth_debug_passwords = yes auth_verbose = yes auth_debug = yes listen = * disable_plaintext_auth = no auth_mechanisms = plain login digest-md5 cram-md5 # mail dir mail_location = maildir:/home/virtual/%d/%u first_valid_uid = 5000 first_valid_gid = 5000 mail_plugins = quota protocol imap { imap_client_workarounds = delay-newmail tb-extra-mailbox-sep mail_plugins = $mail_plugins imap_quota } protocol pop3 { pop3_client_workarounds = outlook-no-nuls oe-ns-eoh } passdb { driver = sql args = /etc/dovecot/dovecot-postfixadmin-mysql.conf } userdb { driver = sql args = /etc/dovecot/dovecot-postfixadmin-mysql.conf } service auth { unix_listener /var/spool/postfix/private/auth { mode = 0666 } } plugin { quota = maildir:User quota }
次に「10-auth.conf」を編集します。
$ sudo cp -p /etc/dovecot/conf.d/{10-auth.conf,10-auth.conf.ORG} $ sudo vi /etc/dovecot/conf.d/10-auth.conf #以下コメントアウト #auth_mechanisms = plain #!include auth-system.conf.ext
次に「MySQLへの接続ファイル」を作成します。
$ sudo vi /etc/dovecot/dovecot-postfixadmin-mysql.conf driver = mysql connect = host=localhost dbname=postfix user=postfix password=DBパスワード default_pass_scheme = MD5-CRYPT password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1' user_query = SELECT concat('/home/virtual/', maildir) AS home, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
バージョン1では protocols に「imaps」や「pop3s」と記述できたが、SSL/TLSを使うか否かは次の「10-master.conf」で設定します。
$ sudo cp -p /etc/dovecot/conf.d/{10-master.conf,10-master.conf.ORG} $ sudo vi /etc/dovecot/conf.d/10-master.conf service imap-login { inet_listener imap { #port = 143 ↓ port = 0 } inet_listener imaps { #port = 993 #ssl = yes ↓ port = 993 ssl = yes } } service pop3-login { inet_listener pop3 { #port = 110 ↓ port = 0 } inet_listener pop3s { #port = 995 #ssl = yes ↓ port = 995 ssl = yes } }
※暗号化をしない imap と pop3 を使えないようにするため「port = 0」と設定する。Dovecot SASL ライブラリの認証ソケットファイルを指定する。
$ sudo vi /etc/dovecot/conf.d/10-master.conf service auth { (略) # Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} ↓ unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }
認証方式の設定
$ sudo vi /etc/dovecot/conf.d/10-auth.conf #disable_plaintext_auth = yes ↓ disable_plaintext_auth = no auth_mechanisms = plain ↓ auth_mechanisms = plain login
※平文パスワードを許可していますが、SSL/TLSで暗号化されますので問題ない。
SSL/TLSの有効化とサーバ証明書と秘密鍵を指定
$ sudo cp -p /etc/dovecot/conf.d/{10-ssl.conf,10-ssl.conf.ORG} $ sudo vi /etc/dovecot/conf.d/10-ssl.conf #ssl = yes ↓ ssl = yes #ssl_cert = </etc/pki/dovecot/certs/dovecot.pem #ssl_key = </etc/pki/dovecot/private/dovecot.pem ↓ ssl_cert = </etc/pki/tls/certs/mail.offline-net.com.crt ssl_key = </etc/pki/tls/private/mail.offline-net.com.key
メールボックスの場所を指定
$ sudo cp -p /etc/dovecot/conf.d/{10-mail.conf,10-mail.conf.ORG} $ sudo vi /etc/dovecot/conf.d/10-mail.conf #mail_location = ↓ mail_location = maildir:~/Maildir
ログの出力先を変更
$ sudo cp -p /etc/dovecot/conf.d/{10-logging.conf,10-logging.conf.ORG} $ sudo vi /etc/dovecot/conf.d/10-logging.conf #log_path = syslog ↓ log_path = /var/log/dovecot/dovecot.log
ログの出力先作成しておきます
$ sudo mkdir /var/log/dovecot $ sudo /etc/init.d/dovecot restart
認証ソケットファイルが作成されているのを確認します
$ sudo ls -F /var/spool/postfix/private/auth ---(下記表示があればOK)--------------------------- /var/spool/postfix/private/auth =
7.Dovecotログの設定
$ sudo vi /etc/logrotate.d/dovecot /var/log/dovecot/dovecot.log { daily missingok dateext rotate 60 sharedscripts postrotate /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true endscript }
最後自動起動の設定
$ sudo /sbin/chkconfig dovecot on $ sudo /sbin/chkconfig saslauthd on
8.ClamAV設定
$ sudo yum install --enablerepo=epel clamd
$ sudo cp -p /etc/{clamd.conf,clamd.conf.ORG} $ sudo vi /etc/clamd.conf #User clam #コメントアウト
ウイルス定義ファイル更新機能を有効化と、定義ファイルの更新します。
$ sudo sed -i 's/Example/#Example/g' /etc/freshclam.conf $ sudo freshclam
起動と自動起動設定
$ sudo /etc/init.d/clamd start $ sudo /sbin/chkconfig clamd on
9.ClamAVとPostfixの連携
$ sudo cp -p /etc/{clamd.conf,clamd.conf.ORG} $ sudo vi /etc/clamd.conf #TCPSocket 3310 #コメントアウト sudo /etc/init.d/clamd restart
10.Amavised-new設定
$ sudo yum install --enablerepo=epel amavisd-new
$ sudo cp -p /etc/amavisd/{amavisd.conf,amavisd.conf.ORG} $ sudo vi /etc/amavisd/amavisd.conf # COMMONLY ADJUSTED SETTINGS: $undecipherable_subject_tag = ''; @bypass_spam_checks_maps = (1); $mydomain = 'localdomain'; #以下コメントアウト #ウィルスメールは隔離しない設定 #$QUARANTINEDIR = undef; # -Q #以下コメントアウト #ウィルス検知メールを管理者宛に通知しない #$virus_admin = undef; # notifications recip. ### BLOCKED ANYWHERE # qr'^UNDECIPHERABLE$', # is or contains any undecipherable components #以下コメントアウト(exeファイルを受信できるようにする) # qr'^\.(exe-ms|dll)$', # banned file(1) types, rudimentary # qr'^\.(exe|lha|cab|dll)$', # banned file(1) types # # this entry; when running chrooted one may prefer a socket under $MYHOME. #以下追加、(/var/run/clamav/clamd.sockはソケット名変更) ['ClamAV-clamd', \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"], qr/\bOK$/m, qr/\bFOUND$/m, qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
起動と自動起動設定
$ sudo /etc/init.d/amavisd start $ sudo /sbin/chkconfig amavisd on
11.SpamAssassin設定
起動と自動起動設定
$ sudo /etc/init.d/spamassassin start $ sudo /sbin/chkconfig spamassassin on
$ sudo cp -p /etc/mail/spamassassin/{v310.pre,v310.pre.ORG} $ sudo vi /etc/mail/spamassassin/v310.pre # TextCat - language guesser #以下コメントアウト解除 #loadplugin Mail::SpamAssassin::Plugin::TextCat
rootユーザーでSpamAssassin設定ファイル最新化スクリプト作成
$ pwd /var/tmp $ sudo vi spamassassin-update #!/bin/bash # SpamAssassin設定ファイル最新版ダウンロード cd /etc/mail/spamassassin wget -qN http://www.flcl.org/~yoh/user_prefs # 設定ファイル更新時のみSpamAssassin再起動 diff user_prefs user_prefs.org > /dev/null 2>&1 if [ $? -ne 0 ]; then cp user_prefs local.cf # スパム判断したメールを添付形式にしないように設定 echo "report_safe 0" >> local.cf # スパム判断したメールの件名に「***SPAM***」を付加するように設定※受信メールサーバーがPOPの場合のみ echo "rewrite_header Subject ***SPAM***" >> local.cf # SpamAssassin再起動 /etc/rc.d/init.d/spamassassin restart > /dev/null fi cp user_prefs user_prefs.org
実行権限追加
$ sudo chmod +x spamassassin-update
一度実行して、最新にする
$ ./spamassassin-update
cronに登録する
$ sudo mv spamassassin-update /etc/cron.daily/
11.procmailの設定ファイルを新規作成する
$ sudo vi /etc/procmailrc SHELL=/bin/bash PATH=/usr/bin:/bin MAILDIR=/home/virtual/$DOMAIN/$USER/Maildir DEFAULT=$MAILDIR/ SPAM=$MAILDIR/.Spam/ LOCKFILE=/home/virtual/procmail.lock LOGFILE=/home/virtual/procmail.log #VERBOSE=ON # SpamAssassin Spam Check :0fw |/usr/bin/spamc :0 *^X-Spam-Flag: YES $SPAM
12.ログの設定(procmail)
$ sudo vi /etc/logrotate.d/procmail /home/virtual/procmail.log { missingok nocreate notifempty }
13.メールディレクトリの自動作成・削除
PostfixAdminを使ってアカウント追加・削除する際に、ディレクトリを自動で作成・削除するようにスクリプトを作成する。
メールボックス作成・削除スクリプト用ディレクトリ作成
$ sudo mkdir /usr/local/bin/postfixadmin
PostfixAdminに有るスクリプトをコピー
$ sudo cp -p /var/www/html/postfixadmin/ADDITIONS/postfixadmin-domain-postdeletion.sh /usr/local/bin/postfixadmin $ sudo cp -p /var/www/html/postfixadmin/ADDITIONS/postfixadmin-mailbox-postcreation.sh /usr/local/bin/postfixadmin $ sudo cp -p /var/www/html/postfixadmin/ADDITIONS/postfixadmin-mailbox-postdeletion.sh /usr/local/bin/postfixadmin
削除したメールボックスを保存するディレクトリを作成
$ sudo mkdir /home/virtual/.deleted-maildirs $ sudo chmod 0700 /home/virtual/.deleted-maildirs $ sudo chown virtual:virtual /home/virtual/.deleted-maildirs
スクリプトの編集(メールボックス作成)
$ sudo vi /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh #basedir=/var/spool/maildirs #←コメントアウト basedir=/home/virtual #←追加 #以下コメントアウト #maildirmake "$maildir" #if [ ! -d "$maildir" ]; then # echo "$0: maildirmake didn't produce a directory; bailing out." # exit 1 #fi #以下exit 0の前に追加 mkdir "$maildir" if [ ! -d "$maildir" ]; then echo "$0: mkdir didn't produce a directory; bailing out." exit 1 fi mkdir "${maildir}cur" if [ ! -d "${maildir}cur" ]; then echo "$0: mkdir didn't produce a directory; bailing out." exit 1 fi mkdir "${maildir}new" if [ ! -d "${maildir}new" ]; then echo "$0: mkdir didn't produce a directory; bailing out." exit 1 fi mkdir "${maildir}tmp" if [ ! -d "${maildir}tmp" ]; then echo "$0: mkdir didn't produce a directory; bailing out." exit 1 fi chown -R virtual:virtual "$maildir" chmod -R 700 "$maildir"
スクリプトの編集(メールボックス削除)
$ sudo vi /usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh #以下コメントアウト #basedir=/var/spool/maildirs #以下追加 basedir=/home/virtual #以下コメントアウト #trashbase=/var/spool/deleted-maildirs #以下追加 trashbase=/home/virtual/.deleted-maildirs #以下コメントアウト #subdir=`echo "$1" | sed 's/@.*//'` #以下追加 subdir=$1
スクリプトの編集(ドメイン削除用)
$ sudo vi /usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh #basedir=/var/spool/maildirs basedir=/home/virtual #trashbase=/var/spool/deleted-maildirs trashbase=/home/virtual/.deleted-maildirs
実行権限追加
$ sudo chmod 0700 /usr/local/bin/postfixadmin/postfixadmin*
daemon(httpd実行ユーザー)がsudo出来るように設定する
$ sudo visudo Defaults requiretty Defaults:daemon !requiretty daemon ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-mailbox-postcreation.sh daemon ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-mailbox-postdeletion.sh daemon ALL=(ALL) NOPASSWD: /usr/local/bin/postfixadmin/postfixadmin-domain-postdeletion.sh
14.再起動して確認
sudo /etc/init.d/saslauthd restart sudo /etc/init.d/postfix restart sudo /etc/init.d/dovecot restart sudo /etc/init.d/spamassassin restart sudo /etc/init.d/clamd restart sudo /etc/init.d/amavisd restart
15.ファイヤーウォール開放ルール
TCP 995 995 0.0.0.0/0 TCP 993 993 0.0.0.0/0 TCP 465 465 0.0.0.0/0 TCP 25 25 0.0.0.0/0
以上