ค้นหาเว็บไซต์

การใช้การควบคุมการเข้าถึงภาคบังคับด้วย SELinux หรือ AppArmor ใน Linux


เพื่อเอาชนะข้อจำกัดและเพื่อเพิ่มกลไกการรักษาความปลอดภัยที่ได้รับจากสิทธิ์มาตรฐาน ugo/rwx และรายการควบคุมการเข้าถึง สำนักงานความมั่นคงแห่งชาติของสหรัฐอเมริกา (NSA) ได้คิดค้น วิธีควบคุมการเข้าถึงที่บังคับ (MAC) ที่เรียกว่า SELinux (ย่อมาจาก Security Enhanced Linux) เพื่อจำกัดเหนือสิ่งอื่นใด ความสามารถของกระบวนการในการ เข้าถึงหรือดำเนินการอื่นๆ บนออบเจ็กต์ระบบ (เช่น ไฟล์ ไดเร็กทอรี พอร์ตเครือข่าย ฯลฯ) โดยได้รับอนุญาตน้อยที่สุด ในขณะที่ยังคงอนุญาตให้มีการแก้ไขโมเดลนี้ในภายหลัง

MAC ที่ได้รับความนิยมและใช้กันอย่างแพร่หลายอีกเครื่องหนึ่งคือ AppArmor ซึ่งนอกเหนือจากคุณสมบัติที่ SELinux มีให้แล้ว ยังมีโหมดการเรียนรู้ที่ช่วยให้ระบบ "เรียนรู้ ” วิธีการทำงานของแอปพลิเคชันเฉพาะ และกำหนดขีดจำกัดโดยการกำหนดค่าโปรไฟล์สำหรับการใช้งานแอปพลิเคชันที่ปลอดภัย

ใน CentOS 7 นั้น SELinux จะรวมอยู่ในเคอร์เนลและเปิดใช้งานในโหมด บังคับใช้ ตามค่าเริ่มต้น (เพิ่มเติมเกี่ยวกับเรื่องนี้ในส่วนถัดไป) ตรงข้ามกับ openSUSE และ Ubuntu ซึ่งใช้ AppArmor

ในบทความนี้ เราจะอธิบายสิ่งสำคัญของ SELinux และ AppArmor และวิธีการใช้เครื่องมือเหล่านี้เพื่อประโยชน์ของคุณ โดยขึ้นอยู่กับการเผยแพร่ที่คุณเลือก

ข้อมูลเบื้องต้นเกี่ยวกับ SELinux และวิธีใช้งานบน CentOS 7

Security Enhanced Linux สามารถดำเนินการได้สองวิธี:

  1. การบังคับใช้: SELinux ปฏิเสธการเข้าถึงตามกฎนโยบายของ SELinux ซึ่งเป็นชุดแนวทางที่ควบคุมกลไกการรักษาความปลอดภัย
  2. อนุญาต: SELinux ไม่ได้ปฏิเสธการเข้าถึง แต่การปฏิเสธจะถูกบันทึกไว้สำหรับการดำเนินการที่อาจถูกปฏิเสธหากทำงานในโหมดบังคับใช้

SELinux ยังสามารถปิดการใช้งานได้ แม้ว่าจะไม่ใช่โหมดการทำงาน แต่ก็ยังเป็นตัวเลือก อย่างไรก็ตาม การเรียนรู้วิธีใช้เครื่องมือนี้ดีกว่าการเพิกเฉยต่อมัน เก็บไว้ในใจ!

หากต้องการแสดงโหมดปัจจุบันของ SELinux ให้ใช้ getenforce หากคุณต้องการสลับโหมดการทำงาน ให้ใช้ setenforce 0 (เพื่อตั้งค่าเป็น อนุญาต) หรือ setenforce 1 (บังคับใช้) แข็งแกร่ง>)

เนื่องจากการเปลี่ยนแปลงนี้ไม่สามารถ รีบูต ได้ คุณจะต้องแก้ไขไฟล์ /etc/selinux/config และตั้งค่าตัวแปร SELINUX เป็นอย่างใดอย่างหนึ่ง บังคับใช้, อนุญาต หรือ ปิดใช้งาน เพื่อให้เกิดการคงอยู่ตลอดการรีบูต:

หมายเหตุด้านข้าง หาก getenforce ส่งคืน Disabled คุณจะต้องแก้ไข /etc/selinux/config ด้วยโหมดการทำงานที่ต้องการและรีบูต มิฉะนั้น คุณจะไม่สามารถตั้งค่า (หรือสลับ) โหมดการทำงานด้วย setenforce ได้

การใช้งานทั่วไปอย่างหนึ่งของ setenforce ประกอบด้วยการสลับระหว่างโหมด SELinux (จาก การบังคับใช้ เป็น อนุญาต หรือวิธีอื่น ๆ ) เพื่อแก้ไขปัญหาแอปพลิเคชันที่ ทำงานผิดปกติหรือไม่ทำงานตามที่คาดไว้ หากใช้งานได้หลังจากที่คุณตั้งค่า SELinux เป็นโหมด อนุญาต คุณจะมั่นใจได้ว่าคุณกำลังดูปัญหาสิทธิ์ของ SELinux

สองกรณีคลาสสิกที่เรามักจะต้องจัดการกับ SELinux คือ:

  1. การเปลี่ยนพอร์ตดีฟอลต์ที่ daemon ฟังอยู่
  2. การตั้งค่าคำสั่ง DocumentRoot สำหรับโฮสต์เสมือนภายนอก /var/www/html

