ระบบรักษาความปลอดภัยลินุกซ์

สาเหตุหนึ่งที่ทำให้ Linux OS ประสบความสำเร็จอย่างมากบนอุปกรณ์พกพาและเซิร์ฟเวอร์แบบฝังตัวคือระดับความปลอดภัยที่ค่อนข้างสูงของเคอร์เนล บริการและแอปพลิเคชันที่เกี่ยวข้อง แต่ถ้า ลองดูอย่างใกล้ชิด สำหรับสถาปัตยกรรมของเคอร์เนล Linux นั้นเป็นไปไม่ได้ที่จะหาสี่เหลี่ยมจัตุรัสที่รับผิดชอบด้านความปลอดภัยเช่นนี้ ระบบย่อยความปลอดภัยของ Linux ซ่อนอยู่ที่ไหนและประกอบด้วยอะไรบ้าง?

ความเป็นมาของ Linux Security Modules และ SELinux

Security Enhanced Linux เป็นชุดของกฎและกลไกการเข้าถึงตามโมเดลการเข้าถึงแบบบังคับและตามบทบาทเพื่อปกป้องระบบ Linux จากภัยคุกคามที่อาจเกิดขึ้น และแก้ไขจุดอ่อนของ Discretionary Access Control (DAC) ซึ่งเป็นระบบรักษาความปลอดภัย Unix แบบดั้งเดิม โครงการนี้เกิดขึ้นจากส่วนลึกของสำนักงานความมั่นคงแห่งชาติของสหรัฐฯ และบริษัทผู้รับเหมาอย่าง Secure Computing Corporation และ MITER รวมถึงห้องปฏิบัติการวิจัยจำนวนหนึ่งได้มีส่วนร่วมโดยตรงในการพัฒนา

ระบบรักษาความปลอดภัยลินุกซ์
โมดูลความปลอดภัยของ Linux

Linus Torvalds ได้ให้ข้อสังเกตจำนวนหนึ่งเกี่ยวกับการพัฒนา NSA ใหม่ เพื่อให้สามารถรวมไว้ในสาขาหลักของเคอร์เนล Linux เขาอธิบายถึงสภาพแวดล้อมทั่วไป โดยมีชุดตัวสกัดกั้นสำหรับจัดการการดำเนินการกับออบเจกต์และชุดของฟิลด์ป้องกันบางส่วนในโครงสร้างข้อมูลเคอร์เนลสำหรับจัดเก็บแอตทริบิวต์ที่เกี่ยวข้อง สภาพแวดล้อมนี้สามารถใช้โดยโมดูลเคอร์เนลที่โหลดได้เพื่อใช้แบบจำลองความปลอดภัยที่ต้องการ LSM เข้าสู่ Linux kernel v2.6 อย่างสมบูรณ์ในปี 2003

เฟรมเวิร์ก LSM รวมถึงฟิลด์ป้องกันในโครงสร้างข้อมูลและการเรียกฟังก์ชันการสกัดกั้นที่จุดวิกฤตในรหัสเคอร์เนลเพื่อจัดการฟิลด์เหล่านั้นและดำเนินการควบคุมการเข้าถึง นอกจากนี้ยังเพิ่มฟังก์ชันสำหรับการลงทะเบียนโมดูลความปลอดภัย อินเตอร์เฟส /sys/kernel/security/lsm มีรายการของโมดูลที่ใช้งานอยู่ในระบบ ตะขอ LSM ถูกจัดเก็บไว้ในรายการที่เรียกตามลำดับที่ระบุใน CONFIG_LSM เอกสาร hook โดยละเอียดรวมอยู่ในไฟล์ส่วนหัว include/linux/lsm_hooks.h

ระบบย่อย LSM ทำให้สามารถผสานรวม SELinux ของเคอร์เนล Linux v2.6 รุ่นเดียวกันได้อย่างสมบูรณ์ ในทันที SELinux กลายเป็นมาตรฐานโดยพฤตินัยสำหรับสภาพแวดล้อม Linux ที่ปลอดภัย และกลายเป็นส่วนหนึ่งของการกระจายที่ได้รับความนิยมมากที่สุด: RedHat Enterprise Linux, Fedora, Debian, Ubuntu

