○ Postfix (SSL対応) のインストール

・Maildir形式のsmtpサーバの構築をします
・postfix-3.1.4をソースからインストールし、設定します
・postscreenを有効にしてRBLをメールフィルターに使います
・tls接続、"DOVCOT_SASL"を利用したsmtp-authに対応しています
・CentOS6には、デフォルトでpostfixがインストールされています
・ここのサイトでは、sendmailに変更し、postfixを除いています
・"浅見秀雄さんのS25Rスパム対策"と"佐藤潔さんのStarpit"を使っています
・make はメンテナンスマシンで行っています

・ソースの取得、削除は省略します
・エディタ、ファイラーの操作は省略します
・ソースを展開したら説明文を読みましょう
・Enterキーを省略します

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○関連サイト

:postfix-3.1.4.tar.gz  (http://www.postfix.org/)
:icu4c-58_2-src.tgz (http://site.icu-project.org/)
:white-list.txt (http://gabacho.reto.jp/anti-spam/)
:postfix-sleep.patch (http://k2net.hakuba.jp/pub/)
:postfix.conf.2.tar.gz  (http://k2net.hakuba.jp/targrey/)

○参照ファイル

パッケージの追加
最初の設定 (Xen)
opensslのインストール

○インストール環境

:OS CentOS 6.8
:selinux disabled or permissive
:インストール先 
:作業 ~/src
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行

・メンテナンスの場合は一般ユーザから行います



○icu4c-58_2

・postfixでsmtputf8を有効にするには、icuライブラリが必要です
・無効にするにはpostfixで"smtputf8_enable = no"に設定します

○icuのインストール

・CentOS6.xのlibicu-develはヴァージョンが古いようです
・オリジナルソースからインストールします

# cd ~/src
[root@jupiter:~/src]
# tar zxf icu4c-58_2-src.tgz
# chown -R root:root icu
# cd icu/source
[root@jupiter:~/src/icu/source]
# ./runConfigureICU Linux
# make
# make install
# cd ~/src
[root@jupiter:~/src]
# tar jcf icu4c-58-170109.tar.bz2 icu/

○キャッシュ情報の更新と確認

・/usr/local/libの設定がされているなら、ldconfigのみ実行します
・古いライブラリは動的リンクを確認するまで残しておく

[root@jupiter:~]
# echo /usr/local/lib >> /etc/ld.so.conf.d/usrlocal.conf
# ldconfig
# ldconfig -p | grep libicu
	libicuuc.so.58 (libc6) => /usr/local/lib/libicuuc.so.58
	libicuuc.so.57 (libc6) => /usr/local/lib/libicuuc.so.57
	libicuuc.so (libc6) => /usr/local/lib/libicuuc.so
	libicutu.so.58 (libc6) => /usr/local/lib/libicutu.so.58
	libicutu.so.57 (libc6) => /usr/local/lib/libicutu.so.57
	libicutu.so (libc6) => /usr/local/lib/libicutu.so
	libicutest.so.58 (libc6) => /usr/local/lib/libicutest.so.58
	libicutest.so.57 (libc6) => /usr/local/lib/libicutest.so.57
	libicutest.so (libc6) => /usr/local/lib/libicutest.so
	libiculx.so.57 (libc6) => /usr/local/lib/libiculx.so.57
	libiculx.so (libc6) => /usr/local/lib/libiculx.so
	libicule.so.57 (libc6) => /usr/local/lib/libicule.so.57
	libicule.so (libc6) => /usr/local/lib/libicule.so
	libicui18n.so.58 (libc6) => /usr/local/lib/libicui18n.so.58
	libicui18n.so.57 (libc6) => /usr/local/lib/libicui18n.so.57
	libicui18n.so (libc6) => /usr/local/lib/libicui18n.so
	libicuio.so.58 (libc6) => /usr/local/lib/libicuio.so.58
	libicuio.so.57 (libc6) => /usr/local/lib/libicuio.so.57
	libicuio.so (libc6) => /usr/local/lib/libicuio.so
	libicudata.so.58 (ELF) => /usr/local/lib/libicudata.so.58
	libicudata.so.57 (ELF) => /usr/local/lib/libicudata.so.57
	libicudata.so (ELF) => /usr/local/lib/libicudata.so

○動的リンクの確認

・postfixインストール後に行います

[root@jupiter:~]
# ldd /usr/sbin/postfix|grep libicu
	libicui18n.so.58 => /usr/local/lib/libicui18n.so.58 (0xb7084000)
	libicuuc.so.58 => /usr/local/lib/libicuuc.so.58 (0xb6edb000)
	libicudata.so.58 => /usr/local/lib/libicudata.so.58 (0xb55da000)



○postfix-3.1.4

○専用ユーザ・グループの作成

uid/gid情報を参照

・ユーザID、グループIDの確認

# cat /etc/passwd
# cat /etc/group

・すでに設定されている場合

# usermod -d /dev/null -s /bin/false postfix

・設定されていない場合

[root@jupiter:~]
# groupadd -g 89 postfix
# groupadd -g 90 postdrop
# useradd -u 89 -g 89 -d /dev/null -s /bin/false postfix

○sendmailの停止

・事前にrpmパッケージをpostfix → sendmailに置き換えています

[root@jupiter:~]
# service sendmail stop
# chkconfig --del sendmail
# mv /usr/sbin/sendmail /usr/sbin/sendmail-OLD
# mv /usr/bin/mailq /usr/bin/mailq-OLD
# mv /usr/bin/newaliases /usr/bin/newaliases-OLD

・setuid権限を削除 (2755→0755)

# chmod 755 /usr/sbin/sendmail.sendmail

○postfixのインストール

・htmlドキュメントを適当なディレクトリに保存して利用しましょう
・sleep中に相手が接続を切ったら、smtpdプロセスを終了するパッチを当てます
・"DOVCOT_SASL"を使う設定です

# cd ~/src
[root@jupiter:~/src]
# tar zxvf postfix-3.1.4.tar.gz
# chown -R root:root postfix-3.1.4
# cd postfix-3.1.4
[root@jupiter:~/src/postfix-3.1.4]

・パッチを当てます
・パッチは~/srcディレクトリに置きます

# patch -p0 < ../postfix-3.0-sleep.patch
# make tidy

・コンフィグシェルスクリプトを実効します
・同じディレクトリで実行します
pfixcfg.sh (詳細別記)

# source pfixcfg.sh

・コンパイル

# make

・インストール (アップデートは別項参照)

# make install
・・・・・・・・・・・・・・・・・・・
install_root: [/]
tempdir: [/root/src/postfix-3.1.4]
config_directory: [/etc/postfix]
command_directory: [/usr/sbin]
daemon_directory: [/usr/libexec/postfix]
data_directory: [/var/lib/postfix]
html_directory: [no]
mail_owner: [postfix]
mailq_path: [/usr/bin/mailq]
manpage_directory: [/usr/local/man]
newaliases_path: [/usr/bin/newaliases]
queue_directory: [/var/spool/postfix]
readme_directory: [no]
sendmail_path: [/usr/sbin/sendmail]
setgid_group: [postdrop]
shlib_directory: [/usr/lib/postfix]
meta_directory: [/etc/postfix]
・・・・・・・・・・・・・・・・・・・

・デフォルトの設定ファイルを保存しておきます

# cp -RL conf ~/src/postfix3104

# cd ..
[root@jupiter:~/src]
# tar jcvf postfix-3.1.4-170109.tar.bz2 postfix-3.1.4/

postfix-3.0-sleep.patch

・pstfix-sleep.patchを参考に差分をとっただけです
・うまく機能しているかは検証していません


○アップデート

・新規インストールの場合は、次項へ進みます
・ソースの展開・コンパイルの表記は略します

・アップデート

# cd ~/src/postfix-3.1.4
[root@jupiter:~/src/postfix-3.1.4]
# make install

・新旧のデフォルト設定ファイルの差分を取り
・必要があれば、設定ファイルを修正します

# cp -RL conf ~/src/postfix3104
# cd ~/src
[root@jupiter:~/src]
# diff -urp postfix3103 postfix3104

・再起動します

# service postfix restart

○aliasesファイルを編集します (変更追加分)

:/etc/aliases (root root 644)

・設定例です
・sendmail用のaliasesを使用しています
・/dev/nullを指定すると配送されません
・root宛のメールは専用ユーザに配送します 専用ユーザ (luna)
・9文字以上のユーザー名にしたい場合、aliasesとcanonicalで設定します

root:           luna
starlight:      star
moonlight:      moon
webmaster:      /dev/null

:aliases.dbを作ります

# cd /etc
[root@jupiter:/etc]
# rm aliases.db
# newaliases

○canonicalファイルを編集します

:/etc/postfix/canonical (root root 644)

・設定例です

star    starlight
moon    moonlight

:canonical.dbを作ります

# cd /etc/postfix
[root@jupiter:/etc/postfix]
# postmap /etc/postfix/canonical

○S25R+Starpit用のファイル

:/etc/postfix/white-list.txt (root root 644)
:/etc/postfix/tarpit_client (root root 644)

・関連サイトにアクセスし、十分理解した上で使用します

○accessファイルを編集します

:/etc/postfix/access (root root 644)

・設定例です
・良く不正リレーメールが来るので必要なければ拒否します
・smtpd_sender_restrictionsで使用しています
・書式は各自学習してください

jss.cn          REJECT
jxs.cn          REJECT
sds.cn          REJECT
bjs.cn          REJECT
hns.cn          REJECT
tjs.cn          REJECT
yns.cn          REJECT

:access.dbを作ります

[root@jupiter:/etc/postfix]
# postmap /etc/postfix/access

○JUNKMAILを拒否・添付ファイルをチェックします

:/etc/postfix/header_checks (root root 644)

・設定例です
・マニュアルは"man 5 header_checks"
・正規表現またはPCREが使える?
・まともな方法で送られてくるスパムメールを、headerをチェックして拒否します
・nameのチェックはheader_checksで行ないます

/^X-Mailer:.*PostMaster General/    REJECT
/^Return-Path:.*<#.*@.*>/       REJECT
/^From:.*<#.*@.*>/              REJECT
/^Subject: more money$/         REJECT
/^Subject:.*I LOVE YOU/         REJECT
/^To: our valued customer$/     REJECT
/^From: your friend$/           REJECT

/^Content-type:.*name.*\.scr.*/ REJECT
/^Content-type:.*name.*\.exe.*/ REJECT
/^Content-type:.*name.*\.inf.*/ REJECT
/^Content-type:.*name.*\.pif.*/ REJECT
/^Content-type:.*name.*\.bat.*/ REJECT
/^Content-type:.*name.*\.dll.*/ REJECT
/^Content-type:.*name.*\.vbs.*/ REJECT
/^Content-type:.*name.*\.reg.*/ REJECT

/^Content-Type: text\/html/     REJECT HTML not allowed.

/GyRCTCQ+NUJ6OS05cCIoGyhC/      REJECT
/wkPjVCejktOXAiK/               REJECT
/MJD4lQno5LTlwIi/               REJECT

・日本語のBASE64エンコード

[root@jupiter:/etc/postfix]
$ echo -n "未承諾広告※"|nkf -MB
GyRCTCQ+NUJ6OS05cCIoGyhC

:/etc/postfix/body_checks (root root 644)

・設定例です
・マニュアルは"man 5 header_checks"
・正規表現またはPCREが使える?
・メール本文をcheckします
・logwachのpostfixレポートに対処します

・logwatchのpostfixレポートで検索パターン(例 bdck:)を付けています
・if〜endif間の構文は、検索パターン(bdck:)の含まれる行のみで有効
・!で否定し、bdck:が付いていない場合にif〜endif間の構文をチェックします

if !/bdck:/
/^(|[^>].*)carecough.ru/ REJECT
/8\\5R%j%9%H/ REJECT
endif

・問い合わせフォームに、自動で送信する迷惑メールは1行で送る場合が多い
・メール本文の先頭に検索パターン(FbMF:)を設定し、構文チェックに使います
・("FbMF:"は"内容:"のエンコード文字列) DISCARDは受信して破棄する設定
・if〜endif構文を入れ子にして問い合わせフォームのみに対応させます

if !/bdck:/
/^(|[^>].*)carecough.ru/ REJECT
/8\\5R%j%9%H/ REJECT
if /FbMF:/
/kamagra/ DISCARD
/levitra/ DISCARD
/vardenafil/ DISCARD
/viagra/ DISCARD
/vigrx/ DISCARD
/pills/ DISCARD
endif
endif

・junkメールからドメイン名を取り出す

# cat * | grep 'http:' | \
sed 's/.*http:\/\///g' | sed 's/ .*$//' | \
sed 's/\/.*//g' | sed 's/^M//g' | \
sort -u > ~/domain.lst

・日本語のiso-2022-jp 7bitエンコード

[root@jupiter:/etc/postfix]
$ echo -n "顧客リスト"|nkf -j|awk '{gsub(/\x1B[$(]B/,"");print}'
8\5R%j%9%H

・正規表現で使われる文字を\でエスケープします

8\\5R%j%9%H

○postscreenのaccess_listでの制御

:/etc/postfix/postscreen_access

・設定例です
・permit (postscreenをスルーしてSMTP server processに渡されます)
・reject (postscreen_blacklist_actionパラメータで制御されます)

#
203.141.136.4		permit
#
211.166.9.0/24		reject

○dynamicmaps.cf

:/etc/postfix/dynamicmaps.cf

・shared=yes dynamicmaps=yesでmakeした場合
・動的リンクライブラリとデータベースプラグインのサポートで
・有効なライブラリとデータベースの設定が追記されます

# dict-type  so-name (pathname)  dict-function  mkmap-function
ldap	postfix-ldap.so	dict_ldap_open
pcre	postfix-pcre.so	dict_pcre_open

○main.cfを編集します

・compatibility_levelの設定によっていくつかのパラメータが変わります
・"postconf -n"ではcompatibility_levelによる変更は表示されません

・main.cf.default

append_dot_mydomain = ${{$compatibility_level} < {1} ? {yes} : {no}}
compatibility_level = 0
mynetworks_style = ${{$compatibility_level} < {2} ? {subnet} : {host}}
relay_domains = ${{$compatibility_level} < {2} ? {$mydestination} : {}}
smtputf8_enable = ${{$compatibility_level} < {1} ? {no} : {yes}}

・main.cf

compatibility_level = 2

・compatibility_levelで決められたパラメータ値

compatibility_level = 2
append_dot_mydomain = no
mynetworks_style = host
relay_domains = 
smtputf8_enable = yes

・main.cfで変更した後のパラメータ値

compatibility_level = 2
append_dot_mydomain = no
mynetworks = 192.168.0.0/24, 127.0.0.0/8
mynetworks_style = host (mynetworksを指定すると無効になります)
relay_domains = $mydestination
smtputf8_enable = yes

/etc/postfix/main.cf (詳細別記)

・証明書の作成は 認証局と証明書の発行 を参照してください

○master.cfを変更します (変更分)

・初段のsmtp(smtpdコマンド)行を無効にします
・postscreenを使う場合 赤色文字
・TLS(SSL)接続を使う場合 緑色文字
・OEがTLSラッパーモードでアクセスするのでsmtps (port465) を開放します

#smtp      inet  n       -       n       -      -      smtpd
smtp      inet  n       -       n       -     1     postscreen
smtpd     pass  -       -       n       -     -     smtpd
dnsblog   unix  -       -       n       -     0     dnsblog
tlsproxy  unix  -       -       n       -     0     tlsproxy

・省略

smtps     inet  n       -       n       -      -      smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

・省略

tlsmgr    unix  -       -       n       1000?   1       tlsmgr

○postfixパラメータの確認

・デフォルトのパラメータを表示

[root@jupiter:/etc/postfix]
# postconf -d

・修正したパラメータの表示

# postconf -n

○/usr/lib/sendmailのリンク変更

# cd /usr/lib
[root@jupiter:/usr/lib]
# mv sendmail sendmail-OLD
# ln -s /usr/sbin/sendmail sendmail

○iptablesの設定

・Netfilter (iptables) で制御している場合、ポートを開けてください

Netfilter (iptables) の設定参照

○postfix起動スクリプトを作ります

/etc/rc.d/init.d/postfix (詳細別記)

○selinuxヘの対応 (selinuxが有効の場合)

:新規インストールファイルのselinuxラベルを修正

# cd ~
[root@jupiter:~]
# restorecon -Rv /etc
# restorecon -Rv /usr
# restorecon -Rv /var

○自動起動スクリプトをonにし、postfixを起動します

[root@jupiter:~]
# chkconfig --add postfix
# service postfix start



○(参考)

○zen.spamhaus.org(DNSBL)を使うときの注意点

・Free use には制限があります

Use of the Spamhaus DNSBLs via DNS queries to our public 
DNSBL servers is free of charge if you meet all three of 
the following criteria:

1) Your use of the Spamhaus DNSBLs is non-commercial*,
    and
2) Your email traffic is less than 100,000 SMTP connections
    per day, and
3) Your DNSBL query volume is less than 300,000 queries
    per day.

○localオンリー

:/etc/postfix/main.cf (変更部分)

・マシンのIPアドレスを指定します

mynetworks = 192.168.0.22/32, 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mail_spool_directory = /var/spool/mail

○smtp のレスポンスコード

response-code

○ Copyright(c) 528p.com All Rights Reserved.