Tuesday, July 27, 2004

Blocking all spam screened by spamassassin

อันนี้คือ Rules ของ Procmail สำหรับโยน SPAM ที่ Spamassassin จับได้ลงถังหมด
 
:0
* ^X-Spam-Level:.*\*\*\*\*\*.*
* B ?? BAYES_99
/dev/null

มีพิเศษนิดนึงคือถ้าเมล์ไม่ใช่ BAYES_99 ก็จะไม่โยนลงถังด้วย จะได้เอามาให้ Baysian learn ต่อได้ 


Friday, July 09, 2004

DVD Burning in Linux

วันก่อนได้ DVD Writer มา ว่าจะเอามาแบ็กอัพข้อมูลสำคัญจากเซอร์เวอร์ซะหน่อย ปรากฎว่า dvdrecord ที่ลงมากับ RedHat 9 ใช้ไม่ได้ครับ Invalid Argument ขึ้นแหลกเลย ก็เลยต้องไปนั่งหาว่าทำไงถึงจะเขียนได้

DVD Writer ที่ผมใช้เป็นรุ่น LG GSA-4081B ครับ ราคาไม่แพงในช่วงนั้น และยี่ห้อ LG ก็น่นาจะไว้ใจได้ (ผมใช้ LG CD Writer มาสามปีแล้วยังแทบไม่เคยเขียนพังเลย) พอได้ตัวนี้มาก็ลองเขียนด้วย Windows ดูก็โอเคครับ ถ้าใช้ Nero ก็พังทุกครั้งเลย เลยต้องใช้ B's Recorder ที่แถมมากับตัวไดรว์ก็ใช้ได้ดีครับ เขียนได้ทั้ง DVD และ CD

ปรากฎว่าพอจะใช้งานมันจริงๆ จำเป็นจะต้องก๊อปข้อมูลจาก Linux ผมก็เลยต่อเจ้า HDD ที่เก็บ Linux ไว้แล้วกะว่าจะใช้ dvdrecord เขียนซะ ก็จัดการสร้าง iso ด้วยคำสั่ง mkisofs เหมืิอนกับเวลาเขียน CD ธรรมดาๆ ปรากฎว่าพอจะ write จริงพอใช้ dvdrecord ก็ปรากฎว่ามัน invalid argument ตลอดเลย ตอนแรกก็คิดว่า dvdrecord อาจจะไม่มีไดรเวอร์หรือเปล่า คล้ายๆกับ cdrecord เลยลองเอาเวอร์ชันใหม่มาลงดูก็ยังไม่หาย สุดท้ายไปหา cdrecord-dvdhack มาลอง โอ๊ะ มี rpm ของ mandrake ด้วยแต่ผมใช้ rh9 ปรากฎว่าลงได้ซะด้วย พอลอง write ดูก็มีบอก error นิดหน่อย แต่สุดท้ายก็ write สำเร็จแต่ต้อง write แบบ Disk-At-Once โดยสั่ง

cdrecord-dvdhack -eject -dao speed=2 -vv dev=0,0,0 backup.iso


แต่ที่แปลกมากๆเลยคือมันใช้เขียน CD ไม่ได้แฮะ cdrecord อ่านขนาดของแผ่นเปล่าที่ใส่ไปผิดตลอดเลย เฮ้อ

Friday, July 02, 2004

Execute command and pass its output to RPM spec's variable

กันลืมอีกแล้วครับ ทำแล้วก็ลืมทุกที

เวลาต้องการ %define ตัวแปรให้มีค่าเท่ากับผลของการ Execute คำสั่งข้างนอก ใน SPECS ไฟล์ของ RPM ต้องใส่ยังงี้


%define pysite_dir %(echo %{_libdir}/@rpm_pysite_dir@ | sed "s/lib64/lib/g")


ตัวอย่างข้างบนจะแก้ /usr/lib เป็น /usr/lib64 แล้วใส่ในตัวแปร pysite_dir

Zope dtml-return

ต้องจัดไว้กันลืมซะแล้ว เคยทำแล้วลืมไปอีกแล้ว

ถ้าอยากสร้าง Folder ให้โผล่ใน Navigation bar ข้างซ้ายของ Plone แล้วกดปุ้ป Redirect ไปเวปอื่นเลย ทำได้สองวิธี

1. add DTML-Document แล้วใช้ dtml-return tag อย่างนี้

< dtml-return news >


แต่แบบนี้ใช้ได้แต่กับเวปข้างในเท่านั้น

2. add Script(python) แล้วเขียนให้มัน

RESPONSE.redirect('http://abc.def.com')


3. add DTML-Document แล้วใช้ dtml-call

<dtml-call expr="RESPONSE.redirect('http://tgcc.cpe.ku.ac.th/thaigrid-mon')">

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 เหมือนที่พวกเวปเมล์ส่วนใหญ่มีก็ได้