หน้าเว็บ

วันพุธที่ 16 กันยายน พ.ศ. 2552

Why is SELinux ?

สุดยอดระบบรักษาความปลอดภัย Red Hat Enterprise Linux 2007-06-06
พุทธพร คณีกุล, System Engineer, RHCT, RHCE

ช่าง เทคนิคทั้งหลายคงไม่มีใครไม่รู้จัก เจ้าหมวกแดง Redhat เป็นแน่ มาดูสุดยอดความปลอดภัยที่มีอยู่ในระบบปฏิบัติการเครือข่ายตัวนี้กันครับ ...(วิทยากรรับเชิญจาก www.lcc.in.th)

ถ้า พูดถึงระบบรักษาความปลอดภัยของ OS Linux ละก็ หลายๆ คนก็คงทราบกันดีอยู่แล้วว่า Linux เป็น OS ตัวหนึ่งที่มีโปรแกรมพื้นฐานทางด้าน Security ที่ดีมาก นั่นคือมี Firewall ที่ติดมากับตัว OS เลย โดยที่เราไม่จำเป็นต้องลงโปรแกรมเพิ่มเติมแต่อย่างใด โปรแกรมที่ทำหน้าที่เป็น Firewall ใน Linux นี้คือโปรแกรม iptables ซึ่งสามารถอ่านรายละเอียดเพิ่มเติมได้ที่ www.netfilter.org

ซึ่ง โปรแกรม iptables นี้มีความสามารถเป็นได้ทั้ง stateful packet filtering และ stateless packet filtering นอกจากนี้ยังสามารถทำงานเป็นตัวแปลง Network address หรือ Port address ได้ด้วย (NAT / NAPT) สิ่งที่ iptables สามารถทำได้ก็คือการกลั่นกรองแพ็คเกจที่วิ่งอยู่ในเครือข่าย โดยตรวจสอบจาก Header ของแพ็คเกจนั้นๆ ว่า มี Address ต้นทางและปลายทางไปที่ไหน แพ็คเกจนั้นวิ่งไปหา Application อะไร ที่ port อะไร ซึ่งเราสามารถเขียน Rule ในการกำหนดพฤติกรรมของของแพคเกจพวกนี้ได้ ว่าจะอนุญาตให้มีการวิ่งผ่านที่ Firewall มั้ย หรือว่าจะมีการเปลี่ยนแปลง address ต้นทางของแพคเกจก่อนจึงค่อยส่งออกไปยังข้างนอก เป็นต้น

นอก เหนือจาก iptables ที่ทำหน้าที่เป็น Firewall ซึ่งมีอยู่ใน Linux ทุกๆ Distribution แล้ว ใน RHEL5 ยังมีระบบรักษาความปลอดภัยอีกอย่างนึงที่ชื่อว่า SELinux ที่มีมาใน Linux Kernel 2.6 เป็นต้นมาคอยทำหน้าที่ป้องกันอีกชั้นหนึ่งด้วย

SELinux ย่อมาจาก Security-Enhanced Linux แปลตรงๆ ก็หมายความว่าเป็น Linux ที่เพิ่มเติมความสามารถในเรื่องระบบรักษาความปลอดภัยให้มากขึ้นกว่าเดิม ซึ่ง SELinux นี้เป็นผลงานการวิจัยของ National Security Agency ของประเทศสหรัฐอเมริกา ที่พัฒนาระบบรักษาความปลอดภัยขึ้นมาใช้เป็นการภายใน เพื่อความคุมในการรักษาความลับของเอเจนซี่

SELinux แตกต่างจากระบบรักษาความปลอดภัยแบบเดิม เช่น Firewall, Password หรือระบบอื่นๆ อย่างระบบรักษาความปลอดภัยแบบอื่น เช่น File permission หรือว่า User Account Password นั้น จะเรียกว่าเป็นระบบ Discretionary Access Control (DAC) ซึ่งระบบแบบนี้ทุกๆ Object (ไฟล์ หรือ ไดเรคทอรี่) ต่างก็ต้องมีเจ้าของ (Owner) สิทธิในการเข้าถึง Object นั้นๆ ขึ้นอยู่กับว่าเป็น User ระดับไหน และผู้ใช้ (User)ไม่ว่าจะเป็น User ธรรมดาหรือว่า Root จะอนุญาตให้คนอื่นๆ เข้าถึงไฟล์ของตนได้โดยคำสั่ง chmod

สิ่ง ที่ SELinux แตกต่างก็คือ SELinux เป็นระบบที่เรียกว่า Mandatory Access Control (MAC) ซึ่งหมายความว่าการ Access เข้าใช้งาน Object ใดๆ ก็ตามในระบบ จะขึ้นอยู่กับ Policy ของระบบเป็นหลัก โดยไม่สนใจว่า Ownership ของ Object นั้นๆ จะเป็นของใครก็ตาม Kernel จะเป็นตัวควบคุม Policy โดยรวม

