SELinux на веб-сервере
Содержание

Введение

Когда-то, настраивая nginx+php-fpm, я просто делал setenforce 0 или правил /etc/selinux/config, перманентно отключая selinux на сервере

/etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=disabled

Теперь, наконец разобравшись, я понял, что никогда больше не буду выключать selinux

Почему?

Вот есть у вас процесс php-fpm, работающий от пользователя nginx и вы изменили владельца папки проекта тоже на nginx,

сhown nginx. -R /var/www/project1

чтобы код, выполняемый с помощью php-fpm, мог изменять содержимое папки проекта - например, писать в папку cache или заливать файлы в папку upload. Так в чём проблема?

Проблема в том, что без selinux пользователь nginx и запущенный от его имени процесс php-fpm сможет выполнять действия над файлами и папками согласно заданным стандартным rwx разрешениям. То есть то, что в системе открыто на чтение для всех, можно прочитать и через, скажем, залитый php-шелл.

Если же selinux будет включён, то помимо стандартных разрешений будут проверяться разрешения на доступ домена, в которым работает процесс (в случае с php-fpm в CentOS7 это httpd_t), к контексту файлов/директорий, заданных для них. И что это даст?

А **ничего **это не даст, потому что домен httpd_t включает в себя правила для домена nsswitch_domain

seinfo -thttpd_t -x

httpd_t
    can_change_object_identity
    kernel_system_state_reader
    syslog_client_type
    corenet_unlabeled_type
    sepgsql_client_type
    netlabel_peer_type
    daemon
    nsswitch_domain # <--
    domain

из-за чего, процесс php-fpm сможет читать, скажем, /etc/passwd, контекст которого passwd_file_t

ll -Z /etc/passwd

-rw-r--r--. root root system_u:object_r:passwd_file_t:s0 /etc/passwd

sesearch --allow --source httpd_t --target passwd_file_t

    Found 3 semantic av rules:
    allow httpd_t file_type : filesystem getattr ;
    allow httpd_t file_type : dir { getattr search open } ;
    allow nsswitch_domain passwd_file_t : file { ioctl read getattr lock open } ;

Да ладно, конечно всё не так, как кажется на первый взгляд. Selinux будет препятствием для дальнейшей эскалации привилегий именно из-за своего механизма доменов и контекстов, так что штука на самом деле крутая и полезная и зачастую может защитить от 0day.