# Минимально необходимые полномочия 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 | Комбинированная мера | сеть / конфигурация | --- 1. **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 - **Пример реализации:** ```nginx # /etc/nginx/nginx.conf user nginx nginx; # или: user www-data www-data; worker_processes auto; ``` - **Проверка эффективности:** ```bash 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`. 2. **Конфигурация 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 {} \; ``` - **Проверка эффективности:** ```bash 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`. 3. **Директории веб-контента** - Необходимые полномочия: чтение файлов, которые должны обслуживаться пользователям. - Запрещено: запись в 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 ``` - **Проверка эффективности:** ```bash 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`. 4. **Директории загрузки файлов** - Необходимые полномочия: запись только в специально выделенные директории (если функция загрузки нужна). - Запрещено: запись в директории, передаваемые обработчикам кода, если это не предусмотрено. - Комментарий: нужно исключить загрузку исполняемого кода в директории обработки. - Проверка: - **Статус:** Условно (если используется) - **Ревью полномочий:** Требования адекватны при использовании WebDAV или иной загрузки. Write — только в выделенный каталог (`/var/www/uploads/`), изолированный от FastCGI `root`. Запрет исполняемых расширений (`.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/ ``` ```nginx location /uploads/ { root /var/www/static-only; dav_methods PUT; } ``` - **Проверка эффективности:** ```bash 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`. 5. **Журналы 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 ``` ```nginx # Альтернатива: централизованное журналирование # 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; ``` - **Проверка эффективности:** ```bash 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`. 6. **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/ ``` - **Проверка эффективности:** ```bash 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`. 7. **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 ``` - **Проверка эффективности:** ```bash 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`. 8. **Файл пользователей 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 ``` - **Проверка эффективности:** ```bash 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`. 9. **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 nginx ``` ```nginx location ~ \.php$ { fastcgi_pass unix:/run/php/php-fpm.sock; } ``` - **Проверка эффективности:** ```bash 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`. 10. **Динамические модули 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/*.so ``` ```nginx load_module modules/ngx_http_geoip_module.so; ``` - **Проверка эффективности:** ```bash 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`. 11. **Временные директории 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 - **Пример реализации:** ```nginx 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/ ``` - **Проверка эффективности:** ```bash 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-файлов не создаётся; пути всё равно зафиксировать в ЭД. 12. **Сетевые соединения к 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 - **Пример реализации:** ```nginx 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 ``` - **Проверка эффективности:** ```bash 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`.