อภิธานศัพท์

  • เอกลักษณ์ - ผู้ใช้ SELinux ไม่เหมือนกับรหัสผู้ใช้ Unix / Linux ทั่วไป พวกเขาสามารถอยู่ร่วมกันในระบบเดียวกันได้ แต่มีความแตกต่างกันอย่างสิ้นเชิงในสาระสำคัญ บัญชี Linux มาตรฐานแต่ละบัญชีสามารถสอดคล้องกับ SELinux ตั้งแต่หนึ่งบัญชีขึ้นไป ข้อมูลประจำตัว SELinux เป็นส่วนหนึ่งของบริบทความปลอดภัยโดยรวมที่กำหนดโดเมนที่คุณสามารถและไม่สามารถเข้าร่วมได้
  • โดเมน - ใน SELinux โดเมนคือบริบทการดำเนินการของหัวเรื่อง เช่น กระบวนการ โดเมนกำหนดการเข้าถึงโดยตรงที่กระบวนการมี โดเมนคือรายการของกระบวนการที่สามารถทำได้ หรือการดำเนินการใดที่กระบวนการสามารถทำได้กับประเภทต่างๆ ตัวอย่างของโดเมน ได้แก่ sysadm_t สำหรับการดูแลระบบ และ user_t ซึ่งเป็นโดเมนผู้ใช้ทั่วไปที่ไม่มีสิทธิ์ ระบบ init ทำงานในโดเมน init_t และกระบวนการที่มีชื่อทำงานในโดเมน name_t
  • บทบาท - สิ่งที่ทำหน้าที่เป็นสื่อกลางระหว่างโดเมนและผู้ใช้ SELinux บทบาทกำหนดโดเมนที่ผู้ใช้สามารถเป็นเจ้าของได้ และประเภทของวัตถุที่ผู้ใช้สามารถเข้าถึงได้ กลไกการควบคุมการเข้าถึงดังกล่าวป้องกันภัยคุกคามจากการโจมตีระดับสิทธิ์ บทบาทถูกเขียนลงในโมเดลความปลอดภัย Role Based Access Control (RBAC) ที่ใช้ใน SELinux
  • ประเภท — พิมพ์แอตทริบิวต์รายการการบังคับใช้ที่กำหนดให้กับวัตถุและกำหนดว่าใครจะมีสิทธิ์เข้าถึง คล้ายกับการกำหนดโดเมน ยกเว้นว่าโดเมนนั้นใช้กับกระบวนการ ในขณะที่ประเภทนั้นใช้กับออบเจกต์ เช่น ไดเร็กทอรี ไฟล์ ซ็อกเก็ต และอื่นๆ
  • หัวเรื่องและวัตถุ - กระบวนการเป็นเรื่องและทำงานในบริบทเฉพาะหรือโดเมนความปลอดภัย ทรัพยากรของระบบปฏิบัติการ: ไฟล์ ไดเร็กทอรี ซ็อกเก็ต ฯลฯ เป็นออบเจกต์ที่กำหนดประเภทบางอย่าง หรืออีกนัยหนึ่งคือระดับความลับ
  • นโยบาย SELinux - SELinux ใช้นโยบายที่หลากหลายในการปกป้องระบบ นโยบาย SELinux กำหนดการเข้าถึงของผู้ใช้ในบทบาท บทบาทในโดเมน และโดเมนในประเภทต่างๆ ขั้นแรก ผู้ใช้ได้รับอนุญาตให้รับบทบาท จากนั้นบทบาทจะได้รับอนุญาตให้เข้าถึงโดเมน สุดท้าย โดเมนอาจมีสิทธิ์เข้าถึงวัตถุบางประเภทเท่านั้น

สถาปัตยกรรม LSM และ SELinux

แม้จะมีชื่อ LSM ไม่ใช่โมดูล Linux ที่สามารถโหลดได้โดยทั่วไป อย่างไรก็ตาม เช่นเดียวกับ SELinux มันถูกรวมเข้ากับเคอร์เนลโดยตรง การเปลี่ยนแปลงใด ๆ กับซอร์สโค้ด LSM ต้องมีการคอมไพล์เคอร์เนลใหม่ ต้องเปิดใช้งานตัวเลือกที่เกี่ยวข้องในการตั้งค่าเคอร์เนล มิฉะนั้น รหัส LSM จะไม่เปิดใช้งานหลังจากบูต แต่ในกรณีนี้ มันสามารถเปิดใช้งานได้ด้วยตัวเลือก bootloader ของระบบปฏิบัติการ

