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