ThaiCERT: Thai Computer Emergency Response Team
ศูนย์ประสานงานการรักษาความปลอดภัยคอมพิวเตอร์ ประเทศไทย 
 
 
 



ชื่อเรื่อง : การตรวจสอบล็อกไฟล์โดยใช้ Swatch
เรียบเรียงโดย : ภูวดล ด่านระหาญ
เรียบเรียงเมื่อ : 6 พฤศจิกายน 2544

กล่าวนำ
ล็อกไฟล์เป็นข้อมูลที่มีประโยชน์ต่อผู้ดูแลระบบในการติดตามการทำงานของระบบ แต่ผู้ดูแลระบบมักจะไม่ให้ความใส่ใจกับมันเท่าใดนัก บางคนอาจจะเข้าไปตรวจสอบก็ต่อเมื่อมีสิ่งผิดปกติขึ้นในระบบเท่านั้น สาเหตุหนึ่งที่ทำให้เกิดความเกียจคร้านก็เนื่องมาจากจำนวนของข้อมูลล็อกที่มีค่อนข้างมาก ในบทความฉบับนี้จะแนะนำเครื่องมือที่ชื่อ Swatch ซึ่งพัฒนาโดย Todd Atkins ด้วยภาษา Perl เป็นโปรแกรมที่ถูกออกแบบมาเพื่อให้ค้นหาสิ่งผิดปกติที่เกิดขึ้นในล็อก และแจ้งเตือนผู้ดูแลระบบผ่านทาง action ที่สามารถกำหนดได้ค่อนข้างยืดหยุ่น เช่น ส่งอี-เมล์ ส่งเสียง beep หรือรันโปรแกรมที่เขียนเตรียมไว้แล้ว มันสามารถทำงานใน real time mode และทั้ง batch mode (ใช้ในกรณีที่ต้องการค้นหาสิ่งที่ต้องการในไฟล์ล็อกเก่าๆ ที่ไม่มีการเพิ่มของข้อมูลแล้ว เช่น ไฟล์ล็อกที่ถูก rotate ไปแล้ว) ได้ โดยทั่วไปแล้วนิยมใช้งานในโหมด real time มากกว่า

ในการสร้าง Swatch ขึ้นมานั้น มีหลักที่สำคัญคือ

  1. ผู้ดูแลระบบสามารถเรียนรู้เพื่อใช้งานโดยไม่ใช้เวลามากมายนัก
  2. มี action ง่ายๆ ที่สามารถใช้งานได้
  3. อนุญาตให้ผู้ใช้สร้าง action ของตัวเองขึ้นมาใช้งานได้ รวมทั้งสามารถส่งผลลัพธ์ที่ได้ไปยังโปรแกรมที่เขียนขึ้นมารองรับได้
  4. ขณะที่ Swatch กำลังทำงาน สามารถปรับเปลี่ยน configuration ได้โดยไม่จำเป็นต้อง stop และ start โปรแกรมใหม่

การติดตั้ง Swatch
เนื่องจาก Swatch เป็นโปรแกรมที่เขียนขึ้นโดยใช้ perl ดังนั้นระบบที่จะนำไปใช้ต้องติดตั้ง Perl ก่อน จากนั้นก็จำเป็นต้องติดตั้งโมดูลของ Perl ที่จำเป็นสำหรับ Swatch คือ Date-Calc, Time-HiRes, File-Tail, TimeDate โดยสามารถดาวน์โหลดได้จาก http://www.perl.com/CPAN-local/modules/01modules.index.html ส่วน Swatch นั้น ดาวน์โหลดได้จาก ftp://ftp.stanford.edu/general/security-tools/swatch/

ให้ unzip และ tar โมดูลของ Perl ดังตัวอย่างด้านล่างนี้

tar xzvf Date-Calc-5.0.tar.gz

จากนั้นให้ cd เข้าไปยังไดเรกทอรีที่เกิดขึ้นมาใหม่จากการขยายโมดูลของ Perl ดังกล่าวและรันคำสั่งดังตัวอย่าง

cd Date-Calc-5.0
perl Makefile.PL

จากนั้นให้ make , test และติดตั้ง

make
make test
make install

ทำลักษณะเดียวกันนี้กับโมดูล Perl ที่เหลืออยู่ และต่อจากนี้ไปก็เป็นการติดตั้ง Swatch

