selinux httpd - efanov/mephi GitHub Wiki

Задание

Ограничение web-сервера Apache с помощью политики безопасности SELinux

Подготовка

Установите web-сервер Apache и запустите его.

# yum install httpd -y
...
=====================================================================================
 Package                   Architecture  Version                Repository      Size
=====================================================================================
Installing:
 httpd                     x86_64        2.4.46-1.fc32          updates        1.4 M
...
# systemctl start httpd.service
# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

Для доступа к серверу из сети нужно узнать IP-адрес с помощью команды ip addr. Также дополнительно может понадобиться настроить файервол (иногда его еще называют брандмауэр) следующим образом:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Содержимое сайта располагается в директории /var/www/html/. Создайте файл index.html. Изучите типы созданного файла и директории.

# echo 'Здравствуй, МИФИ!' > /var/www/html/index.html
# ls -dZ /var/www/html/
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
# ls -Z /var/www/html/index.html 
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

Проверьте работоспособность web-сервера Apache. Это можно сделать, обратившись в браузере по локальному адресу 127.0.0.1, или в командной строке с помощью утилиты curl, предназначенной для передачи данных по разным протоколам (в т.ч. HTTP).

$ curl 127.0.0.1/
Здравствуй, МИФИ!

Изменение корневой директории сайта

Предположим, что нужно развернуть сайт в новой директории /www/. Для настройки web-сервера Apache предназначен конфигурационный файл /etc/httpd/conf/httpd.conf. Измените DocumentRoot "/var/www/html" на DocumentRoot "/www", а также соответствующие <Directory "/www">.

Создайте новую директорию и файл index.html в ней. Изучите типы созданных файла и директории.

# mkdir /www
# echo 'Новый сайт' > /www/index.html 
# ls -dZ /www/
unconfined_u:object_r:default_t:s0 /www/
# ls -Z /www/index.html 
unconfined_u:object_r:default_t:s0 /www/index.html

Обратите внимание на тип default_t.

Перезапустите web-сервер Apache.

systemctl restart httpd.service

Поиск причины

Права доступа субъектов к объектам кодируются в виде т.н. векторов доступа, которые для повышения производительности кэшируются. Поэтому сообщения системы аудита, которые генерятся системой SELinux имеют тип AVC (Access Vector Cache).

Проверьте работоспособность web-сервера Apache. Так как новая страница не появилась, выполните поиск недавних событий аудита с типом AVC.

# ausearch -m avc -ts recent -i
----
type=PROCTITLE msg=audit(03/15/2024 00:40:22.084:98407) : proctitle=/usr/sbin/httpd -DFOREGROUND 
type=PATH msg=audit(03/15/2024 00:40:22.084:98407) : item=0 name=/www/index.html inode=393218 dev=103:03 mode=file,644 ouid=root ogid=root rdev=00:00 obj=unconfined_u:object_r:default_t:s0 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 
type=CWD msg=audit(03/15/2024 00:40:22.084:98407) : cwd=/ 
type=SYSCALL msg=audit(03/15/2024 00:40:22.084:98407) : arch=x86_64 syscall=stat success=no exit=EACCES(Permission denied) a0=0x7f21f000a408 a1=0x7f21f7ffe800 a2=0x7f21f7ffe800 a3=0x2 items=1 ppid=116731 pid=116734 auid=unset uid=apache gid=apache euid=apache suid=apache fsuid=apache egid=apache sgid=apache fsgid=apache tty=(none) ses=unset comm=httpd exe=/usr/sbin/httpd subj=system_u:system_r:httpd_t:s0 key=(null) 
type=AVC msg=audit(03/15/2024 00:40:22.084:98407) : avc:  denied  { getattr } for  pid=116734 comm=httpd path=/www/index.html dev="nvme0n1p3" ino=393218 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file permissive=0 

cat /var/log/messages sealert -l число

Воспользуйтесь системой помощи SELinux - утилитой audit2why.

# ausearch -m avc -ts recent | audit2why

Также посмотрите, что предлагает вторая утилита помощи audit2allow.

