Способ вызвать нарушение политики SELinux?


12

Я изучаю основы работы SELinux и считаю полезным вызвать отказ. Мой тестовый компьютер работает под управлением CentOS 7, это базовая установка сервера без каких-либо дополнительных сервисов, и Getenforce сообщает «Enforcing». Поэтому я был уверен, что сделать / root доступным для чтения всему миру и попытаться прочитать файлы оттуда как непривилегированный пользователь, поможет. Но не повезло! Кто-нибудь может предложить несколько быстрых тестов? Попытка получить доступ к путям или открыть порты и т. Д.

В идеале я ищу простые команды оболочки, которые бы ЦАП не ограничивал, но MAC это заметит и откажет. Поэтому я не собираюсь компилировать сделанные на заказ программы или устанавливать конкретные службы (например, веб-сервер) для достижения этой цели. Это ценно, поскольку предоставляет общий и понятный способ увидеть SELinux в действии.

У меня нет проблем с изменением DAC (т.е. разрешений файловой системы), чтобы сделать их менее строгими, чем они были бы по умолчанию в рамках теста.


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 отрицает попытку открыть порт или получить доступ к пути, используя простые инструменты командной строки, такие как shell, netcat, telnet и т. Д. Я отредактирую этот вопрос, чтобы прояснить ситуацию.
Вдумчивый

Я должен был искать части кода самостоятельно. Я рад, что вы добавили тест bash ниже. Я не учел ошибки Snort и postfix (возможно dovecot) в CentOS7, потому что они являются пакетами, их больше нужно устанавливать, их можно исправить позже, и это просто больше конфигурации. Если вы уже идете по этому пути, это полезно для практики выработки политики.
ǝɲǝɲbρɯͽ

3

Это ясно демонстрирует политику MAC, в которой эквивалентный ЦАП мог быть обойден при базовой установке CentOS 7.

  1. По умолчанию (в CentOS на момент написания статьи) непривилегированные пользователи, не являющиеся системными пользователями, вошли в систему как роль «undefined_u». Однако мы можем изменить нашу систему так, чтобы вместо непривилегированного пользователя «Алиса» была назначена роль «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 content», так как это определенно должно быть поймано. Я склонен предпочесть аудиту для предотвращения создания исполняемого файла, но мне это тоже нравится. Вариант использования: я использую общую облачную службу, которая затрудняет установку нового программного обеспечения (вы должны использовать их менеджер пакетов, а sudo нет), но в этом нет особого смысла; они не блокируют создание или выполнение и являются средами разработки ... поэтому я просто wget / scp нужных мне пакетов и скомпилирую их. +1
ǝɲǝɲbρɯͽ

1

Если вы не изменили свои политики на вкладке Boolean в system-config-selinux (или в / etc / selinux / policy), то по умолчанию должно реагировать на следующее (NB, вы также можете установить 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, когда ЦАП позволил бы это: тогда как он проверяет, насколько хорошо 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.