เอา Postfix มาสู้กับ spammer ไทย

ผมเบื่อพวกสแปมเมลของคนไทยสุดๆ เลยครับ มาทุกวันเรื่องซ้ำๆ เดิมๆ บางที่มาบ่อยมาก เช่น UNSEENForum MGA และ Boston Network ที่จัดสัมนาเรื่องการตลาดอะไรนี่แหละ ลองดูสถิตินะครับ

ในช่วงระยะเวลาประมาณ 1 เดือนที่ผ่านมา มีจำนวนสแปมเมลของไทยที่โดนผมบล๊อกไว้ได้ทั้งหมด 1067 ฉบับ เป็นสแปมของ UNSEENForum เสีย 179 ฉบับ คิดเป็น 16.8% ของสแปมเมลทั้งหมด เป็นสแปมของ MGA เสีย 131 ฉบับ คิดเป็น 12.3% ของสแปมเมลทั้งหมด และ Boston Network อีก 99 ฉบับ คิดเป็น 9.3% ของสแปมเมลทั้งหมด แค่ของ 3 เจ้านี้รวมกันก็เกือบ 40% เข้าไปแล้ว

นอกจากสัมนาแล้วก็มีพวก ทำอย่างไรถึงจะรวย ลดน้ำหนัก และอื่นๆ ที่ลงท้ายว่า “ต้องขออภัยหากอีเมลนี้รบกวนจิตใจท่าน” ซึ่งผมคิดว่าเขาเหล่านี้คงไม่หยุดส่งเป็นแน่แท้

งั้นก็มาลองสู้กันสักตั้ง เพราะตัว Spamassassin เองก็อาจจะมีปัญหากับ spam พวกนี้ อย่ากระนั้นเลยเรากันไม่ให้สแปมพวกนี้เข้ามาตั้งแต่แรกเลยดีกว่า

ใน postfix จะมีไฟล์ main.cf ให้เพิ่มคำสั่งต่อไปนี้ ลองค้นดูก่อนอาจจะมีไว้อยู่แล้วก็ได้
body_checks = regexp:/etc/postfix/maps/body_checks

จากคำสั่งข้างต้นไฟล์ที่เราจะใส่ filter ก็คือคือ body_checks อยู่ที่ /etc/postfix/maps คำสั่ง body_checks จะทำการตรวจสอบเนื้อหาของอีเมลว่ามีคำที่เราระบุไว้หรือไม่

ในไฟล์ body_checks ของผมปัจจุบันได้ใส่ไว้ดังตัวอย่างข้างล่าง คำที่ใส่ไว้ก็คือ คำหลักที่พวกสแปมเมอร์มักจะใส่มาในอีเมล เช่น บางที่จะมี link ให้คลิ๊กไปที่เว็บของตัวเอง
ก็เอาชื่อเว็บนั่นแหละมาใส่เป็นคีย์ที่จะใช้ filter ออกไป ซึ่งตอนนี้ reject พวกสแปมเมลของไทยไปได้เดือนละประมาณ 1,000 – 1,300 ฉบับ ถ้าถามว่าเอา list พวกนี้มาจากไหน คำตอบก็คือผมเพิ่มลงไปแบบ manual นี่แหละ ค่อยๆ เพิ่มไปทีละนิดๆ บางอันอาจจะซ้ำบ้างเพราะไปดูจากหลายอีเมลมารวมกัน ถ้ามีเวลาก็คงจะเขียนเป็น database ขึ้นมา
แต่ตอนนี้อย่าไปเสียเวลากับพวกนี้มากเลย บอกตรงๆ ว่าแค่นี้ก็สะใจแล้วครับ

Continue reading เอา Postfix มาสู้กับ spammer ไทย

Postfix + SMTP AUTH + TLS

เมือคืนผมติดตั้ง TLS โดยทำตาม quick start ตามนี้ ก็ได้ผลดี
http://www.postfix.org/TLS_README.html#quick-start

แต่ที่ยังหาทางทำต่อก็คือ SMTP AUTH ทำได้แล้วแล้วจะมาบันทึกไว้ต่อครับ ขอตัวไปทำอย่างอื่นก่อน

ติดตั้ง SpamAssassin Rules Emporium (SARE)!

