T.Phairintrapa's Blog

Share Knowledge

Wednesday, May 6, 2009

ทำความรู้จักกับ syslogd

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

เอกสารฉบับนี้จะแนะนำ syslogd ซึ่งเป็น daemon ที่สำคัญที่สุด และแนะนำวิธีการนำไปใช้งานโดยเฉพาะใน Red Hat Linux แต่ทั้งนี้ผู้ดูแลระบบยูนิกซ์ตระกูลอื่นๆ ก็สามารถศึกษาและนำไปประยุกต์ใช้งานได้ เพราะในยูนิกซ์อื่นๆ นั้นจะมีความแตกต่างกันในรายละเอียดเล็กน้อยเท่านั้น

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

ข้อมูลล็อกที่ควบคุมโดย syslogd นั้น จะถูกกำหนดให้มีค่า facility และ priority โดยส่วนของ facility นั้น เป็นข้อมูลที่อธิบายถึงแหล่งกำเนิดของข้อมูลล็อกนั้นๆ เช่น ข้อมูลล็อกที่ส่งมาจากระบบเมล์ก็จะมี facility เป็น mail ส่วน priority นั้น จะแสดงถึงระดับความสำคัญของเหตุการณ์ที่เกิดสำหรับแต่ละ facility ทั้งนี้ข้อมูลล็อกทุกอันจำเป็นต้องมี facility และ priority เสมอ

ตารางแสดง facility
Facility คำอธิบาย
auth เกี่ยวข้องกับการทำ authentication
authpriv การทำ private authentication เท่านั้น
cron cron daemon
daemon system daemons
kern ส่วนของ kernel
lpr line printer spooling system
mail sendmail และซอฟแวร์อื่นที่เกี่ยวกับเมล์
mark ให้บันทึกเวลาขณะเกิดเหตุการณ์ด้วย
news usenet news system
security เหมือนกับ auth
syslog ข้อมูลล็อกภายในของ syslogd
user ส่วนของโปรเซสของ user
uucp สำรองไว้สำหรับ UUCP
local0 - local7 local messages

ตารางแสดง priority

Priority คำอธิบาย
emerg ภาวะฉุกเฉิน
alert แจ้งเตือนเร่งด่วน
crit ล่อแหลม
err มีข้อผิดพลาด
warning คำเตือน
notice ข้อสังเกตุ
info ข้อมูลทั่วไป
debug สำหรับใช้ดีบักเท่านั้น


/etc/syslog.conf
การทำงานของ syslogd นั้น จะขึ้นอยู่กับไฟล์ /etc/syslog.conf เป็นหลัก การแก้ไขใดๆ ที่เกิดขึ้นกับไฟล์นี้นั้น จะยังไม่มีผลต่อการทำงานของ syslogd ในทันที จะต้องทำการ restart syslogd service ใหม่เสียก่อน รูปแบบคำสั่งในไฟล์ /etc/syslog.conf นั้นมีรูปแบบดังนี้

facility.level action
facility1, facility2.level action
facility1.level1; facility2.level2 action
*.level action
*.level;badfacility.none action

หมายความว่า เมื่อมีข้อมูลล็อกที่มี facility และ level ที่ตรงหรือมากกว่ากับที่ตั้งไว้ ก็จะกระทำ action ตามที่กำหนดไว้ ทั้งนี้เพราะ level ที่ตั้งไว้นั้น เป็นค่า minimum ซึ่งหมายความว่าถ้าเราตั้ง level เป็น debug ก็จะคลอบคุลมทุก level ของ facility นั้นๆ เลย ทั้งนี้เราสามารถใช้เครื่องหมาย * แทนทุกๆ ค่าใน facility หรือ priority level นั้นๆ ได้ เช่น mail.* /var/log/mail หมายความว่าให้ syslogd เก็บข้อมูลล็อกของ mail ทุก level ไปไว้ยังไฟล์ /var/log/mail

