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,451 @@
# Контроль выполнения кода nginx — результаты проверки
**Дата проверки:** 10.06.2026
**Объект проверки:** upstream nginx + меры контроля выполнения кода
**Метод:** ревью мер контроля, подтверждение по документации nginx, примеры реализации и способы аудита (без практического аудита на стенде)
## Сводная таблица
| № | Механизм | Статус | Тип контроля |
|---|----------|--------|--------------|
| 1 | FastCGI / PHP-FPM | Реализуемо | Конфигурация nginx |
| 2 | uWSGI | Реализуемо | Конфигурация nginx |
| 3 | SCGI | Реализуемо | Конфигурация nginx |
| 4 | HTTP reverse proxy | Реализуемо | Конфигурация nginx |
| 5 | gRPC backend | Реализуемо с оговорками | Конфигурация nginx |
| 6 | njs | Реализуемо с оговорками | Конфигурация + FIM |
| 7 | Perl module | Реализуемо с оговорками | Организационный запрет / FIM |
| 8 | SSI | Реализуемо | Конфигурация nginx |
| 9 | XSLT | Реализуемо с оговорками | Конфигурация + FIM |
| 10 | Динамические модули nginx | Реализуемо | Конфигурация + FIM |
| 11 | Сторонние динамические модули | Реализуемо с оговорками | Организационный белый список + FIM |
| 12 | WebDAV | Реализуемо | Конфигурация nginx |
| 13 | Внутренние перенаправления | Реализуемо | Конфигурация nginx |
| 14 | root / alias | Реализуемо | Конфигурация + права ФС |
| 15 | Конфигурация nginx | Требует внешних/организационных мер | FIM + права доступа |
| 16 | Файлы веб-приложений | Требует внешних/организационных мер | FIM |
---
1. **Механизм:** FastCGI / PHP-FPM
- **Риск:** Передача в обработку файла из неразрешённого каталога ОС.
- **Требование / решение:** Разрешить передачу файлов во внешний обработчик только из утверждённых директорий веб-приложений.
- **Что контролировать:** location; root; alias; try_files; fastcgi_param SCRIPT_FILENAME.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование адекватно риску path traversal и произвольного `SCRIPT_FILENAME`. Перечень «Что контролировать» полный. Ключевой контроль — привязка `location ~ \.php$` к фиксированному `root` и безопасное значение `SCRIPT_FILENAME`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
- **Пример реализации контроля:**
```nginx
server {
root /var/www/app/public;
location / {
try_files $uri =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'SCRIPT_FILENAME|fastcgi_pass|root|alias'
# Убедиться: SCRIPT_FILENAME = $document_root$fastcgi_script_name
# Нет fastcgi_param SCRIPT_FILENAME с пользовательскими переменными
# root указывает только на утверждённый каталог
```
- **Примечание:** Зафиксировать перечень разрешённых директорий в эксплуатационной документации. См. классификацию п. 2 в `Выполнение кода — проверка.md`.
2. **Механизм:** uWSGI
- **Риск:** Передача запроса в приложение, выполняющее код вне контроля nginx.
- **Требование:** Разрешить маршрутизацию только к утверждённым uWSGI-приложениям.
- **Что контролировать:** uwsgi_pass; upstream; конфигурация backend.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование корректно: nginx не исполняет код, но направляет запросы. Контроль — фиксированный `upstream` с явным списком сокетов/адресов, без произвольных `uwsgi_pass` на внешние хосты.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html
- **Пример реализации контроля:**
```nginx
upstream approved_uwsgi {
server unix:/run/uwsgi/app.sock;
}
location / {
uwsgi_pass approved_uwsgi;
include uwsgi_params;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'uwsgi_pass|upstream'
# Все uwsgi_pass ссылаются на утверждённый upstream
# Нет uwsgi_pass на произвольные IP/порты вне списка
```
- **Примечание:** См. классификацию п. 3 в `Выполнение кода — проверка.md`.
3. **Механизм:** SCGI
- **Риск:** Передача запроса во внешний обработчик, выполняющий код приложения.
- **Требование:** Разрешить маршрутизацию только к утверждённым SCGI-приложениям.
- **Что контролировать:** scgi_pass; upstream; конфигурация backend.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Аналогично uWSGI. Мера достаточна при фиксированном upstream и документированном перечне SCGI-приложений.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_scgi_module.html
- **Пример реализации контроля:**
```nginx
upstream approved_scgi {
server 127.0.0.1:4000;
}
location / {
scgi_pass approved_scgi;
include scgi_params;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'scgi_pass|upstream'
```
- **Примечание:** См. классификацию п. 4 в `Выполнение кода — проверка.md`.
4. **Механизм:** HTTP reverse proxy
- **Риск:** Передача запроса во внешний backend, где выполняется код приложения.
- **Требование:** Разрешить proxy_pass только к утверждённым backend-сервисам.
- **Что контролировать:** proxy_pass; upstream; proxy_set_header.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование адекватно. Контроль через именованный `upstream` с фиксированными backend; запрет `proxy_pass http://$variable` (динамический backend). Сетевая изоляция backend — дополнительная мера на уровне firewall.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- **Пример реализации контроля:**
```nginx
upstream approved_backend {
server 127.0.0.1:8080;
keepalive 32;
}
location /api/ {
proxy_pass http://approved_backend;
proxy_set_header Host $host;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'proxy_pass|upstream'
# Нет proxy_pass с переменными или на неутверждённые адреса
```
- **Примечание:** См. классификацию п. 5 в `Выполнение кода — проверка.md`.
5. **Механизм:** gRPC backend
- **Риск:** Передача запроса во внешний gRPC-сервис, где выполняется код.
- **Требование:** Разрешить grpc_pass только к утверждённым gRPC-сервисам.
- **Что контролировать:** grpc_pass; upstream; TLS-настройки при необходимости.
- Проверка:
- **Статус:** Реализуемо с оговорками
- **Ревью меры контроля:** Требование корректно. Дополнительно контролировать TLS для gRPC (HTTP/2). Перечень «Что контролировать» полный.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_grpc_module.html
- **Пример реализации контроля:**
```nginx
upstream approved_grpc {
server 127.0.0.1:50051;
}
location /grpc.service/ {
grpc_pass grpc://approved_grpc;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'grpc_pass|upstream'
```
- **Примечание:** См. классификацию п. 6 в `Выполнение кода — проверка.md`.
6. **Механизм:** njs
- **Риск:** Выполнение JavaScript-логики внутри процесса nginx.
- **Требование:** Разрешить использование njs только из утверждённых файлов/модулей, если njs применяется.
- **Что контролировать:** js_import; js_content; js_set; файлы JavaScript.
- Проверка:
- **Статус:** Реализуемо с оговорками
- **Ревью меры контроля:** Требование адекватно. Рекомендуется по умолчанию не использовать njs; при необходимости — белый список JS-файлов и FIM на `/etc/nginx/njs/`. Перечень контролируемых объектов полный.
- **Источник:** https://nginx.org/en/docs/njs/
- **Пример реализации контроля:**
```nginx
# Только утверждённые модули и файлы
load_module modules/ngx_http_js_module.so;
http {
js_import main from /etc/nginx/njs/main.js;
location /njs-handler {
js_content main.handler;
}
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'js_import|js_content|js_set|load_module.*js'
ls -la /etc/nginx/njs/
# Сверить перечень JS-файлов с утверждённым списком
```
- **Примечание:** JS-файлы включить в контроль целостности (afick). См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 6 (njs). См. классификацию п. 7 в `Выполнение кода — проверка.md`.
7. **Механизм:** Perl module
- **Риск:** Выполнение Perl-логики внутри процесса nginx.
- **Требование:** Разрешить использование Perl-модуля только при наличии обоснованной необходимости.
- **Что контролировать:** perl; perl_set; perl_require; Perl-файлы.
- Проверка:
- **Статус:** Реализуемо с оговорками
- **Ревью меры контроля:** Требование корректно — предпочтительно не включать Perl-модуль. Если включён — обоснование в документации, FIM на Perl-файлы, аудит директив `perl`/`perl_require`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_perl_module.html
- **Пример реализации контроля:**
```nginx
# Рекомендация: не включать Perl-модуль в сборку/конфигурацию
# Если необходим — только утверждённые файлы:
# perl_modules /etc/nginx/perl;
# perl_require approved.pm;
```
- **Проверка эффективности контроля:**
```bash
nginx -V 2>&1 | grep -i perl
nginx -T 2>/dev/null | grep -E 'perl|perl_require|perl_set'
# Ожидание для безопасной конфигурации: отсутствие директив perl
```
- **Примечание:** См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 7 (Perl). См. классификацию п. 8 в `Выполнение кода — проверка.md`.
8. **Механизм:** SSI
- **Риск:** Обработка SSI-команд в ответах может изменить формируемый контент.
- **Требование:** Разрешить SSI только для утверждённых ресурсов или отключить, если не требуется.
- **Что контролировать:** ssi; SSI-файлы; location, где включён SSI.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование адекватно. Дополнительно: запретить `<!--#exec cmd="..."-->` в SSI-файлах (выполнение shell-команд). По умолчанию `ssi off`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssi_module.html
- **Пример реализации контроля:**
```nginx
http {
ssi off; # по умолчанию отключено
}
location /ssi-approved/ {
ssi on;
root /var/www/html;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -i ssi
grep -r '#exec' /var/www/html/ 2>/dev/null
# ssi on только в утверждённых location; нет exec в SSI-файлах
```
- **Примечание:** См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 9 (SSI). См. классификацию п. 9 в `Выполнение кода — проверка.md`.
9. **Механизм:** XSLT
- **Риск:** Выполнение логики преобразования XML с использованием XSLT-стилей.
- **Требование:** Разрешить XSLT-преобразования только с утверждёнными XSLT-файлами, если функция используется.
- **Что контролировать:** xslt_stylesheet; XSLT-файлы.
- Проверка:
- **Статус:** Реализуемо с оговорками
- **Ревью меры контроля:** Требование корректно. XSLT-файлы — объекты FIM. Рекомендуется не использовать модуль, если не требуется.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_xslt_module.html
- **Пример реализации контроля:**
```nginx
location /api/xml {
proxy_pass http://backend;
xslt_stylesheet /etc/nginx/xslt/approved-transform.xslt;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep xslt_stylesheet
ls -la /etc/nginx/xslt/
# Все XSLT-файлы в утверждённом перечне
```
- **Примечание:** См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 8 (XSLT). См. классификацию п. 10 в `Выполнение кода — проверка.md`.
10. **Механизм:** Динамические модули nginx
- **Риск:** Загрузка неразрешённого .so-модуля, выполняемого в процессе nginx.
- **Требование:** Разрешить загрузку только модулей из утверждённого перечня.
- **Что контролировать:** load_module; директории модулей; .so-файлы.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование полностью адекватно риску. Организационный белый список `load_module` + FIM на каталог модулей.
- **Источник:** https://nginx.org/en/docs/ngx_core_module.html#load_module
- **Пример реализации контроля:**
```nginx
# В nginx.conf — только утверждённые модули
load_module modules/ngx_http_geoip_module.so;
# load_module /path/to/unapproved.so; # запрещено
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep load_module
ls -la /usr/lib/nginx/modules/
# Сверить с утверждённым перечнем в эксплуатационной документации
afick -c /etc/afick.conf --check
```
- **Примечание:** См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 3 (динамические модули). См. классификацию п. 11 в `Выполнение кода — проверка.md`.
11. **Механизм:** Сторонние динамические модули
- **Риск:** Подключение стороннего кода без контроля поставки и целостности.
- **Требование:** Запретить сторонние модули либо допускать только после включения в утверждённый список.
- **Что контролировать:** load_module; пакет модуля; путь к .so.
- Проверка:
- **Статус:** Реализуемо с оговорками
- **Ревью меры контроля:** Требование корректно. Сочетание организационного запрета, процедуры включения в белый список, контроля пакета (подпись, репозиторий) и FIM на `.so`.
- **Источник:** https://nginx.org/en/docs/ngx_core_module.html#load_module
- **Пример реализации контроля:**
```nginx
# Политика: только модули из дистрибутивного пакета nginx
# load_module modules/ngx_http_js_module.so; # только после утверждения
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep load_module
rpm -V nginx 2>/dev/null || dpkg -V nginx 2>/dev/null
# Проверка целостности пакета и отсутствия посторонних .so
find /usr/lib/nginx/modules/ -name '*.so' -newer /etc/nginx/nginx.conf
```
- **Примечание:** Процедура утверждения сторонних модулей — организационная мера. См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 7 (Perl). См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 9 (SSI). См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 8 (XSLT). См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 3 (динамические модули). См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 3 (сторонние модули). См. классификацию п. 8 в `Выполнение кода — проверка.md`. См. классификацию п. 9 в `Выполнение кода — проверка.md`. См. классификацию п. 10 в `Выполнение кода — проверка.md`. См. классификацию п. 11 в `Выполнение кода — проверка.md`. См. классификацию п. 12 в `Выполнение кода — проверка.md`.
- **Примечание:** Процедура утверждения сторонних модулей — организационная мера. См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 3 (сторонние модули). См. классификацию п. 12 в `Выполнение кода — проверка.md`.
12. **Механизм:** WebDAV
- **Риск:** Загрузка файла, который затем может быть обработан как код внешним обработчиком.
- **Требование:** Запретить WebDAV в базовой конфигурации либо ограничить загрузку в директории, не передаваемые обработчикам кода.
- **Что контролировать:** dav_methods; права на директории; location WebDAV.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование адекватно косвенному риску. WebDAV не должен пересекаться с каталогами, обрабатываемыми FastCGI/uWSGI. Upload-директория — только статика, без `.php`/скриптов.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_dav_module.html
- **Пример реализации контроля:**
```nginx
# WebDAV не включён в базовой конфигурации
# При необходимости — изолированный location:
location /uploads/ {
root /var/www/static-only;
dav_methods PUT;
# Нет fastcgi_pass / uwsgi_pass в этом location
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'dav_methods|dav_access'
# dav_methods отсутствует вне утверждённых location
# upload-директория не содержит исполняемых расширений
```
- **Примечание:** См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 5 (WebDAV). См. классификацию п. 13 в `Выполнение кода — проверка.md`.
13. **Механизм:** Внутренние перенаправления
- **Риск:** Перенаправление запроса к обработчику кода в обход ожидаемой логики доступа.
- **Требование:** Контролировать внутренние маршруты и исключить передачу в обработку файлов из неразрешённых директорий.
- **Что контролировать:** try_files; error_page; internal; named location.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование корректно. Аудит цепочек `try_files` → FastCGI, `error_page` → internal location, `rewrite` на обход `root`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#try_files , https://nginx.org/en/docs/http/ngx_http_core_module.html#internal
- **Пример реализации контроля:**
```nginx
location / {
root /var/www/app/public;
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E 'try_files|error_page|rewrite|internal'
# Все try_files перед FastCGI содержат =404
# internal location не ведут за пределы root
```
- **Примечание:** См. классификацию п. 14 в `Выполнение кода — проверка.md`.
14. **Механизм:** root / alias
- **Риск:** Ошибка настройки может открыть произвольный каталог ОС или передать файл во внешний обработчик.
- **Требование:** Разрешить обслуживание и обработку файлов только из утверждённых директорий.
- **Что контролировать:** root; alias; location; права ФС.
- Проверка:
- **Статус:** Реализуемо
- **Ревью меры контроля:** Требование полностью адекватно. Контроль конфигурации + права ФС (nginx не должен читать `/etc`, `/root` и т.д.). Осторожность с `alias` и regex location.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#root , https://nginx.org/en/docs/http/ngx_http_core_module.html#alias
- **Пример реализации контроля:**
```nginx
server {
root /var/www/app/public;
location / {
try_files $uri =404;
}
location ~ /\. {
deny all;
}
}
```
- **Проверка эффективности контроля:**
```bash
nginx -T 2>/dev/null | grep -E '^\s*(root|alias)\s'
namei -l /var/www/app/public
# root/alias только на утверждённые пути
# права: каталоги 755, файлы 644, владелец не root для web-контента
```
- **Примечание:** См. классификацию п. 15 в `Выполнение кода — проверка.md`.
15. **Механизм:** Конфигурация nginx
- **Риск:** Изменение конфигурации может разрешить выполнение/передачу неразрешённого кода.
- **Требование:** Поставить конфигурацию nginx на контроль целостности и ограничить права изменения.
- **Что контролировать:** /etc/nginx/nginx.conf; подключаемые конфигурации.
- Проверка:
- **Статус:** Требует внешних/организационных мер
- **Ревью меры контроля:** Требование корректно. nginx не обеспечивает FIM самостоятельно. Необходимы: afick/AIDE, ограничение прав записи (`chmod 644`, владелец root), разделение ролей (изменение конфигурации — только администратор).
- **Источник:** Внешняя мера (FIM); https://nginx.org/en/docs/
- **Пример реализации контроля:**
```
# /etc/afick.conf (фрагмент)
/etc/nginx/ R
# Права доступа
# chmod 644 /etc/nginx/nginx.conf
# chmod 644 /etc/nginx/conf.d/*.conf
# chown root:root /etc/nginx/
```
- **Проверка эффективности контроля:**
```bash
afick -c /etc/afick.conf --check
ls -la /etc/nginx/nginx.conf /etc/nginx/conf.d/
# Только root может изменять конфигурацию
stat -c '%a %U' /etc/nginx/nginx.conf
```
- **Примечание:** Изменение конфигурации — через процедуру Change Management с повторным `nginx -t`. Статус отражает внешнюю меру. См. `Контроль целостности хранимого кода и конфигурации — проверка.md` п. 12; функции 9.3 в `функции безопасности — проверка.md`. См. условное отключение в `Минимизация поверхности атаки nginx — проверка.md` п. 5 (WebDAV). См. классификацию п. 13 в `Выполнение кода — проверка.md`. См. классификацию п. 14 в `Выполнение кода — проверка.md`. См. классификацию п. 15 в `Выполнение кода — проверка.md`.
- **Примечание:** Статус отражает внешнюю меру. См. `Контроль целостности хранимого кода и конфигурации — проверка.md` п. 12; функции 9.3 в `функции безопасности — проверка.md`.
16. **Механизм:** Файлы веб-приложений
- **Риск:** Изменение файлов приложения может привести к выполнению неразрешённого кода.
- **Требование:** Поставить разрешённые директории веб-приложений на контроль целостности.
- **Что контролировать:** web-root; директории приложений; исполняемые скрипты.
- Проверка:
- **Статус:** Требует внешних/организационных мер
- **Ревью меры контроля:** Требование адекватно. Контроль целостности web-root и скриптов (.php, .py и др.) — внешнее средство (afick). nginx не отслеживает изменения файлов приложения.
- **Источник:** Внешняя мера (FIM)
- **Пример реализации контроля:**
```
# /etc/afick.conf (фрагмент)
/var/www/ R
```
- **Проверка эффективности контроля:**
```bash
afick -c /etc/afick.conf --check
find /var/www -name '*.php' -o -name '*.py' | head -20
# Сверить перечень скриптов с утверждённым
# После тестового изменения файла — afick должен зафиксировать нарушение
```
- **Примечание:** Дополняет конфигурационный контроль (п. 1, 14); не заменяет его. Статус отражает внешнюю меру. См. `Контроль целостности хранимого кода и конфигурации — проверка.md` п. 34; функции 9.3 в `функции безопасности — проверка.md`.
- **Примечание:** Статус отражает внешнюю меру. См. `Контроль целостности хранимого кода и конфигурации — проверка.md` п. 34; функции 9.3 в `функции безопасности — проверка.md`.