Назад | Перейти на главную страницу

Предупреждение о базовом типе Selinux 'var_t'

В настоящее время я «потерялся» в лесу CentOS Selinux.

Моя установка включает установку сокета WSGI в /var/www/demo/out который nginx использует для связи с процессом UWSGI. Всякий раз, когда я запрашиваю страницу в своем браузере, я получаю сообщение об ошибке nginx.

Почему этот Селинукс связан?

Я пробовал добавить 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>

Ты можешь читать Вот по аналогичной проблеме.