ในขณะที่ level ที่เป็น none นั้น หมายความว่าไม่ให้สนใจ facility ที่ประกาศค่า level เป็น none เช่น

*.emerg;mail.none /var/log/emer.log

คือให้เก็บข้อมูลล็อกที่มี level เป็น emerg สำหรับทุก facility ยกเว้น mail facility

สำหรับ action นั้นสามารถเลือกได้ดังนี้คือ

  • filename : เก็บข้อมูลล็อกนั้นลงในไฟล์ที่กำหนด
  • @hostname : ส่งต่อข้อมูลล็อกไปยัง syslogd บน host ที่กำหนด
  • @ipaddress : ส่งต่อข้อมูลล็อกไปยัง host ที่มี ip address ตามที่กำหนด
  • user1, user2 : ส่งข้อมูลล็อกไปยังหน้าจอของ user ที่กำหนด ถ้า user เหล่านั้นยังล็อกอินอยู่ในระบบ
  • * : ส่งข้อมูลล็อกไปยังทุกๆ user ที่ยังล็อกอินอยู่ในระบบ
  • /dev/console เพื่อส่งข้อมูลล็อกไปยัง console device หรือ device อื่นๆ ตามที่ต้องการ

สำหรับ Red Hat นั้นได้ขยายความสามารถของ syslogd เพิ่มเติม โดยอนุญาตให้ข้อมูลล็อกสามารถถูกส่งแบบ pipe ไปยังไฟล์ได้ โดยแก้ไขใน syslog.conf และยังสามารถใช้เครื่องหมาย = และ ! ใน syslog.conf ได้

  • โดยเครื่องหมาย = หมายถึง priority ที่กำหนดเท่านั้น
  • เครื่องหมาย ! หมายถึง priority อื่นที่ไม่ใช่ priority นี้และสูงกว่า

ตัวอย่าง เช่น

mail.info ความหมายคือ ข้อมูลล็อกที่เกี่ยวข้องกับเมล์และมี priority เป็น info และสูงกว่า
mail.=info ความหมายคือ ข้อมูลล็อกที่เกี่ยวข้องกับเมล์และมี priority เป็น info เท่านั้น
mail.info;mail.!err ความหมายคือ ข้อมูลล็อกที่เกี่ยวข้องกับเมล์และมี priority เป็น info , notice และ warning
mail.debug;mail.!=warning ความหมายคือ ข้อมูลล็อกที่เกี่ยวข้องกับเมล์และมี priority ทุกระดับที่ไม่ใช่ warning

และ Red Hat นั้น โดยปกติจะเก็บข้อมูลล็อกไว้ในไฟล์ซึ่ง อยู่ภายใต้โฟลเดอร์ /var/log และถูกติดตั้งมาพร้อมกับ logrotate ซึ่งเป็นเครื่องมือที่ช่วยจัดการล็อกไฟล์ได้อย่างมีประสิทธิภาพ ปกติแล้วจะ rotate ล็อกไฟล์อาทิตย์ละครั้ง และจะเก็บล็อกไว้ 4 รอบ หรือ 1 เดือน ผู้ดูแลระบบสามารถปรับเปลี่ยนค่าเหล่านี้ได้ที่ /etc/logrotate.conf

ตัวอย่างของไฟล์ configuration สำหรับ stand-alone machine

#ในกรณีฉุกเฉินให้แจ้งเตือน user ทุกคนที่ล็อกอินอยู่
*.emerg *
#เก็บข้อมูลล็อกที่สำคัญไว้ในไฟล์
*.warning;daemon,auth.info,user.none /var/log/messages
#printer errors
lpr.debug /var/log/lpd-errs

ตัวอย่างของไฟล์ configuration สำหรับ network client

