Một cách để kích hoạt một vi phạm chính sách SELinux?


12

Tôi đang nghiên cứu các hoạt động cơ bản của SELinux và sẽ thấy hữu ích khi kích hoạt từ chối. Máy thử nghiệm của tôi đang chạy CentOS 7, đây là cài đặt máy chủ cơ bản mà không cần bất kỳ dịch vụ bổ sung nào và có được trạng thái 'Thực thi'. Vì vậy, tôi cảm thấy chắc chắn rằng việc tạo / root có thể đọc được trên thế giới và cố gắng đọc các tệp từ đó vì một người dùng không có đặc quyền sẽ thực hiện thủ thuật này. Nhưng không có may mắn! Bất cứ ai có thể đề nghị một số bài kiểm tra nhanh? Đang cố gắng truy cập các đường dẫn, hoặc mở các cổng, v.v.

Lý tưởng nhất là tôi đang tìm kiếm các lệnh shell đơn giản mà một bộ xử lý tín hiệu sẽ không bị hạn chế, nhưng MAC sẽ chú ý và từ chối. Vì vậy, tôi không tìm cách biên dịch các chương trình bespoke hoặc cài đặt các dịch vụ cụ thể (như máy chủ web) để đạt được điều này. Điều này rất có giá trị vì nó cung cấp một cách chung chung và rõ ràng để thấy Selinux hoạt động.

Tôi không có vấn đề gì với việc sửa đổi DAC (tức là quyền hệ thống tập tin) để làm cho chúng ít hạn chế hơn so với mặc định như là một phần của thử nghiệm.


1
+1 biết cách kích hoạt các hệ thống bảo vệ của bạn để bạn có thể xác minh chúng hoạt động là một bước quan trọng và không thể bỏ qua.
gowenfawr

Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì nó thuộc về Unix & Linux SE.
Đánh dấu

Câu trả lời:


3

Để chứng minh tiện ích của SELinux trong việc phát hiện lỗi cho mã của bên thứ ba / nhà phát triển của riêng bạn, đây là một thử nghiệm bảo vệ bộ nhớ (sửa đổi ví dụ mã đầu tiên tại đây ):

#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;
}
Biên dịch và hiển thị mặc định (không bắt)
$ 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>

Thay đổi booleans để nắm bắt vấn đề:

$ 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

Điều này thực sự hữu ích và được ghi lại rõ ràng (+1), mặc dù tôi không phải là lập trình viên và không thực sự hiểu mã. Lý tưởng nhất là tôi muốn xem một ví dụ rõ ràng về việc Selinux từ chối nỗ lực mở cổng hoặc truy cập đường dẫn, sử dụng các công cụ dòng lệnh đơn giản như shell, netcat, telnet, v.v. Tôi sẽ chỉnh sửa câu hỏi để làm cho câu hỏi này rõ ràng hơn.
Suy nghĩ

Tôi đã phải tự tìm kiếm các phần mã. Tôi rất vui vì bạn đã thêm một bài kiểm tra bash dưới đây. Tôi đã bỏ qua các lỗi Snort và postfix (có thể là dovecot) trên CentOS7 vì chúng là các gói, cần nhiều công việc hơn để cài đặt, nó có thể được sửa sau và nó chỉ là cấu hình nhiều hơn. Nếu bạn đã đi theo cách đó, nó hữu ích cho thực tiễn tạo chính sách.
ǝɲǝɲbρɯͽ

3

