LINUX.ORG.RU

Ограничение доступа к объектам при помощи SELinux

 ,


0

2

Здравствуйте! Моя задача: ограничить доступ к объекту (начал с самого простого - файла) конкретному приложению. Самое оптимальное решение на мой взгляд - определить новый тип и разрешения в новом модуле, например:

module fz_fs_allow 1.0.0;
require {
attribute file_type;
type gdm_t;
class file read;
class file write;
};

type fz_fs_allow_all_t, file_type;
type fz_fs_allow_read_t, file_type;
type fz_fs_allow_write_t, file_type;
type fz_fs_deny_all_t, file_type;

allow gdm_t fz_fs_allow_all_t:file { read write };
allow gdm_t fz_fs_allow_read_t:file { read };
allow gdm_t fz_fs_allow_write_t:file { write };

Далее модуль собираю, загружаю, делаю semanafe fcontext на файл (устанавливаю тип для него fz_fs_allow_write_t). Теперь к этому файлу должна быть разрешена только запись, но почему-то не прокатывает, и разрешено все. в логах ничего по этому поводу, сам se работает. Может, кто-то имел опыт администрирования всего этого дела? начинаю грешить на ubuntu.



Последнее исправление: Sodds (всего исправлений: 1)

Теперь к этому файлу должна быть разрешена только запись...

...процессами с меткой gdm_t. Почему, кстати, gmd_t ? Я бы на каком-нибудь httpd_t поэкспериментировал.

начинаю грешить на ubuntu

в убунтах, вроде бы, упор делается на apparmor, а не на selinux?

fjoe
()
Ответ на: комментарий от fjoe

да, с apparmor вышло бы все замечательно и за пару минут, но, увы, делать необходимо через se. по поводу типа xdm_t (простите, в первом посте опечатка, но это точно не причина проблемы): запускаю свое приложение и смотрю его контекст через ps -Z получаю:

system_u:system_r:xdm_t:s0-s0:c0.c255 hp 3642 5.0 1.2 94808 24980 ? Sl 13:50 0:02 /usr/bin/filezilla

Если посмотреть с другой стороны, то ни один другой домен больше не имеет прав на данный тип файла, поскольку мной они не были установлены, однако я могу открыть файл чем угодно.

Sodds
() автор топика
Ответ на: комментарий от Sodds

однако я могу открыть файл чем угодно

«что угодно» тоже бывает разное. вот этот процесс

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 fjoe 32743 0.0  0.0 116988 4 pts/48 Ss+ Feb27   0:00 /bin/bash
откроет файл с любой меткой, а вот этот (обычный апач в обычной федоре с базовыми настройками selinux)
system_u:system_r:httpd_t:s0    apache   15802  0.0  0.0 416808  1220 ?        S    Mar04   0:00 /usr/sbin/httpd -DFOREGROUND
только разрешённые ему файлы.

Провреять доступ надо неunconfined процессами. Обычно все десктопные процессы/юзеры игнорируют selinux по умолчанию.

fjoe
()
Ответ на: комментарий от fjoe

да, именно поэтому я привел весь контекст, включая пользователя и роль. при этом смущает xdm. это все, что имеет gui или нет? и возможно ли как-то покрутить контекст процесса?

Sodds
() автор топика
Ответ на: комментарий от Sodds

при этом смущает xdm. это все, что имеет gui или нет?

похоже, что xdm запускается с xdm_t, далее в нём стартуют иксы и всё остальное с той же самой меткой. Выглядит логично. Просто мои примеры не из убунты, потому в них по-другому.

Что там вывод sestatus говорит?

[admin@localhost ~]# sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
должно быть всё в enforcing/enabled.

fjoe
()
Ответ на: комментарий от fjoe

В конфигах все в поряде, в логи идут сообщения типа {denied}. пока работаю в режиме запрета, чтобы каждый раз в лог не соваться и не смотреть, а сразу видеть заветное сообщение о запрете при попытке чтения :)

   
SELinux status:                 enabled
SELinuxfs mount:                /selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             ubuntu
Current mode:                   enforcing
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     denied
Max kernel policy version:      28