ระบบรักษาความปลอดภัยลินุกซ์
กองตรวจสอบ LSM

LSM ติดตั้ง hooks ในฟังก์ชันเคอร์เนลหลักที่อาจเกี่ยวข้องกับการตรวจสอบ คุณสมบัติหลักประการหนึ่งของ LSM คือเป็นแบบสแต็ก ดังนั้น การตรวจสอบมาตรฐานจึงยังคงดำเนินการอยู่ และแต่ละเลเยอร์ LSM จะเพิ่มการควบคุมและการควบคุมเพิ่มเติมเท่านั้น ซึ่งหมายความว่าการแบนไม่สามารถย้อนกลับได้ ดังแสดงในรูป หากผลการตรวจสอบ DAC ตามปกติล้มเหลว ก็จะไม่ถึง LSM hooks

SELinux นำสถาปัตยกรรมการรักษาความปลอดภัยของ Flask มาใช้ในระบบปฏิบัติการวิจัยของ Fluke โดยเฉพาะหลักการของสิทธิพิเศษน้อยที่สุด สาระสำคัญของแนวคิดนี้ตามชื่อของมันคือการให้สิทธิ์แก่ผู้ใช้หรือดำเนินการเฉพาะสิทธิ์ที่จำเป็นสำหรับการดำเนินการตามที่ตั้งใจไว้ หลักการนี้ถูกนำมาใช้โดยใช้การพิมพ์การเข้าถึงแบบบังคับ ดังนั้นการควบคุมการเข้าถึงของ SELinux จึงขึ้นอยู่กับโมเดลประเภทโดเมน =>

SELinux มีความสามารถในการควบคุมการเข้าถึงมากกว่ารุ่น DAC ดั้งเดิมที่ใช้ในระบบปฏิบัติการ Unix/Linux ด้วยการบังคับใช้การพิมพ์การเข้าถึง ตัวอย่างเช่น คุณสามารถจำกัดหมายเลขพอร์ตเครือข่ายที่จะเกิดขึ้นกับเซิร์ฟเวอร์ ftp อนุญาตให้เขียนและเปลี่ยนไฟล์ในบางโฟลเดอร์ แต่ไม่สามารถลบได้

ส่วนประกอบหลักของ SELinux คือ:

  • เซิร์ฟเวอร์บังคับใช้นโยบาย - กลไกหลักในการจัดระเบียบการควบคุมการเข้าถึง
  • ฐานข้อมูลนโยบายความปลอดภัยของระบบ
  • การโต้ตอบกับผู้ฟังเหตุการณ์ LSM
  • เซลินุกซ์ - Pseudo-FS เหมือนกับ /proc และติดตั้งใน /sys/fs/selinux เติมข้อมูลแบบไดนามิกโดยเคอร์เนล Linux ขณะรันไทม์ และมีไฟล์ที่มีข้อมูลสถานะ SELinux
  • เข้าถึงแคชเวกเตอร์ - กลไกเสริมเพื่อปรับปรุงประสิทธิภาพ

ระบบรักษาความปลอดภัยลินุกซ์
SELinux ทำงานอย่างไร

ทั้งหมดนี้ใช้งานได้ดังนี้

  1. หัวเรื่อง ในแง่ SELinux ดำเนินการที่ได้รับอนุญาตกับวัตถุหลังจากการตรวจสอบ DAC ดังที่แสดงในภาพบนสุด คำขอดำเนินการนี้ส่งไปยังผู้ฟังเหตุการณ์ LSM
  2. จากนั้น คำขอพร้อมกับบริบทความปลอดภัยของหัวเรื่องและวัตถุจะถูกส่งผ่านไปยังโมดูล SELinux Abstraction และ Hook Logic ที่รับผิดชอบในการโต้ตอบกับ LSM
  3. เซิร์ฟเวอร์การบังคับใช้นโยบายเป็นหน่วยงานที่มีอำนาจในการตัดสินใจเกี่ยวกับการเข้าถึงออบเจกต์ของอาสาสมัคร และรับข้อมูลจาก SELinux AnHL
  4. ในการตัดสินใจเกี่ยวกับการเข้าถึงหรือการห้าม เซิร์ฟเวอร์การบังคับใช้นโยบายหมายถึงระบบย่อยการแคชของกฎ Access Vector Cache (AVC) ที่ใช้มากที่สุด
  5. หากไม่พบวิธีแก้ปัญหาสำหรับกฎที่เกี่ยวข้องในแคช คำขอจะถูกส่งต่อไปยังฐานข้อมูลนโยบายความปลอดภัย
  6. ผลการค้นหาจากฐานข้อมูลและ AVC จะถูกส่งกลับไปยังเซิร์ฟเวอร์การบังคับใช้นโยบาย
  7. หากนโยบายที่พบสอดคล้องกับการดำเนินการที่ร้องขอ การดำเนินการจะได้รับอนุญาต มิฉะนั้นจะถูกห้ามดำเนินการ

