25 KiB
25 KiB
Минимально необходимые полномочия nginx — результаты проверки
Дата проверки: 10.06.2026
Объект проверки: полномочия процесса nginx и доступ к ресурсам ОС
Метод: ревью модели полномочий, подтверждение по документации nginx и практикам ОС, примеры прав доступа и команды аудита (без практической настройки на стенде)
Сводная таблица
| № | Объект полномочий | Статус | Уровень |
|---|---|---|---|
| 1 | Worker-процессы nginx | Реализуемо | процесс |
| 2 | Конфигурация nginx | Реализуемо | ФС |
| 3 | Директории веб-контента | Реализуемо | ФС |
| 4 | Директории загрузки файлов | Условно (если используется) | ФС |
| 5 | Журналы nginx | Комбинированная мера | ФС / syslog |
| 6 | TLS-сертификаты | Реализуемо | ФС |
| 7 | TLS-ключи | Реализуемо | ФС |
| 8 | Файл пользователей Basic Auth | Условно (если используется) | ФС |
| 9 | Unix-сокеты backend | Реализуемо | ФС / процесс |
| 10 | Динамические модули nginx | Комбинированная мера | ФС + FIM |
| 11 | Временные директории nginx | Реализуемо | ФС |
| 12 | Сетевые соединения к backend | Комбинированная мера | сеть / конфигурация |
-
Worker-процессы nginx
- Необходимые полномочия: выполнение от непривилегированного пользователя, заданного в конфигурации; повышенные права master-процесса допускаются только для запуска службы и системных операций.
- Запрещено: работа worker-процессов с избыточными правами root.
- Комментарий: master-процесс может стартовать с повышенными правами для привязки к портам, worker-процессы должны работать с минимальными правами.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Модель полномочий корректна и соответствует архитектуре nginx. Master (root) выполняет bind к портам <1024, чтение TLS-ключей при reload, fork worker-процессов. Worker работает от пользователя из директивы
userс минимальными правами. Запрет worker от root — обязательное требование;worker_processesна привилегии не влияет. - Источник: https://nginx.org/en/docs/ngx_core_module.html#user
- Пример реализации:
# /etc/nginx/nginx.conf user nginx nginx; # или: user www-data www-data; worker_processes auto; - Проверка эффективности:
nginx -T 2>/dev/null | grep '^user ' ps aux | grep 'nginx:' # Master — root; worker — UID пользователя из user (не 0) id nginx 2>/dev/null || id www-data - Примечание: См. п. 15 в
Минимизация поверхности атаки nginx — проверка.md.
-
Конфигурация nginx
- Необходимые полномочия: чтение конфигурации nginx.
- Запрещено: запись в конфигурацию от имени пользователя nginx.
- Комментарий: изменение конфигурации должно быть доступно только администратору.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Требования адекватны. Master читает конфигурацию при старте/reload (от root); worker не должен иметь прав на запись в
/etc/nginx/. Владелец — root, права на файлы —644, на каталоги —755. Изменения — только администратором; контроль целостности — FIM. - Источник: https://nginx.org/en/docs/ngx_core_module.html#include
- Пример реализации:
chown -R root:root /etc/nginx/ find /etc/nginx -type f -exec chmod 644 {} \; find /etc/nginx -type d -exec chmod 755 {} \; - Проверка эффективности:
ls -la /etc/nginx/ namei -l /etc/nginx/nginx.conf # Пользователь nginx не имеет write на /etc/nginx/ sudo -u nginx test -w /etc/nginx/nginx.conf && echo FAIL || echo OK - Примечание: См. п. 1–2 в
Контроль целостности хранимого кода и конфигурации — проверка.md.
-
Директории веб-контента
- Необходимые полномочия: чтение файлов, которые должны обслуживаться пользователям.
- Запрещено: запись в web-root, если nginx не должен изменять контент.
- Комментарий: для статического сайта nginx обычно нужны только права чтения.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Требования корректны. Worker нужен только
read/execute(traverse) на каталоги иreadна файлы. Запись в web-root для статического сайта запрещена — снижает риск подмены контента при компрометации worker. Каталоги —755, файлы —644; без world-writable (777,666). - Источник: https://nginx.org/en/docs/http/ngx_http_core_module.html#root
- Пример реализации:
chown -R root:www-data /var/www/html/ find /var/www/html -type d -exec chmod 755 {} \; find /var/www/html -type f -exec chmod 644 {} \; # nginx (www-data) — только чтение, без write - Проверка эффективности:
nginx -T 2>/dev/null | grep -E '^\s*root\s|^\s*alias\s' namei -l /var/www/html/index.html ls -la /var/www/html/ sudo -u nginx test -w /var/www/html/index.html && echo FAIL || echo OK find /var/www -perm -0002 -type f 2>/dev/null # Не должно быть world-writable файлов - Примечание: См. п. 3–4 в
Контроль целостности хранимого кода и конфигурации — проверка.md; п. 14 вМинимизация поверхности атаки nginx — проверка.md.
-
Директории загрузки файлов
- Необходимые полномочия: запись только в специально выделенные директории (если функция загрузки нужна).
- Запрещено: запись в директории, передаваемые обработчикам кода, если это не предусмотрено.
- Комментарий: нужно исключить загрузку исполняемого кода в директории обработки.
- Проверка:
- Статус: Условно (если используется)
- Ревью полномочий: Требования адекватны при использовании WebDAV или иной загрузки. Write — только в выделенный каталог (
/var/www/uploads/), изолированный от FastCGIroot. Запрет исполняемых расширений (.php,.py) в upload-директории. Без WebDAV — запись worker в web-root не нужна. - Источник: https://nginx.org/en/docs/http/ngx_http_dav_module.html
- Пример реализации:
mkdir -p /var/www/uploads chown nginx:nginx /var/www/uploads chmod 750 /var/www/uploads # Нет fastcgi_pass в location /uploads/location /uploads/ { root /var/www/static-only; dav_methods PUT; } - Проверка эффективности:
nginx -T 2>/dev/null | grep dav_methods ls -la /var/www/uploads/ 2>/dev/null # Upload-каталог не пересекается с root для .php find /var/www/uploads -name '*.php' -o -name '*.py' 2>/dev/null - Примечание: См. п. 10 в
Контроль целостности хранимого кода и конфигурации — проверка.md; п. 5 вМинимизация поверхности атаки nginx — проверка.md.
-
Журналы nginx
- Необходимые полномочия: права на запись текущих журналов или передачу событий в syslog.
- Запрещено: изменение, удаление и подмена архивных журналов (ограничить правами ОС и/или централизованным журналированием).
- Комментарий: для аудита важна защита журналов от подмены и удаления.
- Проверка:
- Статус: Комбинированная мера
- Ревью полномочий: Модель корректна. Активные журналы — write для пользователя nginx (или группа
adm); архивы после logrotate — read-only для nginx (chmod 440, владелец root:adm). Централизованное журналирование через syslog снимает зависимость от локальных файлов. Worker не должен удалять/перезаписывать архивы. - Источник: https://nginx.org/en/docs/ngx_core_module.html#error_log , https://nginx.org/en/docs/syslog.html
- Пример реализации:
chown root:adm /var/log/nginx/ chmod 750 /var/log/nginx/ chmod 640 /var/log/nginx/access.log /var/log/nginx/error.log# Альтернатива: централизованное журналирование # access_log syslog:server=192.168.1.1:514,facility=local7,tag=nginx,severity=info combined; # error_log syslog:server=192.168.1.1:514,facility=local7,tag=nginx; - Проверка эффективности:
ls -la /var/log/nginx/ stat -c '%a %U:%G' /var/log/nginx/*.log sudo -u nginx rm /var/log/nginx/access.log.1 2>&1 # Ожидание: отказ в удалении архива nginx -T 2>/dev/null | grep -E 'access_log|error_log' - Примечание: См. п. 13 в
Контроль целостности хранимого кода и конфигурации — проверка.md; п. 14 вПроверочные мероприятия для ПМИ — проверка.md.
-
TLS-сертификаты
- Необходимые полномочия: минимальные права для чтения сертификатов на этапе запуска/перезагрузки конфигурации.
- Запрещено: запись/изменение сертификатов от имени nginx.
- Комментарий: сертификаты должны изменяться только администратором.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Требования корректны. Сертификаты (публичная часть) —
644, владелец root. Master читает при старте/reload; worker не нуждается в write. Обновление сертификатов — администратором, с последующимnginx -s reload. - Источник: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate
- Пример реализации:
chown root:root /etc/nginx/ssl/ chmod 644 /etc/nginx/ssl/*.crt chmod 755 /etc/nginx/ssl/ - Проверка эффективности:
ls -la /etc/nginx/ssl/ stat -c '%a %U:%G %n' /etc/nginx/ssl/*.crt sudo -u nginx test -w /etc/nginx/ssl/server.crt && echo FAIL || echo OK - Примечание: См. п. 11 в
Контроль целостности хранимого кода и конфигурации — проверка.md.
-
TLS-ключи
- Необходимые полномочия: минимальные права для чтения закрытых ключей на этапе запуска/перезагрузки конфигурации.
- Запрещено: доступ к закрытым ключам для неуполномоченных пользователей/процессов.
- Комментарий: доступ к закрытым ключам должен быть ограничен только необходимыми системными пользователями/процессами.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Требования полностью адекватны. Закрытые ключи читает master-процесс (root) при старте и
nginx -s reload; worker обычно не обращается к ключам напрямую. Права —600, владелец root:root. Пользователь nginx и прочие — без read. Запись nginx на ключи запрещена. - Источник: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate_key
- Пример реализации:
chmod 600 /etc/nginx/ssl/*.key chown root:root /etc/nginx/ssl/*.key - Проверка эффективности:
stat -c '%a %U:%G %n' /etc/nginx/ssl/*.key # Ожидание: 600 root root sudo -u nginx cat /etc/nginx/ssl/server.key 2>&1 # Ожидание: Permission denied getfacl /etc/nginx/ssl/server.key 2>/dev/null - Примечание: См. п. 11 в
Контроль целостности хранимого кода и конфигурации — проверка.md.
-
Файл пользователей Basic Auth
- Необходимые полномочия: чтение файла для проверки паролей.
- Запрещено: запись в файл пользователей от имени nginx.
- Комментарий: изменение учётных данных должно выполняться администратором.
- Проверка:
- Статус: Условно (если используется)
- Ревью полномочий: Требования корректны при использовании
auth_basic. Worker нужен read; write — только root (администратор). Рекомендуемые права —640, владелец root:root (или root:nginx при необходимости read для worker через группу). - Источник: https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html#auth_basic_user_file
- Пример реализации:
chown root:root /etc/nginx/htpasswd chmod 640 /etc/nginx/htpasswd # Обновление: htpasswd от root, затем nginx -s reload - Проверка эффективности:
nginx -T 2>/dev/null | grep auth_basic_user_file ls -la /etc/nginx/htpasswd sudo -u nginx test -w /etc/nginx/htpasswd && echo FAIL || echo OK - Примечание: См. п. 12 в
Контроль целостности хранимого кода и конфигурации — проверка.md.
-
Unix-сокеты backend
- Необходимые полномочия: доступ только к сокетам тех backend, которые используются конфигурацией.
- Запрещено: доступ к произвольным сокетам и сервисам ОС.
- Комментарий: например, socket PHP-FPM/uWSGI должен быть доступен только при необходимости.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Требования адекватны. Доступ к Unix-сокету — через группу: пользователь nginx в группе
www-data/php-fpm, сокет с правами660и группойwww-data. Не использовать world-readable сокеты (777). Доступ только к сокетам изfastcgi_pass/uwsgi_passв конфигурации. - Источник: https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass , https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_pass
- Пример реализации:
# PHP-FPM pool: listen.owner = www-data, listen.group = www-data, listen.mode = 0660 usermod -aG www-data nginxlocation ~ \.php$ { fastcgi_pass unix:/run/php/php-fpm.sock; } - Проверка эффективности:
nginx -T 2>/dev/null | grep -E 'fastcgi_pass|uwsgi_pass|scgi_pass' namei -l /run/php/php-fpm.sock ls -la /run/php/ groups nginx 2>/dev/null || groups www-data # Сокет не world-writable; nginx в нужной группе - Примечание: См. п. 1–3 в
Контроль выполнения кода — проверка.md.
-
Динамические модули nginx
- Необходимые полномочия: чтение разрешённых .so-модулей.
- Запрещено: запись/подмена .so-модулей от имени nginx.
- Комментарий: модули выполняются в процессе nginx, поэтому требуют контроля целостности.
- Проверка:
- Статус: Комбинированная мера
- Ревью полномочий: Требования корректны. Master загружает
.soпри старте (read); каталог/usr/lib/nginx/modules/— root:root,755, файлы644. Пользователь nginx не имеет write. Подмена модулей предотвращается FIM и организационным белым спискомload_module. - Источник: https://nginx.org/en/docs/ngx_core_module.html#load_module
- Пример реализации:
chown -R root:root /usr/lib/nginx/modules/ chmod 755 /usr/lib/nginx/modules/ chmod 644 /usr/lib/nginx/modules/*.soload_module modules/ngx_http_geoip_module.so; - Проверка эффективности:
ls -la /usr/lib/nginx/modules/ nginx -T 2>/dev/null | grep load_module sudo -u nginx test -w /usr/lib/nginx/modules/ngx_http_geoip_module.so && echo FAIL || echo OK afick -c /etc/afick.conf --check - Примечание: См. п. 5 в
Контроль целостности хранимого кода и конфигурации — проверка.md; п. 3 вМинимизация поверхности атаки nginx — проверка.md.
-
Временные директории nginx
- Необходимые полномочия: запись во временные директории, необходимые для buffering/client body.
- Запрещено: запись в произвольные системные директории.
- Комментарий: временные директории должны быть ограничены и контролируемы правами.
- Проверка:
- Статус: Реализуемо
- Ревью полномочий: Требования адекватны. По умолчанию nginx использует
client_body_temp_path,proxy_temp_path,fastcgi_temp_pathпод/var/cache/nginxили compile-time пути. Явно задать пути в конфигурации; каталог — владелец nginx:nginx,700или750. Не использовать world-writable/tmp. - Источник: https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_temp_path , https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_path
- Пример реализации:
http { client_body_temp_path /var/cache/nginx/client_temp; proxy_temp_path /var/cache/nginx/proxy_temp; fastcgi_temp_path /var/cache/nginx/fastcgi_temp; }mkdir -p /var/cache/nginx/{client_temp,proxy_temp,fastcgi_temp} chown -R nginx:nginx /var/cache/nginx/ chmod 750 /var/cache/nginx/ - Проверка эффективности:
nginx -T 2>/dev/null | grep -E 'client_body_temp_path|proxy_temp_path|fastcgi_temp_path' ls -la /var/cache/nginx/ find /var/cache/nginx -perm -0002 2>/dev/null # Нет world-writable каталогов - Примечание: При
proxy_buffering offчасть temp-файлов не создаётся; пути всё равно зафиксировать в ЭД.
-
Сетевые соединения к backend
- Необходимые полномочия: исходящие соединения только к утверждённым backend-сервисам (при проксировании).
- Запрещено: произвольные исходящие соединения, если они не нужны.
- Комментарий: ограничивается архитектурой, межсетевыми правилами и конфигурацией.
- Проверка:
- Статус: Комбинированная мера
- Ревью полномочий: Требования корректны, но nginx не имеет встроенного egress-filter. Ограничение исходящих соединений — комбинация: (1) конфигурация с белым списком
upstream/proxy_pass; (2) файрвол/nftables на хосте; (3) сегментация сети. Без проксирования исходящие соединения nginx минимальны (DNS при resolver, syslog при централизованном журналировании). - Источник: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass , https://nginx.org/en/docs/http/ngx_http_upstream_module.html
- Пример реализации:
upstream approved_backend { server 127.0.0.1:8080; server 10.0.0.5:8080; } location /api/ { proxy_pass http://approved_backend; }# nftables (фрагмент): исходящие от nginx только к утверждённым адресам # ip saddr @nginx_workers ip daddr { 10.0.0.5, 127.0.0.1 } tcp dport 8080 accept - Проверка эффективности:
nginx -T 2>/dev/null | grep -E 'proxy_pass|fastcgi_pass|uwsgi_pass|grpc_pass|resolver' ss -tnp | grep nginx # Сверить активные соединения с утверждённым перечнем backend nft list ruleset 2>/dev/null | grep -i nginx - Примечание: См. п. 12–13 в
Минимизация поверхности атаки nginx — проверка.md; п. 4 вКонтроль выполнения кода — проверка.md.