Files
nginx-analize/docs/Минимально_необходимые_полномочия_nginx_—_проверка.md
Redsandyg fcc9139361 init
2026-06-15 06:31:35 +03:00

340 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Минимально необходимые полномочия 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
```
- **Примечание:** См. п. 12 в `Контроль целостности хранимого кода и конфигурации — проверка.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 файлов
```
- **Примечание:** См. п. 34 в `Контроль целостности хранимого кода и конфигурации — проверка.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 в нужной группе
```
- **Примечание:** См. п. 13 в `Контроль выполнения кода — проверка.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
```
- **Примечание:** См. п. 1213 в `Минимизация поверхности атаки nginx — проверка.md`; п. 4 в `Контроль выполнения кода — проверка.md`.