#ในกรณีฉุกเฉินให้แจ้งเตือน user ทุกคนที่ล็อกอินอยู่
*.emerg;user.none *
#ส่งข้อมูลล็อกที่สำคัญไปยังเครื่องที่ทำหน้าที่เก็บล็อก
*.warning;lpr,local1.none @netloghost
daemon,auth.info @netloghost
#ส่งข้อมูลล็อกของ local ไปยังเครื่องที่ทำหน้าที่เก็บล็อก
local2.info;local0,local7.debug @netloghost
#printer errors
lpr.debug /var/log/lpd-errs
#ข้อมูลของ sudo ที่ local2 ให้เก็บไว้ในไฟล์
local2.info /var/log/sudo-logs
#ข้อมูลของ kernel ให้เก็บไว้ในไฟล์
kern.info /var/log/kern.log

ใน กรณีนี้ข้อมูลส่วนใหญ่จะถูกส่งไปยังเครื่องที่ทำหน้าที่เก็บล็อก ซึ่งหมายความว่าถ้าเครื่องนั้นไม่สามารถให้บริการได้ข้อมูลล็อกก็จะสูญไป ดังนั้นจึงควรเก็บข้อมูลล็อกบางส่วนไว้ที่เครื่องของตัวเองด้วย

ตัวอย่างของไฟล์ configuration สำหรับ central logging host

#ในกรณีฉุกเฉินให้ส่งข้อมูลไปยัง console และล็อกไฟล์โดยมีเวลากำหนดด้วย
*.emerg /dev/console
*.err;kern,mark.debug;auth.notice /dev/console
*.err;kern,mark.debug;user.none /var/log/console.log
auth.notice /var/log/console.log
#ส่งข้อมูลล็อกที่ไม่ใช่ข้อมูลฉุกเฉินไปยังไฟล์ธรรมดา
*.err;user.none;kern.debug /var/log/messages
daemon,auth.notice;mail.crit /var/log/messages
lpr.debug /var/log/lpd-errs
mail.debug /var/log/mail.log
#เก็บข้อมูลที่เกี่ยวข้องกับการทำ authorization เช่น sudo
local2.debug /var/log/sudo.log
local2.alert /var/log/sudo-errs.log
auth.info /var/log/auth.log
#และข้อมูลอื่นๆ
local7.debug /var/log/tcp.log
#ข้อมูลของ user
user.info /var/log/user.log

ข้อควรระวังคือ ในกรณีที่เวลาของแต่ละเครื่องไม่ตรงกันนั้นอาจจะก่อให้เกิดความยุ่งยากมากทีเดียว เพราะเวลาที่เขียนลงในล็อกไฟล์นั้นเป็นเวลาของเครื่องที่ทำหน้าที่บันทึกข็อมูลล็อก ไม่ได้ดึงมาจากเครื่องที่ส่งข้อมูลล็อกมาให้แต่อย่างใด ดังนั้นจึงควรทำ clock syncronize ในทุกๆ เครื่อง

รายชื่อซอฟต์แวร์ที่ใช้ syslog

Program Facility Levels Description
amd daemon err-info NFS automounter
date auth notice Set the time and date
ftpd daemon err-debug FTP daemon
gated daemon alert-info Routing daemon
halt/reboot auth crit Shutdown programs
inetd daemon err, warning Internet super-daemon
login/rlogind auth crit-info Login programs
lpd lpr er-info BSD line printer daemon
named daemon err-info Name server (DNS)
nnrpd news crit-notice INN news reader
ntpd daemon, user crit-info Network time daemon
passwd auth err Password-setting program
popper local0 notice, debug Mac/PC mail system
sendmail mail alert-debug Mail transport system
su auth crit, notice Switches UIDs
sudo local2 alert, notice Limited su program
syslogd syslog, mark err-info Internal errors, timestamps
tcpd local7 err-debug TCP wrapper for inetd
cron cron, daemon info System task-scheduling daemon
vmunix kern varies The kernel

สำหรับการดีบักหรือทดสอบการทำงานของ syslog ว่าทำงานหรือไม่นั้น สามารถทำได้โดยไม่ยากนัก เช่นเพิ่มบรรทัดด้านล่างนี้ใน syslog.conf

