This commit is contained in:
Redsandyg
2026-06-15 06:31:35 +03:00
commit fcc9139361
50 changed files with 5400 additions and 0 deletions

View File

@@ -0,0 +1,339 @@
# Минимально необходимые полномочия 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`.