Kernel Securelevels and file flags

kernel ของ BSD มีความคิดเกี่ยวกับ securelevel เข้ามาเกี่ยวข้องด้วย securelevel เป็น level เดียว กับที่ kernel รัน แต่ละ level ก็จะมีระบบป้องกันและการตรวจสอบที่ต่าง ๆ กัน โดยดูได้จาก man page ของ init ดังต่อไปนี้:

The kernel runs with four different levels of security. Any superuser process can raise the security level, but only init can lower it. The security levels are:

 

-1 Permanently insecure mode - always run the system in level 0 mode.

0 Insecure mode - immutable and append-only flags may be turned off. All devices may be read or written subject to their permissions.
1 Secure mode - the system immutable and system append-only flags may not be turned off; disks for mounted filesystems, /dev/mem, and /dev/kmem may not be opened for writing.

 

2 Highly secure mode - same as secure mode, plus disks may not be opened for writing (except by mount(2)) whether mounted or not. This level precludes tampering with filesystems by unmounting them, but also inhibits running newfs(8) while the system is multi-user. If the security level is initially -1, then init leaves it unchanged. Otherwise, init arranges to run the system in level 0 mode while single user and in level 1 mode while multiuser. If level 2 mode is desired while running multiuser, it can be set while single user, e.g., in the startup script /etc/rc, using sysctl(8).

(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(8), chflags(1), sysctl(8)


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