วิธีใดที่จะกระตุ้นการละเมิดนโยบายของ SELinux


12

ฉันกำลังศึกษาการทำงานขั้นพื้นฐานของ SELinux และจะพบว่ามีประโยชน์ในการทำให้เกิดการปฏิเสธ เครื่องทดสอบของฉันใช้งาน CentOS 7 มันเป็นเซิร์ฟเวอร์พื้นฐานที่ติดตั้งโดยไม่มีบริการพิเศษใด ๆ และทำให้รัฐ 'บังคับใช้' ดังนั้นฉันจึงมั่นใจว่าการทำ / รูททั่วโลกสามารถอ่านได้และการพยายามอ่านไฟล์จากที่นั่นเนื่องจากผู้ใช้ที่ไม่มีสิทธิพิเศษจะทำเคล็ดลับ แต่ไม่มีโชค! ใครช่วยแนะนำการทดสอบอย่างรวดเร็ว? พยายามเข้าถึงพา ธ หรือเปิดพอร์ต ฯลฯ

เป็นการดีที่ฉันกำลังมองหาคำสั่งเชลล์ที่ตรงไปตรงมาซึ่ง DAC จะไม่ จำกัด แต่ MAC จะสังเกตเห็นและปฏิเสธ ดังนั้นฉันจึงไม่ต้องการรวบรวมโปรแกรม bespoke หรือติดตั้งบริการเฉพาะ (เช่นเว็บเซิร์ฟเวอร์) เพื่อให้ได้สิ่งนี้ สิ่งนี้มีค่าเนื่องจากเป็นวิธีการทั่วไปและชัดเจนในการมองเห็นการทำงานของ SELinux

ฉันไม่มีปัญหาในการแก้ไข DAC (เช่นสิทธิ์ระบบไฟล์) เพื่อให้มีข้อ จำกัด น้อยกว่าโดยค่าเริ่มต้นซึ่งเป็นส่วนหนึ่งของการทดสอบ


1
+1 การรู้จักวิธีกระตุ้นระบบป้องกันของคุณเพื่อให้คุณสามารถตรวจสอบว่าระบบทำงานเป็นขั้นตอนสำคัญและพลาดไม่ได้
gowenfawr

ฉันลงคะแนนให้ปิดคำถามนี้เป็นหัวข้อนอกเพราะเป็นของ Unix & Linux SE
Mark

คำตอบ:


3

เพื่อสาธิตยูทิลิตี้ของ SELinux ในการตรวจจับบั๊กสำหรับรหัสของบุคคลที่สาม / นักพัฒนาของคุณเองนี่คือการทดสอบการป้องกันหน่วยความจำ (แก้ไขตัวอย่างรหัสแรกที่นี่ ):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
รวบรวมและแสดงค่าเริ่มต้น (ไม่จับ)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

เปลี่ยน booleans เพื่อตรวจจับปัญหา:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

สิ่งนี้มีประโยชน์อย่างแน่นอนและมีเอกสารอย่างดี (+1) ถึงแม้ว่าฉันไม่ใช่โปรแกรมเมอร์และไม่เข้าใจรหัสจริงๆ โดยหลักการแล้วฉันต้องการเห็นตัวอย่างที่ชัดเจนของ SELinux ที่ปฏิเสธความพยายามในการเปิดพอร์ตหรือเข้าถึงพา ธ โดยใช้เครื่องมือบรรทัดคำสั่งอย่างง่ายเช่น shell, netcat, telnet เป็นต้นฉันจะแก้ไขคำถามเพื่อให้ชัดเจนขึ้น
คิด

ฉันต้องค้นหารหัสด้วยตนเอง ฉันดีใจที่คุณเพิ่มการทดสอบทุบตีด้านล่าง ฉันออกจากข้อผิดพลาด Snort และ postfix (อาจจะเป็น dovecot) ใน CentOS7 เพราะมันเป็นแพ็คเกจมีการติดตั้งมากกว่านี้มันอาจจะได้รับการแก้ไขในภายหลังและมันก็เป็นแค่การกำหนดค่าที่มากกว่า หากคุณใช้วิธีนี้เป็นประโยชน์สำหรับการสร้างนโยบาย
3bρɯͽ

3

