メールサーバ構築

元ネタ  CentOSで自宅サーバ構築 ( http://centossrv.com/ )

Postfix + Amavisd-new + Clamd の組み合わせによる構成で構築

Postfixのインストール

yum -y install postfix

Postfixの設定を修正

最低限の main.cf 修正

vi  /etc/postfix/main.cf
myhostname = hostname.moritox.jp
mydomain = moritox.jp
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP

Postfixだけでセキュリティを向上させる為に追記する。

vi  /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_delay_reject = yes
disable_vrfy_command = yes
allow_percent_hacks = yes
swap_bangpath = yes
allow_untrusted_routing = no
smtpd_helo_required = yes
smtpd_helo_restrictions =
	permit_mynetworks,
	reject_non_fqdn_helo_hostname,
	reject_invalid_helo_hostname,
	permit
smtpd_sender_restrictions =
	permit_mynetworks,
	permit_sasl_authenticated,
	reject_non_fqdn_sender,
	reject_sender_login_mismatch,
	reject_unknown_sender_domain,
	permit
smtpd_recipient_restrictions =
	reject_unauth_pipelining,
	reject_non_fqdn_recipient,
	reject_unknown_recipient_domain,
	permit_mynetworks,
	permit_sasl_authenticated,
	reject_unauth_destination,
	reject_rbl_client bl.spamcop.net,
	reject_rbl_client sbl-xbl.spamhaus.org,
	check_policy_service unix:private/policy,  # SPFチェック用
	check_policy_service inet:127.0.0.1:10023, # Postgrey用
	permit
strict_rfc821_envelopes = yes

TLS (SSL)用に main.cf を修正

vi /etc/postfix/main.cf
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/server.crt
smtpd_tls_key_file = /etc/postfix/server.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

TLS (SSL)用に master.cf を修正( ”#” を削除する)

CentOS-4

vi  /etc/postfix/master.cf
smtps	inet	n	n	-	-	smtpd
	-o  smtpd_tls_wrappermode=yes  -o  smtpd_sasl_auth_enable=yes
tlsmgr	unix	-	-	n	300	1	tlsmgr

CentOS-5

vi  /etc/postfix/master.cf
smtps	inet	n	-	n	-	-	smtpd
	-o smtpd_tls_wrappermode=yes
	-o smtpd_sasl_auth_enable=yes

アンチウィルス対策

ClamAVのインストール

clamdだけで関連パッケージもインストールされる

yum --enablerepo=rpmforge -y install clamd

CalmAV のアップデート

アップデートの時は3つを指定しないとアップデートのパッケージが存在してもインストールされない。

yum --enablerepo=rpmforge -y update clamd clamav clamav-db

Clamd設定を修正

vi  /etc/clamd.conf
#User clamav
LocalSocket /var/run/clamav/clamd.sock
#TCPSocket 3310

Freshclam設定を修正

vi  /etc/freshclam.conf
DatabaseMirror db.jp.clamav.net

Postfix と Clamd を連携させる。

Amavisd-new インストール

yum --enablerepo=rpmforge -y install amavisd-new

Amavisd-new設定を修正

vi  /etc/amavisd.conf
$mydomain = 'moritox.jp';   # a convenient default for other settings
#$QUARANTINEDIR = "/var/virusmails";
#$virus_admin      = "virusalert\@$mydomain";  # notifications recip.
#$sa_spam_subject_tag = '***SPAM*** ';
$final_spam_destiny	= D_PASS;
### http://www.clamav.net/
['ClamAV-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

Amavisd-new用に main.cf に追記する。

vi  /etc/postfix/main.cf
content_filter=smtp-amavis:[127.0.0.1]:10024

Amavisd-new用に master.cf 追記する。

vi  /etc/postfix/master.cf
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

SpamAssassin用の設定

CentOS-5 のみ下記ファイルを修正(#を削除)

vi /etc/mail/spamassassin/v310.pre
loadplugin Mail::SpamAssassin::Plugin::TextCat

Spamassassin用の学習と設定ファイルのスクリプトは CentOSで自宅サーバ構築 内の物を使用する。
SpamAssassin日本語スパムメール対応の設定ファイルの取得スクリプト : spamassassin-update
スクリプトは実行権限を与えて、/etc/cron.daily/ の中に入れる。

vi  spamassassin-update
#!/bin/bash

# TLEC(http://tlec.linux.or.jp/)よりSpamAssassin設定ファイル最新版ダウンロード
cd /etc/mail/spamassassin
wget -qN http://tlec.linux.or.jp/docs/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

   # SpamAssassin再起動
   /etc/rc.d/init.d/spamassassin restart > /dev/null
fi
cp user_prefs user_prefs.org

# スパム判定スコアをTLEC版SpamAssassin設定ファイルの値に変更
amavisd_conf=`rpm -ql amavisd-new|grep etc|grep amavisd.conf`
required_score=\
`grep required_score /etc/mail/spamassassin/local.cf|awk '{print $2}'`
sa_tag2_level_deflt=\
`grep "\sa_tag2_level_deflt" $amavisd_conf|awk '{print $3}'|tr -d \;`
if [ $required_score != $sa_tag2_level_deflt ]; then
   sed -i "s/sa_tag2_level_deflt.*/sa_tag2_level_deflt = $required_score;/g" \
   $amavisd_conf
   /etc/rc.d/init.d/amavisd restart > /dev/null 2 > & 1
fi

受信したスパムメールをSpamAssassinに学習させるスクリプト : spamassassin-learn
スクリプトは実行権限を与えて、/etc/cron.daily/ の中に入れる。

vi spamassassin-learn
#!/bin/bash

PATH=/usr/bin:/bin

for user in `ls /home/`
do
   # 正常メール
   hammail=/home/$user/Maildir/cur

   # 正常メール学習
   if [ -d "$hammail" ]; then
	# 正常メールをSpamAssassinに学習させる
	su $user -s "/bin/bash" -c "sa-learn --ham $hammail | \
	logger -p mail.info -t 'sa-learn for $user'"
   fi

   # スパムメール
   spammail=/home/$user/Maildir/.Spam/cur

   # スパムメール学習
   if [ -d "$spammail" ]; then
	# スパムメールをSpamAssassinに学習させる
	su $user -s "/bin/bash" -c "sa-learn --spam $spammail | \
	logger -p mail.info -t 'sa-learn for $user'"
   fi
done

Spamassasinのチェック後に振り分ける為のProcmailの設定

vi /etc/procmailrc
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
SPAM=$MAILDIR/.Spam/
LOGFILE=$HOME/.procmail.log
#VERBOSE=ON

# SpamAssassinによるスパムチェック
# ※fetchmail取り込みメールのスパム検査未実施対処
:0fw
*!^X-Spam-
|/usr/bin/spamc

# SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送
:0
*^X-Spam-Flag: YES
$SPAM

受信したスパムメールの宛先フォルダーを作るスクリプト : spamfolder
このスクリプトを実行するとユーザーの Maildir 内に .Spam フォルダーが作成される。

SPFチェック

追加インストールする。

yum --enablerepo=rpmforge -y install perl-Mail-SPF

http://www.openspf.org/Software からPerlスクリプトをダウンロードする。

ダウンロード
wget http://www.openspf.org/blobs/postfix-policyd-spf-perl-2.007.tar.gz

解凍
tar zxvf postfix-policyd-spf-perl-2.007.tar.gz

スクリプトファイルを所定の位置へ移動
mv postfix-policyd-spf-perl-2.007/postfix-policyd-spf-perl /usr/local/lib/

Postfixのmaster.cfを修正

vi /etc/postfix.master.cf
policy  unix  -       n       n       -       0       spawn
  user=nobody argv=/usr/bin/perl  /usr/local/lib/postfix-policyd-spf-perl

Postfixのmain.cfを修正

vi /etc/postfix/main.cf
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination,
			check_policy_service unix:private/policy
policy_time_limit = 3600

Spam対策ツールのPostgreyを導入

Postgreyインストール

yum --enablerepo=rpmforge -y install postgrey

Postgreyが起動時に連動するように設定する。
OPTIONS の中に ”–inet=10023 -d” を追記する。

vi  /etc/rc.d/init.d/postgrey
OPTIONS="--whitelist-recipients=/etc/postfix/postgrey_whitelist_recipients
	   --inet=10023 -d --unix=$SOCKET" (1行で記述)

Postfixと連携するようにPostfixの main.cf を修正

vi  /etc/postfix/main.cf
smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:10023