มูลนิธิสื่อเพื่อเยาวชน
ว่าที่ร้อยตรี จิรศักดิ์ กรรเจียกพงษ์

วิธีการรักษาความปลอดภัยให้กับ FreeBSD (2)


FreeBSD Security How-To

Networking part II

telnetd

ถ้าคุณตัดสินใจที่จะใช้ inetd ต่อไป ให้คุณดู option ในไฟล์ /etc/inetd.conf ซึ่งจะทำให้ เซอร์วิสมีความปลอดภัยมากยิ่งขึ้นและได้ความรู้เพิ่มขึ้น ผู้ประสงค์ร้ายต่อระบบคอมพิวเตอร์ ของคุณจะเริ่มต้นด้วยการหาข้อมูลเกี่ยวกับระบบที่เขาต้องการโจมตี สิ่งหนึ่งที่คุณสามารถป้องกัน ได้ก็คือการเพิ่ม "-h" ไปใน option ของ telnet daemon ดังนี้:

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h

จาก telnetd man page:

-h Disable the printing of host-specific information before login has been completed. (ปิดการให้ข้อมูลเกี่ยวโฮสต์ก่อนที่การล็อกอินจะสมบูรณ์)

ในขณะที่มีหลายวิธีที่จะหาข้อมูลเกี่ยวระบบ(เพื่อการโจมตี) มียูทิลิตี้ซึ่งช่วยบอกเกี่ยวชนิดของ OS โดยการ "fingerprinting" ไปที่ TCP/IP stack ของ OS นั้น ถ้าคุณไม่ต้องการรัน telnet daemon เพียงแค่ ใส่ "#" ลงไปหน้าบรรทัดนี้ ดังนี้

#telnet stream tcp nowait root /usr/libexec/telnetd telnetd

การปิดการบริการ telnetd ทำให้คุณเลือกหนทางที่ปลอดภัยกว่าโดยการใช้ SSH อีกมาตรการหนึ่งที่จะทำให้คอมพิวเตอร์ของคุณปลอดภัยยิ่งขึ้นโดยการปฏิเสธการติดต่อ telnet จากใครก็ตามที่ IP ของเขาไม่สามารถเปลี่ยนมาเป็นชื่อ hostname ได้ โดยการใส่ "-U" ดังนี้ :

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U

ถึงแม้จะเป็นเพียงการปรับแต่งเพียงเล็กน้อย แต่เพิ่มความปลอดภัยโดยรวมให้แก่ระบบคอมพิวเตอร์ของคุณได้

ftpd

ต่อไปมาดูกันที่ ftp FreeBSD มี ftp daemon ที่ถูกกำหนดค่าให้สามารถบันทึกการติดต่อได้ สามารถตรวจสอบได้โดยการดูที่ inetd.conf ซึ่งจะรัน ftp ด้วย "-l" คุณต้องกำหนดค่าใน syslogd เพือให้สนับสนุนการบันทึกการติดต่อซึ่งถูกสร้างโดย ftpd ด้วย

จาก man page

-l Each successful and failed ftp(1) session is logged using syslog with a facility of LOG_FTP. If this option is specified twice, the retrieve (get), store (put), append, delete, make directory, remove directory and rename operations and their filename argu- ments are also logged. Note: LOG_FTP messages are not displayed by syslogd(8) by default, and may have to be enabled in syslogd(8)'s configuration file.

การติดต่อโดยทาง ftp ไม่ว่าจะสำเร็จหรือไม่ก็จะถูกบันทึกไว้โดยใช้ syslog ถ้า option นี้ถูกใช้สองครั้ง คำสั่งที่เกี่ยวกับ get, put, append, delete, make directory remove directory, rename และ file name argument จะถูกบันทึกไว้ด้วย

ดังนั้นคุณจึงควรให้ ftpd logging ทำงาน โดยการเปลี่ยนแปลงค่าในไฟล์ของ syslog daemon นั่นก็คือไฟล์ /etc/syslog.conf (อาจดูระบบ help ของไฟล์นี้โดยใช้คำสั่ง "man 5 syslog.conf")

โดยใส่บรรทัดต่อไปนี้ลงไป:

ftp.* /var/log/ftpd

