Спосіб викликати порушення політики SELinux?


12

Я вивчаю основні роботи SELinux і вважаю корисним викликати відмову. Мій тестовий апарат працює під управлінням CentOS 7, це базовий сервер, який встановлюється без додаткових сервісів, і getenforce заявляє про "Enforcing". Тож я був впевнений, що зробити / створити корінний світ, і читати звідти файли як непривілейований користувач зробить це. Але не щастить! Хто-небудь може запропонувати кілька швидких тестів? Спроба доступу до шляхів або відкритих портів тощо.

В ідеалі я шукаю прості команди оболонок, які DAC не обмежував би, але MAC помітить і заперечить. Як такий, я не хочу складати програми замовника або встановлювати конкретні сервіси (наприклад, веб-сервер) для досягнення цього. Це цінно, оскільки забезпечує загальний та зрозумілий спосіб бачити SELinux у дії.

У мене немає проблем із зміною ЦАП (тобто дозволів файлової системи), щоб зробити їх менш обмежуючими, ніж вони були б за замовчуванням в рамках тесту.


1
+1 знати, як запустити захисні системи, щоб ви могли переконатися, що вони функціонують - важливий і часто пропущений крок.
gowenfawr

Я голосую, щоб закрити це питання поза темою, оскільки воно належить до Unix & Linux SE.
Марк

Відповіді:


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>

Змініть булеві, щоб вирішити проблему:

$ 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 заперечує спробу відкрити порт або отримати доступ до шляху, використовуючи прості інструменти командного рядка, такі як оболонка, netcat, telnet тощо. Я відредагую питання, щоб зробити це зрозумілішим.
Продуманий

Довелося шукати кодові частини самостійно. Я радий, що ви додали баш-тест нижче. Я залишив помилки Snort і postfix (можливо, голубці) на CentOS7, тому що вони пакують, їх потрібно більше встановити, можливо, це буде виправлено пізніше, і це просто більше конфігурації. Якщо ви вже йдете таким шляхом, це корисно для практики вироблення політики.
ǝɲǝɲbρɯͽ

3

Це наочно демонструє політику MAC, коли еквівалентний ЦАП міг бути обійдений на базовій установці CentOS 7.

  1. За замовчуванням (у CentOS на момент написання) непривілейовані несистемні користувачі увійшли як роль "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
    

Гей так, це працює! Мені конкретно подобається, що ви вибрали такий підхід "no exec content", оскільки це, безумовно, має бути спійманим. Я, як правило, віддаю перевагу аудиту, щоб запобігти створенню виконуваних файлів, в першу чергу, але мені це теж подобається. Випадок використання: я використовую звичайний хмарний сервіс, який ускладнює встановлення нового програмного забезпечення (ви повинні використовувати їх менеджер пакунків, а судо-немає), але сенсу мало; вони не блокують створення або виконання, і вони є середовищем для розробників ... тож я просто випробовую / скапую потрібні мені пакунки та компілюю їх. +1
ǝɲǝɲbρɯͽ

1

Якщо ви не змінили свою політику на вкладці Boolean 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, але зможете отримати доступ до ресурсу.

EDIT: вибачте, не побачив, що ви сказали "не веб-сервер". Спробуйте chcon -u fake_u <filename>використовувати непривілейований обліковий запис у системному файлі.


Я не міг змусити вашу другу пропозицію працювати (використовуючи новоствореного користувача). Також я вважаю за краще тест, який був більш загальним, приклад того, як MAC активізується там, де DAC це дозволив би: тоді як це перевіряє, наскільки SELinux може захистити від адміністративних змін маркування SELinux.
Продуманий

0

встановити два невеликі пакети - ніяких залежностей

  yum install -y vsftpd lftp

запустити FTP-сервер

  systemctl start vsftpd

створити файл у будинку root

  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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.