การใช้การควบคุมการเข้าถึงภาคบังคับด้วย 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 สามารถดำเนินการได้สองวิธี:
- การบังคับใช้: SELinux ปฏิเสธการเข้าถึงตามกฎนโยบายของ SELinux ซึ่งเป็นชุดแนวทางที่ควบคุมกลไกการรักษาความปลอดภัย
- อนุญาต: SELinux ไม่ได้ปฏิเสธการเข้าถึง แต่การปฏิเสธจะถูกบันทึกไว้สำหรับการดำเนินการที่อาจถูกปฏิเสธหากทำงานในโหมดบังคับใช้
SELinux ยังสามารถปิดการใช้งานได้ แม้ว่าจะไม่ใช่โหมดการทำงาน แต่ก็ยังเป็นตัวเลือก อย่างไรก็ตาม การเรียนรู้วิธีใช้เครื่องมือนี้ดีกว่าการเพิกเฉยต่อมัน เก็บไว้ในใจ!
หากต้องการแสดงโหมดปัจจุบันของ SELinux ให้ใช้ getenforce
หากคุณต้องการสลับโหมดการทำงาน ให้ใช้ setenforce 0
(เพื่อตั้งค่าเป็น อนุญาต) หรือ setenforce 1
(บังคับใช้) แข็งแกร่ง>)
เนื่องจากการเปลี่ยนแปลงนี้ไม่สามารถ รีบูต ได้ คุณจะต้องแก้ไขไฟล์ /etc/selinux/config และตั้งค่าตัวแปร SELINUX เป็นอย่างใดอย่างหนึ่ง บังคับใช้
, อนุญาต
หรือ ปิดใช้งาน
เพื่อให้เกิดการคงอยู่ตลอดการรีบูต:
หมายเหตุด้านข้าง หาก getenforce
ส่งคืน Disabled คุณจะต้องแก้ไข /etc/selinux/config ด้วยโหมดการทำงานที่ต้องการและรีบูต มิฉะนั้น คุณจะไม่สามารถตั้งค่า (หรือสลับ) โหมดการทำงานด้วย setenforce
ได้
การใช้งานทั่วไปอย่างหนึ่งของ setenforce
ประกอบด้วยการสลับระหว่างโหมด SELinux (จาก การบังคับใช้ เป็น อนุญาต หรือวิธีอื่น ๆ ) เพื่อแก้ไขปัญหาแอปพลิเคชันที่ ทำงานผิดปกติหรือไม่ทำงานตามที่คาดไว้ หากใช้งานได้หลังจากที่คุณตั้งค่า SELinux เป็นโหมด อนุญาต คุณจะมั่นใจได้ว่าคุณกำลังดูปัญหาสิทธิ์ของ SELinux
สองกรณีคลาสสิกที่เรามักจะต้องจัดการกับ SELinux คือ:
- การเปลี่ยนพอร์ตดีฟอลต์ที่ daemon ฟังอยู่
- การตั้งค่าคำสั่ง 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 และคู่มือผู้ดูแลระบบ