SELinux для WordPress на Nginx: контексты, boolean и проверка

closeup photo of eyeglasses

SELinux (Security-Enhanced Linux) даёт мандатный контроль доступа к файлам и процессам. Вместе с Nginx это режет лишние пути к файлам WordPress, даже если у процесса есть обычные Unix-права. Отключать enforcing «чтобы заработало» – плохой рефлекс; ниже рабочая схема меток и boolean.

Контекст: WordPress под Nginx (PHP-FPM) на RHEL/CentOS/Alma/Rocky-подобной системе. Пути и сокеты подставьте свои.

WordPress и Nginx

Пакет WordPress (если есть в репозитории) и копирование в document root:

sudo yum install wordpress
sudo cp -r /usr/share/wordpress /var/www/html/

Минимальный vhost Nginx с PHP-FPM:

server {
    listen 80;
    server_name your_domain.com;
    root /var/www/html/wordpress;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Сокет PHP-FPM зависит от дистрибутива и версии PHP – проверьте unit/pool конфиг, не копируйте путь вслепую.

Контексты SELinux для каталога WordPress

По умолчанию SELinux может запретить чтение/запись там, где веб-стеку это нужно. Пометьте дерево как контент httpd и примените метки:

sudo semanage fcontext -a -t httpd_sys_content_t '/var/www/html/wordpress(/.*)?'
sudo restorecon -Rv /var/www/html/wordpress

Каталоги, куда WordPress пишет (uploads, cache, иногда wp-content целиком на dev), обычно требуют httpd_sys_rw_content_t:

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/wordpress/wp-content/uploads(/.*)?'
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/wordpress/wp-content/cache(/.*)?'
sudo restorecon -Rv /var/www/html/wordpress/wp-content

Без rw-метки обновления плагинов и загрузка медиа часто сыпятся в audit.log, при этом Unix-права выглядят «нормально».

Boolean: БД и сеть

Если MySQL/MariaDB на том же или другом хосте, веб-процессу нужен сетевой доступ к БД:

sudo setsebool -P httpd_can_network_connect_db 1

Флаг -P делает boolean постоянным после перезагрузки. Если PHP ходит наружу (обновления, API, SMTP через TCP), иногда нужен и более широкий:

# только если реально требуется исходящий TCP из httpd/php-fpm
sudo setsebool -P httpd_can_network_connect 1

Не включайте все boolean «на всякий случай» – смотрите отказы в audit и включайте точечно.

Проверка и разбор отказов

После смены меток и boolean пройдите по сайту: просмотр страниц, вход в админку, правка записи, загрузка файла в медиабиблиотеку. Если что-то режется:

sudo ausearch -m avc -ts recent | tail -50
# или
sudo grep denied /var/log/audit/audit.log | tail -30
# пояснение отказа:
sudo ausearch -m avc -ts recent | audit2why

По выводу решаете: дописать fcontext, boolean или (реже) локальный модуль policy. Не ставьте setenforce 0 на прод как «решение».

Проверить текущие метки:

ls -Z /var/www/html/wordpress
ls -Z /var/www/html/wordpress/wp-content/uploads
getsebool -a | grep httpd

Регулярные обновления ОС, Nginx, PHP и WordPress по-прежнему обязательны. SELinux – слой контроля доступа, а не замена патчам.

Источники и ссылки


Комментарии загружаются…