Что еще интересно:

 
$sesearch --allow --target fz_fs_allow_write_t

   allow kernel_t fz_fs_allow_write_t : lnk_file { read getattr } ; 
   allow kernel_t fz_fs_allow_write_t : lnk_file { read create getattr setattr unlink rename } ; 
   allow puppet_t fz_fs_allow_write_t : lnk_file { read create getattr setattr unlink rename } ; 
   allow nmbd_t fz_fs_allow_write_t : lnk_file { read create getattr setattr unlink rename } ; 
   allow kernel_t fz_fs_allow_write_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow puppet_t fz_fs_allow_write_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow nmbd_t fz_fs_allow_write_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow kernel_t fz_fs_allow_write_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow puppet_t fz_fs_allow_write_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow nmbd_t fz_fs_allow_write_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t fz_fs_allow_write_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t fz_fs_allow_write_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; 
   allow ftpd_t fz_fs_allow_write_t : lnk_file { read create getattr setattr unlink rename } ; 
   allow ftpd_t fz_fs_allow_write_t : sock_file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow ftpd_t fz_fs_allow_write_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ;
.... там еще много...
откуда-то это взялось. прич чем
$sesearch --allow --target fz_fs_allow_write_t | grep xdm_t
   allow xdm_t file_type : filesystem getattr ; 
ЧТО ВООБЩЕ ПРОИСХОДИТ??

Sodds
() автор топика
Ответ на: комментарий от Sodds

ах да, в лог идут запреты, которые моих дел не касаются, увы

Sodds
() автор топика
Ответ на: комментарий от fjoe

думаю, есть смысл попробовать neverallow

Sodds
() автор топика
Ответ на: комментарий от Sodds

Вот собрал тот же самый модуль, но s/xdm_t/httpd_t/g чтобы проверить можно было.

[root@four selinux]# cat ./test.te 
module fz_fs_allow 1.0.0;

require {
  attribute file_type;
  type httpd_t;
  class file read;
  class file write;
};

type fz_fs_allow_all_t, file_type;
type fz_fs_allow_read_t, file_type;
type fz_fs_allow_write_t, file_type;
type fz_fs_deny_all_t, file_type;

allow httpd_t fz_fs_allow_all_t:file { read write};
allow httpd_t fz_fs_allow_read_t:file { read };
allow httpd_t fz_fs_allow_write_t:file { write };

сборка

[root@four selinux]# make -f /usr/share/selinux/devel/Makefile
Compiling targeted test module
/usr/bin/checkmodule:  loading policy configuration from tmp/test.tmp
/usr/bin/checkmodule:  policy configuration loaded
/usr/bin/checkmodule:  writing binary representation (version 17) to tmp/test.mod
Creating targeted test.pp policy package
rm tmp/test.mod.fc tmp/test.mod

установка и проверка установки модуля

[root@four selinux]# semodule -i test.pp 
[root@four selinux]# semodule -l | grep fz_fs_allow
fz_fs_allow	1.0.0	
установлено... далее ещё проверка.
[root@four selinux]# sesearch --allow | fgrep 'fz_fs_allow_write_t'
   allow fz_fs_allow_write_t fz_fs_allow_write_t : filesystem associate ; 
   allow httpd_t fz_fs_allow_write_t : file write ; 
Вот последняя строчка выглядит правильно. Первая - это. Всё выглядит хорошо.

Проверяем доступ на живом примере: Этот файл будет подопытным, выставляю метку.