สิ่งนี้แสดงให้เห็นถึงนโยบาย MAC ที่ชัดเจนว่า DAC ที่เทียบเท่าสามารถข้ามผ่านการติดตั้ง CentOS 7 ได้

  1. โดยค่าเริ่มต้น (ใน CentOS ณ เวลาที่เขียน) unprivileged ผู้ใช้ที่ไม่ใช่ระบบจะเข้าสู่ระบบในบทบาท 'unconfined_u' อย่างไรก็ตามเราสามารถเปลี่ยนระบบของเราเพื่อให้ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษ 'alice' ถูกวางไว้ในบทบาท 'user_u' แทน นโยบายเริ่มต้นสามารถทำได้เพื่อ จำกัด บทบาทนี้อย่างชัดเจนด้วยการกำหนดค่าเพิ่มเติมเพียงเล็กน้อย

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. ตอนนี้ปิดความสามารถสำหรับผู้ใช้เหล่านี้เพื่อรันไฟล์ที่อยู่ในโฮมไดเร็กตอรี่และ / tmp อีกครั้งค่าเริ่มต้นคือการอนุญาตพฤติกรรมนี้ คำสั่งนี้อาจใช้เวลาสักครู่เพื่อให้เสร็จสมบูรณ์

    [root]# setsebool -P user_exec_content off
    
  3. ตอนนี้ (กับผู้ใช้ที่ไม่มีสิทธิพิเศษของเรา) เราสามารถเข้าสู่ระบบและพยายามที่จะดำเนินการบางอย่างในพื้นที่ที่ไม่มีการใช้งาน อย่างที่คุณเห็นเราถูกปฏิเสธ

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. สุดท้ายเราสามารถดูบันทึก AVC เพื่อดูการปฏิเสธ SELinux ของเรา

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

เฮ้ใช่ว่าใช้งานได้! ฉันชอบโดยเฉพาะอย่างยิ่งที่คุณเลือกวิธีการ "ไม่มีเนื้อหา exec" นี้เป็นสิ่งที่ควรจะถูกจับแน่นอน ฉันมักจะชอบ auditd เพื่อป้องกันการสร้างปฏิบัติการในตอนแรก แต่ฉันก็ชอบสิ่งนี้เช่นกัน กรณีการใช้งาน: ฉันใช้บริการ Cloud-based ทั่วไปซึ่งทำให้ยากต่อการติดตั้งซอฟต์แวร์ใหม่ (คุณต้องใช้ตัวจัดการแพ็กเกจและไม่มี sudo) แต่มีจุดเล็กน้อย พวกเขาไม่ได้ปิดกั้นการสร้างหรือการดำเนินการและพวกเขาเป็นสภาพแวดล้อมของนักพัฒนาซอฟต์แวร์ ... ดังนั้นฉันเพิ่งไป / scp แพคเกจที่ฉันต้องการและรวบรวมพวกเขา +1
ǝɲǝɲbρɯͽ

1

ยกเว้นว่าคุณได้เปลี่ยนแปลงนโยบายของคุณในแท็บบูลีนของ system-config-selinux (หรือใน / etc / selinux / policy) ดังนั้นค่าเริ่มต้นควรตอบสนองต่อไปนี้ (หมายเหตุคุณอาจต้องการติดตั้ง setroubleshoot เพื่อดำน้ำลึก) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

จากนั้นรีสตาร์ทเว็บเซิร์ฟเวอร์ของคุณและพยายามเข้าถึงhttp: // localhost / ksด้วยเว็บเบราว์เซอร์ของคุณ คุณควรเห็นข้อความ "ต้องห้าม" หากคุณกำลังปรับแต่ง/var/log/audit/audit.logหรือถ้าคุณวิ่งausearch -m avc -ts recentคุณควรจะเห็นข้อความ:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

จากนั้นคุณสามารถเปลี่ยนบริบท SELinux ด้วยchcon -Rv --reference /var/www/html /install/ksหากคุณไม่ต้องการปิดใช้งาน SELinux แต่สามารถเข้าถึงทรัพยากรได้

แก้ไข: ขออภัยไม่เห็นว่าคุณพูดว่า "ไม่ใช่เว็บเซิร์ฟเวอร์" ลองchcon -u fake_u <filename>ใช้บัญชีที่ไม่มีสิทธิพิเศษบนไฟล์ระบบ


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

0

ติดตั้งแพ็กเกจเล็ก ๆ สองแพคเกจ - ไม่มีการพึ่งพา

  yum install -y vsftpd lftp

เริ่มเซิร์ฟเวอร์ FTP

  systemctl start vsftpd

สร้างไฟล์ในบ้านของรูท

  touch ~/tux.tch

ย้ายจากโฮมรูทไปยังไดเรกทอรี FTP
หมายเหตุ: ย้ายไม่คัดลอกมิฉะนั้นเนื้อหาของไฟล์จะเปลี่ยน

  mv ~/tux.tch /var/ftp/pub

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

  lftp localhost
    ls pub/tux.tch
    exit

ดูการปฏิเสธในบันทึกดิบ

  grep AVC /var/log/audit/audit.log

หรือถ้าคุณได้setroubleshoot*ติดตั้ง

  grep sealert /var/log/messages
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.