หลังจากติดตั้ง Razor ไปแล้ว คราวนี้ก็มาเพิ่ม rules ให้กับ SA บ้าง
โดยใช้ rule จาก http://www.rulesemporium.com/index.html
และใช้ script จาก Rules Du Jour (http://www.exit0.us/index.php?pagename=RulesDuJour) ในการทำให้ rules update อัตโนมัติ

1. สร้างไดเรกทอรี /etc/rulesdujour

2. สร้างไฟล์ config ภายใต้ /etc/rulesdujour

3. ในไฟล์ conig ให้ใส่คำสั่งต่อไปนี้เพื่อระบุว่าต้องการใช้ rules อะไรบ้าง
TRUSTED_RULESETS=”TRIPWIRE EVILNUMBERS SARE_RANDOM”;

4. สร้าง bash script ชื่อ rules_du_jour และเอา script ไว้ที่ /etc/rulesdujour

5. แก้ค่าตัวแปรใน scirpt rules_du_jour
SA_DIR=”/etc/mail/spamassassin” (เป็นไดเรอทอรีที่ SA จะเข้าไปอ่าน rules อัตโนมัติ
MAIL_ADDRESS=”username@address.com” (email ที่ต้องการให้ script ส่งรายงาน)
SA_RESTART=”/etc/init.d/spamd restart” (คำสั่งที่ใช้ในการ restart SA)

6. chmod +x rules_du_jour

7. สร้าง crontab สั่งให้ scirpt ทำงาน เช่น
28 1 * * * /etc/rulesdujour/rules_du_jour (script ทำงานตอน 1:28AM)

8. ทดสอบ SA โดยใช้คำสั่ง
spamassassin -D < sample-spam.txt

ติดตั้ง Razor สู้กับ Spam

ผมยังหาทางสู้กับ spam อยู่ครับ คราวนี้มาติดตั้ง Razor
วิธีติดตั้งอยู่ที่นี่ http://razor.sourceforge.net/docs/install.php

1. Download the latest v2 razor-agents tarball from
http://sourceforge.net/project/showfiles.php?group_id=3978

2. Download the latest v2 razor-agents-sdk tarball from
http://sourceforge.net/project/showfiles.php?group_id=3978
Untar and run:

perl Makefile.PL
make
make test
make install

If you are not root, run perl Makefile.PL with a “PREFIX=~”
option, like so:

perl Makefile.PL PREFIX=~

OR

2. Instead of installing the razor-agents-sdk package, you can install the
following Perl modules from CPAN:

Net::Ping
Net::DNS
Time::HiRes
Digest::SHA1
Getopt::Long
File::Copy
Digest::Nilsimsa
URI::Escape

If you do not install perl libs to standard places, set PERL5LIB. csh ex:

setenv PERL5LIB /home/user/myperl/lib

3. Untar the razor-agents tarball and run:

perl Makefile.PL
make
make test
make install

Note: ติดตั้งมาถึงตรงนี้แล้วมีปัญหากับ make install ครับ เกิด error ขึ้นเพราะมันหา Digest::SHA1 ไม่เจอ ทีนี้พอปล่อยไว้ปรากฎว่า default ของ SA ก็คือใช้ razor2 ซึ่งก็จะเกิด error ต่อไปนี้
razor2 check skipped: Can't locate object method "new" via package "Razor2::Client::Agent" at /usr/lib/perl5/site_perl/5.8.0/Mail/SpamAssassin/Dns.pm line 430.

วิธีแก้ก็คือ ลบไฟล์ SHA1.pm, SHA1.bs และ SHA1.so ให้หมดครับ แล้วทำการติดตั้ง Digest::SHA1 ใหม่
#perl -MCPAN -e shell
#install Digest::SHA1

เสร็จแล้วก็เริ่มทำการติดตั้ง razor-agents ใหม่อีกรอบครับ 🙂

4. Razor Agents are now installed. Run `razor-client’ after installation
to insure appropriate symlinks have been created.

5. Run `razor-admin -create’ to create a default config file in your
home directory under /home/user/.razor. (Remember to change user to
your username from root before running razor-admin)

6. Razor v2 requires reporters to be registered so their reputations can
be computed over time and they can participate in the revocation
mechanism. Registration is done with razor-admin -register. It has to be
manually invoked in either of the following ways:

To register user foo with `s1kret’ as password:

razor-admin -register -user=foo -pass=s1kr3t

To register with an email address and have the password assigned:

razor-admin -register -user=foo@bar.com

To have both (random) username and password assgined:

razor-admin -register

razor-admin -register negotiates a registration with the Nomination Server
and writes the identity information in
/home/user/.razor/identity-username, or /etc/razor/identity-username
when invoked as root.

7. You can edit razor-agent.conf to change the defaults. Config options
and their values are defined in the razor-agent.conf(5) manpage.

8. The next step is to integrate razor-check, razor-report and
razor-revoke in your mail system. If you are running Razor v1, the
change will be transparent, new versions of razor agents will overwrite
the old ones. You would still need to plugin razor-revoke in your MUA,
since it’s a new addition in Razor v2. If you are not running Razor v1,
refer to manpages of razor-check(1), razor-report(1), and
razor-revoke(1) for integration instructions.

Update: Postfix + Spamassassin + SPF + Greylist

ผม upgrade postfix ใหม่ ทีแรกนึกว่าจะยุ่งยาก แต่ก็แค่
#make
#make upgrade

ทีนี้พอลงใหม่ SPF ที่เคยติดตั้งไว้ก็อันตระธารหายไปด้วย พอดีไปเจอวิธีการติดตั้ง postfix + SpamAssassin + Procmail ที่นี่

Postfix + site-wide SpamAssassin + Procmail for individual ‘spam’ mailboxes.
(http://www.geekly.com/entries/archives/00000155.htm)
วิธีข้างล่างนี้เอามาจากเว็บข้างบนครับ ผมใส่รายละเอียดเพิ่มเติมลงไป

1. Install postfix and get it working for your domain. See http://www.postfix.org for details.

2. Install SpamAssassin. The easiest way to do this is with the command “perl -MCPAN -e ‘install Mail::SpamAssassin'”
Note:
- ต้องสั่ง #export LANG=en_US ก่อน
- ถ้ายังไม่มี CPAN ต้องสั่ง #up2date perl-CPAN

3. As root, create a file at /usr/bin/postfixfilter with the following content:

#!/bin/bash
/usr/bin/spamc | /usr/sbin/sendmail -i "$@"
exit $?

4. Run “chmod 755 /usr/bin/postfixfilter”

5. Create a user called ‘spamfilter’. Make it a complete user, with home directory and shell.

6. Run “chown spamfilter /usr/bin/postfixfilter”

7. In /etc/postfix/master.cf in the “Services” section, alter the ‘smtp’ line as follows (the ” -o con…” SHOULD be on the next line:
Note: ข้อควรระวังก็คือ ให้ระวังว่า spamfilter จะซ้ำกับ filter ที่มีแล้วหรือไม่ ถ้ามีก็ต้องเปลี่ยนเป็นชื่ออื่น เช่น spamfilter_smtp

smtp inet n - n - - smtpd
-o content_filter=spamfilter:

8. In /etc/postfix/master.cf in the “Interfaces to non-Postfix software” section add:
Note: ข้อควรระวังก็คือ ให้ระวังว่า spamfilter จะซ้ำกับ filter ที่มีแล้วหรือไม่ ถ้ามีก็ต้องเปลี่ยนเป็นชื่ออื่น เช่น spamfilter_smtp

spamfilter unix - n n - - pipe
flags=Rq user=spamfilter argv=/usr/bin/postfixfilter -f ${sender} -- ${recipient}

9. Restart postfix and make sure you can still get email. Send a fake spam through the system (from an outside address) to verify that spam is marked as spam. For information on configuring SpamAssassin, go to http://www.spamassassin.org.

10. Install ‘procmail’ if it is not already installed. To discover this try ‘which procmail’.

11. For each user who needs a ‘spam’ mailbox, follow steps 12 – 13. You can safely stop right here if you do not want any users to have their spam filtered into another mailbox.

12. Create a file in their home directory, owned by them, called ‘.procmailrc’. Enter the following into it, making sure that the locations listed are what you wish to use for mailbox location (here we are using /home/$username/mail/ as the location for mail folders:

MAILDIR=$HOME/mail
DEFAULT=$HOME/mail/Inbox
LOGFILE=$HOME/mail/proc.log

# Catch SPAM
:0
* ^X-Spam-Flag: YES
* ^X-Spam-Level: ******
spam

Explanation of the above –

MAILDIR is the location of mailbox folders
DEFAULT is the default mailbox.
“* ^X-Spam-Flag: YES” makes sure the email is marked as spam before doing anything with it.
“* ^X-Spam-Level: ******” make sure the spam received a ‘spam score’ of at least 6 before doing anything with it. This ensures that ‘borderline’ cases that are more likely to be ‘false positives’ (meaning they have been falsely marked as spam) do not go into the spam mailbox.
‘spam’ is the name of the mailbox they are going into.

13. Create a file in their home directory, owned by them, called ‘.forward’. Enter the following into it, changing ‘username’ to their username. Include the quotes and the pound (“#”) symbol!

"|IFS=' ' && exec /usr/bin/procmail || exit 75 #username"

14. As with any change made to user’s mailboxes, test!

15. Keep SpamAssassin updated with the same procedure you used to install it in #2.

หลังจากนั้นก็ติดตั้ง SPF (Sender Policy Framework) โดยอ้างอิงจากที่นี่
Filtering spam with Postfix
(http://www.freesoftwaremagazine.com/free_issues/issue_02/focus_spam_postfix/)

1. แก้ไข master.cf และเพิ่มเข้าไปดังนี้

spfpolicy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/local/libexec/postfix/smtpd-policy.pl

2. ไฟล์ smtpd-policy.pl เอามาจากที่นี่ http://spf.pobox.com/postfix-policyd.txt

3. ลองสั่ง perl smtpd-policy.pl อาจจะได้รับข้อความ error ถ้ายังไม่ติดตั้ง SPF::Query
Note: วิธีการติดตั้ง SPF::Query
export LANG=en_US
perl -MCPAN -e 'install Mail::SPF::Query'

4. เพิ่มคำสั่งต่อไปนี้ใน smtpd_recipient_restrictions
check_policy_service unix:private/spfpolicy

5. restart postfix แล้วก็ทดสอบ spoof email address ดูว่า SPF ทำงานหรือไม่

เท่านี้ก็เป็นอันเสร็จ 🙂

ทีนี้ผมลองมาใช้ Greylist จาก Greylisting.org ช่วยสะกัด spam mail อีกชั้นหนึ่ง (http://greylisting.org/implementations/postfix.shtml)
(http://www.postfix.org/SMTPD_POLICY_README.html#greylist)

วิธีติดตั้งก็ตามข้างล่าง

1. ก๊อปปี้ไฟล์ graylist.pl ซึ่งจะมีมาพร้อมกับ source code ของ postfix อยู่แล้ว ไปไว้ที่ /usr/libexec/postfix/
cp postfix-2.2.X/examples/smtpd-policy/greylist.pl /usr/libexec/postfix/

2. แก้ไขไฟล์ greylist.pl
$database_name="/etc/postfix/mta/greylist.db";
$greylist_delay=60;

3. สร้างไดเรกทอรี /etc/postfix/mta แล้ว chown ให้เป็นของ nobody
#mkdir /etc/postfix/mta
#chown nobody.nobody /etc/postfix/mta

4. ทดสอบดูว่า greylist.pl ทำงานได้รึเปล่า โดยใช้คำสั่ง
perl greylist.pl
Note: ถ้าไม่มี DB_File.pm ก็จะต้องทำการติดตั้งก่อน
perl -MCPAN -e 'install DB_File'

5. แก้ไขไฟล์ master.cf เพิ่มคำสั่งต่อไปนี้
greypolicy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl

6. แก้ไขไฟล์ main.cf เพิ่มคำสั่งต่อไปนี้ใน smtpd_recipient_restrictions
check_policy_service unix:private/greypolicy

7.restart postfix แล้วก็ทดสอบ ดูว่า greylist ทำงานหรือไม่

*ปัญหา greylist กับ gmail.com
หลังจากทดสอบ greylist ไปได้พักหนึ่งผมก็พบว่า gmail.com ใช้ rproxy.gmail.com ซึ่งมีทั้งหมดกว่า 16 IP Address และก็จะสุ่มเปลี่ยนไปเรื่อย ทำให้มีปัญหากับ greylist ที่คอยตรวจสอบ IP Address ในฐานข้อมูลผู้ส่ง ดังนั้นก็เลยต้องให้สิทธิพิเศษ gmail สักหน่อย โดยการเพิ่มคำสั่ง check_sender_access เอาไว้ก่อน greypolicy แต่ให้อยู่หลัง spfpolicy เพื่อให้ผ่าน spfpolicy ก่อน

check_policy_service unix:private/spfpolicy,
check_sender_access hash:/etc/postfix/maps/access_sender,
check_policy_service unix:private/greypolicy

ทีนี้ในไฟล์ access_sender ก็ใส่บรรทัดนี้ลงไป
gmail.com OK

เท่านี้ก็เรียบร้อย