Điều này thể hiện rõ ràng một chính sách MAC trong đó một bộ xử lý tương đương có thể đã được bỏ qua trên bản cài đặt cơ bản của CentOS 7.

  1. Theo mặc định (trong CentOS tại thời điểm viết) không có đặc quyền, người dùng không phải là hệ thống được đăng nhập với vai trò 'unconfined_u'. Tuy nhiên, chúng tôi có thể thay đổi hệ thống của mình để người dùng không được ưu tiên 'alice' được đặt vào vai trò 'user_u'. Các chính sách mặc định có thể được thực hiện để hạn chế rõ ràng vai trò này chỉ với một lượng nhỏ cấu hình bổ sung.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. Bây giờ hãy tắt khả năng cho những người dùng này thực thi các tệp nằm trong thư mục chính của họ và / tmp. Một lần nữa, mặc định là cho phép hành vi này. Lệnh này có thể mất một chút thời gian để hoàn thành .

    [root]# setsebool -P user_exec_content off
    
  3. Bây giờ (với người dùng không có đặc quyền của chúng tôi), chúng tôi có thể đăng nhập và cố gắng thực hiện một cái gì đó trên một trong những khu vực không đi này. Như bạn thấy, chúng tôi bị từ chối.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. Cuối cùng, chúng ta có thể xem nhật ký AVC để xem từ chối SELinux của chúng tôi.

    [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
    

Hey yeah hoạt động! Tôi đặc biệt thích rằng bạn đã chọn phương pháp "không thực hiện nội dung" này, vì điều này chắc chắn nên được nắm bắt. Tôi đã có xu hướng thích audd để ngăn chặn việc tạo thực thi ngay từ đầu, nhưng tôi cũng thích điều này. Trường hợp sử dụng: Tôi sử dụng một dịch vụ dựa trên đám mây phổ biến khiến việc cài đặt phần mềm mới trở nên khó khăn (bạn phải sử dụng trình quản lý gói của họ và không có sudo), nhưng có rất ít điểm; họ không chặn việc tạo hoặc thực thi và chúng là môi trường dành cho nhà phát triển ... vì vậy tôi chỉ cần wget / scp các gói tôi cần và biên dịch chúng. +1
ǝɲǝɲbρɯͽ

1

Trừ khi bạn đã thay đổi chính sách của mình trong tab Boolean của system-config-selinux (hoặc trong / etc / selinux / chính sách), thì mặc định sẽ phản hồi như sau (NB, bạn cũng có thể muốn cài đặt setroubledhoot để lặn sâu hơn) :

mkdir -m 755 -p / cài đặt / ks

cp /root/anaconda-ks.cfg / cài đặt / ks

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

Sau đó, khởi động lại máy chủ web của bạn và cố gắng truy cập http: // localhost / ks bằng trình duyệt web của bạn. Bạn sẽ thấy một thông báo "Cấm". Nếu bạn đang theo đuôi /var/log/audit/audit.loghoặc nếu bạn chạy ausearch -m avc -ts recent, thì bạn sẽ có thể thấy thông báo: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

Sau đó, bạn có thể thay đổi bối cảnh SELinux chcon -Rv --reference /var/www/html /install/ksnếu bạn không muốn vô hiệu hóa SELinux nhưng có thể truy cập tài nguyên.

EDIT: xin lỗi, không thấy rằng bạn nói "không phải là máy chủ web". Hãy thử chcon -u fake_u <filename>sử dụng một tài khoản không có đặc quyền trên một tệp hệ thống.


Tôi không thể nhận được đề xuất thứ hai của bạn để làm việc (sử dụng người dùng mới được tạo). Ngoài ra, tôi muốn nói một thử nghiệm mang tính khái quát hơn, một ví dụ về MAC tăng cường trong đó DAC sẽ cho phép nó: trong khi thử nghiệm này, Selinux có thể bảo vệ tốt như thế nào trước các thay đổi hành chính đối với ghi nhãn SELinux.
Suy nghĩ

0

cài đặt hai gói nhỏ - không phụ thuộc

  yum install -y vsftpd lftp

bắt đầu một máy chủ FTP

  systemctl start vsftpd

tạo một tập tin trong nhà của root

  touch ~/tux.tch

chuyển từ thư mục gốc sang thư mục FTP.
lưu ý: di chuyển, không sao chép hoặc fcontext của tệp sẽ thay đổi

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

đăng nhập vào máy chủ FTP của bạn với tư cách là người dùng máy khách FTP và cố gắng truy cập tệp mới.
lưu ý: tab tự động hoàn thành sẽ không hoạt động ở đây

  lftp localhost
    ls pub/tux.tch
    exit

xem từ chối trong nhật ký thô

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

hoặc nếu bạn đã setroubleshoot*cài đặt

  grep sealert /var/log/messages
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.