В настоящее время я «потерялся» в лесу CentOS Selinux.
Моя установка включает установку сокета WSGI в /var/www/demo/out
который nginx использует для связи с процессом UWSGI. Всякий раз, когда я запрашиваю страницу в своем браузере, я получаю сообщение об ошибке nginx.
Почему этот Селинукс связан?
setenforce 0
исправляет это.denied
и missing type enforcement (TE) allow rule
Я пробовал добавить httpd_sys_content_t
метку сокета, чтобы nginx мог читать и записывать в файл сокета, restorecon после добавления новой метки.
Прохождение нарушения через audit2allow
возвращает следующую политику:
module nginx 1.0;
require {
type httpd_t;
type var_t;
type httpd_sys_content_t;
class sock_file write;
}
#============= httpd_t ==============
allow httpd_t httpd_sys_content_t:sock_file write;
#!!!! WARNING: 'var_t' is a base type.
allow httpd_t var_t:sock_file write;
Первое правило я понимаю, но что передает второе правило? Я предполагаю, потому что процесс nginx запрашивает tcontext, который имеет var_t
в нем требуется новая политика selinux, которая включает этот новый контекст?
Так почему здесь это предупреждение? Он жалуется, что добавление каталога, такого как var, в политику слишком общее / недостаточно конкретное? В таком случае нельзя сузить эту политику до чего-то вроде var_www_t
? Также, если это так, то почему процессу uwsgi, работающему под пользователем без полномочий root, разрешено записывать в сокет?
Подумайте о том, чтобы разместить сокет в том месте, где его уже ожидает SELinux.
# semanage fcontext -l | grep httpd_var_run_t | grep wsgi
/var/run/wsgi.* socket system_u:object_r:httpd_var_run_t:s0
Таким образом, если вы создадите /run/wsgi.anything
и используйте это как сокет, тогда он будет работать отлично. Имейте в виду, что, поскольку это временный каталог, очищаемый при каждой загрузке, вы должны создать сокет самостоятельно при запуске, обычно с а tmpfiles.d
конфигурация. Например:
p+ /run/wsgi.anything 0660 user group - -
Предупреждение здесь, потому что вы можете слишком много разглашать. Вы разрешаете httpd записывать в любой сокет в / var, который может быть не тем, что вам нужно.
Контекст httpd_sys_content_t разрешает доступ только для чтения к файлу, если вы не включили логическое значение httpd_unified. Если вы хотите, чтобы ваш сокет был доступен для записи по httpd, вам нужно установить его как httpd_sys_rw_content_t
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/demo/out"
restorecon -Rv /var/www/demo/out
Майкл Хэмптон скоро будет поправлять меня, я уверен
Базовый тип selinux - это общий тип, который, если он предоставлен, разрешает доступ к очень значительной части базовой системы. Включение доступа к selinux для var_t
практически без ограничений запускать процесс.
Из блог одного из разработчиков selinux:
Мы действительно хотим остановить запись доменов в BASE-типы. Если я разрешаю ограниченному домену писать в тип BASE, такой как etc_t или usr_t, то взломанная система может атаковать другие домены, поскольку почти все другие домены должны читать некоторый контент etc_t или usr_t.
Файлы в /var/www/
уже помечены httpd_sys_content_t
; присвоив ему ту же метку, вы ничего не измените. Насколько я помню, httpd_sys_content_t
следует использовать для статических файлов HTML, а не для сокетов. Попробуйте переименовать сокет чем-нибудь вроде:
semanage fcontext -a -t httpd_var_run_t </your/socket/path>
restorecon -RF </your/socket/path>
Ты можешь читать Вот по аналогичной проблеме.