ลองมาดูทั้งสองกรณีนี้โดยใช้ตัวอย่างต่อไปนี้

ตัวอย่างที่ 1: การเปลี่ยนพอร์ตดีฟอลต์สำหรับ sshd daemon

สิ่งแรกที่ผู้ดูแลระบบส่วนใหญ่ทำเพื่อรักษาความปลอดภัยเซิร์ฟเวอร์คือเปลี่ยนพอร์ตที่ SSH daemon ฟังอยู่ ซึ่งส่วนใหญ่จะกีดกันเครื่องสแกนพอร์ตและผู้โจมตีภายนอก ในการดำเนินการนี้ เราใช้คำสั่ง Port ใน /etc/ssh/sshd_config ตามด้วยหมายเลขพอร์ตใหม่ดังต่อไปนี้ (เราจะใช้พอร์ต 9999 ในกรณีนี้):


Port 9999

หลังจากพยายามรีสตาร์ทบริการและตรวจสอบสถานะแล้ว เราจะพบว่าไม่สามารถเริ่มบริการได้:


systemctl restart sshd
systemctl status sshd

หากเราดูที่ /var/log/audit/audit.log เราจะเห็นว่า sshd ถูกป้องกันไม่ให้เริ่มทำงานบนพอร์ต 9999 โดย SELinux เนื่องจากเป็นพอร์ตที่สงวนไว้สำหรับบริการ JBoss Management (ข้อความบันทึกของ SELinux มีคำว่า “AVC” เพื่อให้สามารถใช้งานได้อย่างง่ายดาย ระบุจากข้อความอื่น):


cat /var/log/audit/audit.log | grep AVC | tail -1

ณ จุดนี้คนส่วนใหญ่อาจจะปิดการใช้งาน SELinux แต่เราจะไม่ทำเช่นนั้น เราจะเห็นว่ามีวิธีสำหรับ SELinux และการฟัง sshd บนพอร์ตอื่น เพื่ออยู่ร่วมกันอย่างกลมกลืน ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งและเรียกใช้แพ็คเกจ policycoreutils-python แล้ว:


yum install policycoreutils-python

หากต้องการดูรายการพอร์ตที่ SELinux อนุญาตให้ sshd ฟัง ในภาพต่อไปนี้ เรายังเห็นได้ว่าพอร์ต 9999 ถูกสงวนไว้สำหรับบริการอื่น ดังนั้นเราจึงไม่สามารถใช้พอร์ตนี้เพื่อใช้บริการอื่นได้ในขณะนี้:


semanage port -l | grep ssh

แน่นอนว่าเราสามารถเลือกพอร์ตอื่นสำหรับ SSH ได้ แต่หากเราแน่ใจว่าเราจะไม่จำเป็นต้องใช้เครื่องเฉพาะนี้สำหรับบริการที่เกี่ยวข้องกับ JBoss ใดๆ เราก็สามารถแก้ไขกฎ SELinux ที่มีอยู่และกำหนดพอร์ตนั้นให้กับ SSH แทนได้:


semanage port -m -t ssh_port_t -p tcp 9999

หลังจากนั้น เราสามารถใช้คำสั่ง semanage คำสั่งแรกเพื่อตรวจสอบว่าพอร์ตถูกกำหนดอย่างถูกต้องหรือไม่ หรือใช้ตัวเลือก -lC (ย่อมาจาก list custom):


semanage port -lC
semanage port -l | grep ssh

ตอนนี้เราสามารถรีสตาร์ท SSH และเชื่อมต่อกับบริการโดยใช้พอร์ต 9999 โปรดทราบว่าการเปลี่ยนแปลงนี้จะรอดจากการรีบูต

ตัวอย่างที่ 2: การเลือก DocumentRoot ภายนอก /var/www/html สำหรับโฮสต์เสมือน

หากคุณต้องการตั้งค่าโฮสต์เสมือนของ Apache โดยใช้ไดเรกทอรีอื่นที่ไม่ใช่ /var/www/html เป็น DocumentRoot (เช่น /websrv/sites /กาเบรียล/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

Apache จะปฏิเสธที่จะให้บริการเนื้อหาเนื่องจาก index.html มีป้ายกำกับเป็นประเภท default_t SELinux ซึ่ง Apache ไม่สามารถเข้าถึงได้:


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

เช่นเดียวกับตัวอย่างก่อนหน้านี้ คุณสามารถใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่านี่เป็นปัญหาที่เกี่ยวข้องกับ SELinux จริงหรือไม่:


cat /var/log/audit/audit.log | grep AVC | tail -1

หากต้องการเปลี่ยนป้ายกำกับของ /websrv/sites/gabriel/public_html ซ้ำเป็น httpd_sys_content_t ให้ทำดังนี้


semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

คำสั่งดังกล่าวจะให้สิทธิ์การเข้าถึง Apache แบบอ่านอย่างเดียวในไดเร็กทอรีนั้นและเนื้อหาในนั้น

สุดท้าย หากต้องการใช้นโยบาย (และทำให้การเปลี่ยนแปลงป้ายกำกับมีผลทันที) ให้ทำดังนี้


restorecon -R -v /websrv/sites/gabriel/public_html

ตอนนี้คุณควรจะสามารถเข้าถึงไดเร็กทอรีได้:


wget http://localhost/index.html

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ SELinux โปรดดู Fedora 22 SELinux และคู่มือผู้ดูแลระบบ