Thursday, July 01, 2004

Creating Incremental SPAM solution with Linux

สงสัยต้องจดไว้ซะแล้วกันลืม หลังจากทำมาตั้งหลายเดือนแล้ว

เรื่องมันเริ่มจากหลายเดือนก่อน ผมเซ็งมากกับ SPAM Mail ที่มาถึงวันละร่วมๆ 25-30 เมล์ ผมก็เลยตัดสินใจจัดการกับปัญหานี้แบบถาวรซะที

เริ่มจาก Spamassassin ก่อน จริงๆแล้วเครื่องเซอร์เวอร์เมล์ที่ผมใช้ มี Spamassassin ติดตั้งอยู่แล้วและทำงานอยู่ตลอดเวลา ผมก็หาก่อนว่าเพราะเหตุใดมันถึงทำงานได้ไม่ถูกต้องขนาดนั้น สมมุติฐานแรกก็คือ Spamassassin ทำงานโดยใช้ phrase-base คือทำตามข้อความที่อยู่ในแต่ละเมล์ ว่าเป็น SPAM หรือไม่ ผมก็เข้าใจว่ามันคงต้องมีเหมือนกับว่า Update Data file เหมือนกับพวกโปรแกรมตรวจไวรัสแน่เลย ผมก็จัดการไปหา Spamassassin เวอร์ชันใหม่มาลงก่อน ปรากฎว่าก็ช่วยได้บ้างครับ ลดลงไปหลายวัน แถมลง Spamassassin-milter มาลงด้วยจะได้ทำงานเร็วๆ แต่ผ่านไปหลายวันผลก็เริ่มเหมือนเดิมครับ SPAM เยอะมาก จนมันกลับมาวันละ 30 เมล์ใหม่ผมก็ทนไม่ไหวอีก ลองไปดูซิว่ามี Update spam rules จาก spamassassin ไหม ก็ปรากฎว่าไม่มี ผมเลยตัดสินใจว่าคงต้องใช้วิธีการแบบอื่นมาแก้ไขปัญหาซะแล้ว ตอนแรกก็ลองนั่งแก้ Rules ทุกวันใน /etc/mail/spamassassin/local.cf ดู ปรากฎว่าไม่ไหวครับ SPAM Mail นี่มันพัฒนากันเป็นรายวันเลย คำแปลกๆใหม่ๆ เทคนิคพิสดารต่างๆ มาเพียบ จะเขียน Rules ให้กว้างไปก็ไม่ได้มันจับเมล์ทุกเมล์เป็น SPAM ไปซะหมด ก็เลยคิดว่าต้องหาวิธีอื่นที่เป็นวิธีใหม่เลยมาแก้ดีกว่า

วิธีการแรกที่ผมนึกได้ก็คือ Baysian จำได้ว่ามีซอฟต์แวร์ตัวนึงชื่อว่า SpamBayes ซึ่งใช้วิธีการแบบ Baysian มาช่วยวิเคราะห์หา Spam Mail แบบอัตโนมัติ แต่ก่อนที่ผมจะเข้า google หา SpamBayes ว่าเวปมันอยู่ที่ไหนนั่นเอง ผมก็เห็นว่า SpamAssassin เวอร์ชันที่ผมเอามานั้น มันสนับสนุน Baysian Algorithm อยู่ในตัวอยู่แล้ว ผมเลยลองเซ็ต Baysian สำหรรับ Spamassassin ดู

วิธีการเซ็ตก็ไม่ยากครับ ต้องมีชุดของอีเมล์ที่คิดว่าเป็น SPAM และ HAM (ไม่ใช่ SPAM) มาส่งให้คำสั่ง sa-learn ของ spamassassin เวอร์ชันใหม่นี้ เผื่อให้มันเรียนรู้ว่าเมล์ไหนเป็นเมล์ดี เมล์ไหนไม่ใช่ อันนี้ไม่ยากเลยเพราะมีเมล์ SPAM เก็บเป็นกะตั้กเลย บวกกะของเพื่อนผมอีกเป็นร้อย ทีนี้มีปัญหานิดคือโดยปกติแล้วมันจะ Learn แล้วเก็บผลลัพธ์เป็น Database ไว้ใน home directory ของ User คนนั้น นัยว่าของใครของมัน ผมอยากให้มันกลายเป็นของระบบทุกคนใช้ได้เลย ก็เลยต้องไปแก้ /etc/mail/spamassassin/local.cf นิด โดยบอกว่าให้เก็บไฟล์ไว้ตรงไหน แบบนี้


use_bayes 1
bayes_path /var/spool/spamassassin/bayes


ถ้าจำไม่ผิด use_bayes นี่ไม่ต้องก็ได้ เพราะจะ Enable by default อยู่แล้ว เพียงแต่ต้อง Learn ไปขนาดนึงมันถึงจะถือว่าฉลาดพอและยอมให้ใช้งาน ส่วนกลไกการทำงานของ Baysian ก็ง่ายๆครับ ตัว Spamassassin จะไปอ่าน Database file ที่สร้างขึ้นจากการ Learn แล้วดูด้วยวิธีการของ Baysian ว่านี่เป็น SPAM หรือไม่ โดยผลลัพธ์จะเป็นความน่าจะเป็น คือจะออกมาเป็น Rules อันนึงของ Spamassassin เช่น BAYES_99 BAYES_80 BAYES_50 เป็นต้น พวกนี้เป็นชื่อ Rules ที่สามารถใช้ระบุได้ใน local.cf เหมือนกับ Rules อื่นๆ (เช่น GENERIC_VIAGRA, PENIS ต่างๆพวกนั้นน่ะครับ) ซึ่งกลไกตรงนี้ทำให้เราสามารถปรับ Score ที่ได้จาก Baysian Rules ได้ด้วย ว่าแล้วผมก็จัดการให้มันเรียนรู้จากเมล์ต่างๆที่ผมมีก่อน แล้วก็ดูผลซักสองสามวัน ดูซิว่าเป็นไงบ้าง

ปรากฎว่าเวิร์คมากครับ จาก 30 เมล์ต่อวันลดเหลือ 1-2 เมล์เท่านั้น ซึ่งผมยังใช้อยู่จนถึงปัจจุบันนี้โดยไม่ได้เปลี่ยนเวอร์ชัน spamassassin อีกเลย โดยปัจจุบัน SPAM Mail ที่ได้เฉลี่ยอยู่ราวๆวันละ 0-2 เมล์เท่านั้น โดยอาศัยการทำงนร่วมกันระหว่างการสแกนแบบ Rules base บวกกับ Baysian นี่แหละครับ ว่าแล้วผมก็เขียน procmail filter ให้ลบเมล์ที่ Baysian เห็นว่าน่าจะเป็น SPAM (ติด Rules BAYES_99) และมี score มากกว่า 5.0 (เช็คจาก X-Spam-level) ลง /dev/null ให้หมดๆไป ส่วนที่เหลือ ถึง Spamassassin จะจัดว่าเป็น Spam (score มากกว่า 5.0 อาจเป็นได้ถ้าเกิดมีคำล่อแหลมติดมาเยอะ) ผมก็จะเก็บไว้ก่อน เอาไว้ให้ Baysian learn ในภายหลัง

ทีนี้มีแถมท้ายอีกหน่อย คือผมเซ็ต Samba ให้แชร์ไดเรคทอรี่อันหนึ่งให้ใครๆก็เขียนได้ สำหรับให้ทุกๆคนเอา E-mail ที่คิดว่าเป็น SPAM มา drop ไว้ แล้วตั้ง Crontab ไว้ให้เรียก sa-learn ทุกวันแล้วลบเมล์ทิ้งออกจาก Repository ตรงนี้ซะ ก็จัดว่าสะดวกมากทีเดียว เหมือนกับระบบสแกนไวรัสแบบอัพเดทตัวเองได้ยังไงยังงั้น (จริงๆเหมือนว่า spamassassin จะ auto-learn mail ที่คิดว่าเป็น SPAM ให้อยู่แล้วด้วย แต่เพื่อความชัวร์ สอนมันวันละครั้งสองครั้งก็ไม่เสียหลาย) ถ้าจะปรับเอาไปใช้ในองค์กรก็อาจจะทำเป็นเวปฟอร์มสำหรับ Report SPAM เหมือนที่พวกเวปเมล์ส่วนใหญ่มีก็ได้

No comments: