SpamSnake · 7 min read · Dec 25, 2025
完璧なSpamSnake - Ubuntu Jeos 10.10 Maverick Meerkat - ページ 4
14. KAM
vi /etc/cron.daily/kam.sh以下の内容を追加し、
chmod +x /etc/cron.daily/kam.sh#!/bin/bash
# Andrew MacLachlanによって修正されたオリジナルバージョン
# 初回の再起動失敗時に追加のMailScanner再起動を追加
# 通常(成功)動作のためにスクリプトをサイレントで実行
# UPDATEMAXDELAYを600から900に増加
# ウイルス更新を広めるために、この値までのランダムな遅延を挿入
# 1800秒 = 30分。
# これを0に設定すると無効になります。
UPDATEMAXDELAY=0
if [ -f /opt/MailScanner/var/MailScanner ] ; then
. /opt/MailScanner/var/MailScanner
fi
export UPDATEMAXDELAY
if [ "x$UPDATEMAXDELAY" = "x0" ]; then
:
else
logger -p mail.info -t KAM.cf.sh $UPDATEMAXDELAY秒までcronジョブを遅延
perl -e "sleep int(rand($UPDATEMAXDELAY));"
fi
# JKF Fetch KAM.cf
#echo KAM.cfを取得中...
cd /etc/mail/spamassassin
rm -f KAM.cf
wget -O KAM.cf http://www.peregrinehw.com/downloads/SpamAssassin/contrib/KAM.cf > /dev/null 2>&1
if [ "$?" = "0" ]; then
#echo 完了し、何かを取得しました
if ( tail -10 KAM.cf | grep -q '^#.*EOF' ); then
# echo 成功したのでバックアップを作成
cp -f KAM.cf KAM.cf.backup
else
echo ERROR: EOFマーカーが見つかりませんでした
cp -f KAM.cf.backup KAM.cf
fi
else
echo 正常に完了しませんでした
cp -f KAM.cf.backup KAM.cf
fi
#echo MailScannerとSpamAssassinの設定ルールを再読み込み中
/etc/init.d/mailscanner reload > /dev/null 2>&1
if [ $? != 0 ] ; then
echo "MailScannerの再読み込みに失敗しました - 再試行中..."
/etc/init.d/mailscanner force-reload
if [ $? = 0 ] ; then
echo "MailScannerの再読み込みに成功しました。"
else
echo "MailScannerを停止中..."
/etc/init.d/mailscanner stop
echo "1分待機中..."
perl -e "sleep 60;"
echo "MailScannerを起動しようとしています..."
/etc/init.d/mailscanner start
fi
fi 15. ScamNailer
vi /usr/sbin/update_scamnailer
と
chmod +x /usr/sbin/update_scamnailer
注: *内容は scamnailer.docにあります。)
それをcronに追加:
@daily /usr/sbin/update_scamnailer &> /dev/null #Scamnailerを更新16. FireholでSpamSnakeをファイアウォール
はじめに
Fireholは、状態を持つiptablesパケットフィルタリングファイアウォールコンフィギュレータです。抽象化されており、拡張可能で、簡単かつ強力です。あらゆる種類のファイアウォールを処理できますが、最も重要なのは、あなたが考えるのと同じ方法で構成する手段を提供することです。
Fireholのインストール
apt-get install fireholFireholの設定:
vi /etc/default/fireholそして以下を変更:
START_FIREHOL=YESvi /etc/firehol/firehol.confそして以下を追加:
version 5
# すべてのクライアントトラフィックを任意のインターフェースで受け入れる
interface any internet
protection strong
server "icmp ping ICMP ssh http https telnet webmin dns dcc echo smtp" accept
client all acceptこれは、上記のサービスに関連しないすべての着信接続をフィルタリングします。より失礼になりたい場合は、’protection strong’の後に以下を追加してドロップできます: policy drop
vi /usr/sbin/get-iana以下の内容で
chmod +x /usr/sbin/get-iana#!/bin/bash
# $Id: get-iana.sh,v 1.13 2010/09/12 13:55:00 jcb Exp $
#
# $Log: get-iana.sh,v $
# Revision 1.13 2010/09/12 13:55:00 jcb
# 最新のIANA予約形式に更新。
#
# Revision 1.12 2008/03/17 22:08:43 ktsaou
# 最新のIANA予約形式に更新。
#
# Revision 1.11 2007/06/13 14:40:04 ktsaou
# * 空のログメッセージ *
#
# Revision 1.10 2007/05/05 23:38:31 ktsaou
# 外部定義のサポートを追加:
#
# RESERVED_IPS
# PRIVATE_IPS
# MULTICAST_IPS
# UNROUTABLE_IPS
#
# 同じ名前のファイルを/etc/firehol/に配置します。
# RESERVED_IPSのみが必須です(fireholはそれがないと文句を言いますが、
# それがなくても動作します)、また、fireholがどれだけ古いかを確認する唯一のファイルでもあります。
# 90日以上古い場合、fireholは再度文句を言います。
#
# 提供されたget-iana.shスクリプトを変更してRESERVED_IPSファイルを生成します。
# FireHOLは、ファイルが欠落しているか、古すぎる場合にこのスクリプトを使用するように指示します。
#
# Revision 1.9 2007/04/29 19:34:11 ktsaou
# * 空のログメッセージ *
#
# Revision 1.8 2005/06/02 15:48:52 ktsaou
# 127.0.0.1をRESERVED_IPSに含めることを許可
#
# Revision 1.7 2005/05/08 23:27:23 ktsaou
# 現在のIANA予約にRESERVED_IPSを更新。
#
# Revision 1.6 2004/01/10 18:44:39 ktsaou
# http://www.vergenet.net/linux/aggregate/を使用してPRIVATE_IPSをさらに最適化し、削減。
#
# 提供されたget-iana.shは、パスに.aggregate.が見つかると使用します。
# (aggregateは、Gentooにインストールされたときのこのプログラムの名前です)
#
# Revision 1.5 2003/08/23 23:26:50 ktsaou
# バグ #793889:
# #!/bin/shを#!/bin/bashに変更して、FireHOLが
# bashが/bin/shにリンクされていないシステムで実行できるようにします。
#
# Revision 1.4 2002/10/27 12:44:42 ktsaou
# CVSテスト
#
#
# IANAによるIPv4アドレス空間の割り当てをダウンロードし、
# すべての予約されたアドレス空間のリストを作成するプログラムです。
#
IPV4_ADDRESS_SPACE_URL="http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.txt"
# プログラムは、ファイル内のすべての行を一致させます。
# 数字で始まり、スラッシュがあり、
# その後に別の数字が続く行に対して、次のパターンも一致します。
IANA_RESERVED="(RESERVED|UNALLOCATED)"
# 上記で一致した行を無視するために
# (つまり、RESERVED_IPSに含めない)は?
#IANA_IGNORE="(Multicast|Private use|Loopback|Local Identification)"
IANA_IGNORE="Multicast"
tempfile="/tmp/iana.$$.$RANDOM"
AGGREGATE="`which aggregate 2>/dev/null`"
if [ -z "${AGGREGATE}" ]
then
AGGREGATE="`which aggregate 2>/dev/null`"
fi
if [ -z "${AGGREGATE}" ]
then
echo >&2
echo >&2
echo >&2 "WARNING"
echo >&2 "'aggregate'をインストールしてIPのリストを縮小してください。"
echo >&2
echo >&2
fi
echo >&2
echo >&2 "IANA IPv4アドレス空間を取得中、ソース:"
echo >&2 "${IPV4_ADDRESS_SPACE_URL}"
echo >&2
wget -O - -proxy=off "${IPV4_ADDRESS_SPACE_URL}" |\
egrep " *[0-9]+/[0-9]+.*${IANA_RESERVED}" |\
egrep -vi "${IANA_IGNORE}" |\
sed -e 's:^ *\([0-9]*/[0-9]*\).*:\1:' |\
(
while IFS="/" read range net
do
if [ ! $net -eq 8 ]
then
echo >&2 "ネットワークマスクが$netビットのため処理できません ($range/$net)"
continue
fi
first=`echo $range | cut -d '-' -f 1`
first=`expr $first + 0`
last=`echo $range | cut -d '-' -f 2`
last=`expr $last + 0`
x=$first
while [ ! $x -gt $last ]
do
# test $x -ne 127 && echo "$x.0.0.0/$net"
echo "$x.0.0.0/$net"
x=$[x + 1]
done
done
) | \
(
if [ ! -z "${AGGREGATE}" -a -x "${AGGREGATE}" ]
then
"${AGGREGATE}"
else
cat
fi
) >"${tempfile}"
echo >&2
echo >&2
echo >&2 "次の予約されたIP範囲が見つかりました:"
printf "RESERVED_IPS=\"
i=0
for x in `cat ${tempfile}`
do
i=$[i + 1]
printf "${x} "
done
printf "\"
if [ $i -eq 0 ]
then
echo >&2
echo >&2
echo >&2 "予約されたIPを見つけることに失敗しました。"
echo >&2 "ファイル形式が変更されたか、URLを取得できません。"
echo >&2
rm -f ${tempfile}
exit 1
fi
echo >&2
echo >&2
echo >&2 "取得したリストと/etc/firehol/RESERVED_IPSにインストールされたリストの違い:"
echo >&2 "# diff /etc/firehol/RESERVED_IPS ${tempfile}"
diff /etc/firehol/RESERVED_IPS ${tempfile}
if [ $? -eq 0 ]
then
echo >&2
echo >&2 "違いは見つかりませんでした。"
echo >&2
rm -f ${tempfile}
exit 0
fi
echo >&2
echo >&2
echo >&2 "このリストを/etc/firehol/RESERVED_IPSに保存しますか"
echo >&2 "これによりFireHOLは今後自動的に使用しますか?"
echo >&2
while [ 1 = 1 ]
do
printf >&2 "はいまたはいいえ > "
read x
case "${x}" in
yes) cp -f /etc/firehol/RESERVED_IPS /etc/firehol/RESERVED_IPS.old 2>/dev/null
cat "${tempfile}" >/etc/firehol/RESERVED_IPS || exit 1
echo >&2 "新しいRESERVED_IPSが'/etc/firehol/RESERVED_IPS'に書き込まれました。"
echo "Fireholは再起動します"
sleep 3
/etc/init.d/firehol restart
break
;;
no)
echo >&2 "何も保存されていません。"
break
;;
*) echo >&2 "'${x}'を理解できません。"
;;
esac
done
rm -f ${tempfile}vi /usr/sbin/update-iana以下の内容で
chmod +x /usr/sbin/update-iana#!/bin/sh
/usr/sbin/get-iana < /etc/firehol/get-iana-answerfilevi /etc/firehol/get-iana-answerfile以下の内容で:
yesRESERVED_IPSを更新するためにスクリプトを実行:
/usr/sbin/update-ianaこれで、サーバーは許可したサービスの接続のみを受け入れるように設定されています。
それをcronに追加:
@monthly /usr/sbin/update-iana &> /dev/null #firehol予約ipsを更新17. リレー受信者の適用
以下の指示は、Microsoft Exchange 2000またはMicrosoft Exchange 2003を使用している人向けです。
このページでは、メールゲートウェイを構成して、定期的にExchangeシステムから有効な受信者のメールアドレスのリストを取得する方法を説明します。これにより、無効なアドレスに宛てられたメールを自動的に拒否するようにサーバーを構成できます。これにより、非配信レポートを処理する必要がなくなり、Exchangeサーバーの負荷が軽減され、Postfixサーバーの負荷も軽減されます。
依存関係のインストール
perlモジュールNet::LDAPをインストール:
perl -MCPAN -e shell
install Net::LDAPvi /usr/bin/getadsmtp.pl以下の内容で:
#!/usr/bin/perl -T -w
# このスクリプトは、Active DirectoryからすべてのユーザーのSMTPアドレスを取得し
# (プライマリおよびセカンダリのメールアドレスを含む)
# Postfixがrelay_recipient_mapsで使用する形式"[email protected] OK"でリストします。
# 上記のperlのパスを再確認してください。
# これにはNet::LDAPがインストールされている必要があります。インストールするには、シェルで
# "perl -MCPAN -e shell"と入力し、次に"install Net::LDAP"と入力します。
use Net::LDAP;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant ( "LDAP_CONTROL_PAGED" );
# 出力のパス/ファイルを入力
$VALID = "/etc/postfix/relay_recipients";
open VALID, ">$VALID" or die "CANNOT OPEN $VALID $!";
# Active DirectoryドメインコントローラーのFQDNを以下に入力
$dc1="domaincontroller1.example.com";
$dc2="domaincontroller2.example.com";
# ユーザーベースのLDAPコンテナを入力。
# 構文はCN=Users,dc=example,dc=com
# これはWindows 2000サポートツールをインストールして
# ADSI Editを実行することで見つけることができます。
# ADSI Editで「Domain NC [domaincontroller1.example.com]」を展開し、
# 例えば、DC=example,DC=com(これがベースです)を確認します。
# ユーザーコンテナは、右ペインにCN=Usersとして指定されます。
# スキーマによって異なります(これがコンテナです)。
# ADSI Editでユーザーフォルダーの「プロパティ」をクリックして
# 「パス」値を確認することで再確認できます。
# LDAP://domaincontroller1.example.com/CN=Users,DC=example,DC=com
# これは$hqbase="cn=Users,dc=example,dc=com"になります。
# 注: $hqbase="dc=example,dc=com"を使用することもできます。
$hqbase="cn=Users,dc=example,dc=com";
# 有効なユーザーのユーザー名とパスワードを入力
# usernameはcn=username,cn=Users,dc=example,dc=comの形式
# ユーザーのパスワードが期限切れにならないようにしてください。このユーザーは
# 特別な権限を必要としません。
# ADSI Editでユーザーの「プロパティ」をクリックして
# 「パス」値を確認することで再確認できます。
# LDAP://domaincontroller1.example.com/CN=user,CN=Users,DC=example,DC=com
# これは$user="cn=user,cn=Users,dc=example,dc=com"になります。
# 注: UPNログインを使用することもできます: "user\@example.com"
$user="cn=user,cn=Users,dc=example,dc=com";
$passwd="password";
# Active Directoryドメインコントローラーに接続
$noldapserver=0;
$ldap = Net::LDAP->new($dc1) or
$noldapserver=1;
if ($noldapserver == 1) {
$ldap = Net::LDAP->new($dc2) or
die "指定されたドメインコントローラーへの接続エラー $@ \n";
}
$mesg = $ldap->bind ( dn => $user,
password =>$passwd);
if ( $mesg->code()) {
die ("エラー:", $mesg->error_text((),"\n"));
}
# 各ページラウンドで取得するLDAPクエリ結果の数
# Active Directory用に1000未満に設定
$page = Net::LDAP::Control::Paged->new( size => 990 );
@args = ( base => $hqbase,
# これを調整して、連絡先、パブリックフォルダーなどのオブジェクトを取得します。
# メールを持つユーザーのための最小限のフィルターは:
# filter => "(&(sAMAccountName=*)(mail=*)))"
filter => "(& (mailnickname=*) (| (&(objectCategory=person)
(objectClass=user)(!(homeMDB=*))(!(msExchHomeServerName=*)))
(&(objectCategory=person)(objectClass=user)(|(homeMDB=*)
(msExchHomeServerName=*)))(&(objectCategory=person)(objectClass=contact))
(objectCategory=group)(objectCategory=publicFolder) ))",
control => [ $page ],
attrs => "proxyAddresses",
);
my $cookie;
while(1) {
# 検索を実行
my $mesg = $ldap->search( @args );
# proxyAddresses属性の結果をフィルタリング
foreach my $entry ( $mesg->entries ) {
my $name = $entry->get_value( "cn" );
# LDAP属性は複数値を持つため、各値を印刷する必要があります。
foreach my $mail ( $entry->get_value( "proxyAddresses" ) ) {
# 行が次のいずれかで始まるかテスト:
# proxyAddresses: [smtp|SMTP]:
# また、この開始文字列を破棄して、$mailが他の文字なしのアドレスのみになるようにします...
if ( $mail =~ s/^(smtp|SMTP)://gs ) {
print VALID $mail." OK\n";
}
}
}
# LDAP_SUCCESSのみに続行
$mesg->code and last;
# ページ制御からクッキーを取得
my($resp) = $mesg->control( LDAP_CONTROL_PAGED ) or last;
$cookie = $resp->cookie or last;
# ページ制御にクッキーを設定
$page->cookie($cookie);
}
if ($cookie) {
# 異常終了したので、サーバーにもうこれ以上は望まないことを知らせます
$page->cookie($cookie);
$page->size(0);
$ldap->search( @args );
# ここで不幸に死ぬのも良いアイデアです
die("LDAPクエリが成功しませんでした");
}
# 出力ファイルに追加の制限、ユーザーなどを追加します。
#print VALID "user\@domain1.com OK\n";
#print VALID "user\@domain2.com 550 ユーザーが不明です。\n";
#print VALID "domain3.com 550 ユーザーが存在しません。\n";
close VALID;次に、ファイルの権限を設定して実行可能にします:
chmod +x /usr/bin/getadsmtp.plファイルを編集して特定のドメインにカスタマイズします。ファイルは読み取り専用のため、viで:w!を使用してファイルを保存する必要があります。
- $dc1と$dc2をドメインコントローラーの完全修飾ドメイン名またはIPアドレスに設定します。
- $hqbaseをメールアカウントのメールアドレスを取得したいコンテナまたは組織単位のLDAPパスに設定します。
- $userと$passwdを、この情報にアクセスするために使用するユーザーアカウントを示すように設定します。このアカウントはドメインのメンバーである必要があるため、特にこのためのアカウントを設定することをお勧めします。
スクリプトを実行してみてください。正しく動作すれば、/etc/postfix/relay_recipientsが作成されます。
PostfixサーバーがActive Directoryコントローラーからファイアウォールで分離されている場合は、PostfixサーバーからADCsへのTCPポート389を開く必要があります。
getadsmtp.plこの時点で、/etc/postfix/relay_recipientsを編集して、不要なメールアドレスを削除することをお勧めします。このスクリプトはすべてをインポートします。
ハッシュDBを作成するためにファイルをPostmap
postmap /etc/postfix/relay_recipients
postfix reload最後に、/etc/postfix/relay_recipients.dbファイルを定期的に更新して構築するためのcronジョブを設定することをお勧めします。/usr/bin/update-relay-recipients.shというスクリプトを作成できます:(オプション)
vi /usr/bin/update-relay-recipients.sh以下の内容で
chmod +x /usr/bin/update-relay_recipients.sh#!/bin/sh
/usr/bin/getadsmtp.pl
postmap /etc/postfix/relay_recipients
postfix reload次の内容が/etc/postfix/main.cfファイルに含まれていることを確認してください:
relay_recipient_maps = hash:/etc/postfix/relay_recipientsそれをcronに追加:
30 2 * * * /usr/bin/update-relay-recipients.sh #Active Directoryアドレスでrelay_recipientsを同期:このcronジョブは毎日午前2時30分にデータベースファイルを更新します。新しいメールユーザーをシステムに追加する頻度に応じて、もっと頻繁に実行するか、実行しないかを選択できます。
18. Webminのインストール(オプション):
apt-get install perl libnet-ssleay-perl libauthen-pam-perl libio-pty-perl apt-show-versions
cd /tmp && wget http://mirrors.kernel.org/ubuntu/pool/universe/libm/libmd5-perl/libmd5-perl_2.03-1_all.deb
dpkg -i libmd5-perl_2.03-1_all.deb
wget http://downloads.sourceforge.net/project/webadmin/webmin/1.520/webmin_1.520_all.deb
dpkg --install webmin_1.520_all.deb19. alterMIMEで送信メールに自動的に免責事項を追加(オプション)
このチュートリアルでは、alterMIMEをインストールして使用する方法を示します。alterMIMEは、メールに自動的に免責事項を追加できるツールです。この記事では、UbuntuでPostfixフィルターとしてインストールする方法を説明します。
alterMIMEのインストール:
apt-get install altermime次に、ユーザーフィルターを作成し、ホームディレクトリを/var/spool/filterに設定します - alterMIMEはそのユーザーとして実行されます:
useradd -r -c "Postfix Filters" -d /var/spool/filter filter
mkdir /var/spool/filter
chown filter:filter /var/spool/filter
chmod 750 /var/spool/filterその後、alterMIMEを実行する/etc/postfix/disclaimerというスクリプトを作成します。UbuntuのalterMIMEパッケージには、単に/etc/postfix/disclaimerにコピーできるサンプルスクリプトが付属しています:
cp /usr/share/doc/altermime/examples/postfix_filter.sh /etc/postfix/disclaimer
chgrp filter /etc/postfix/disclaimer
chmod 750 /etc/postfix/disclaimerこのスクリプトの問題は、着信メールと送信メールを区別しないことです - すべてのメールに免責事項を追加します。通常、免責事項は送信メールのみに必要であり、さらにすべての送信者アドレスに対して必要ではありません。したがって、/etc/postfix/disclaimerスクリプトを少し修正しました - それについては後で説明します。
今、/etc/postfix/disclaimer_addressesというファイルを作成し、alterMIMEが免責事項を追加すべきすべての送信者メールアドレス(1行ごとに)を保持します:
vi /etc/postfix/disclaimer_addresses[email protected]
[email protected]
[email protected]次に、/etc/postfix/disclaimerを開いて以下のように修正します(変更した部分をマークしました):
vi /etc/postfix/disclaimer#!/bin/sh
# これをローカライズします。
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail
####### オリジナルスクリプトから変更 #######
DISCLAIMER_ADDRESSES=/etc/postfix/disclaimer_addresses
####### オリジナルスクリプトから変更終了 #######
# からの終了コード
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
# 完了時または中止時にクリーンアップ。
trap "rm -f in.$$" 0 1 2 3 15
# 処理を開始します。
cd $INSPECT_DIR || { echo $INSPECT_DIRは存在しません; exit
$EX_TEMPFAIL; }
cat >in.$$ || { echo メールをファイルに保存できません; exit $EX_TEMPFAIL; }
####### オリジナルスクリプトから変更 #######
# Fromアドレスを取得
from_address=`grep -m 1 "From:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1`
if [ `grep -wi ^${from_address}$ ${DISCLAIMER_ADDRESSES}` ]; then
/usr/bin/altermime --input=in.$$ \
--disclaimer=/etc/postfix/disclaimer.txt \
--disclaimer-html=/etc/postfix/disclaimer.txt \
--xheader="X-Copyrighted-Material: Please visit http://www.company.com/privacy.htm" || \
{ echo メッセージコンテンツが拒否されました; exit $EX_UNAVAILABLE; }
fi
####### オリジナルスクリプトから変更終了 #######
$SENDMAIL "$@" 次に、免責事項テキストを保持するテキストファイル/etc/postfix/disclaimer.txtを作成する必要があります。UbuntuのalterMIMEパッケージには、今のところ使用できるサンプルテキストが付属しています(もちろん、必要に応じて変更できます):
cp /usr/share/doc/altermime/examples/disclaimer.txt /etc/postfix/disclaimer.txt最後に、Postfixに/etc/postfix/disclaimerスクリプトを使用して送信メールに免責事項を追加するように指示する必要があります。/etc/postfix/master.cfを開き、smtp行に-o content_filter=dfilt:を追加します:
vi /etc/postfix/master.cf#
# Postfixマスタープロセス構成ファイル。ファイルの形式の詳細は、
# master(5)マニュアルページを参照してください(コマンド: "man 5 master")。
#
# ==========================================================================
# サービスタイプ プライベート 非特権 chroot ウェイクアップ 最大プロセス コマンド + 引数
# (はい) (はい) (はい) (決して) (100)
# ==========================================================================
smtp inet n - - - - smtpd
-o content_filter=dfilt:
[...] 同じファイルの最後に、次の2行を追加します:
[...]
dfilt unix - n n - - pipe
flags=Rq user=filter argv=/etc/postfix/disclaimer -f ${sender} -- ${recipient} その後、Postfixを再起動します:
/etc/init.d/postfix restartこれで完了です!これで、/etc/postfix/disclaimer_addressesにリストされているアドレスから送信された送信メールに免責事項が追加されるはずです。
20. スクリーンショット



おめでとうございます
これで、すべての機能を備えた完全なSpamSnakeが完成しました :-)
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。