การจัดการการตั้งค่า SELinux

SELinux ทำงานในหนึ่งในสามโหมด:

  • การบังคับใช้ - การบังคับใช้นโยบายความปลอดภัยอย่างเข้มงวด
  • อนุญาต - อนุญาตให้ละเมิดข้อ จำกัด ทำเครื่องหมายที่เกี่ยวข้องในบันทึก
  • ปิดใช้งาน - นโยบายความปลอดภัยไม่มีผล

คุณสามารถดูว่า SELinux อยู่ในโหมดใดด้วยคำสั่งต่อไปนี้

[admin@server ~]$ getenforce
Permissive

การเปลี่ยนโหมดก่อนรีบูต เช่น ตั้งค่าเป็นบังคับใช้ หรือ 1. พารามิเตอร์ที่อนุญาตสอดคล้องกับรหัสตัวเลข 0

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

คุณยังสามารถเปลี่ยนโหมดได้ด้วยการแก้ไขไฟล์:

[admin@server ~]$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

SELINUXTYPE=เป้าหมาย

ข้อแตกต่างกับ setenfoce คือเมื่อระบบปฏิบัติการบูท โหมด SELinux จะถูกตั้งค่าตามค่าของพารามิเตอร์ SELINUX ในไฟล์คอนฟิกูเรชัน นอกจากนี้ การบังคับใช้ <=> การเปลี่ยนแปลงที่ปิดใช้งานจะมีผลผ่านการแก้ไขไฟล์ /etc/selinux/config และหลังจากรีบูตเท่านั้น

ดูรายงานสถานะสรุป:

[admin@server ~]$ sestatus

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31

หากต้องการดูแอตทริบิวต์ SELinux ยูทิลิตี้สต็อกบางตัวใช้ตัวเลือก -Z