อย่าลืมที่จะใช้คำสั่ง "touch /var/log/ftpd"เนื่องจาก syslogd ไม่สามารถเขียนไฟล์ที่ยังไม่ได้สร้างได้ นอกจากนี้จะต้องใส่ชื่อไฟล์ที่คุณต้องการจะบันทึกกิจกรรมในการใช้ ftp ลงใน /etc/newsyslog.conf เพื่อให้มั่นใจว่ามันสามารถทำงานได้อย่างถูกต้อง ถ้าคุณต้องการให้ระบบของคุณบันทึกข้อมูลเกี่ยวกับ ftpd มีรายละเอียดมากขึ้น เพียงใส่ "-l" option ที่สองลงไปในส่วนของ ftp ในไฟล์ /etc/inetd.conf

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l

ถ้าคุณต้องการให้ผู้ใช้งานในระบบของคุณที่ใช้ scp (Secure Copy, เป็นส่วนหนึ่งของชุดโปรแกรม SSH) แต่ต้องการให้ใช้บริการ anynymous ftp ด้วย ให้รัน ftp daemon ด้วย "-A":

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -A

คุณสามารถแก้ไข /etc/ftpwelcome ให้ให้ ftpd แสดงข้อความในทำนองว่า anonymous ftp อนุญาตให้เฉพาะผู้ใช้ภายนอก ส่วนผู้ใช้ภายในระบบควรจะใช้ scp แทนที่ ftpd ถ้าต้องการให้มีการใช้ anonymous ftpd ได้ ให้ใช้ "-S" เพื่อที่จะสามารถบันทึกการใช้ anonymous ftp ได้

ftp stream tcp nowait root /usr/libexec/ftpd ftpd -A -S

fingerd

finger เซอร์วิสถูกกำหนดให้มีความปลอดภัยโดยค่าเริ่มต้น มันไม่อนุญาตให้ใช้บริการโดยไม่ทราบ username แต่บางคนอยากให้มีความปลอดภัยยิ่งกว่านั้นด้วยการไม่ให้มีการใช้ finger service เลย ในกรณีนี้ก็เพียงแต่ใส่ "#" ลงไปหน้าบรรทัดของ finger แต่ถ้าอยากใช้ finger เซอร์วิสต่อไป ก็สามารถให้มีการบันทึกการใช้ finger โดยการเติม "-l" ไป:

finger stream tcp nowait nobody /usr/libexec/fingerd fingerd -s -l

บันทึกจาก fingerd จะถูกเก็บไว้ใน /var/log/messages โดยค่าเริ่มต้น ถ้าต้องการให้ fingerd บึกทึกไฟล์ ไว้ที่อื่นให้ใส่บรรทัดต่อไปนี้ลงไปใน /etc/syslog.conf:

daemon.notice /var/log/fingerd

คุณอาจดูระบบ help ของ syslog.conf เพื่อให้เข้าใจมากยิ่งขึ้น

% man 5 syslog.conf

จริง ๆ แล้วคุณไม่ควรให้บริการเซอร์วิสอื่นที่นอกเหนือจาก ftp, telnet, และ finger ในไฟล์ /etc/inetd.conf คุณควรปิดบริการ talk, comsat และบริการอื่น ๆ ที่ไม่จำเป็น นอกจากนี้ควรดูระบบ help ที่เกี่ยวข้องกับ networking configuration ด้วย อันได้แก่ inetd, ftpd, telnetd, fingerd, syslogd, comsat, talkd, rshd rlogind, และ inetd.conf และดูที่หัวข้อ "SEE ALSO" ของ man page เพื่อที่จะได้รู้ข้อมูลที่เกี่ยวข้องด้วย

IP firewalling with ipfw

IP firewall มีหน้าที่กลั่นกรองแพ็กเก็ต คุณควรที่จะคอมไพล์ kernel เพื่อให้สนับสนุน ipfw (IP firewall) โดย kernel ที่สนับสนุน ipfw จะมี kernel config file ที่มีลักษณะดังนี้:

options IPFIREWALL #finger the net

options IPFIREWALL_VERBOSE #log the net

options IPFIREWALL_DEFAULT_TO_ACCEPT #just what it say