[root@four default]# chcon -v -t fz_fs_allow_write_t ./test.txt 
changing security context of ‘./test.txt’
[root@four default]# ll -Z ./test.txt 
-rw-r--r--. root root unconfined_u:object_r:fz_fs_allow_write_t:s0 ./test.txt
Открываю файл браузером - получаю:
type=AVC msg=audit(1394096067.672:175339): avc:  denied  { getattr } for  pid=4651 comm="httpd" path="/var/www/html/default/test.txt" dev="sda2" ino=395394 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:fz_fs_allow_write_t:s0 tclass=file
Модулю selinux не хватает getattr (далее ещё open), но не суть, доступ блокируется.

fjoe
()
Ответ на: комментарий от fjoe

Такой обновлённый модуль разрешит доступ к файлу.

module fz_fs_allow 1.0.2;

require {
  attribute file_type;
  type httpd_t;
  class file read;
  class file write;
  class file getattr;
  class file open;
};

type fz_fs_allow_all_t, file_type;
type fz_fs_allow_read_t, file_type;
type fz_fs_allow_write_t, file_type;
type fz_fs_deny_all_t, file_type;

allow httpd_t fz_fs_allow_all_t:file getattr;
allow httpd_t fz_fs_allow_write_t:file getattr;

allow httpd_t fz_fs_allow_all_t:file open;
allow httpd_t fz_fs_allow_write_t:file open;

allow httpd_t fz_fs_allow_all_t:file { read write };
allow httpd_t fz_fs_allow_read_t:file { read };
allow httpd_t fz_fs_allow_write_t:file { write }

fjoe
()
Ответ на: комментарий от fjoe

то есть получается, что ограничиваем httpd? Радует, конечно, что модуль работает! Сейчас попробую с демоном сделать...

Sodds
() автор топика
Ответ на: комментарий от Sodds


то есть получается, что ограничиваем httpd?


Нет, наоборот. Разрешаем.
В базовой настройке есть файловые метки httpd_sys_content_t, httpd_sys_rw_content_t и ещё десяток разных (почти) на все случаи жизни.
Модуль добавляет ещё 3 файловые метки для апача, с которыми он может взаимодействовать.

fjoe
()
Ответ на: комментарий от fjoe

хм.. у меня выхожит, что практически все запускается с этим контекстом xdm_t...

system_u:system_r:xdm_t:s0-s0:c0.c255 nobody 13903 0.1 0.0 9296 1360 ? Ss 23:54 0:00 proftpd: (accepting connections)

Sodds
() автор топика
Ответ на: комментарий от Sodds

Вот пример как всё должно работать через 'Process Transitions'. Работает она так: если процесс с определённой меткой запускает файл с некоторой другой меткой, то результирующий процесс будет с третьей меткой. Пример:

В федоре процессы запускает systemd. У него метка init_t

[root@localhost ~]# ps -auxZ | fgrep '/usr/lib/systemd/systemd ' | fgrep -v 'fgrep'
system_u:system_r:init_t:s0     root         1  0.0  0.1  50068  3800 ?        Ss   Feb09  11:17 /usr/lib/systemd/systemd --switched-root --system --deserialize 27
system_u:system_r:init_t:s0     user         566  0.0  0.0  44644   624 ?        Ss   Feb09   0:03 /usr/lib/systemd/systemd --user
system_u:system_r:init_t:s0     root      1431  0.0  0.0  44652   596 ?        Ss   Feb09   0:04 /usr/lib/systemd/systemd --user
Далее я смотрю, какая метка на бинарике апача(httpd_exec_t):
[root@localhost ~]# ll -Z /sbin/httpd 
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /sbin/httpd
проверяю, что же должно произойти при запуске процессом init_t файла с httpd_exec_t:
[root@localhost ~]# sesearch -T -t httpd_exec_t -s init_t
Found 1 semantic te rules:
   type_transition init_t httpd_exec_t : process httpd_t;
У запущенного процесса апача должна быть метка httpd_t. Проверяю:
[root@localhost ~]# ps -auxZ | fgrep 'httpd'
system_u:system_r:httpd_t:s0    root     12864  1.9  0.7 382540 14548 ?        Ss   22:57   0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   12865  0.0  0.3 382540  7004 ?        S    22:57   0:00 /usr/sbin/httpd -DFOREGROUND
Всё верно.