tar xzvf swatch-3.0.3.tar.gz
cd swatch-3.0.3
perl Makefile.PL
make
make test
make install

และในกรณีที่การติดตั้งไม่มีข้อผิดพลาดใดๆ เราก็พร้อมที่จะสร้างไฟล์ configuration สำหรับ Swatch แล้ว

*** การติดตั้งทั้งหมดที่กล่าวถึงในบทความนี้ ได้ทดสอบบน Red Hat Linux 7.1 (kernel 2.4.3-12 และ 2.4.12)

การสร้างไฟล์ configuration
จากการกล่าวนำด้านบนก็พอทราบแล้วว่า Swatch สามารถรันได้ใน real time mode และ batch mode ซึ่งการทำงานของ Swatch จะเกี่ยวข้องกับ syslog ค่อนข้างมาก ดังนั้นจึงจำเป็นที่ต้องมีความรู้พื้นฐานเกี่ยวกับ syslog ค่อนข้างดีพอสมควร เพราะอาจจะต้องมีการเปลี่ยนแปลง configuration ของ syslog โดยการแก้ไข /etc/syslog.conf เพื่อให้เหมาะสมกับระบบที่มีอยู่และข้อมูลที่ต้องการ

ทั้งนี้มีแนวคิดในการเริ่มทำอย่างง่ายๆ คือ

  1. ถามตัวเองว่าต้องการรู้อะไร เช่น ต้องการรู้ว่าใครที่เข้ามาใช้งาน su บ้าง
  2. ตรวจสอบจาก /etc/syslog.conf ว่า ข้อมูลที่ต้องการถูกเก็บไว้ในไฟล์ใด (อาศัยความรู้เรื่อง syslog)
  3. พิจารณาว่าควรจะใช้อะไรเป็น trigger สำหรับข้อมูลล็อกนั้นๆ

ตัวอย่างที่ 1
ต้องการอยากตรวจสอบว่ามีใครลักลอบเข้ามาใช้ mail server ของเราในการส่ง spam mail ออกไปหาผู้อื่นโดยไม่ได้รับอนุญาตหรือไม่ ซึ่งขั้นตอนในการตรวจสอบ syslog ว่าข้อมูลของ mail ถูกเก็บไว้ในไฟล์ใดนั้น จำเป็นต้องใช้ความรู้พื้นฐานเกี่ยวกับ syslog ดังที่กล่าวไปแล้ว ดังนั้นหากท่านยังไม่เข้าใจการทำงานของ syslog ก็ให้ไปทำความเข้าใจก่อน ไม่เช่นนั้นก็อาจจะเกิดการเข้าใจผิดได้ ทำให้ระบบที่ติดตั้งไว้ทำงานไม่สมบูรณ์

สมมุติว่าเราได้ตั้ง configuration ของ syslog ให้ข้อมูลล็อกของ mail ทั้งหมดเก็บไว้ใน /var/log/mail ขั้นตอนต่อไปคือการตั้ง trigger ซึ่งในกรณีที่มีการพยายามใช้ mail server ในการเป็น relay สำหรับส่ง spam mail นั้น โดยปกติล็อกที่เกิดขึ้นมีรูปแบบดังนี้

Oct 3 14:48:51 homer sendmail[6704]: OAA06704: ruleset=check_rcpt,arg1=bsmith@domain.com, relay=foo@moo.com [206.54.252.1],reject=550 root@domain.com... Relaying denied

ซึ่งในกรณีนี้เราสามารถใช้คำว่า Relaying denied มาเป็น trigger สำหรับเหตุการณ์นี้ได้ และสามารถเขียน configuration ของเหตุการณ์นี้ได้ดังนี้

watchfor = /Relaying denied/
echo=normal
mail=admin@somewhere.com,subject=------SWATCH : Sendmail Alert ------
throttle 10:00

จากนั้นให้บันทึกข้อมูล configuration ดังกล่าวลงในไฟล์ ในที่นี้ตั้งชื่อเป็น swatchrc_sendmail จากนั้นก็ให้รัน Swatch ดังนี้

swatch -c ./swatchrc_sendmail -t /var/log/mail

โดยออปชัน -c เป็นตัวบอก Swatch ว่าให้ไปอ่านไฟล์ configuration จาก swatchrc_sendmail ส่วน -t เป็นตัวบอกให้ Swatch ทำงานใน real time mode โดยให้ไปจับตาดูการเปลี่ยนแปลงของ /var/log/mail

ดังนั้นเมื่อมีเหตุการณ์เกิดขึ้นตามที่ระบุไว้ใน watchfor คือมีผู้พยายามส่งเมล์ออกไปโดยใช้ mail server ของเราเป็นตัวส่งโดยไม่ได้รับอนุญาต แล้วตัว Swatch จะทำงานตาม action ที่กำหนดไว้ดังนี้

ตัวอย่างที่ 2
ต้องการตรวจสอบว่ามีใครที่ใส่รหัสผ่านไม่ถูกต้อง ทำให้เกิด authentication failure ซึ่งในกรณีนี้เราต้องทราบว่า facility ใดของ syslog ที่ควบคุมข้อมูลชุดนี้ ซึ่งโดยปกติแล้วข้อมูลที่สำคัญมักจะถูกเก็บไว้ใน /var/log/messages (ต้องตรวจสอบจาก /etc/syslog.conf ของระบบที่มีอยู่ด้วยตัวเอง) ข้อมูลล็อกที่เกิดขึ้นเมื่อมีการทำ authentication failure จะมรูปแบบดังนี้

Nov 6 16:41:06 organ su(pam_unix)[1074]: authentication failure; logname=unt uid=500 euid=0 tty= ruser= rhost= user=root

ดังนั้นเราสามารถใช้คำว่า authentication failure มาใช้เป็น trigger ได้ และสามารถเขียน configuration ของเหตุการณ์นี้ได้ดังนี้

watchfor=/authentication failure/
echo=bold
bell=3
exec = "/root/pager/call_pager.pl authernticatyion_failure";
mail=admin@somewhere.com

เช่นเดียวกันกับตัวอย่างแรก ให้บันทึก configuration ด้านบนลงในไฟล์ ในที่นี้ใช้ชื่อ swatchrc_messages และจากนั้นให้รันคำสั่งดังนี้

swatch -c ./swatchrc_messages -t /var/log/messages

เมื่อมีเหตุการณ์ที่สอดคล้องกับที่ระบุไว้ใน watchfor ตัว Swatch ก็จะแสดงผลออกทาง terminal ด้วยตัวหนา (bold) พร้อมทั้งส่งเสียงร้อง 3 ครั้ง พร้อมทั้งรันโปรแกรมส่งข้อความไปยังเพจเจอร์ที่เขียนไว้ก่อนหน้านี้ และส่งเมล์ไปยัง admin@somewhere.com

ตัวอย่างที่ 3
ตัวอย่างนี้จะแสดงวิธีการทำงานใน batch mode เช่น เราต้องการค้นหาว่ามี ip 192.168.1.1 ติดต่อเข้ามายังระบบของเราในช่วงใดบ้าง ถ้าพบก็ให้แสดงผลออกมาทาง terminal

watchfor = /192.168.1.1/
echo

บันทึก configuration ด้านบนในชื่อ swatchtemp จากนั้นก็รันคำสั่งด้านล่างนี้

swatch -c ./swatchtemp -f /var/log/messages.1

โดยออปชัน -f เป็นตัวบอกว่าให้ไปตรวจสอบไฟล์ที่กำหนดคือ messages.1

นอกจากนี้ยังมีคำอื่นๆ ที่สามารถใช้เป็น trigger ได้โดยทั่วไป เช่น file system full, useradd, FAILED LOGIN ทั้งนี้ผู้ที่เขียน configuration สามารถใช้รูปแบบของ pattern matching ของ Perl ในการเขียน trigger ได้ เช่น watchfor = /192.168.1.*/ หมายถึง อะไรก็ตามที่มี IP address ในวงของ 192.168.1.0/24 ปรากฏอยู่ด้วย


คำอธิบาย Action อื่นๆ