# ausearch -m avc -ts recent | audit2allow 


#============= httpd_t ==============
allow httpd_t default_t:file getattr;

Что является причиной запрета доступа?

Восстановление работы web-сервера Apache

Здесь ещё можно sesearch поискать правила.

Добавьте правильный тип для новой директории сайта:

# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
# semanage fcontext -l | grep '^/www'
/www(/.*)?                                         all files          system_u:object_r:httpd_sys_content_t:s0 

Обратите внимание, что команда semanage fcontext с ключом добавления -a только создаёт новую запись, но не изменяет типа директории!

Восстановите правильные контексты.

# restorecon -Rv /www/
Relabeled /www from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /www/index.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
# ls -Z /www/index.html 
unconfined_u:object_r:httpd_sys_content_t:s0 /www/index.html

Снова проверьте работоспособность web-сервера Apache.

$ curl 127.0.0.1/
Новый сайт

Работоспособность web-сервера Apache восстановлена.

getsebool -a | grep httpd

vi /etc/httpd/conf.d/userdir.conf

grep '^ *UserDir' /etc/httpd/conf.d/userdir.conf

UserDir public_html

systemctl restart httpd.service $ mkdir -/public_html $ echo 'Home directories' > ~/public_html/index.html

change perms

$ chmod 711 ~

http://localhost/~user1/index.html

getsebool -a | grep home

setsebool -P httpd_enable_homedirs on


https://www.youtube.com/watch?v=eIF9sxJbWGw

If you want to allow httpd to have getattr access on the index.html file
Then you need to change the label on /www/index.html
Do

semanage fcontext -a -t FILE_TYPE '/www/index.html'


where FILE_TYPE is one of the following: NetworkManager_exec_t, ...

Then execute:

restorecon -v '/www/index.html'

You can generate a local policy module to allow this access.
Do
allow this access for now by executing:

ausearch -c 'httpd' --raw | audit2allow -M my-httpd

semodule -X 300 -i my-httpd.pp


## Ограничение root


yum install -y policycoreutils policycoreutils-devel setools-console setroubleshoot

pwd
/root

Директория для создания модуля
mkdir mephi_selinux
cd mephi_selinux

Создать базовый файл для модуля
# cat mephi_selinux.te 
policy_module(mephi_selinux, 1.0)
require {
	type unconfined_t;
	type setroubleshootd_t;
}
type mephi_selinux_t;
fs_associate(mephi_selinux_t);
allow unconfined_t mephi_selinux_t:dir relabelto;
allow unconfined_t mephi_selinux_t:{ file dir } { relabelto getattr read };
#allow setroubleshootd_t mephi_selinux_t:{ file dir } getattr;

Скомпилировать файл
ln -s /usr/share/selinux/devel/Makefile .
make mephi_selinux.pp

Загрузить политику
semodule -i mephi_selinux.pp
semodule -l | grep mephi_selinux

Создать тестовую директорию
mkdir -m 777 /mephi_selinux
chcon -t private_files_t /mephi_selinux

Проверить изменения
ls -Z /mephi_selinux - запрещает читать содержимое

Ищем события
ausearch -m AVC -ts recent | audit2allow 

Добавляем правила
vim mephi_selinux.te
make mephi_selinux.pp
semodule -r mephi_selinux
semodule -i mephi_selinux.pp 
chcon -t mephi_selinux_t /mephi_selinux - куда делся тип?

ls -Z /mephi_selinux - теперь нужно право read
ausearch -m AVC -ts recent | audit2allow 

Чтобы ускорить процесс отладки
setenforce 0

Создаём скрипт

ls -lZ /mephi_selinux
chmod 777 /mephi_selinux
touch /mephi_selinux/file1
echo Hello > /mephi_selinux/file1
echo MEPhI >> /mephi_selinux/file1
chmod 640 /mephi_selinux/file1
mkdir /mephi_selinux/dir1
rmdir /mephi_selinux/dir1
rm /mephi_selinux/file1
chcon -t unconfined_t /mephi_selinux

setenforce 1

https://www.youtube.com/watch?v=gwrOKv79sVk