практически все запускается с этим контекстом xdm_t

Это плохо. Похоже на недонастроенный или совсем ненастроенный selinux.

Гугл рассказывает про пакет 'selinux-basics'. Он установлен? Вероятно, для убунты есть другие сборки модулей (сторонние и/или адаптированные с redhat,fedora или даже gentoo).

fjoe
()
Ответ на: комментарий от fjoe

да, все пакеты стоят. Пробовал поменять политику на default, но результат нет. Видимо, задача сводится к поиску виртуалки с нормально функционирующей системой, потому что сил больше нет искать проблему :(

Sodds
() автор топика
Ответ на: комментарий от Sodds

при чем нормально так идут логи: Mar 8 02:09:06 ubuntu kernel: [38488.061447] type=1400 audit(1394230146.410:20323): avc: denied { read } for pid=1679 comm=«console-kit-dae» name=«run» dev=«sda1» ino=131478 scontext=system_u:system_r:consolekit_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=lnk_file

Sodds
() автор топика
Ответ на: комментарий от fjoe

А вот, кстати, на debian трудностей не возникло, за исключением того, что там появляются проблемы с dbus и иксами, поэтому приходится периодически вырубать selinux. Зато ftp запускается под доменом ftpd_t! УРА

Sodds
() автор топика
Ответ на: комментарий от fjoe

а вот все равно откуда-то при установке модуля берутся дополнительные разрешающие правила для моего нового типа! может, дело в makefile, которым я все это дело собираю?

Sodds
() автор топика
Ответ на: комментарий от fjoe

так, теперь сижу на федоре, все совпадает по контектсам, но profptd запускается под unconfined_t. в чем может быть дело тогда?

Sodds
() автор топика
Ответ на: комментарий от Sodds

при чем с этим типом запускаются опять же практически все процессы, за редким исключением :(

Sodds
() автор топика
Ответ на: комментарий от Sodds

profptd запускается под unconfined_t

У profptd репутация так себе, потому не могли его пропустить. Специально поставил чтобы проверить. Не настраивал, просто запустил.

[root@localhost ~]# ps -Z -C proftpd
LABEL                             PID TTY          TIME CMD
[root@localhost ~]# service proftpd start
Redirecting to /bin/systemctl start  proftpd.service
[root@localhost ~]# ps -Z -C proftpd
LABEL                             PID TTY          TIME CMD
system_u:system_r:ftpd_t:s0-s0:c0.c1023 3863 ? 00:00:00 proftpd
[root@localhost ~]# 
У процесса метка ftpd_t. Версия федорки - 20
[root@localhost ~]# cat /etc/issue
Fedora release 20 (Heisenbug)
Kernel \r on an \m (\l)

fjoe
()
Ответ на: комментарий от fjoe

на дебиане та же сборка сервера запускалась под верным контекстом. у тут на федоре, я смотрю, почему-то все с этим unconfined_t. такое ощущение, что что-то не активировано. после установки системы я ничего не менял относительно selinux. тоже двадцаточка стоит, не понимаю!

Sodds
() автор топика
Ответ на: комментарий от Sodds

Проверьте наличие этих пакетов

[root@localhost ~]# rpm -qa | grep selinux-policy
selinux-policy-3.12.1-106.fc20.noarch
selinux-policy-targeted-3.12.1-106.fc20.noarch
И правильно расставленные метки (ftpd_exec_t для бинарика proftpd)
[root@localhost ~]# ll -Z /sbin/proftpd
-rwxr-xr-x. root root system_u:object_r:ftpd_exec_t:s0 /sbin/proftpd
[root@localhost ~]# sesearch -T -t ftpd_exec_t -s init_t
Found 1 semantic te rules:
   type_transition init_t ftpd_exec_t : process ftpd_t; 
процесс должен получиться ftpd_t.

fjoe
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.