[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL                             PID TTY          TIME CMD
system_u:system_r:httpd_t:s0     2914 ?        00:00:04 httpd
system_u:system_r:httpd_t:s0     2915 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2916 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2917 ?        00:00:00 httpd
...
system_u:system_r:httpd_t:s0     2918 ?        00:00:00 httpd

เมื่อเทียบกับเอาต์พุต ls -l ปกติ มีฟิลด์เพิ่มเติมหลายฟิลด์ในรูปแบบต่อไปนี้:

<user>:<role>:<type>:<level>

ฟิลด์สุดท้ายหมายถึงบางอย่าง เช่น ตราประทับความปลอดภัย และประกอบด้วยองค์ประกอบสองอย่างรวมกัน:

  • s0 - นัยสำคัญ บันทึกเป็นช่วงระดับต่ำ-ระดับสูงด้วย
  • c0, c1… c1023 คือหมวดหมู่

การเปลี่ยนการกำหนดค่าการเข้าถึง

ใช้ semodule เพื่อโหลดโมดูล SELinux เพิ่มและลบออก

[admin@server ~]$ semodule -l |wc -l #список всех модулей
408
[admin@server ~]$ semodule -e abrt #enable - активировать модуль
[admin@server ~]$ semodule -d accountsd #disable - отключить модуль
[admin@server ~]$ semodule -r avahi #remove - удалить модуль

ทีมแรก เข้าสู่ระบบ Semanage เชื่อมโยงผู้ใช้ SELinux กับผู้ใช้ระบบปฏิบัติการ รายการที่สองแสดงรายการนั้น สุดท้าย คำสั่งสุดท้ายที่มีสวิตช์ -r จะลบการแมปผู้ใช้ SELinux กับบัญชี OS คำอธิบายไวยากรณ์ของค่าช่วง MLS/MCS อยู่ในส่วนก่อนหน้า

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol

ทีม ผู้ใช้ Semanage ใช้ในการจัดการการแมประหว่างผู้ใช้ SELinux และบทบาท

[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

ตัวเลือกคำสั่ง:

  • -a เพิ่มรายการการแมปบทบาทที่กำหนดเอง
  • -l รายชื่อผู้ใช้และบทบาทที่ตรงกัน
  • -d ลบรายการการแมปบทบาทที่กำหนดเอง
  • -R รายการบทบาทที่แนบมากับผู้ใช้

ไฟล์ พอร์ต และบูลีน

โมดูล SELinux แต่ละโมดูลมีชุดกฎการทำเครื่องหมายไฟล์ แต่คุณสามารถเพิ่มกฎของคุณเองได้หากจำเป็น ตัวอย่างเช่น เราต้องการให้เว็บเซิร์ฟเวอร์มีสิทธิ์เข้าถึงโฟลเดอร์ /srv/www

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

คำสั่งแรกจะลงทะเบียนกฎการทำเครื่องหมายใหม่ และคำสั่งที่สองจะรีเซ็ตหรือเปิดเผยประเภทไฟล์ตามกฎปัจจุบัน

ในทำนองเดียวกัน พอร์ต TCP/UDP จะถูกทำเครื่องหมายในลักษณะที่เฉพาะบริการที่เหมาะสมเท่านั้นที่สามารถรับฟังได้ ตัวอย่างเช่น เพื่อให้เว็บเซิร์ฟเวอร์รับฟังพอร์ต 8080 คุณต้องเรียกใช้คำสั่ง

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

โมดูล SELinux จำนวนมากมีพารามิเตอร์ที่สามารถรับค่าบูลีนได้ รายการทั้งหมดของตัวเลือกดังกล่าวสามารถดูได้ด้วย getsebool -a ค่าบูลีนสามารถเปลี่ยนแปลงได้โดยใช้ setsebool

[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off

ปฏิบัติ เข้าถึง Pgadmin-web interface

ลองพิจารณาตัวอย่างจากการปฏิบัติ เราติดตั้ง pgadmin7.6-web บน RHEL 4 เพื่อจัดการฐานข้อมูล PostgreSQL เราผ่านไปเล็กน้อย การแสวงหา ด้วยการตั้งค่า pg_hba.conf, postgresql.conf และ config_local.py, ตั้งค่าสิทธิ์ให้กับโฟลเดอร์, ติดตั้งโมดูล Python ที่หายไปจาก pip ทุกอย่างพร้อมวิ่งและรับ 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์.

ระบบรักษาความปลอดภัยลินุกซ์

เราเริ่มต้นด้วยผู้ต้องสงสัยทั่วไป ตรวจสอบ /var/log/httpd/error_log มีบางรายการที่น่าสนใจที่นั่น

[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690] [timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.

ณ จุดนี้ ผู้ดูแลระบบ Linux ส่วนใหญ่จะถูกล่อลวงอย่างมากให้เรียกใช้ setencorce 0 และดำเนินการกับมัน พูดตามตรงว่านี่เป็นครั้งแรกที่ฉันทำ แน่นอนว่านี่เป็นทางออก แต่ยังห่างไกลจากสิ่งที่ดีที่สุด

แม้จะมีการออกแบบที่ยุ่งยาก แต่ SELinux ก็เป็นมิตรกับผู้ใช้ เพียงติดตั้งแพ็คเกจ setroubleshoot และดูบันทึกของระบบ

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

โปรดทราบว่าบริการ auditd จะต้องเริ่มต้นใหม่ด้วยวิธีนี้ ไม่ใช่ด้วย systemctl แม้ว่าจะมี systemd อยู่ในระบบปฏิบัติการก็ตาม ในบันทึกของระบบ จะถูกระบุ ไม่เพียง แต่ข้อเท็จจริงของการปิดกั้นเท่านั้น แต่ยังรวมถึงเหตุผลและ วิธีที่จะเอาชนะการห้าม.

ระบบรักษาความปลอดภัยลินุกซ์

เราดำเนินการคำสั่งเหล่านี้:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

เราตรวจสอบการเข้าถึงหน้าเว็บ pgadmin4 ทุกอย่างใช้งานได้

ระบบรักษาความปลอดภัยลินุกซ์

ระบบรักษาความปลอดภัยลินุกซ์

ที่มา: will.com

เพิ่มความคิดเห็น