- 追加された行はこの色です。
- 削除された行はこの色です。
*Postfix [#of989e54]
MTA(メール中継エージェント)の一つ。コンフィグレベルでSendmailと互換性がある。
転送先がSMTPをサポートしていれば、フィルタリング、ウイルスチェック、リバースプロキシへ転送する事も可能。
#author("2018-02-01T23:18:27+09:00","default:nowsky","nowsky")
*AMaViS [#o146649b]
clamavと連携させる事で、メールのウイルス検査を実現するソフトウェア。
単体でリレーMTAとして動作させる事も可能だが、
sendmailやPostfixとかの他MTAで一度受けた後にAMaViSに転送する方がセキュリティ的に望ましい。
- 参考情報
[[amavisd-newの設定の巻:+http://www.sea-bird.org/pukiwiki/index.php?amavisd-new%A4%CE%C0%DF%C4%EA%A4%CE%B4%AC]]
~
*構築環境 [#n95c74e7]
*構築環境 [#lf44aa5d]
今回検証した環境はこちら
-openSUSE 13.1 x86_64
-debian 8.1 x86_64
-CentOS 7.2 x86_64
-openSUSE 42.2 x86_64
※CentOS 6.x等の非Systemd環境で構築する場合には、各スクリプトをinit用に書き換える必要がある。
~
*構築 [#kcd06788]
&size(16){&font(b){1. ディレクトリ構成};};
普通は"/var/spool"以下にメールデータを格納するのだが、
今回はちょっと特殊な構成な点と、色々なミドルウェアとの連携をしているので、
メールデータディレクトリのみデフォルトから変更している。
メールデータディレクトリ:/var/hostname/spool/*
Postfixのコンフィグディレクトリ:/etc/postfix/*
Postfixのシステムコンフィグファイル:/etc/sysconfig/postfix
今回はこのディレクトリ構成でMTA(Postfix)の構築を行う
他には下の内容で構築メモを作成
-amavisは"127.0.0.1:TCP/10026"で待ち受ける
-検査完了したメールには"X-Virus-Scanned:"のヘッダーを付与する
-ウイルスメール以外(スパムとか)は、とりあえず次のMTAへ転送する
-Clamavは事前にインストールしておく
-コンフィグディレクトリ構成は、apt-getやzypperした結果のデフォルトをそのまま使う
~
&size(16){&font(b){2. インストール};};
ソースからmakeするのが筋なのだろうが、面倒だったのでyastでインストール。
zypperとかyumとかapt-getでも同様に行ける。
# yast
[Software] -> [Software Management] -> [Search Phrase] -> "postfix"を入力。
実際にインストールするのは、"postfix","postfix-devel","postfix-mysql"の三つ。
ドメイン構成などは
-メール鯖のドメイン:hoge.org
-メール鯖のFQDN:mail.hoge.org
-メール鯖のIPアドレス:10.0.0.1
-メール鯖管理者のメールアドレス:admin☆mail.hoge.org
~
*設定 [#x6068952]
&size(16){&font(b){・説明};};
Postfixのメインコンフィグを書き換えていく。
存在しないコンフィグファイルがあった場合は新規作成をする。
*構築(Debian) [#v6c5c48f]
&size(16){&font(b){1. インストール};};
amavisの一部コマンドがnon-freeリポジトリを使っている為、
リポジトリを追加する事でインストール出来るようにする必要がある。
# vi /etc/apt/sources.list.d/jessie.non-free.list
==================================================
deb http://ftp.jp.debian.org/debian/ jessie non-free
deb http://ftp.jp.debian.org/debian/ jessie-updates non-free
deb http://ftp.jp.debian.org/debian/ jessie-backports non-free
# apt-get install amavisd-new spamassassin clamav-daemon
# apt-get install pyzor razor libnet-dns-perl libmail-spf-perl
# apt-get install arj bzip2 cabextract cpio file gzip lha nomarch pax rar unrar unzip unzoo zip zoo
~
設定ファイルのオーナー&グループはroot:rootで、パーミッションは644を基本とする。
しかし、&font(b){以下の設定ファイル};はオーナー&グループを&font(b){root:root};のパーミッションを&font(b){600};とする。
/etc/postfix/header_checks
/etc/postfix/mysql_virtual_alias_maps.cf
/etc/postfix/mysql_virtual_domains_maps.cf
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
/etc/postfix/mysql_virtual_mailbox_maps.cf
&size(16){&font(b){2. 設定};};
debian環境の場合は、amavisの設定ファイルが細切れになっている。
概ね機能毎に纏まっているが一部の設定は全く違うファイルにあったりするので、
該当するコンフィグが見つからない場合は、都度grepコマンドで探し出す。
# grep -r "検索文字列" ./*
~
基本的にデフォルトのパラメータやディレクトリ構成を使用する事とする。
しかし、ユーザ情報はMySQLで管理する構成なので、
PostfixからMySQLへのアクセスを行う設定ファイルを追加作成する。
設定例としてMySQLはlocalhostに構築済みかつ、MySQL用のパラメータを以下とする。
・MySQLユーザ名:postfix-mysql-user
・MySQLパスワード:postfix-mysql-pass
・MySQLのDB名:postfix-user-db
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){そのまま使う設定ファイル};};
/etc/amavis/conf.d/01-debian
/etc/amavis/conf.d/30-template_localization
/etc/amavis/conf.d/50-user
~
あと、現状のPostfixコンフィグの何処を書き換えたかうろ覚えなので、
変更した設定ファイル内容を全て列挙する。
1). 下記の書き換え項目に挙っていない所は全てコメントアウトする。
2). 書き換えに上がっていない設定ファイルはデフォルトのまま使用する。
&size(14){&font(b){/etc/amavis/conf.d/05-domain_id};};
< chomp($mydomain = `head -n 1 /etc/mailname`);
---
> chomp($mydomain = "hoge.org");
~
&size(16){&font(b){/etc/postfix/main.cf};};
##
## 基本設定
##
## マニュアル [http://www.postfix-jp.info/trans-2.2/jhtml/postconf.5.html]
##
&size(14){&font(b){/etc/amavis/conf.d/05-node_id};};
< chomp($myhostname = `hostname --fqdn`);
---
> chomp($myhostname = "mail.hoge.org");
~
&size(14){&font(b){/etc/amavis/conf.d/15-av_scanners};};
! ['ClamAV-clamd',
! \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.ctl"],
! qr/\bOK$/m, qr/\bFOUND$/m,
! qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
---
&ask_daemonの第2引数をclamavのソケットと合わせる
~
&size(14){&font(b){/etc/amavis/conf.d/15-content_filter_mode};};
< @bypass_spam_checks_maps = (
< \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
---
> @bypass_spam_checks_maps = (1);
~
&size(14){&font(b){/etc/amavis/conf.d/20-debian_defaults};};
< $QUARANTINEDIR = "$MYHOME/virusmails";
< $quarantine_subdir_levels = 1; # enable quarantine dir hashing
---
> ###$QUARANTINEDIR = "$MYHOME/virusmails";
> ###$quarantine_subdir_levels = 1; # enable quarantine dir hashing
==================================================
< @keep_decoded_original_maps = (new_RE(
< qr'^MAIL$',
< qr'^MAIL-UNDECIPHERABLE$',
< qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
< qr'^Zip archive data',
< ));
---
> @keep_decoded_original_maps = (new_RE(
> qr'^MAIL$',
> qr'^MAIL-UNDECIPHERABLE$',
> qr'^(ASCII(?! cpio)|text|uuencoded|xxencoded|binhex)'i,
> ###qr'^Zip archive data',
> ));
==================================================
! [1] $inet_socket_bind = '127.0.0.1';
! [2] $inet_socket_port = 10026;
! [3] $forward_method = 'smtp:[127.0.0.1]:10025';
! [4] $X_HEADER_TAG = 'X-Virus-Scanned';
! [5] $X_HEADER_LINE = "$myproduct_name at $mydomain";
! [6] $virus_admin = 'admin@mail.hoge.org';
! [7] $spam_admin = 'admin@mail.hoge.org';
---
[1] amavisの待ち受けるIPアドレス
[2] amavisの待ち受けるTCPポート番号
[3] ウイルス検査完了メールの転送先。例だとIP:127.0.0.1-TCP/10025に投げる
[4] ウイルス検査完了メールに付与するヘッダ
[5] ウイルス検査完了メールに付与するヘッダパラメータ
[6] ウイルスメールの転送先アドレス。ドメイン部を$mydomainに置き換え可能
[7] スパムメールの転送先アドレス。ドメイン部を$mydomainに置き換え可能
==================================================
$banned_filename_re = new_RE(
# [1] Block certain double extensions anywhere in the base name
qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
# Postfixのキューディレクトリ。キューディレクトリはデフォルトを使用する
queue_directory = /var/spool/postfix
# [2] Windows Class ID CLSID, strict
qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i,
# Postfixの管理コマンド
command_directory = /usr/sbin
# [3] Block these MIME types
qr'^application/x-msdownload$'i,
qr'^application/x-msdos-program$'i,
qr'^application/hta$'i,
# Postfixのサポート、デーモンの各プログラムがあるディレクトリ
daemon_directory = /usr/lib/postfix
# Postfixが書き込むディレクトリ。所有ユーザが$mail_ownerの値になっている必要がある
data_directory = /var/lib/postfix
# Postfixデーモンの実行ユーザ
mail_owner = postfix
# MTAのメール受け取り用ホスト名。FQDNで書く必要がある
myhostname = mail.hoge.org
# MTAのドメイン名。$myhostnameからホスト部分を取った値になる
mydomain = hoge.org
# ローカルのPostfixから送信したメールが、何処のメールサーバ(FQDN)から送信された物かの記述をする
# 通常は "$myhostname" を指定する事となる
# バーチャルドメインを使いつつ、ローカルroot宛メールをalias転送する際には、転送用FQDNを指定する
myorigin = server-name.hoge.org
# メールを受け取るNICのアドレス。allを指定すると全てから受け取る
inet_interfaces = all
# メール配送を許可するドメインのリスト。
# バーチャルドメインのみを利用する場合は "mydestination =" をそのまま記述する
# バーチャルドメインを使いつつ、ローカルroot宛メールをalias転送する際には、下記の指定を行う
mydestination = $myorigin, localhost
# 受信者アドレスがローカルIPで、受信者条件に合致しない時に応答するコード
unknown_local_recipient_reject_code = 550
# $mynetworksパラメータのデフォルト値を生成する方法。普通はhostかsubnetを指定する
mynetworks_style = subnet
# 信頼されたネットワーク。MTAのサーバ自体(127.0.0.1/32)と、LANの値(192.168.0.0/24)を指定する
mynetworks = 192.168.0.0/24, 127.0.0.1/32
# Postfixがメールをリレーしようとする配送先MTAドメイン
relay_domains = $mydestination
# Postfixの認証(ユーザのログイン)で使用されるエイリアスデータベース
alias_maps = hash:/etc/aliases
# newaliasesコマンドで更新されるエイリアスデータベース
alias_database = hash:/etc/aliases
# メールの保存ディレクトリ名と保存形式。今回はMailDir形式(一つのメールに一つのファイル)で保存を行う
# 下記だと各ユーザの"mail"というディレクトリの中にメール毎にファイルを生成し保存する事になる
home_mailbox = mail/
# メールの配送に使用するコマンド。つまり、Postfixの受信したメールの次の行き先をコマンドレベルで指定する
# 今回は、procmailでの振り分けを行うのでprocmailのバイナリ(コマンド)を指定する
mailbox_command = /usr/bin/procmail
# ローカルIPアドレスが付与されるReceivedヘッダを削除するルールファイルの指定
header_checks = regexp:/etc/postfix/header_checks
# SMTPのリターンコードが220の時に付随するテキスト。unknownにしないとPostfixのバージョンが漏れる
smtpd_banner = $myhostname ESMTP unknown
# リモートクライアントかサーバが$debug_peer_listパラメータにマッチした場合の冗長ログレベル
debug_peer_level = 2
# デーモンが"-D"オプションで呼ばれた時に実行される外部コマンド
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
# Sendmail互換機能。Postfixキューにメールを投げるのに使用される
sendmail_path = /usr/sbin/sendmail
# Sendmail互換機能。localのエイリアスDBを再構築する際に使用
newaliases_path = /usr/bin/newaliases
# Sendmail互換機能。Postfixのメールキューをリストアップする
mailq_path = /usr/bin/mailq
# Postfixコマンド、Postfixディレクトリを所有するグループ
# このパラメータを変更した場合、"postfix set-permissions"コマンドを実行する必要がある
setgid_group = maildrop
# Postfixのドキュメント(HTML)ファイルのディレクトリ
html_directory = /usr/share/doc/packages/postfix-doc/html
# Postfixのマニュアルがインストールされたディレクトリ
manpage_directory = /usr/share/man
# Postfixの設定例があるディレクトリ
sample_directory = /usr/share/doc/packages/postfix-doc/samples
# PostfixのREADMEファイルのディレクトリ
readme_directory = /usr/share/doc/packages/postfix-doc/README_FILES
# Postfixが待ち受けるプロトコル。ipv4=IPv4,ipv6=IPv6,all=IPv4+IPv6
inet_protocols = ipv4
##
## [独自追加部分] - SASL設定
##
# PostfixのSASL認証を有効にする
smtpd_sasl_auth_enable = yes
# Receivedヘッダーに認証ユーザ名を表示する
smtpd_sasl_authenticated_header = yes
# DovecotのSASL認証を利用する
smtpd_sasl_type = dovecot
# DovecotのSASL認証用デーモンのソケットを指定
smtpd_sasl_path = private/auth
# SASL認証のレルム(realm)の指定
smtpd_sasl_local_domain = $myhostname
# クライアントに許可(提供)する認証方法
# noplaintext : 平分パスワードを非許可
# noactive : "non-dictionary active"攻撃に脆弱な認証を非許可
# nodictionary : "passive dictionary"攻撃に脆弱な認証を非許可
# noanonymous : 匿名ログインを非許可
# mutual_auth : 相互認証を提供する方法のみ許可
smtpd_sasl_security_options = noanonymous
# SMTPクライアントがSMTPセッションで"HELO"or"EHLO"コマンドで情報を要求する
smtpd_helo_required = yes
# PostfixがSMTP"RCPT TO"コマンドの際に適用するアクセス制限。詳細はPostfixのマニュアルを読むこと
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
# 古いバージョンのSMTP"AUTH"コマンドとの相互運用性を有効にする
broken_sasl_auth_clients = yes
# PostfixでTLSを有効にする。Postfix2.3以降だと"smtpd_tls_security_level"の使用を推奨している
smtpd_use_tls = yes
# Postfixで暗号化されていないSASL認証を受け付けない。"smtpd_use_tls = yes"になっている事が必要
smtpd_tls_auth_only = yes
# PEMフォーマットのSMTP(Postfix)サーバ用RSA証明書ファイル
smtpd_tls_cert_file = /etc/pki/tls/mail.hoge.crt
# PEMフォーマットのSMTP(Postfix)サーバ用RSA秘密鍵ファイル
smtpd_tls_key_file = /etc/pki/tls/mail.hoge.key
# PostfixのTLSセッションキャッシュを含むファイルの名前。btreeやsdbmを指定する。dbmは非推奨
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
# 擬似乱数生成用のソースファイル。デバイスファイルを指定する際には、先頭に"dev:"を付ける
tls_random_source = dev:/dev/urandom
# SMTPの"SMTP VRFY"コマンドを無効化する
disable_vrfy_command = yes
##
## [独自追加部分] - バーチャルドメイン設定
##
## 先頭に"mysql:"と付いている箇所はMySQLのDB値を取得する事を意味する
##
# $mydestinationでリストアップされたドメインへの配送方法を指定する
# "virtual" だと仮想配送(バーチャルドメイン)を行う
# "local" だと、一度ローカル配送(alias)を実施した後にバーチャルドメインへ受け渡す
# バーチャルドメインを使いつつ、ローカルroot宛メールをalias転送する際には、下記の指定を行う
local_transport = local
# $virtual_mailbox_domainsでリストアップされたドメインで、最終配送時のデフォルトメール配送(Next-Hop)先
virtual_transport = procmail
# 特定メールアドレス、ドメインのエイリアスファイルを指定
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
# 指定されたバーチャルエイリアスドメインの最終配送先
# $virtual_alias_maps内に受信者アドレスが存在しない場合、受信を拒否する
virtual_alias_domains = $virtual_alias_maps
# バーチャルドメインのトップレベルメールスプールディレクトリを指定
# $virtual_mailbox_mapsテーブル検索結果の全てのPATHの先頭に付けるプレフィックスと同じ意味
virtual_mailbox_base = /var/hoge/mail-spool
# $virtual_mailbox_domainsに対応する有効なアドレスのオプション検索テーブル
# $virtual_mailbox_baseの値がこのPATHの前に付けられるので注意
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
# 指定ファイル内から受信者アドレスの検索を行い、存在しない受信者宛のメールは拒否をする
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
# メールの最大サイズ(Byte換算)。0だと無制限
message_size_limit = 10485760
# MTAサーバでのQuota制限に引っかかった場合、エラーメールを返送する
virtual_overquota_bounce = yes
# 受信メールボックスのみを制限する
virtual_mailbox_limit_inbox = yes
# バーチャルドメイン毎の最大メールボックスを記述したエイリアスファイルを指定
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
# $virtual_mailbox_limit_mapsの値で、最大メールボックスの設定値を上書きする
virtual_mailbox_limit_override = yes
# PostfixのユーザIDの最小値を指定する。この値以下のユーザ(UID)での配送は全て拒否する
virtual_minimum_uid = 5000
# 用意したユーザIDを指定する。5000以降にしておくとシステムと被る事が少ないので良
virtual_uid_maps = static:5000
# 用意したグループIDを指定する。5000以降にしておくとシステムと被る事が少ないので良
virtual_gid_maps = static:5000
# キューに入った後にフィルタリング処理を行うMTAの名前とポートを指定する
# Postfixのコンフィグ(master.cf)に書いた値を指定する。他のMTAサーバ(IPアドレス違い)を指定する事も可能
# 今回はウイルスチェックを通す為、amavisの待機ポートを指定する
content_filter = amavis:[localhost]:10026
# 受信者確認、アドレス書き換えの処理を指定する
# no_unknows_recipient_checks : 知らない受信者でも拒否をしない
# 外部コンテンツフィルタの"後"に処理される
# no_address_mappings : バーチャルエイリアスマップ拡張、自動BCC受信者を無効にする
# 外部コンテンツフィルタの"前"に処理される
# no_header_body_check : ヘッダー・ボディチェックを無効にする
# 外部コンテンツフィルタの"後"に処理される
receive_override_options = no_address_mappings
# [4] Block these file extension
qr'^(?!cid:).*\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i,
qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)$'i,
qr'^\.(exe-ms|dll)$',
);
---
[1] 二重拡張子の添付ファイルを遮断
[2] OSのCLSIDパラメータを遮断
[3] 添付ファイルのMIMEタイプで遮断
[4] 添付ファイルの拡張子で遮断
~
&size(16){&font(b){/etc/postfix/header_checks};};
/^Received:/ IGNORE
&size(14){&font(b){/etc/amavis/conf.d/25-amavis_helpers};};
< @mynetworks = qw( 127.0.0.1/32 );
---
> @mynetworks = qw( 127.0.0.1/32 10.0.0.1/32 );
---
@mynetworksはCIDR形式で記入する
#endregion
~
&size(16){&font(b){/etc/postfix/mysql_virtual_alias_maps.cf};};
user = postfix-mysql-user
password = postfix-mysql-pass
hosts = localhost
dbname = postfix-user-db
table = alias
select_field = goto
where_field = address
&size(16){&font(b){3. 設定反映};};
書き換えた設定をAMaViSに反映させる為にプロセスの再起動を行う。
# systemctl restart amavis.service
# netstat -an | egrep -i "tcp.*10026.*LISTEN"
~
&size(16){&font(b){/etc/postfix/mysql_virtual_domains_maps.cf};};
user = postfix-mysql-user
password = postfix-mysql-pass
hosts = localhost
dbname = postfix-user-db
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
*構築(CentOS) [#l9b626fe]
&size(16){&font(b){1. インストール};};
コアとなるclamavと関連ライブラリはEPELリポジトリを使っている為、
事前にEPELリポジトリを追加しておく必要がある。
# yum install amavisd-new spamassassin
# yum install clamav clamav-data clamav-filesystem clamav-lib clamav-scanner-sysvinit clamav-scanner
# yum install clamav-server-systemd clamav-server-sysvinit clamav-server clamav-update
~
&size(16){&font(b){/etc/postfix/mysql_virtual_mailbox_limit_maps.cf};};
user = postfix-mysql-user
password = postfix-mysql-pass
hosts = localhost
dbname = postfix-user-db
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
&size(16){&font(b){2. 設定};};
CentOSの場合amavisの設定ファイルは、/etc/amavisd/amavisd.confの一つに集約されている。
/etc/clamd.d/amavisd.confにも設定があるが、こちらは使わないので放置する。
~
&size(16){&font(b){/etc/postfix/mysql_virtual_mailbox_maps.cf};};
user = postfix-mysql-user
password = postfix-mysql-pass
hosts = localhost
dbname = postfix-user-db
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){/etc/amavisd/amavisd.conf};};
! [1] @bypass_virus_checks_maps = (0);
! [2] @bypass_spam_checks_maps = (1);
---
[1] ウイルスチェックを必ず実行する
[2] スパムメールチェックは行わない
==================================================
! [3] $lock_file = "/var/run/amavisd/amavisd.lock";
! [4] $pid_file = "/var/run/amavisd/amavisd.pid";
---
[3] amavisd起動時のロックファイル
[4] amavisdのプロセス番号ファイル
==================================================
! [5] $log_level = 1;
! [6] $do_syslog = 1;
! [7] $syslog_facility = 'mail';
---
[5] amavisdのウイルスチェックログを記録
[6] amavisdのログをsyslogに出力
[7] syslogのfacilityを設定する
==================================================
< \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamd.amavisd/clamd.sock"],
---
> \&ask_daemon, ["CONTSCAN {}\n", "【clamavのソケットと同じにする】"],
==================================================
< $mydomain = 'example.com';
---
> $mydomain = 'hoge.org';
> $myhostname = 'mail.hoge.org';
< $QUARANTINEDIR = undef;
---
> # $QUARANTINEDIR = undef;
< $db_home = "$MYHOME/db";
---
> # $db_home = "$MYHOME/db";
< @mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 );
---
> @mynetworks = qw( 127.0.0.1/32 10.0.0.1/32 );
< $inet_socket_port = 10024;
---
> $inet_socket_bind = '127.0.0.1';
> $inet_socket_port = 10026;
< $virus_admin = undef;
---
> $virus_admin = 'admin@mail.hoge.org';
> $spam_admin = 'admin@mail.hoge.org';
< $mailfrom_notify_admin = undef;
< $mailfrom_notify_recip = undef;
< $mailfrom_notify_spamadmin = undef;
---
> $mailfrom_notify_admin = "virusalert\@$mydomain";
> $mailfrom_notify_recip = "virusalert\@$mydomain";
> $mailfrom_notify_spamadmin = "spam.police\@$mydomain";
< # $notify_method = 'smtp:[127.0.0.1]:10025';
---
> $forward_method = 'smtp:[127.0.0.1]:10025';
> $notify_method = '$forward_method';
< $X_HEADER_TAG = 'X-Virus-Scanned';
< $X_HEADER_LINE = "$myproduct_name at $mydomain";
> $banned_filename_re = new_RE(
> qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
> qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i,
> qr'^application/x-msdownload$'i,
> qr'^application/x-msdos-program$'i,
> qr'^application/hta$'i,
> qr'^(?!cid:).*\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i,
> qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)$'i,
> qr'^\.(exe-ms|dll)$',
> );
#endregion
~
&size(16){&font(b){/etc/postfix/vquota};};
# 該当メールアドレスのバーチャルクォータを指定
# ドメインのオーナーアドレスとかは下記みたいに個別指定にした方が良
hoge-owner@mail.hoge.org 524288000
# ドメイン全体でのバーチャルドメインクォータを指定
# 『個別メールクォータ容量≦ドメイン全体でのクォータ容量』になるようにする
@mail.hoge.org 524288000
&size(16){&font(b){3. スクリプト書き換え};};
デフォルト設定だと、&font(b){amavisd};と&font(b){clamd};が&font(b){それぞれamavisプロセスを起動};してしまい、メモリを2倍消費する。
clamavと連携する時は、clamdからのみプロセスを実行出来れば良いので、起動スクリプトを修正して二重起動を防止する。
また、スクリプト修正に併せてtmpfiles内のユーザ・グループ設定を、amavisd・clamdの実行ユーザにそれぞれ変更する。
~
&size(16){&font(b){/etc/postfix/master.cf};};
本来ならchroot環境にするべきなのだが、
chrootにすると何故かMySQLとの連携で転けたので今回はノーマル状態で構築。
あと、基本的に"下記のまま"記述をし、下記に書いていない箇所については"コメントアウト"を行う。
# ==========================================================================
# Postfix Document
# http://www.postfix-jp.info/trans-2.3/conf/master.cf.jp
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - n - - smtpd
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){起動スクリプト調整};};
# vi /usr/lib/systemd/system/amavisd.service
---
[Unit]
Description=Amavisd-new is an interface between MTA and content checkers.
Documentation=http://www.ijs.si/software/amavisd/#doc
# After=network.target
# Wants=clamd@amavisd.service
# Wants=postfix.service
After=clamd@scan.service network.target
Wants=clamd@scan.service
Before=postfix.service
&size(14){&font(b){2重起動防止};};
# rm /etc/clamd.d/amavisd.conf
&size(14){&font(b){テンポラリ設定の変更};};
# vi /usr/lib/tmpfiles.d/amavisd-new.conf
---
d /var/run/amavisd 755 vscan vscan -
## amavisとの連携オプションを指定する。
## サーバの性能によってプロセス数を調整する(今のPCスペックならこのまま記載する)。
amavis unix - - n - 4 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
## TLS認証やSASL-AUTHの使用設定を行う。
## 今回の構成ならyesにする必要がある。
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 300 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
## amavisでスキャンを行ったメッセージのサーバ(MTA)内受信ポートを指定する。
## 今回は1台の物理サーバで全てのメール転送プロセスを処理している為、
## "localhost"の"10025ポート"で受信する様に設定してある。
## また、mynetworksを指定し信頼するネットワークの指定も行う。
## 他のパラメータについては、必要に応じて適宜設定を行う。
localhost:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_restriction_classes=
-o mynetworks=192.168.0.0/24,127.0.0.1/32
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o local_recipient_maps=
-o relay_recipient_maps=
scache unix - - n - 1 scache
## userには、main.cfの$home_mailboxディレクトリへの書き込み権限のある、"Postfixサーバ上のユーザ"を指定する。
## 今回はPostfixAdminとの連携を行うので、PostfixAdminで指定したユーザと同じものにする。
procmail unix - n n - - pipe
flags=R user=postfixadmin argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} EXTENSION=${extension} /etc/procmailrc
# vi /usr/lib/tmpfiles.d/clamd.scan.conf
---
d /var/run/clamd.scan 0710 clamd clamd
#endregion
~
&size(16){&font(b){/etc/sysconfig/postfix};};
OSのディストリビューションによっては編集する必要がある。
基本はデフォルト値にして、Postfixのコンフィグで設定を書いていく方が後々楽になる。
POSTFIX_RELAYHOST=""
POSTFIX_LISTEN=""
POSTFIX_INET_PROTO=""
POSTFIX_MYHOSTNAME=""
POSTFIX_MASQUERADE_DOMAIN=""
POSTFIX_LOCALDOMAINS=""
POSTFIX_NULLCLIENT="no"
POSTFIX_DIALUP="no"
POSTFIX_NODNS="no"
POSTFIX_CHROOT="no"
POSTFIX_UPDATE_CHROOT_JAIL="no"
POSTFIX_WITH_LDAP="no"
POSTFIX_WITH_MYSQL="no"
POSTFIX_MYSQL_CONN="socket"
POSTFIX_LAPTOP="no"
POSTFIX_UPDATE_MAPS="yes"
# デフォルト値の末尾に"helo_access relay"を追記
POSTFIX_MAP_LIST="virtual transport access canonical sender_canonical relocated sasl_passwd:600 relay_ccerts helo_access relay"
POSTFIX_TRANSPORT_MAPS=""
POSTFIX_RBL_HOSTS=""
POSTFIX_BASIC_SPAM_PREVENTION="off"
POSTFIX_SMTPD_CLIENT_RESTRICTIONS=""
POSTFIX_SMTPD_HELO_RESTRICTIONS=""
POSTFIX_SMTPD_SENDER_RESTRICTIONS=""
POSTFIX_SMTPD_RECIPIENT_RESTRICTIONS=""
POSTFIX_MDA="local"
POSTFIX_SMTP_AUTH_SERVER="no"
POSTFIX_SMTP_AUTH="no"
POSTFIX_SMTP_AUTH_OPTIONS=""
POSTFIX_SMTP_TLS_SERVER="no"
POSTFIX_SMTP_TLS_SERVER_LEGACY_SUPPORT="no"
POSTFIX_SMTP_TLS_CLIENT="no"
##
## 以下、SSLファイルの指定は"main.cf"の設定値の方が優先されるのでデフォルトのままでok
##
POSTFIX_SSL_PATH="/etc/postfix/ssl"
POSTFIX_TLS_CAFILE="cacert.pem"
POSTFIX_TLS_CERTFILE="certs/postfixcert.pem"
POSTFIX_TLS_KEYFILE="certs/postfixkey.pem"
##
## [修正箇所] - SSL証明書作成時に入力した(する)値を設定する
##
# SSL証明書の"Country Name"の値 = 日本ならJP
POSTFIX_SSL_COUNTRY="JP"
# SSL証明書の"State or Province Name"の値 = 都道府県
POSTFIX_SSL_STATE="Tokyo"
# SSL証明書の"Locality Name"の値 = 市区町村。個人鯖とかで書きたくなかったら"*"とか"-"とか"."で埋める
POSTFIX_SSL_LOCALITY="-"
# SSL証明書の"Organization Name"の値 = 組織名。個人鯖ならドメイン名とかが良
POSTFIX_SSL_ORGANIZATION="hoge.org"
# SSL証明書の"Organizational Unit Name"の値 = 組織内での申請部署名。個人鯖とかで書く必要なかったら"*"とか"-"とか"."で埋める
POSTFIX_SSL_ORGANIZATIONAL_UNIT="-"
# SSL証明書の"Common Name"の値 = Postfixの稼働するマシンのFQDNを書く。必ず、メール送受信に使用するFQDNを書く事
POSTFIX_SSL_COMMON_NAME="mail.hoge.org"
# SSL証明書の"Email Address"の値 = ドメインのオーナーアドレスをを書く
POSTFIX_SSL_EMAIL_ADDRESS="hoge-owner@mail.hoge.org"
# メールボックスの容量リミットを無制限にする
POSTFIX_ADD_MAILBOX_SIZE_LIMIT="0"
# メール一通の容量リミットを無制限にする
POSTFIX_ADD_MESSAGE_SIZE_LIMIT="0"
# サービスロケーションプロトコルの切り替え。デフォルト値(yes)を推奨
POSTFIX_REGISTER_SLP="yes"
# Postfixの稼働するサーバでのネットワークスタイルを書く。普通は"subnet"を指定する
POSTFIX_ADD_MYNETWORKS_STYLE="subnet"
&size(16){&font(b){4. 設定反映};};
amavisdを一つだけにする為、関連するプログラムを再起動する
設定を間違えてamavisdが二重起動しようとしている場合や、systemdによるサービス自動再起動が動作し、
プログラムが上手く再起動出来ない(1つだけにならない)場合は下記ログがmessagesに出力される
systemd: Starting clamd scanner (amavisd) daemon...
clamd: ERROR: Can't open/parse the config file /etc/clamd.d/amavisd.conf
systemd: clamd@amavisd.service: main process exited, code=exited, status=1/FAILURE
systemd: Unit clamd@amavisd.service entered failed state.
systemd: clamd@amavisd.service failed.
systemd: clamd@amavisd.service holdoff time over, scheduling restart.
systemd: start request repeated too quickly for clamd@amavisd.service
systemd: Started clamd scanner (amavisd) daemon.
※再起動順序
amavisdがforeground引数を付けた状態で起動していたら、clamd経由でamavisが起動している(二重起動状態)
---
# systemctl restart clamd
# systemctl restart amavisd
# netstat -an | egrep -i "tcp.*10026.*LISTEN"
# ps -ef | grep amavis
~
*メールディレクトリ [#wab30632]
メール保存用ディレクトリを作成してパーミッションも設定する
# mkdir /var/hoge/mail-spool
# chown postfixadmin.postfix /var/hoge/mail-spool
# chmod 750 /var/hoge/mail-spool
*構築(openSUSE) [#z4b7a91b]
&size(16){&font(b){1. インストール};};
openSUSEでは標準リポジトリでamavisパッケージを導入する事が出来る筈だが、
エラーが出てしまった場合はソースRPMリポジトリとセキュリティリポジトリを追加する。
# zypper addrepo http://download.opensuse.org/distribution/leap/42.2/repo/oss/ opensuse-repo-oss
# zypper addrepo http://download.opensuse.org/repositories/security/openSUSE_Leap_42.2/security.repo opensuse-security
# zypper refresh
# zypper install clamav amavisd-new
~
*起動設定 [#q96c3002]
yastやchkconfigを使って自動起動の設定を行う。
-yast
# yast
[System] -> [Services Manager] -> [postfix] -> "Enabled"
-chkconfig
# chkconfig postfix on
&size(16){&font(b){2. 設定};};
openSUSEのamavisd.confは一つのファイルに固まった形になっている。
設定内容はCentOS版と殆ど同じだが、バイパス設定が少しだけ違うので注意する。
~
#region(&color(#ff0000){設定内容};)
&size(14){&font(b){/etc/amavisd.conf};};
! [1] # @bypass_virus_checks_maps = (1);
! [2] @bypass_spam_checks_maps = (1);
! [3] # $bypass_decode_parts = 1;
---
[1] コメントアウトか"0"をセットするとウイルスチェックを実行する
[2] スパムチェックは行わない
[3] コメントアウトするとファイルデコーダ・アーカイバが動作するようになる
==================================================
! [4] $MYHOME = '/var/spool/amavis';
! [5] $lock_file = "$MYHOME/var/amavisd.lock";
! [6] $pid_file = "$MYHOME/var/amavisd.pid";
---
[4] amavisが生成するファイルのディレクトリ指定
[5] amavis起動時のロックファイル
[6] amavisのプロセス番号ファイル
==================================================
! [7] $log_level = 1;
! [8] $do_syslog = 1;
! [9] $syslog_facility = 'mail';
---
[7] amavisのウイルスチェックログを記録
[8] amavisのログをsyslogに出力
[9] syslogのfacilityを設定する
==================================================
< \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamd.amavisd/clamd.sock"],
---
> \&ask_daemon, ["CONTSCAN {}\n", "【clamavのソケットと同じにする】"],
==================================================
< $mydomain = 'example.com';
---
> $mydomain = 'hoge.org';
> $myhostname = 'mail.hoge.org';
< $QUARANTINEDIR = undef;
---
> # $QUARANTINEDIR = undef;
< $db_home = "$MYHOME/db";
---
> # $db_home = "$MYHOME/db";
< @mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 );
---
> @mynetworks = qw( 127.0.0.1/32 10.0.0.1/32 );
< $inet_socket_port = 10024;
---
> $inet_socket_bind = '127.0.0.1';
> $inet_socket_port = 10026;
< $virus_admin = undef;
---
> $virus_admin = 'admin@mail.hoge.org';
> $spam_admin = 'admin@mail.hoge.org';
< $mailfrom_notify_admin = undef;
< $mailfrom_notify_recip = undef;
< $mailfrom_notify_spamadmin = undef;
---
> $mailfrom_notify_admin = "virusalert\@$mydomain";
> $mailfrom_notify_recip = "virusalert\@$mydomain";
> $mailfrom_notify_spamadmin = "spam.police\@$mydomain";
< # $notify_method = 'smtp:[127.0.0.1]:10025';
---
> $forward_method = 'smtp:[127.0.0.1]:10025';
> $notify_method = '$forward_method';
< $X_HEADER_TAG = 'X-Virus-Scanned';
< $X_HEADER_LINE = "$myproduct_name at $mydomain";
> $banned_filename_re = new_RE(
> qr'\.[^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
> qr'\{[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}\}?$'i,
> qr'^application/x-msdownload$'i,
> qr'^application/x-msdos-program$'i,
> qr'^application/hta$'i,
> qr'^(?!cid:).*\.[^./]*[A-Za-z][^./]*\.\s*(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)[.\s]*$'i,
> qr'.\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)$'i,
> qr'^\.(exe-ms|dll)$',
> );
#endregion
~
-init.d
●起動
# /etc/init.d/postfix start
●停止
# /etc/init.d/postfix stop
●再起動
# /etc/init.d/postfix restart
&size(16){&font(b){3. 設定反映};};
書き換えた設定をプロセスに反映させる為に再起動を行う。
また、デフォルトでは自動起動がOFFになっている為、自動起動をONに変更する。
# systemctl enable amavis.service
# systemctl restart amavis.service
# netstat -an | egrep -i "tcp.*10026.*LISTEN"