บรรทัดแรกกำหนดค่าเกี่ยวกับ IP Firewall support บรรทัดที่สองกำหนดค่าเพื่อให้ ipfw สามารถบันทึกการตอบรับหรือการปฏิเสธแพ็กเก็ต บรรทัดที่สามถูกกำหนดให้ยอมรับการติดต่อทุก ๆ ชนิดและแพ็กเก็ตที่ส่งมาจากทุก ๆ ที่โดยค่าเริ่มต้น ถ้าคุณไม่กำหนดค่าข้างต้น ifpw จะปฏิเสธทุกการติดต่อโดยค่าเริ่มต้น (อย่าใส่ค่าในบรรทัดที่สามถ้าคุณต้องการสร้างระบบที่มีความปลอดภัย ต้องมั่นใจว่าให้ระบบปฏิเสธทุก ๆ การติดต่อโดยค่าเริ่มต้น แล้วจึง เพิ่ม rules ไปเพื่ออนุญาตการติดต่อเป็นกรณี ๆ ไป ดูรายละเอียดใน /etc/rc.firewall

log_in_vain

คุณสามารถเปลี่ยน kernel variable บางอย่างผ่านคำสั่ง sysctl :

# sysctl -w net.inet.tcp.log_in_vain=1

# sysctl -w net.inet.udp.log_in_vain=1

ทำให้ระบบมีการบันทึกความพยายามที่จะติดต่อกับระบบของคุณไปยัง port ที่ server ไม่ได้ให้บริการ เช่น คุณไม่ได้ให้บริการ DNS server แต่มีผู้ที่จะใช้บริการ DNS จากเครื่องของคุณ จะเห็นข้อความอย่างเช่น :

Connection attempt to UDP yourIP:53 from otherIP:X

(x คือหมายเลขพอร์ตสูง ๆ)

ดูได้ด้วยคำสั่ง "dmesg" คำสั่งนี้จะแสดง kernel message buffer ของระบบ แต่มันสามารถเก็บข้อมูลได้เพียงจำกัด ดังนั้นมันจึงบันทึกไว้ในไฟล์ messages ในไดเรกทอรี /var/log :

# tail -1 /var/log/messages

Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X

ในตอนนี้ระบบของคุณควรจะปลอดภัยขึ้นกว่าตอนที่คุณเพิ่ง install ใหม่ ๆ ต่อไปก็ทำการทดสอบสิ่งที่คุณได้ทำมาข้างต้นด้วย:

% netstat -na | grep LISTEN

จะบอกถึง port ที่เซอร์วิสกำลังรอเพื่อการติดต่อจากภายนอก ยิ่งมีน้อยเท่าไหร่ยิ่งดี นอกจากนี้อาจใช้ โปรแกรม port scanner เพื่อหา port ที่เปิดใช้ ในที่นี้ขอแนะนำ nmap (http://www.insecure.org/nmap/) และทดสอบว่า syslog กำลังบันทึกทุก ๆ สิ่งที่คุณต้องการด้วยการใช้คำสั่ง :

# cd /var/log

# tail -10 fingerd ftpd messages

ถ้าเห็นว่าไฟล์ที่บึนทึกการทำงานเหล่านี้ไม่ได้บันทึกอะไรไว้เลย ก็ต้องมั่นใจว่าคุณได้ restart โปรเซสของ inetd และ syslogd แล้ว :

# kill -HUP `cat /var/run/syslog.pid` `cat /var/run/inetd.pid`

Filesystem

เนื่องจากยูนิกซ์มองทุกสิ่งเป็นไฟล์ ดังนั้นจึงต้องป้องกัน filesystem อย่างถูกต้องด้วย ขั้นตอนนี้เริ่มก่อนที่ จะ install OS ลงไปเสียอีก คุณจำเป็นต้องคำนวนและออกแบบพาร์ติชันของคุณ เหตุผลที่ต้องทำคือ เพื่อให้คุณสามารถ mount filesystem หลาย ๆ filesystem ด้วย option หลาย ๆ อย่าง และสามารถที่จะ export filesystem เพื่อให้สามารถควบคุมได้มากกว่าเดิม ถ้าคุณใช้ FreeBSD โดยผ่านการใช้งาน Linux มาก่อน คุณจะสังเกตได้ว่า Linux บรรจุทุก ๆ อย่างไว้ใน "/", แต่ค่าเริ่มต้นของ FreeBSD จะมี "/", "/usr" และ "var" ทำให้ง่ายที่จะใช้โปรแกรมอย่างเช่น dump นอกจากนี้ยังมีประโยชน์ในเรื่องของความปลอดภัยด้วย

ตัวอย่างเช่น การแยก partition ที่ยูสเซอร์มีสิทธิ์ write ออกไปเพื่อให้สามารถ mounted แบบ nosuidได้ จาก mount man page :

nosuid Do not allow set-user-identifier or set-group-identifier bits to take effect. Note: this option is worthless if a public available suid or sgid wrapper like suidperl is installed on your system.

(หมายถึงไม่อนุญาตให้ set-user-identifier หรือ set-group-identifier bits ทำงาน แต่ option นี้จะไร้ประโยชน์ถ้ามีไฟล์ที่มี suid หรือ sgid เช่น suidperl อยู่ในระบบ)

ดังนั้นถ้าคุณมี partition เดียวสำหรับไดเร็จทอรีของของยูสเซอร์ อาจเป็น /home หรือ /usr/home ดังนี้

% cat /etc/fstab

# Device Mountpoint FStype Options Dump Pass#

/dev/sd0s1b none swap sw 0 0

/dev/sd0s1a / ufs rw 1 1

/dev/sd0s1g /usr ufs rw 2 2

/dev/sd0s1h /usr/home ufs rw,nosuid 2 2

/dev/sd0s1f /var ufs rw,nosuid 2 2

/dev/sd0s1i /tmp ufs rw,nosuid 2 2

/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2

proc /proc procfs rw 0 0

ต้องมั่นใจว่า ทุกไดเร็กทอรีที่ยูสเซอร์มีสิทธิ์ write ถ้าไม่ mount แบบ "-nosuid" หรือไม่ก็ต้องถูก chmod ให้มีเพียง root เท่านั้นที่สามารถ write ไดเร็กทอรีเหล่านั้นได้ ค่าเริ่มต้นของ FreeBSD จะมีเพียง /var/spool/uucppublic เท่านั้นที่ไม่ได้เซ็ตค่าไว้ ดังนั้นคุณอาจจะ mount /var filesystem ด้วย "-nosuid" หรือ :

# chmod o-w /var/spool/uucppublic

ถ้าต้องการค้นหาทุก ๆ ไดเร็กทอรีที่สามารถ write ได้ให้ ใช้คำสั่ง:

# find / -perm -0777 -type d -ls

จากที่กล่าวไว้แล้วข้างต้น ถ้ามีไฟล์ที่มี suid หรือ sgid อยู่ในระบบก็ไร้ประโยชน์ที่จะ mount filesystem แบบ nosuid ดังนั้นจึงควรหาไฟล์ในระบบของคุณที่เซ็ตให้เป็น suid หรือ sgid โดยใช้คำสั่ง find ดังนี้:

# find / -perm -2000 -ls

# find / -perm -4000 -ls

ถ้าอยากให้ผลที่รายงานออกมาแบบกระชับเพียงแต่ไม่ใช้ "-ls" สำหรับไฟล์ที่พบว่าไม่จำเป็นต้องใช้ให้ "chmod 000" เช่น uustat, uucico หรือ ppp และ pppd, ถ้าไม่ได้ใช้งานเกี่ยวกับด้านการพิมพ์ คำสั่ง lpr, lprq, lprm ก็ไม่จำเป็นเช่นกัน มี utility ที่เรียกว่า suidcontrol (http://www.watson.org/fbsd-hardening/suidcontrol.html) ที่สามารถใช้สำหรับควบคุมไฟล์ suid/sgid ที่อยูในระบบของคุณได้

มาถึงตอนนี้คุณอาจจะถามว่ามีวิธีไหนที่จะป้องกันผู้โจมตีจากการใช้การ unmount และ mount filesystem ที่ปราศจาก "-nosuid" ได้บ้าง คำตอบคือการเปลี่ยน securelevel

ที่มา :
http://infosec.sran.org/


หมายเลขบันทึก: 41716เขียนเมื่อ 30 กรกฎาคม 2006 17:37 น. ()แก้ไขเมื่อ 11 กุมภาพันธ์ 2012 15:29 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท