วิธีเพิ่มความปลอดภัย ให้กับ Freebsd ( Security Freebsd )

2864 สัปดาห์ ที่แล้ว - คนดู 5,965
  • วิธีเพิ่มความปลอดภัย ให้กับ Freebsd ( Security Freebsd ) รูปที่ 1
รายละเอียด

เพิ่มความปลอดภัยให้กับ Freebsd

ซึ่งเจาะจงโดยเฉพาะกับระบบนี้ แต่ก็มีหลักการบางอย่างที่สามารถนำไปปรับใช้กับ unix อื่น ๆ ได้ด้วยเช่นในเรื่อง inetd เป็นต้น ทั้งนี้ขอให้คุณดูระบบ help ของระบบ unix ที่จะนำไปปรับใช้ ซึ่งจะทำให้ทราบความเหมือนและความแตกต่าง) Networking
inetd (Inet Daemon) ระบบเน็ตเวิร์คมีบทบาทสำคัญในระบบรักษาความปลอดภัยทั้งหมด โดย FreeBSD จะสร้างมาจาก 4.4 BSD ซึ่ง มีระบบเน็ตเวิร์คที่มีความปลอดภัยสูงและ TCP/IP stack ที่มีความรวดเร็ว ซึ่ง stack ชนิดนี้สนับสนุนโปรโตคอลหลายชนิด เช่น telnet, ftp, talk, rsh, และอื่น ๆ อีกมาก ไฟล์หลักสำหรับกำหนดค่าต่าง ๆ

สำหรับเซอร์วิสเหล่านี้ จะอยู่ในไดเร็คทอรี /etc ชื่อว่า inetd.conf
เพื่อที่จะแก้ไขไฟล์นี้ให้พิมพ์ "vi /etc/inetd.conf" (ถ้าคุณถนัด pico มากกว่าให้ใช้คำสั่ง pico กับ option -w
เพื่อให้มันสามารถแก้ไฟล์ที่มีบรรทัดยาว ๆ ได้ ( -w disable word wrap (thus allow editing of long lines) นอกจากนี้แล้วคุณอาจใช้คำสั่ง "ee" ซึ่งจะมีใน FreeBSD เป็น editor ซึ่งโดยปกติจะถูกกำหนดไว้สำหรับ root อยู่แล้ว คุณสามารถตรวจสอบโดยใช้คำสั่ง "echo $EDITOR" เมื่อคุณเปิด editor แล้วคุณจะเห็นไฟล์ที่อยู่ในฟอร์แมท ascii ซึ่งจะบอกโปรแกรม inetd ว่าจะให้เซอร์วิสไหนทำงาน ยูสเซอร์คนไหนเป็นคนรันเซอร์วิสและรายละเอียดอื่น ๆ เนื่องจากไฟล์นี้เป็นไฟล์หลักสำหรับเริ่มเน็ตเวิร์คเซอร์วิสเหล่านี้ทั้งหมด ดังนั้นจึงสำคัญมากที่จะกำหนดค่าต่าง ๆ อย่างถูกต้อง ถ้าอยากจะปิดการให้บริการเซอร์วิสที่ไม่ต้องการ เพียงแค่พิมพ์ "#" ลงไปหน้าบรรทัดของเซอร์วิสนั้น โดยปกติแล้วคุณควรจะปิดการให้บริการเซอร์วิสที่คุณไม่คุ้นเคย หรือไม่รู้ว่ามันทำอะไร จะเป็นการดีมากถ้าคุณจะปิดการให้บริการ inetd ทั้งหมด ตัวอย่างเช่น ถ้าคุณต้องการ เพียงจะให้บริการ world wide web เท่านั้น ดังนั้นคุณน่าจะรัน ssh และ httpd เท่านั้น และไม่จำเป็นต้องรันเซอร์วิสอื่น ๆ อีก ถ้าคุณตัดสินใจที่จะไม่ให้บริการใด ๆ ทั้งสิ้นที่อยู่ในไฟล์ inetd.conf เพียงแค่ปิดบริการของ inetd เสีย โดยการแก้ไขไฟล์ /etc/rc.conf และเปลี่ยน

ปิดการใช้งาน inetd ด้วยคำสั่ง

 

vi /etc/rc.conf

แก้ไขบรรทัด


inetd_enable="YES" เป็น

inetd_enable="NO"



จากนี้ไม่มีใครสามารถ telnet, rlogin, หรือ ftp
ไปยังคอมพิวเตอร์ของคุณได้อีก ถ้าคุณตั้งใจที่จะรัน inetd ควรใช้ tcp wrapper ด้วย (หาข้อมูลได้จาก ftp://ftp.win.tue.nl/pub/security/index.html#software ) และต้องมั่นใจว่าได้เซ็ตระบบของคุณเพื่อให้สามารถบันทึกการติดต่อระหว่างเน็ตเวิร์ค(logging) และเพิ่มเวลาของเซอร์วิสที่จะถูกร้องขอข้อมูลในเวลา 1 นาทีด้วย (ค่าเริ่มต้นอยู่ที่ 256, แต่แนะนำว่า ควรเป็น 1024, ซึ่งคุณอาจแก้ไขค่านี้ให้เหมาะสมกับความต้องการของคุณ) ถ้าคุณติดต่อกับเน็ตเวิร์คด้วยความเร็วที่ช้าอย่างเช่นโมเด็ม ค่านี้จะไม่มีผลอะไร แต่ถ้าคุณติดต่อกับเน็ตเวิร์คด้วยความเร็วสูง จากความสามารถนี้สามารถใช้เพื่อสร้างการโจมตีที่เรียกว่า DoS(Denial of Service) โดยผู้โจมตีจะใช้ shell script ที่จะร้องขอข้อมูลจากคอมพิวเตอร์ของคุณมากกว่า 256 การติดต่อ มีผลให้ inetd เซอร์วิสปิดการให้บริการลง นอกจากนี้ถ้าต้องการให้ระบบของคุณสนับสนุนการติดต่อ 1024 ครั้ง(ใน 1 นาที) ต้องแน่ใจว่าฮาร์ดแวร์ของคุณสนับสนุนค่านี้ด้วย มิฉะนั้นผู้ประสงค์ร้ายสามารถโจมตีคอมพิวเตอร์ของคุณแบบ DoS ได้เช่นกันและทำให้ระบบคอมพิวเตอร์ของคุณหยุดทำงานด้วยการส่งการติดต่อ 1024 การติดต่อในเวลาเดียว ให้ดูจากไฟล์ /etc/rc.conf ข้างล่างนี้ inetd_enable="YES" ควรจะเปลี่ยนจาก
 


inetd_flags="" เป็น

inetd_flags="-l -R 1024"



ซึ่งจะทำให้มันบันทึกการติดต่อ (-l switch) และเพิ่มการติดต่อที่มากที่สุดถึง 1024 จากค่าเริ่มต้น 256
คุณจำเป็นที่จะต้องแก้ไขไฟล์ syslog.conf ในไดเร็กทอรี /etc


SSH - Secure Shell
จากที่ได้กล่าวข้างต้นในเรื่อง ssh
แล้วว่าในกรณีที่คุณไม่ต้องการรันเซอร์วิส inetd ทั้งหมด อย่างเช่น
คุณต้องการเพียงต้องการรัน web server หรือ news server หรือ nfs เท่านั้น
คุณไม่จำเป็นต้องมีเซอร์วิสอื่นที่รันที่คอมพิวเตอร์ของคุณอีก คุณสามารถใช้โปรแกรม SSH เพื่อใช้ล็อกอินเข้าสู่คอมพิวเตอร์จากที่ห่างไกล โปรแกรมนี้ถูกออกแบบมาเพื่อแทนที่ rsh, rlogin และคำสั่งที่เริ่มต้นด้วย r
ของ Berkeley SSH มีความสามารถหลายอย่าง แต่มักจะใช้เพื่อเข้ารหัส
การติดต่อเพื่อป้องกันจากรหัสผ่านที่สามารถอ่านได้และข้อมูลต่าง ๆ ที่ผ่านเส้นทางที่ไม่ปลอดภัย ถ้าคุณใช้ telnet การติดต่อของคุณสามารถถูกดักข้อมูลได้ (ถ้าคุณคิดว่า S/Key เป็นทางแก้ไข คุณคิดผิด เพราะยังมีปัญหาเรื่องการถูกแก้ไขข้อมูลที่อยู่ระหว่างทางและ connection hijacking ) ทางที่ดีคุณควรปิดเซอร์วิสของ inetd ทั้งหมดและใช้ SSH แทน แต่ถ้าคุณคิดว่า inetd ยังจำเป็นสำหรับคุณอยู่แล้ว อย่างน้อยคุณควรให้ inetd สามารถบันทึกการติดต่อระหว่างเน็ตเวิร์ค (logging) และเพิ่มจำนวนการติดต่อที่มากที่สุดที่อนุญาตให้ติดต่อได้ใน 1 นาที


ถ้าคุณตัดสินใจที่จะใช้ 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
 

 

FTP

การติดต่อโดยทาง 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 Kernel Securelevels and file flags kernel ของ BSD มีความคิดเกี่ยวกับ securelevel เข้ามาเกี่ยวข้องด้วย securelevel เป็น level เดียว กับที่ kernel รัน แต่ละ level
ก็จะมีระบบป้องกันและการตรวจสอบที่ต่าง ๆ กัน โดยดูได้จาก man page ของ init ดังต่อไปนี้:
.
(kernel รันด้วยการรักษาความปลอดภัยที่ต่างกัน 4 ระดับ , โปรเซตใด ๆ
ก็ตามของ super user สามารถยกระดับความปลอดภัยได้ แต่มีเพียงคำสั่ง init
เท่านั้นที่สามารถ เซ็ตค่าให้ต่ำลง ระดับความปลอดภัยมีดังนี้:

-1 โหมดที่ไม่มีความปลอดภัยอย่างถาวร ดังนั้นจึงควรรันในโหมด level 0
0 โหมดที่ไม่มีความปลอดภัย ระบบที่ห้ามการเปลี่ยนแปลงระบบและอนุญาตการเพิ่มเท่านั้น (append-only
flags) ไม่ทำงาน, device สามารถอ่านหรือเขียนได้ตาม permission

1 โหมดที่มีความปลอดภัย
ระบบที่ห้ามการเปลี่ยนแปลงระบบและเพิ่มขึ้นมาเท่านั้นทำงาน, disk สำหรับ mount filesystem, /dev/mem และ /dev/kmem ไม่สามารถเขียนได้
2 โหมดที่มีความปลอดภัยสูง เช่นเดียวกับ โหมด 1
แต่เพิ่มการป้องกันการเขียน disk (ยกเว้น ใช้คำสั่ง mount) ไม่ว่าdisk นี้จะถูก mount หรือไม่ก็ตาม นอกจากนี้ level นี้ยังป้องกันการ mount filesystem ด้วย และห้ามการใช้ newfs ขณะที่ระบบเป็นแบบ multi-user ถ้าเริ่มต้น security level ด้วย -1, init จะไม่เปลี่ยนแปลงค่านี้ แต่ init จะรันระบบ ใน level ในขณะที่ระบบเป็นแบบ single user, level
1ในขณะที่ระบบเป็นแบบ multiuser ถ้าต้องการเซ็ต security level โหมด 2 ในขณะที่เป็น multiuser สามารถเซ็ตได้ในตอนที่อยู่ในแบบ single user เช่นการใช้ startup cript /etc/rc โดยใช้คำสั่ง sysctl )
ยกตัวอย่างเช่น ถ้าคุณต้องการให้บริการ www ให้เซ็ต securelevel เป็น 2 แต่ถ้าต้องการรัน X server ด้วย ต้องเซ็ตเป็น 1 ถ้าเซ็ตค่าที่สูงกว่านี้จะมีปัญหาเพราะ X server ต้องใช้ /dev/mem และ /dev/kmem สำหรับ write, อาจแก้ไขโดยการเซ็ตค่า securelevel หลังจาก start X server แล้ว อย่างไรก็ตามถ้าคุณรัน X server คุณก็มีปัญหาในเรื่องความปลอดภัยที่น่าเป็นห่วงมากกว่าเรื่อง kernel securelevel เสียอีก ถ้าต้องการรู้ securelevel ใช้คำสั่งต่อไปนี้:

# sysctl kern.securelevel
เพิ่ม securelevel:
# sysctl -w kern.securelevel=N
N คือ 0, 1 หรือ 2.

คุณอาจพบปัญหาตอนที่อัปเกรดระบบด้วยการใช้คำสั่ง "make world" หรือ build kernel ใหม่ ถ้า securelevel เป็น 1 เพราะว่า "make install" จะ install kernel โดยใช้ flag ที่ห้ามไม่ให้ มีการเปลี่ยนแปลงระบบ (immutable flag) ดังนี้:

# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
schg นี้เองที่ป้องกันไม่ไห้คุณ install kernel ใหม่:
nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)
nfr# sysctl kern.securelevel
kern.securelevel: 2
nfr# rm -rf /kernel
rm: /kernel: Operation not permitted
nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted

ถ้าคุณใช้ securelevel 1 หรือ 2 flag "schg" ไม่สามารถปิดการทำงานของมันได้:
# chflags noschg /kernel
chflags: /kernel: Operation not permitted
จำไว้ว่าไฟล์ /boot.config สามารถใช้สำหรับเปลี่ยนค่าเริ่มต้นของ kernel ตอนบูตระบบได้ เพื่อป้องการเปลี่ยนแปลงค่านี้ควรใช้คำสั่งดังนี้:

# touch /boot.config
# chflags schg /boot.config

โคยค่าเริ่มต้นของไฟล์ไบนารีที่ install อยู่ในระบบของคุณที่มี flag schg ในระบบด้วย:

# ls -lo /sbin | grep schg
-r-x------ 1 bin bin schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x 1 root bin schg 192512 Jul 19 20:36 rcp

ต่อไปกลับไปถึงเรื่องการล็อคระบบของคุณ เนื่องจากกำลังพูดถึงเรื่อง flag ที่ห้ามการเปลี่ยนแปลงระบบ ดังนั้นจึงควรใช้คำสั่ง "chflags schg" ในไดเร็กทอรี /sbin และ /bin ซึ่งจะทำให้ยากขึ้นไปอีกที่ จะทำให้ผู้ประสงค์ร้ายต่อระบบของคุณจะสามารถวาง backdoor
ลงไปในระบบของคุณได้ (ระบบคุณต้อง มี securelevel ที่เหมาะสมแล้วด้วย

# chflags schg /bin/*
# chflags schg /sbin/*

เนื่องจาก /sbin สามารถลบได้และสามารถสร้างไดเร็กทอรี /sbin ใหม่ได้ จึงควร chflags ไดเร็กทอรี /sbin และ /bin ด้วย ดังนี้:
# chflags schg /bin ; chflags schg /sbin
การเปลี่ยน flag ของไฟล์ทำเกิดปัญหากับ "make world ดังนั้นจึงควรใช้คำสั่ง "make world" ในโหมด single user สำหรับข้อมูลเกี่ยวกับ "make world ดูได้จาก:
http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html 

ถึงจุดนี้ระบบของคุณจะถูกล๊อกไว้อย่างเหมาะสม มีเซอร์วิสเพียงเล็กน้อยที่รันอยู่, filesystem ถูก mount
ด้วยวิธีที่เหมาะสม และ kernel securelevel ที่ถูกต้อง man page ที่เกี่ยวกับหัวข้อ ที่เกี่ยวข้องข้างต้นคือ init(, chflags(1), sysctl( System logging via syslog



การบันทึกการติดต่อ (logging)


สำคัญมากเพราะมันจะให้ข้อมูลเกี่ยวกับร่องรอยการถูกโจมตี การพยายามบุกรุกหรือระบบของคุณถูกบุกรุกแล้วก็ตาม ยูนิกซ์โดยทั่วไปจะทำโดย syslog daemon daemon นี้จะเริ่มทำงานตอนบูตระบบจาก /etc/rc แล้วจึงทำงานต่อไปจนกระทั่งปิดระบบของคุณ ตรวจดูว่า syslogd ทำงานอยู่หรือไม่ด้วยคำสั่ง:
% ps -axu | grep syslogd
syslog daemon จะอ่าน configuration จาก /etc/syslog.conf
เมื่อเริ่มต้นทำงาน ไฟล์นี้มีความสำคัญมากเนื่องจากมันบอก syslog อะไรที่จะให้บันทึกและบันทึกไว้ที่ไหน คุณสามารถอ่าน manpage ของ syslogd และ syslog.conf ดังนี้:

% man syslogd syslog.conf

เนื่องจากยูนิกซ์ออกแบบมาเพื่อการทำงานด้านเน็ตเวิร์ค ดังนั้นค่าเริ่มต้น
syslog daemon จึงสามารถรับ syslog datagram จากระบบอื่นและส่ง datagram ไปยังระบบอื่นในเน็ตเวิร์คได้ syslod daemon ใช้ UDP - datagram ซึ่งปลอมแปลงข้อมูลได้ง่ายกว่า TCP มาก ดังนั้นจึง ควรเซ็ต syslog daemon ไม่ให้รับ syslog message จากระบบอื่น โดยการรัน syslog daemon ในโหมดที่ปลอดภัย โดยการเพิ่ม "-s" ลงไปใน /etc/rc.conf
ถ้าคุณจำเป็นต้องให้ระบบของคุณรับ syslog datagram จาก device อีกอย่างหนึ่ง (เช่น router หรือ web server ของตัวเอง) ใช้ "-a" เพื่อให้ยอมรับจากโฮสต์ หรือโดเมน หรือโดเมนย่อยที่ต้องการ ต่อไป

เมื่อรีบูตระบบ syslogd ระบบรันด้วย "-s" เมื่อมีผู้ส่ง datagram มา
syslogd โดยผ่านเน็ตเวิร์ค คุณ จะเห็นข้อความใน log ของคุณดังต่อไปนี้:

Jul 21 10:52:35 nfr syslogd: discarded 1 unwanted packets in secure mode

Jul 21 10:52:35 nfr syslogd: discarded 2 unwanted packets in secure mode

Jul 21 10:52:35 nfr syslogd: discarded 4 unwanted packets in secure mode

ถ้าไม่ต้องการรีบูตใหม่เพียงแต่ kill -9 syslog daemon แล้วรัน syslogd
ใหม่ด้วยสิทธิ์ของ root ด้วย "-s" มันจะทำงานได้ดีถ้าการโจมตีระบบของคุณล้มเหลวและ syslog ไม่ถูกแก้ไข
แต่ถ้าผู้โจมตี สามารถบุกรุกเข้ามาได้และลบไฟล์ใน /var/log มีหลายวิธีที่จะป้องกันได้ วิธีหนึ่งคือให้เซ็ตคอมพิวเตอร์
เครื่องหนึ่งซึ่งรัน syslog สำหรับเน็ตเวิร์คทั้งหมดและไม่ต้องให้รันเซอร์วิสอื่น ๆ อีก ไม่มีพอร์ตอื่นที่เปิด นอกจาก UDP พอร์ต 514 (พอร์ตของ syslogd) ด้วยวิธีนี้คุณสามารถทำให้ระบบของคุณทั้งหมด (routers, firewalls, server,
workstation) ส่งข้อมูลที่สำคัญ(หรือที่คุณเลือกไว้)มาที่เครื่องนี้ ซึ่งอาจเป็น เครื่อง 486 เก่า ๆ ที่มีเนื้อที่ hardisk เหลือมากหน่อย ต้องมั่นใจว่าได้เซ็ต option ที่ถูกต้องแก่ "-a" ถ้าคุณ จะให้ระบบนี้ใช้ syslogd อย่างเดียวนอกจากนี้คุณสามารถต่อพรินเตอร์เข้ากับระบบของคุณและให้ syslog ส่งข้อมูล(เช่นการ log in ไม่สำเร็จ)เข้าไปพิมพ์ที่พรินเตอร์ ถ้าข้อมูลพิมพ์บนกระดาษแล้วก็ยากที่ผู้โจมตีจะลบ log ได้ (ถ้าไม่ทำงานอยู่ที่เดียวกัน) อีกทางเลือกคือให้ส่งข้อความจาก syslogd ทั้งหมดไปยังคอมพิวเตอร์ อีกเครื่องหนึ่งที่ติดต่อกันด้วย serial (cuaaN) หรือ parallel (lpN) พอร์ตเคเบิล ถึงแม้แต่ละคนมีเหตุผลในการบันทึก syslog ต่างกัน แต่สิ่งหนึ่งที่ควรทำคือ เพิ่มบรรทัดนี้ลงไปใน /etc/syslog.conf ดังนี้:

auth.*,authpriv.* /var/log/authlog
FreeBSD มีโปรแกรม newsyslog ซึ่งจะเปลี่ยนไฟล์ log ให้เพื่อ log
จะได้ไม่ใหญ่จนเกินไป configuration ไฟล์ของโปรแกรมนี้คือ
/etc/newsyslog.conf ดู man page เพื่อดูข้อมูลเกี่ยวกับ newsyslog
% man newsyslog
โปรแกรมนี้ไม่เหมือน syslogd มันจะรันจาก crontab:
% grep newsyslog /etc/crontab
0 * * * * root /usr/sbin/newsyslog
คุณควรแก้ไข /etc/newsyslog.conf ให้เหมาะสมกับความต้องการของคุณ
ควรเปลี่ยน permission จาก 664 เป็น 640
เนื่องจากยูสเซอร์ธรรมดาไม่มีความจำเป็นที่จะต้องอ่าน log ของคุณ:
 


# cd /var/log
# chmod g-w,o-r * ; chmod a+r wtmp


ด้วยวิธีข้างต้นจะต้องกันไม่ให้ยูสเซอร์ธรรมไม่ให้อ่านไฟล์ log
ของคุณได้ถ้าเขาไม่ได้อยู่ใน group ที่เหมาะสม (อย่างเช่น group wheel หรืออื่น ๆ) คุณควรเปลี่ยนไฟล์ log ทั้งหมดให้อยู่ใน group wheel เพื่อความสะดวก คุณสามารถ su เพื่อเป็น root และอ่าน log ไฟล์ได้

คุณสามารถเพิ่ม "root.wheel" ลงไปใน /etc/newsyslog.conf ดังนี้:
/var/log/maillog root.wheel 640 7 100 * Z
/var/log/authlog root.wheel 640 7 100 * Z
/var/log/messages root.wheel 640 7 100 * Z

เมื่อไฟล์เหล่านี้มีขนาด 100 kilobyte มันจะ zip ไฟล์เหล่านี้เก็บไว้ เปลี่ยนเป็น 640 แล้ว chown เป็น root.wheel ตามที่เราต้องการ
มีโปรแกรมที่เป็นทางเลือกอื่น ๆ นอกจาก syslog ที่มีกับยูนิกซ์โดยทั่วไป คือ:
* ssyslog (secure syslog จาก Core SDI
(http://www.core-sdi.com/Core-SDI/english/slogging/ssyslog.html )
* nsyslog (new syslog จากผู้ที่สร้าง ipfileter
(http://cheops.anu.edu.au/~avalon/nsyslog.html )
ไม่ว่าคุณใช้โปรแกรมใดข้างต้นก็ตาม (syslog, ssylog, หรือ nsyslog)
คุณควรใช้ utility อื่น ๆที่จะช่วย วิเคราะห์ไฟล์ log ของคุณ เพื่อจะได้ไม่ต้องมีปัญหากับคำสั่ง grep
* logcheck หาได้จากhttp://www.psionic.com/abacus/abacus_logcheck.html
* logsurfer หาได้จากhttp://www.cert.dfn.de/eng/team/wl/logsurf
Miscellaneous hints and tips
LKM
คุณจำเป็นที่จะต้องปิดการใช้งานโปรแกรม LKM ในระบบ ดูรายละเอียดจาก Phrack
Magazine Volume 7, Issue 51 September 01, 1997, article 09 ปิดการใช้งาน
LKM โดยการเพิ่มบรรทัดต่อไปนี้ลงไปใน kernel configuration file: options
NO_LKM


Portmap

ค่าเริ่มต้นของ FreeBSD จะเซ็ตให้ portmapper ใช้งานได้
แต่ถ้าคุณไม่มีความจำเป็นที่จะต้องใช้ก็ให้ปิดการใช้งานมันเสีย คุณไม่มีความจำเป็นที่จะต้องใช้ถ้าคุณไม่ใช้โปรแกรมที่ต้องการ RPC
ปิดการใช้งานโดยการแก้ไขไฟล์ /etc/rc.conf ดังนี้:

ให้เปลี่ยนจาก
portmap_enable="YES" # Run the portmapper service (or NO).
เป็น

portmap_enable="NO" # Run the portmapper service (or NO).
Sendmail

ค่าเริ่มต้นของ FreeBSD โปรแกรม sendmail สามารถใช้งานได้
ในอดีตเป็นที่รู้กันดีว่ามีปัญหาเรื่องความปลอดภัย แต่ต่อมีได้ปรับปรุงให้ดีขึ้น แต่เนื่องจาก source code
ที่มีขนาดใหญ่ที่ไม่สะดวกในเรื่องการตรวจสอบ ดังนั้นจึงควรปิดการใช้ sendmail ถ้าไม่จำเป็น แต่ถ้าจำเป็นจริง ๆ ก็ควร ไปที่
http://www.sendmail.org บ่อย ๆ เพื่อนำ patch มาเพื่อแก้ไข นอกจากนี้ถ้าคุณใช้ sendmail 8.8 ต้องมั่นใจว่าระบบของคุณจะไม่ถูก spammer ใช้เพื่อส่ง spam ดูข้อมูลจากhttp://www.sendmail.org/antispam.html
ปิดการใช้ sendmail ใน FreeBSD ด้วยการแก้ไฟล์ /etc/rc.conf เปลี่ยน:

sendmail_enable="YES" # Run the sendmail daemon (or NO).
เป็น

sendmail_enable="NO" # Run the sendmail daemon (or NO).

 

Port and Packages

ไม่ใช้ port หรือแพคเกจโปรแกรมขณะที่กำลังเซ็ตระบบที่ปลอดภัย
เพราะคุณไม่รู้ว่าพอร์ตหรือแพจเกจซอฟท์แวร์นั้นจะ install suid-root ไบนารีไฟล์ลงไปหรือไม่ คุณไม่จำเป็นต้องใช้มากกว่าที่คุณมีอยู่ในระบบ ของคุณแล้ว อาจใช้คำสั่ง pkg_add ตามด้วย "-v" หรือ "-n" นอกจานี้ให้ดาวน์โหลดซอฟท์แวร์ที่เป็น source code และคอมไพล์ด้วยต้วคุณเอง



Filesystem quota


ถ้าคุณให้บริการ shell server คุณจำเป็นต้องให้บริการ quota ใน user
filesystem (อย่างเช่น /usr/home เป็นต้น) ซึ่งสามารถป้องกันการโจมตีแบบ Denial of Service ได้ (โดยการทำให้ filesystem ทั้งหมดเต็มไปด้วยไฟล์)
ทำให้ quota ทำงานด้วยการแก้ไข /etc/rc.conf:
จาก
check_quotas="NO" # Check quotas (or NO).
เป็น
check_quotas="YES" # Check quotas (or NO).
ควรดู man page ของคำสั่งต่อไปนี้เพื่อดูข้อมูลและตัวอย่างวิธีการใช้งาน quota: quotaon, edquota, repquota, quota ต้องมั่นใจว่าใด้เพิ่ม "userquota" ลงไปในไฟล์ /etc/fstab ด้วย (ดู man page ด้วยคำสั่ง man 5 fstab)

Crontab
ถ้าคุณใช้ /etc/crontab เพื่อรันงานของคุณ
ซึ่งมันสามารถให้ข้อมูลสำคัญเกี่ยวกับระบบคุณแก่ผู้ที่ประสงค์ร้าย ได้ ดังนั้นจึงควร:
# chmod 640 /etc/crontab

BPF
BPF ย่อมาจาก berkeley packet filter ซึ่งจำเป็นต้องอยู่ใน kernel
ถ้าคุณต้องการรัน network sniffing โปรแกรมอย่าง tcpdump หรือ NFR (http://www.nfr.net/ ) ใช้ BPF ทุกครั้ง โปรแกรมที่ sniff network จากระบบ BSD ต้องใช้ BPF ดังนั้นถ้ามีใครก็ตามที่ได้สิทธิ์ root ใน ระบบของคุณซึ่งมี BPF ใน kernel จะทำให้เขาสามารถรัน sniffer ในเน็ตเวิร์คของคุณได้อย่างง่ายดาย ดังนั้นจึงไม่ควรคอมไพล์ BPF ไปใน
kernel ถ้าไม่มีความจำเป็นค่าเริ่มต้นของ FreeBSD kernel จะไม่สนับสนุน BPF

Update OS โดยการใช้ CVSup, CVS, และอื่น ๆ
ถ้าคุณ install ระบบจาก CDROM มีโอกาสที่จะมี bug ที่ถูกค้นพบหลังจากที่คุณได้ install ลงไป
ดังนั้นจึงควรอัปเกรดระบบของคุณเป็น -current หรือ -stable ก็ได้

สำหรับรายละเอียดให้ดูจาก
 

FreeBSD สำหรับเวอร์ชันที่คุณใช้อยู่ เอกสารเกี่ยวกับ "make world"
หลังจากที่คุณได้ source ล่าสุด ของ OS ที่http://www.nothing-going-on.demon.co.uk/FreeBSD/make-world/make-world.html

SSH
คุณควรใช้ SSH แทนที่ telnet, ftp, rlogin, rsh และอื่น ๆ
ดังที่กล่าวแล้วข้างต้น สำหรับผู้ใช้ที่ความเร็วต่ำ (อย่างเช่น modem 56 k เป็นต้น) SSH มี -C option (จาก man page):
-C Requests compression of all data (including stdin, stdout, stderr, and data for forwarded X11 and TCP/IP connections). The compression algorithm is the same used by gzip, and the "level" can be con-
trolled by the CompressionLevel option (see below). Compression is desirable on modem lines and other slow connections, but will only slow down things on fast networks. The default value can be set on a host-by-host basis in the configuration files; see the Compress option below.
โดย option นี้จะทำให้การติดต่อด้วย SSH เร็วขึ้น