local5.warning /var/log/test.log

จากนั้นให้ restart syslogd ใหม่ แล้วจึงรันคำสั่ง #logger -p local5.warning "test" ซึ่งถ้าเป็นไปตามปกติแล้ว ในไฟล์ /var/log/test.log ก็จะมีคำว่า test ปรากฏอยู่ด้วย

สำหรับ Red Hat ที่ต้องการทำหน้าที่เป็นเครื่องที่ทำหน้าที่เก็บข้อมูลล็อกสำหรับเครื่องอื่นๆ ภายในเครือข่าย สามารถแก้ไขได้โดยเพิ่ม -r ใน startup options ของ syslog daemon โดยแก้ไขได้ที่ /etc/sysconfig/syslog หรือที่ /etc/rc.d/init.d/syslog

ข้อสังเกต
syslog นั้นเป็นมาตรฐานสำหรับการทำ logging ของยูนิกซ์และลินุกซ์ แต่ syslog กำลังจะถูกแทนที่โดย syslog-ng (syslog new generation) ซึ่งมีความยืดหยุ่นมากกว่า standard syslog และสามารถเก็บข้อมูลล็อกบนพื้นฐานของ regular expression ได้ ท่านสามารถหารายละเอียดเพิ่มเติมเกี่ยวกับ syslog-ng ได้ที่ http://www.balabit.hu/en/products/syslog-ng/ และ http://www.linuxgazette.com/issue43/scheidler.html

สำหรับการตรวจสอบล็อกไฟล์นั้น โดยปกติควรจะตรวจสอบอย่างน้อยวันละหนึ่งครั้ง แต่เนื่องจากล็อกไฟล์โดยส่วนใหญ่มักจะมีขนาดใหญ่ บางครั้งผู้ดูแลระบบเองอาจจะเผลอเรอหรือมองข้ามในบางจุดไป ซึ่งอาจจะก่อให้เกิดความเสียหายต่อระบบได้ การนำ Swatch และ Logwatch มาใช้งาน จะช่วยลดปัญหาเรื่องการสูญเสียเวลาได้ สำหรับ Swatch นั้น เป็น daemon ที่ทำหน้าที่ตรวจสอบรูปแบบ (pattern matching) ของล็อกไฟล์ เมื่อเจอข้อมูลที่ต้องการก็สามารถรัน script หรือโปรแกรมอื่นได้ เช่นอาจจะสั่งให้ส่งอี-เมล์ ส่งเสียงบี๊บ ท่านสามารถดาวน์โหลด Swatch ได้จาก http://www.oit.ucsb.edu/~eta/swatch/ และอ่านเอกสารประกอบได้ที่ http://www.enteract.com/~lspitz/linux.html ส่วน Logwatch นั้นรันบน cron job มีหน้าที่ในการตัดข้อมูลล็อกแล้วส่งผ่านอี-เมล์ไปยังผู้ดูแลระบบ ท่านสามารถดาวน์โหลด Logwatch ได้ที่ ftp://ftp.kaybee.org/pub/linux/logwatch-2.1.1.tar.gz

เนื่องจากการส่งข้อมูลล็อกไปยังเครื่องที่ทำหน้าที่เก็บข้อมูลล็อกอื่น นั้น ไม่มีกระบวนการของการตรวจสอบและยืนยันตัวตน และทำงานโดยใช้ UDP port 514 (user datagram protocol) ซึ่งเป็นโพรโตคอลที่ไม่มีการรับประกันการส่งข้อมูล และยังสามารถปลอมแปลง header ได้โดยง่าย ดังนั้นผู้ดูแลระบบควรติดตั้งไฟร์วอลล์เพื่อป้องกันไม่ให้เครื่องจากภายนอก ส่งข้อมูลล็อกมายังเครื่องที่ทำหน้าที่เก็บข้อมูลล็อกดังกล่าว

References

เรียบเรียงโดย : ภูวดล ด่านระหาญ


0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home