ผู้ใช้งานในระบบ User ธรรมดา หรือว่าแม้แต่ Root ก็ตาม ไม่สามารถอนุญาตให้ User คนอื่นๆ เข้าใช้งาน Object นั้นๆ ได้ ถ้ามันขัดกับ Policy โดยรวมของระบบ

การใช้ระบบรักษาความปลอดภัยแบบ MAC นี้ จะต้องทำความเข้าใจใน Concept ของเรื่องนี้กันใหม่ เพราะเมื่อ User พบกับ Error เรื่องของ Permission violation ที่ถูกควบคุมโดย SELinux แล้วละก็ User ก็มักจะแก้ปัญหาโดยการเช็คที่ Ownership ของไฟล์ และเช็คเรื่อง Permission ในการ Read, Write ,Execute ของไฟล์หรือไดเร็คทอรี่นั้นๆ แต่ว่าถึง User จะเปลี่ยน Ownership และ Permission ของ Object นั้นให้ถูกต้องแล้ว แต่ก็ยังพบว่าไม่สามารถ Access ไฟล์นั้นได้ ทั้งนี้ก็เพราะว่า Ownership และ Permission ของไฟล์ และไดเรคทอรี่นั้นไม่ใช่สิ่งที่ SELinux นำมาพิจารณา หากแต่เป็นเรื่องของ Policy ต่างหาก

ตัวอย่างที่สามารถอธิบายเรื่องนี้ได้ดีที่สุดก็คือ สมมุติว่าคุณมี Server อยู่ 1 ตัวที่รันเว็บไซต์ขายของด้วย HTTP server และในนั้นก็มีการเชื่อมต่อกับฐานข้อมูล MySQL ที่เก็บข้อมูลของสินค้าในร้านคุณ (รวมถึงข้อมูลบัตรเครดิตด้วย) ถ้าเกิดว่า Apache ที่รันเป็น Web server นั้นเกิดมีช่องโหว่ด้านระบบรักษาความปลอดภัยจนทำให้เกิดมี Hacker เจาะเข้ามาได้ ถามว่าอันตรายจะเกิดขึ้นแต่ส่วนของ Web server ใช่มั้ย? ตอบได้เลยว่าไม่ใช่ครับ

สมมุติว่า Hacker สามารถแฮคก์จนได้ Root shell ขึ้นมา ในระบบที่ไม่มี SELinux นั้น Root สามารถเข้าถึงข้อมูลบัตรเครดิตที่อยู่ใน Database ได้ เมื่อ hacker ได้เจาะเข้ามาได้ทาง Web server ละก็ ระบบทั้งหมดก็ตกอยู่ในอันตรายแล้ว แต่ถ้าเป็นระบบเดียวกันที่มีการป้องกันด้วย SELinux นั้น แม้ว่า Hacker สามารถเจาะเข้ามาทาง Web server ได้แล้ว แต่ว่าจะไม่สามารถเจาะเข้าไปที่ส่วนของ Database หรือส่วนอื่นๆ ของระบบได้ ถึงแม้ว่า Hacker นั้นจะได้ Root shell ก็ตาม

SELinux จะอนุญาตให้โพรเซสของ HTTP ติดต่อกับ Database ผ่านทาง Named pipe เท่านั้น หรืออีกความหมายหนึ่งคือ ถ้ามี SELinux แล้ว คุณไม่เชื่อใจใน Application (เพราะว่ามันอาจจะมีบั๊กหรือมีรูรั่วของระบบรักษาความปลอดภัยหรืออาจจะถูก Compromise ได้) แต่คุณไว้วางใจใน SELinux policy แทน

ระบบรักษาความ ปลอดภัยของ SELinux เปรียบเทียบได้กับระบบระบายน้ำของเรือหรือว่าเรือดำน้ำ ซึ่งท้องเรือจะมีการกั้นห้องหลายๆ ห้อง เพื่อคอยกั้นน้ำที่รั่วเข้ามาในเรือ เมื่อมีน้ำรั่วเข้ามาในห้องไหน น้ำก็จะท่วมแค่ห้องนั้นห้องเดียว จะไม่ส่งผลกระทบไปถึงห้องอื่นๆ
SELinux = Red Hat Enterprise Linux
SELinux ไม่ใช่เป็นกลุ่มของแพคเกจที่ติดตั้งเพิ่มเติมในภายหลัง แต่ว่าเป็นสิ่งที่รวมมาอยู่ในตัวของ Kernel เลย ดังนั้นเมื่อคุณใช้งาน RHEL5 นั่นก็คือคุณใช้งาน SELinux แล้ว