การนำไปใช้งาน
ในขั้นตอนการนำไปใช้งานจริงนั้น ขึ้นอยู่กับ syslog ที่ตั้งไว้ และความต้องการของผู้ดูแลระบบเองว่าต้องการตรวจสอบล็อกในไฟล์ใดบ้าง โดยทั่วไปแล้วมักจะสร้างไฟล์ configuration ของ Swatch ไว้ในชื่อไฟล์ swatchrc สำหรับตรวจสอบล็อกไฟล์ /var/log/messages ซึ่งเป็นจุดรวมล็อกที่เกิดขึ้นของ Red Hat Linux ทั้งนี้ท่านสามารถสร้างไฟล์ configuration แยกกันได้ และสามารถสั่งให้ Swatch ตรวจสอบล็อกไฟล์เหล่านั้นพร้อมๆ กันได้ จากนั้นเมื่อสร้าง configuration ไฟล์ได้ตามที่ต้องการแล้ว ก็จะนำคำสั่งสำหรับรัน Swatch ไปบันทึกไว้ใน /etc/rc.local เพื่อให้ Swatch รันทุกครั้งที่มีการรีบูตเครื่องใหม่ เช่น

echo "Starting swatch monitoring:"
/usr/bin/swatch -c /root/swatch/swatchrc_messages -t /var/log/messages &
/usr/bin/swatch -c /root/swatch/swatchrc_sendmail -t /var/log/mail &

มีข้อพิจารณาที่สำคัญมากอีกจุดหนึ่งคือ ในระบบ Linux ทั่วไปนั้นมักจะติดตั้ง logrotate มาพร้อมกับ syslog เสมอ และโดย default แล้ว logrotate จะทำการ rotate log ทุกๆ 1 สัปดาห์ (แก้ไขได้ที่ /etc/logrotate.conf) ปัญหาที่จะเกิดขึ้นคือ เมื่อใดก็ตามที่ถึงเวลาในการ rotate log ตัว logrotate จะสร้างไฟล์ใหม่สำหรับเก็บล็อกขึ้นมา ซึ่งทำให้ Swatch ที่กำลังทำงานอยู่ไม่สามารถทำงานได้ตามปกติ จำเป็นต้องมีการส่งสัญญาณ -HUP ไปยัง Swatch เพื่อเริ่มรันใหม่อีกครั้ง(restart process) ดังนั้นจึงต้องสร้างไฟล์สำหรับทำหน้าที่ดังกล่าว ในที่นี้ขอเรียกชื่อว่า reswatch ซึ่งเป็น shell script ดังนี้

ไฟล์ /usr/sbin/reswatch_messages.sh
#!/bin/sh
pid=`ps -aefw | grep "/usr/bin/swatch -c /root/swatch/swatchrc_messages" | grep -v grep | awk '{print $2}'`
echo "Sending HUP signal to PID $pid."
kill -HUP $pid

ไฟล์ /usr/sbin/reswatch_sendmail.sh
#!/bin/sh
pid=`ps -aefw | grep "/usr/bin/swatch -c /root/swatch/swatchrc_sendmail" | grep -v grep | awk '{print $2}'`
echo "Sending HUP signal to PID $pid."
kill -HUP $pid

ซึ่งไฟล์จะถูกรันเมื่อ logrotate ทำการ rotate log ไฟล์ทั้งสองไฟล์คือ /var/log/messages และ /var/log/mail ดังนั้นให้แก้ไขไฟล์ /etc/logrotate.d/syslog ดังนี้

/var/log/messages {
postrotate
          /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
          /usr/sbin/reswatch_messages.sh
endscript
}

/var/log/mail {
postrotate
          /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
          /usr/sbin/reswatch_sendmail.sh
endscript
}

ซึ่ง logrotate จะรันคำสั่งดังกล่าว ภายหลังการ rotate ล็อกทั้งสองเรียบร้อยแล้ว หากท่านยังสงสัยคำสั่งหรือการทำงานของ logrotate ท่านสามารถใช้คำสั่ง man logrotate เพื่อดูการทำงานของมันทั้งหมดหรืออ่านได้จาก http://nodevice.com/sections/ManIndex/man0735.html

สรุป
ผู้ดูแลระบบสามารถเพิ่มเติม configuration ไฟล์ได้ตามต้องการ โดยตัวอย่างด้านบนนั้นเป็นเพียงการแสดงให้เห็นเพื่อความเข้าใจเท่านั้น เมื่อจะต้องนำไปใช้งานจริงแล้วจำเป็นต้องได้รับการปรับปรุงหรือเพิ่มเติมเพื่อให้เหมาะกับแต่ละระบบต่อไป

เอกสารอ้างอิง



Home || เอกสารเผยแพร่ || Unix & Linux

ThaiCERT Disclaimer | Copyright © 2001 ThaiCERT(NECTEC). All rights reserved.