ก่อนอื่นขออธิบายคำศัพท์ 2 คำที่จะพูดถึงต่อไปนั่นคือ System Space และ User Space System Space ก็คือโปรแกรมใดๆ ก็ตามที่ถูกรันขึ้นมาในระหว่างขั้นตอนการบู๊ตระบบ เช่น crond, named หรือว่า Service อื่นๆ เช่น httpd, mysqld เป็นต้น ส่วนคำว่า User Space ก็คือโปรแกรมใดๆ ก็ตามที่ถูกรันโดย Logged-in user

สิ่ง ที่ RHEL5 เพิ่มมาใน SELinux ในเวอร์ชันนี้ก็คือ เพิ่มการควบคุมดูแลโพรเซสมากกว่า 200 โพรเซส (ซึ่งใน RHEL4 นั้นจะมีแค่ 15 Service เท่านั้นที่ถูกดูแลโดย SELinux) ดังนั้นจึงบอกได้ว่า ใน RHEL5 นี้มีระบบรักษาความปลอดภัยที่มากขึ้นกว่าเดิมเป็นอย่างมาก นอกจากนี้ SELinux ใน RHEL5 ยังมีความถูกต้องแม่นยำมากขึ้นในการควบคุมดูแลการทำงานของ Service ต่างๆ เป็นเรื่องที่ยากมากที่ System space ใน RHEL5 จะถูก Compromised หรือเกิด Error ที่เป็นสาเหตุมาจาก SELinux policy ไม่สามารถจัดการกับ Service ต่างๆ เหล่านั้นได้

ส่วน User Space application ก็จะถูกล็อคในรีลีสตัวต่อไปของ RHEL ซึ่ง Logged-in user ยังคงสามารถรันโปรแกรมที่ไม่ถูกจำกัดขอบเขตโดย SELinux policy ได้

มี ข้อควรจำอยู่ 2 ข้อเกี่ยวกับ User space ใน RHEL5 อย่างแรกก็คือ คำว่า Logged-in user หมายถึง User ที่เข้ามาใช้งานในระบบโดยผ่าน 3 โปรแกรมคือ login, sshd หรือ xdm เท่านั้น ซึ่งจะแตกต่างจากการที่ระบบโดน Hack เข้ามา (เช่น การแฮ็คก์เข้ามาทาง http) แล้วมาเปิด Shell ขึ้น

การแฮ็คก์ เข้ามาแบบนี้จะถูกสกัดโดย SELinux ซึ่งจะจัดการเหมือนเป็นโพสเซสหนึ่งของ Httpd อย่างที่ 2 คือ แม้ใน User space ที่ไม่ถูก SELinux จำกัด แต่ว่า SELinux จะป้องกันปัญหาเรื่องการโจมตีแบบ Buffer overflow โดยทำการตรวจสอบ Executable memory เมื่อมีการ Overflow เกิดขึ้นจะมีการเขียน Memory มากกว่าที่กำหนดไว้ใน Buffer และจะทำให้เกิด Executable code ไปเขียนข้อมูลทับได้

แต่ SELinux จะทำการตรวจสอบ Memory อยู่ตลอดเวลาว่าข้อมูลที่ถูกเขียนไปนั้น จะไม่มีวันเปลี่ยนสภาพให้กลายเป็น Executable code

นอก จากนี้ใน RHEL5 ยังมีเครื่องมือสำหรับปรับแต่งให้เราสามารถกำหนด Policy ของ SELinux ที่ใช้งานง่ายให้ด้วย นั่นคือรันคำสั่ง System-config-selinux ที่เป็นโหมดกราฟฟิก ก็จะมีหน้าต่างขึ้นมาซึ่งเราสามารถปรับแต่ง Policy ของแต่ละ Service ได้อย่างง่ายดาย

Conclusion
ทุกวันนี้ภัยที่คอย คุกคาม Computer และ Server ของคุณมีอยู่มากมาย ซึ่งบางอย่างอาจจะทำให้ข้อมูลที่มีค่าของคุณต้องเสียหายได้ในพริบตา ดังนั้นการมีระบบรักษาความปลอดภัยแบบเดิมๆ อาจจะไม่เพียงพอ ดังนั้น SELinux ใน RHEL5 จึงเป็นสิ่งที่คุณควรคจะติดตั้งและใช้งานมันทุกครั้งที่รันเครื่องในระบบ Production จริง เพราะตอนนี้ SELinux มีการใช้งานที่ง่ายมากขึ้น และยังมีความปลอดภัยมากขึ้นกว่าแต่ก่อนอีกด้วย

อย่าลืมเติม IQ ให้ตัวเองอยู่เสมอกับ ByNature นะครับ

Thanks : narong

ไม่มีความคิดเห็น: