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

665 lines
49 KiB
Markdown
Raw Permalink 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.
# Проверочные мероприятия для ПМИ — результаты проверки
**Дата проверки:** 10.06.2026
**Объект проверки:** upstream nginx + методика ПМИ
**Метод:** ревью пригодности мероприятий, подтверждение по документации nginx, примеры конфигурации и команд испытания (без проведения испытаний на стенде)
## Сводная таблица
| № | Проверяемое требование | Статус | Механизм |
|---|------------------------|--------|----------|
| 1 | Ограничение доступа по IP-адресу | Пригодно с оговорками | allow; deny |
| 2 | Аутентификация по имени пользователя и паролю | Пригодно для ПМИ | auth_basic; auth_basic_user_file |
| 3 | Проверка клиентского TLS-сертификата | Пригодно с оговорками | ssl_verify_client; ssl_client_certificate |
| 4 | Авторизация через внешний сервис | Пригодно с оговорками | auth_request |
| 5 | Комбинирование проверок доступа | Пригодно для ПМИ | satisfy |
| 6 | Разграничение доступа по URL | Пригодно для ПМИ | server; location |
| 7 | Ограничение HTTP-методов | Пригодно для ПМИ | limit_except |
| 8 | Запрет прямого доступа к внутренним ресурсам | Пригодно для ПМИ | internal |
| 9 | Защита соединения TLS | Пригодно с оговорками | listen 443 ssl; ssl_certificate |
| 10 | Ограничение версий TLS и шифров | Пригодно для ПМИ | ssl_protocols; ssl_ciphers |
| 11 | Принудительное использование HTTPS | Пригодно для ПМИ | return 301/308; HSTS |
| 12 | Журналирование HTTP-запросов | Пригодно для ПМИ | access_log; log_format |
| 13 | Журналирование ошибок | Пригодно для ПМИ | error_log |
| 14 | Передача журналов в syslog | Требует внешних средств | syslog |
| 15 | Ограничение частоты запросов | Пригодно для ПМИ | limit_req_zone; limit_req |
| 16 | Ограничение количества соединений | Пригодно для ПМИ | limit_conn_zone; limit_conn |
| 17 | Ограничение размера запроса | Пригодно для ПМИ | client_max_body_size |
| 18 | Настройка таймаутов | Пригодно с оговорками | client_*_timeout; send_timeout |
| 19 | Сокрытие версии nginx | Пригодно для ПМИ | server_tokens off |
| 20 | Управление страницами ошибок | Пригодно для ПМИ | error_page |
| 21 | Отключение листинга директорий | Пригодно для ПМИ | autoindex off |
| 22 | Обратное проксирование backend | Пригодно с оговорками | proxy_pass |
| 23 | Ограничение директорий веб-контента | Пригодно для ПМИ | root; alias; location |
| 24 | Контроль целостности | Требует внешних средств | afick или иной механизм |
---
1. **Проверяемое требование:** Ограничение доступа по IP-адресу
- **Настройка / механизм:** allow; deny
- **Действия испытателя:** Настроить доступ к ресурсу только с разрешённого IP. Выполнить запрос с разрешённого и запрещённого адреса.
- **Ожидаемый результат:** С разрешённого адреса доступ предоставлен, с запрещённого адреса доступ запрещён.
- **Признак выполнения:** Разные HTTP-ответы для разрешённого и запрещённого IP.
- Проверка:
- **Статус:** Пригодно с оговорками
- **Ревью мероприятия:** Действия, ожидаемый результат и признак выполнения корректны. Для проверки «запрещённого IP» необходим второй хост в другой подсети или изменение IP испытательной машины; подмена IP через заголовок `X-Forwarded-For` не влияет на `$remote_addr` без модуля `realip`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_access_module.html
- **Пример конфигурации:**
```nginx
location /admin/ {
allow 192.168.1.100;
deny all;
}
```
- **Примеры команд испытания:**
```bash
# С разрешённого хоста (192.168.1.100)
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/admin/
# С запрещённого хоста (другой IP)
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/admin/
```
- **Проверка признака выполнения:** С разрешённого IP — код 200 (или иной успешный); с запрещённого — 403 Forbidden.
- **Примечание:** Зафиксировать в протоколе IP-адреса испытательных хостов.
2. **Проверяемое требование:** Аутентификация по имени пользователя и паролю
- **Настройка / механизм:** auth_basic; auth_basic_user_file
- **Действия испытателя:** Настроить защищённый location. Выполнить запрос без учётных данных, с неверными и с корректными учётными данными.
- **Ожидаемый результат:** Без учётных данных и с неверными данными доступ запрещён, с корректными данными доступ разрешён.
- **Признак выполнения:** HTTP 401 для отказа и успешный ответ при корректной аутентификации.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие полностью воспроизводимо. Три сценария (без credentials, неверные, верные) покрывают требование. Признак выполнения однозначен.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
- **Пример конфигурации:**
```nginx
location /secure/ {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd;
}
```
- **Примеры команд испытания:**
```bash
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/secure/
curl -s -o /dev/null -w "%{http_code}" -u wrong:wrong http://nginx-test/secure/
curl -s -o /dev/null -w "%{http_code}" -u user:password http://nginx-test/secure/
```
- **Проверка признака выполнения:** Первые два запроса — 401; третий — 200 (или иной успешный код).
3. **Проверяемое требование:** Проверка клиентского TLS-сертификата
- **Настройка / механизм:** ssl_verify_client; ssl_client_certificate
- **Действия испытателя:** Настроить проверку клиентского сертификата. Выполнить подключение без сертификата, с недоверенным и с доверенным сертификатом.
- **Ожидаемый результат:** Доступ разрешён только при предъявлении доверенного клиентского сертификата.
- **Признак выполнения:** Успешное TLS-подключение только с доверенным сертификатом.
- Проверка:
- **Статус:** Пригодно с оговорками
- **Ревью мероприятия:** Действия и ожидаемый результат корректны. Требуется подготовка тестовых сертификатов (CA, доверенный клиентский, недоверенный). При `ssl_verify_client on` подключение без сертификата завершается ошибкой на этапе handshake.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_client
- **Пример конфигурации:**
```nginx
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
}
```
- **Примеры команд испытания:**
```bash
# Без клиентского сертификата — ошибка handshake
openssl s_client -connect nginx-test:443 -servername nginx-test </dev/null
# С доверенным сертификатом
openssl s_client -connect nginx-test:443 -cert client.crt -key client.key </dev/null
# С недоверенным (самоподписанным) сертификатом
openssl s_client -connect nginx-test:443 -cert untrusted.crt -key untrusted.key </dev/null
```
- **Проверка признака выполнения:** Успешный handshake и HTTP-ответ только при доверенном сертификате; без сертификата или с недоверенным — ошибка TLS (verify return code != 0).
4. **Проверяемое требование:** Авторизация через внешний сервис
- **Настройка / механизм:** auth_request
- **Действия испытателя:** Настроить внешний сервис авторизации. Проверить доступ при ответах 2xx, 401 и 403 от сервиса авторизации.
- **Ожидаемый результат:** При 2xx доступ разрешён, при 401/403 доступ запрещён.
- **Признак выполнения:** Поведение nginx соответствует ответу сервиса авторизации.
- Проверка:
- **Статус:** Пригодно с оговорками
- **Ревью мероприятия:** Мероприятие корректно. Требуется mock-сервер авторизации с переключаемыми ответами. Необходимо подтвердить наличие модуля `auth_request` в поставке nginx (`nginx -V`).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_auth_request_module.html
- **Пример конфигурации:**
```nginx
location = /auth {
internal;
proxy_pass http://127.0.0.1:9999/validate;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location / {
auth_request /auth;
proxy_pass http://backend;
}
```
- **Примеры команд испытания:**
```bash
# Mock возвращает 200 — доступ разрешён
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/
# Переключить mock на 401/403 — повторить запрос
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/
```
- **Проверка признака выполнения:** При ответе auth-сервиса 2xx — успешный код от nginx; при 401 — 401; при 403 — 403.
5. **Проверяемое требование:** Комбинирование проверок доступа
- **Настройка / механизм:** satisfy
- **Действия испытателя:** Настроить совместное применение IP-ограничения и Basic Authentication. Проверить сценарии прохождения одной или нескольких проверок.
- **Ожидаемый результат:** Доступ предоставляется в соответствии с выбранным режимом satisfy all/any.
- **Признак выполнения:** Фактический доступ соответствует заданной политике.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. Рекомендуется в протоколе явно фиксировать значение `satisfy` (all/any) и матрицу сценариев: IP+пароль, только IP, только пароль, ни то ни другое.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#satisfy
- **Пример конфигурации:**
```nginx
location /admin/ {
satisfy all;
allow 10.0.0.0/8;
deny all;
auth_basic "Admin";
auth_basic_user_file /etc/nginx/htpasswd;
}
```
- **Примеры команд испытания:**
```bash
# IP из allow + верный пароль
curl -u user:password http://nginx-test/admin/
# IP из allow + без пароля
curl http://nginx-test/admin/
# IP вне allow + верный пароль (при satisfy all — отказ)
curl -u user:password http://nginx-test/admin/
```
- **Проверка признака выполнения:** Сверить фактические коды ответов с матрицей для выбранного `satisfy all` или `satisfy any`.
6. **Проверяемое требование:** Разграничение доступа по URL
- **Настройка / механизм:** server; location
- **Действия испытателя:** Настроить разные правила доступа для публичного и защищённого location. Выполнить запросы к обоим разделам.
- **Ожидаемый результат:** Публичный раздел доступен, защищённый раздел доступен только при выполнении условий доступа.
- **Признак выполнения:** Разные правила доступа применяются к разным URL.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно и воспроизводимо. Достаточно двух location с разными правилами.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#location
- **Пример конфигурации:**
```nginx
location /public/ {
root /var/www/html;
}
location /admin/ {
allow 10.0.0.0/8;
deny all;
root /var/www/html;
}
```
- **Примеры команд испытания:**
```bash
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/public/index.html
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/admin/
```
- **Проверка признака выполнения:** `/public/` — 200; `/admin/` — 403 с неразрешённого IP или 200 с разрешённого.
7. **Проверяемое требование:** Ограничение HTTP-методов
- **Настройка / механизм:** limit_except
- **Действия испытателя:** Настроить ограничение методов. Выполнить запросы методами GET, POST, PUT, DELETE.
- **Ожидаемый результат:** Разрешённые методы обрабатываются, запрещённые методы блокируются.
- **Признак выполнения:** Запрещённые методы возвращают отказ.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. В протоколе указать, какие методы разрешены в `limit_except`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_except
- **Пример конфигурации:**
```nginx
location /api/ {
limit_except GET POST {
deny all;
}
proxy_pass http://backend;
}
```
- **Примеры команд испытания:**
```bash
curl -s -o /dev/null -w "%{http_code}" -X GET http://nginx-test/api/
curl -s -o /dev/null -w "%{http_code}" -X POST http://nginx-test/api/
curl -s -o /dev/null -w "%{http_code}" -X PUT http://nginx-test/api/
curl -s -o /dev/null -w "%{http_code}" -X DELETE http://nginx-test/api/
```
- **Проверка признака выполнения:** GET и POST — успешные коды; PUT и DELETE — 403.
8. **Проверяемое требование:** Запрет прямого доступа к внутренним ресурсам
- **Настройка / механизм:** internal
- **Действия испытателя:** Настроить internal location. Выполнить прямой запрос к нему и внутреннее перенаправление.
- **Ожидаемый результат:** Прямой запрос запрещён, внутреннее перенаправление работает.
- **Признак выполнения:** Прямой доступ получает отказ, внутренний сценарий успешен.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. Прямой запрос к internal location возвращает 404 (не 403) — это штатное поведение nginx; признак выполнения следует трактовать как «отказ в доступе» (404).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#internal
- **Пример конфигурации:**
```nginx
location /protected/ {
internal;
alias /var/data/files/;
}
location /download {
rewrite ^ /protected/document.pdf last;
}
```
- **Примеры команд испытания:**
```bash
# Прямой запрос — отказ
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/protected/document.pdf
# Внутреннее перенаправление — успех
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/download
```
- **Проверка признака выполнения:** Прямой запрос — 404; через `/download` — 200 и содержимое файла.
9. **Проверяемое требование:** Защита соединения TLS
- **Настройка / механизм:** listen 443 ssl; ssl_certificate; ssl_certificate_key
- **Действия испытателя:** Настроить HTTPS-сервер. Выполнить подключение по HTTPS.
- **Ожидаемый результат:** Соединение устанавливается по TLS.
- **Признак выполнения:** Клиент видит действующее TLS-соединение.
- Проверка:
- **Статус:** Пригодно с оговорками
- **Ревью мероприятия:** Мероприятие корректно. Требуются тестовые сертификаты. Для самоподписанных сертификатов в командах нужен флаг `-k`/`--insecure`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html
- **Пример конфигурации:**
```nginx
server {
listen 443 ssl;
server_name nginx-test;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
}
```
- **Примеры команд испытания:**
```bash
curl -vk https://nginx-test/
openssl s_client -connect nginx-test:443 -servername nginx-test </dev/null
```
- **Проверка признака выполнения:** В выводе `openssl s_client` — строка `Verify return code: 0` (или успешный handshake); `curl` завершается без ошибки SSL.
10. **Проверяемое требование:** Ограничение версий TLS и шифров
- **Настройка / механизм:** ssl_protocols; ssl_ciphers
- **Действия испытателя:** Настроить допустимые версии TLS и шифры. Выполнить подключение с разрешёнными и запрещёнными версиями/шифрами.
- **Ожидаемый результат:** Разрешённые параметры работают, запрещённые отклоняются.
- **Признак выполнения:** Результат подключения соответствует политике TLS.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. Рекомендуется зафиксировать в ТУ/ПМИ конкретную политику (например, только TLSv1.2 и TLSv1.3).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols
- **Пример конфигурации:**
```nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
```
- **Примеры команд испытания:**
```bash
# Разрешённая версия
openssl s_client -connect nginx-test:443 -tls1_2 </dev/null
# Запрещённая версия (если в политике только TLSv1.2+)
openssl s_client -connect nginx-test:443 -tls1_1 </dev/null
```
- **Проверка признака выполнения:** TLSv1.2 — успешный handshake; TLSv1.1 — ошибка handshake (alert protocol version).
11. **Проверяемое требование:** Принудительное использование HTTPS
- **Настройка / механизм:** return 301/308; Strict-Transport-Security
- **Действия испытателя:** Выполнить HTTP-запрос к ресурсу. Проверить перенаправление и наличие HSTS-заголовка, если он настроен.
- **Ожидаемый результат:** HTTP-запрос перенаправляется на HTTPS.
- **Признак выполнения:** В ответе присутствует redirect на HTTPS и/или HSTS.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. HSTS проверяется только на HTTPS-ответе, не на HTTP-редиректе.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
- **Пример конфигурации:**
```nginx
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
add_header Strict-Transport-Security "max-age=31536000" always;
}
```
- **Примеры команд испытания:**
```bash
curl -I http://nginx-test/
curl -I https://nginx-test/
```
- **Проверка признака выполнения:** HTTP — `301` и заголовок `Location: https://...`; HTTPS — заголовок `Strict-Transport-Security`.
12. **Проверяемое требование:** Журналирование HTTP-запросов
- **Настройка / механизм:** access_log; log_format
- **Действия испытателя:** Выполнить несколько HTTP-запросов. Проверить появление записей в access log.
- **Ожидаемый результат:** Запросы зарегистрированы в журнале.
- **Признак выполнения:** В журнале присутствуют записи с требуемыми полями.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. В ПМИ зафиксировать перечень обязательных полей журнала (IP, время, метод, URI, статус).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_log_module.html
- **Пример конфигурации:**
```nginx
log_format pmi '$remote_addr - [$time_local] "$request" $status';
access_log /var/log/nginx/access.log pmi;
```
- **Примеры команд испытания:**
```bash
curl http://nginx-test/test-page
curl http://nginx-test/another-page
tail -n 5 /var/log/nginx/access.log
```
- **Проверка признака выполнения:** В журнале две новые записи с IP клиента, URI `/test-page` и `/another-page`, кодами ответа.
13. **Проверяемое требование:** Журналирование ошибок
- **Настройка / механизм:** error_log
- **Действия испытателя:** Сформировать ошибочную ситуацию, которая гарантированно фиксируется в error log: ошибка доступа к файлу, ошибка взаимодействия с backend, некорректный upstream или иная ошибка обработки. Проверить наличие записи в error log.
- **Ожидаемый результат:** Ошибка зарегистрирована в журнале ошибок.
- **Признак выполнения:** В error log появилась запись о событии.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. Простейший воспроизводимый сценарий — `proxy_pass` на недоступный upstream (connection refused).
- **Источник:** https://nginx.org/en/docs/ngx_core_module.html#error_log
- **Пример конфигурации:**
```nginx
error_log /var/log/nginx/error.log warn;
location /broken/ {
proxy_pass http://127.0.0.1:59999;
}
```
- **Примеры команд испытания:**
```bash
curl http://nginx-test/broken/
tail -n 10 /var/log/nginx/error.log
```
- **Проверка признака выполнения:** В error log — запись об ошибке подключения к upstream (`connect() failed`).
14. **Проверяемое требование:** Передача журналов в syslog
- **Настройка / механизм:** access_log syslog:...; error_log syslog:...
- **Действия испытателя:** Настроить вывод журналов в syslog. Выполнить запросы и проверить внешнюю систему журналирования.
- **Ожидаемый результат:** События передаются во внешнюю систему журналирования.
- **Признак выполнения:** Записи обнаружены в syslog/централизованном журнале.
- Проверка:
- **Статус:** Требует внешних средств
- **Ревью мероприятия:** Мероприятие корректно, но зависит от rsyslog/journald или централизованного SIEM. nginx только отправляет в syslog; приёмник — внешний компонент стенда.
- **Источник:** https://nginx.org/en/docs/syslog.html
- **Пример конфигурации:**
```nginx
error_log syslog:server=127.0.0.1:514,facility=local7,tag=nginx,severity=error;
access_log syslog:server=127.0.0.1:514,facility=local7,tag=nginx,severity=info combined;
```
- **Примеры команд испытания:**
```bash
curl http://nginx-test/
# На приёмнике syslog (Linux)
journalctl -t nginx --since "1 min ago"
# или
tail -f /var/log/syslog | grep nginx
```
- **Проверка признака выполнения:** Запись с тегом `nginx` и данными HTTP-запроса в syslog/journal.
- **Примечание:** Статус отражает внешнюю меру. См. `Контроль целостности хранимого кода и конфигурации — проверка.md` п. 13; `Минимально необходимые полномочия nginx — проверка.md` п. 5; функции 4.4 в `функции безопасности — проверка.md`.
15. **Проверяемое требование:** Ограничение частоты запросов
- **Настройка / механизм:** limit_req_zone; limit_req
- **Действия испытателя:** Настроить лимит запросов. Выполнить серию запросов с превышением лимита.
- **Ожидаемый результат:** Избыточные запросы ограничиваются или отклоняются.
- **Признак выполнения:** При превышении лимита сервер возвращает отказ/задержку согласно настройке.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. По умолчанию nginx возвращает 503 при превышении `limit_req` (без `limit_req_status`).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
- **Пример конфигурации:**
```nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;
location / {
limit_req zone=one burst=5 nodelay;
}
```
- **Примеры команд испытания:**
```bash
for i in $(seq 1 20); do
curl -s -o /dev/null -w "%{http_code}\n" http://nginx-test/
done
```
- **Проверка признака выполнения:** Первые запросы — 200; при превышении лимита — 503 (или задержка при отсутствии `nodelay`).
16. **Проверяемое требование:** Ограничение количества соединений
- **Настройка / механизм:** limit_conn_zone; limit_conn
- **Действия испытателя:** Настроить лимит соединений. Открыть число соединений выше допустимого.
- **Ожидаемый результат:** Лишние соединения отклоняются.
- **Признак выполнения:** При превышении лимита сервер возвращает отказ.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. Для воспроизведения удобен `ab` или параллельные `curl` с длительным запросом (sleep на backend).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
- **Пример конфигурации:**
```nginx
limit_conn_zone $binary_remote_addr zone=addr:10m;
location / {
limit_conn addr 2;
}
```
- **Примеры команд испытания:**
```bash
for i in $(seq 1 5); do
curl -s http://nginx-test/slow &
done
wait
```
- **Проверка признака выполнения:** Часть запросов получает 503 (`limit_conn_status` по умолчанию).
17. **Проверяемое требование:** Ограничение размера запроса
- **Настройка / механизм:** client_max_body_size
- **Действия испытателя:** Настроить максимальный размер тела запроса. Отправить запрос меньше и больше лимита.
- **Ожидаемый результат:** Запрос меньше лимита принимается, больше лимита отклоняется.
- **Признак выполнения:** Большой запрос получает ошибку ограничения размера.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно и полностью воспроизводимо.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
- **Пример конфигурации:**
```nginx
client_max_body_size 1m;
```
- **Примеры команд испытания:**
```bash
# Меньше лимита
dd if=/dev/zero bs=1024 count=100 2>/dev/null | curl -s -o /dev/null -w "%{http_code}" -X POST -d @- http://nginx-test/upload
# Больше лимита
dd if=/dev/zero bs=1M count=2 2>/dev/null | curl -s -o /dev/null -w "%{http_code}" -X POST -d @- http://nginx-test/upload
```
- **Проверка признака выполнения:** Малый запрос — 200/204; большой — 413 Request Entity Too Large.
18. **Проверяемое требование:** Настройка таймаутов
- **Настройка / механизм:** client_header_timeout; client_body_timeout; send_timeout; keepalive_timeout
- **Действия испытателя:** Настроить таймауты. Смоделировать медленную отправку заголовков/тела запроса.
- **Ожидаемый результат:** Медленные соединения закрываются по таймауту.
- **Признак выполнения:** Соединение разрывается после заданного времени.
- Проверка:
- **Статус:** Пригодно с оговорками
- **Ревью мероприятия:** Мероприятие корректно по смыслу, но воспроизведение медленной отправки заголовков требует специальных инструментов (`nc`, скрипт на Python) или модулей; `curl --limit-rate` подходит для тела запроса (`client_body_timeout`).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
- **Пример конфигурации:**
```nginx
client_header_timeout 5s;
client_body_timeout 5s;
```
- **Примеры команд испытания:**
```bash
# Медленная отправка тела (превышение client_body_timeout)
dd if=/dev/zero bs=1K count=1000 2>/dev/null | curl --limit-rate 1K -m 30 -X POST -d @- http://nginx-test/upload
```
- **Проверка признака выполнения:** curl завершается с ошибкой (timeout/connection reset) примерно через заданный `client_body_timeout`.
19. **Проверяемое требование:** Сокрытие версии nginx
- **Настройка / механизм:** server_tokens off
- **Действия испытателя:** Выполнить запрос и проверить заголовки/страницы ошибок.
- **Ожидаемый результат:** Версия nginx не раскрывается в ответах.
- **Признак выполнения:** В ответе отсутствует номер версии nginx.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. `server_tokens off` убирает версию, но заголовок `Server: nginx` остаётся — это соответствует документации.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens
- **Пример конфигурации:**
```nginx
http {
server_tokens off;
}
```
- **Примеры команд испытания:**
```bash
curl -I http://nginx-test/
curl http://nginx-test/nonexistent-page
```
- **Проверка признака выполнения:** Заголовок `Server: nginx` без номера версии (не `nginx/1.24.0`); в теле ошибки 404 нет номера версии.
20. **Проверяемое требование:** Управление страницами ошибок
- **Настройка / механизм:** error_page
- **Действия испытателя:** Настроить пользовательскую страницу ошибки. Вызвать ошибку 404/403/500.
- **Ожидаемый результат:** Отображается настроенная страница ошибки без раскрытия лишних деталей.
- **Признак выполнения:** Пользователь видит заданную страницу ошибки.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно и воспроизводимо.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
- **Пример конфигурации:**
```nginx
error_page 404 /custom_404.html;
location = /custom_404.html {
root /var/www/errors;
internal;
}
```
- **Примеры команд испытания:**
```bash
curl http://nginx-test/nonexistent-page
```
- **Проверка признака выполнения:** Тело ответа содержит текст/разметку из `/var/www/errors/custom_404.html`, а не стандартную страницу nginx.
21. **Проверяемое требование:** Отключение листинга директорий
- **Настройка / механизм:** autoindex off
- **Действия испытателя:** Обратиться к директории без индексного файла.
- **Ожидаемый результат:** Листинг директории не отображается.
- **Признак выполнения:** Сервер возвращает отказ или штатную ошибку, но не список файлов.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. `autoindex off` — значение по умолчанию; при отсутствии index.html ожидается 403.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_autoindex_module.html
- **Пример конфигурации:**
```nginx
location /files/ {
autoindex off;
root /var/www/html;
}
```
- **Примеры команд испытания:**
```bash
curl http://nginx-test/files/
```
- **Проверка признака выполнения:** Ответ 403 Forbidden (или 404), в теле нет HTML-листинга с перечнем файлов.
22. **Проверяемое требование:** Обратное проксирование backend
- **Настройка / механизм:** proxy_pass
- **Действия испытателя:** Настроить proxy_pass на backend. Если архитектурой предусмотрена изоляция backend-сервиса, проверить, что пользовательский доступ к backend выполняется через nginx, а прямой доступ к backend ограничен сетевыми правилами/настройками инфраструктуры.
- **Ожидаемый результат:** Запрос проходит через nginx; прямой доступ к backend ограничен, если это предусмотрено архитектурой.
- **Признак выполнения:** Backend обслуживается через nginx согласно настройке.
- Проверка:
- **Статус:** Пригодно с оговорками
- **Ревью мероприятия:** Проверка proxy_pass через nginx — корректна. Проверка сетевой изоляции backend — отдельное инфраструктурное мероприятие (firewall, bind только на 127.0.0.1); в протоколе разделить результаты.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- **Пример конфигурации:**
```nginx
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
```
- **Примеры команд испытания:**
```bash
# Через nginx — успех
curl http://nginx-test/api/status
# Прямой доступ к backend (с испытательной машины, если backend на 127.0.0.1 — недоступен)
curl http://127.0.0.1:8080/status
```
- **Проверка признака выполнения:** Запрос через nginx возвращает ответ backend; прямой доступ с внешней сети к порту 8080 — отказ (если изоляция настроена).
23. **Проверяемое требование:** Ограничение директорий веб-контента
- **Настройка / механизм:** root; alias; location; try_files
- **Действия испытателя:** Настроить разрешённую директорию веб-контента. Выполнить запрос к файлу внутри и вне разрешённой директории.
- **Ожидаемый результат:** Файлы внутри разрешённой директории доступны, вне директории не обслуживаются.
- **Признак выполнения:** Доступ к произвольным каталогам ОС отсутствует.
- Проверка:
- **Статус:** Пригодно для ПМИ
- **Ревью мероприятия:** Мероприятие корректно. Для «вне директории» использовать path traversal (`/../etc/passwd`) или запрос к URI вне `root`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#root
- **Пример конфигурации:**
```nginx
server {
root /var/www/app/public;
location / {
try_files $uri =404;
}
}
```
- **Примеры команд испытания:**
```bash
# Файл внутри root
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/index.html
# Попытка path traversal
curl -s -o /dev/null -w "%{http_code}" http://nginx-test/../../../etc/passwd
```
- **Проверка признака выполнения:** Легитимный файл — 200; traversal — 404 (содержимое `/etc/passwd` не отдаётся).
24. **Проверяемое требование:** Контроль целостности
- **Настройка / механизм:** afick или иной механизм
- **Действия испытателя:** Настроить контроль целостности для конфигурации, web-root и модулей. Изменить контролируемый файл.
- **Ожидаемый результат:** Изменение обнаруживается механизмом контроля целостности.
- **Признак выполнения:** Средство контроля фиксирует нарушение целостности.
- Проверка:
- **Статус:** Требует внешних средств
- **Ревью мероприятия:** Мероприятие корректно. nginx не выполняет FIM; испытание относится к внешнему средству (afick, AIDE). В протоколе указать версию и конфигурацию FIM.
- **Источник:** https://nginx.org/en/docs/ (функция FIM в nginx не описана)
- **Пример конфигурации внешнего средства (afick):**
```
# /etc/afick.conf (фрагмент)
/etc/nginx/ R
/var/www/ R
/usr/lib/nginx/modules/ R
```
- **Примеры команд испытания:**
```bash
# Базовая проверка (без изменений)
afick -c /etc/afick.conf --check
# Изменить контролируемый файл
echo "# test change" >> /etc/nginx/nginx.conf
# Повторная проверка
afick -c /etc/afick.conf --check
```
- **Проверка признака выполнения:** Отчёт afick содержит запись об изменении `/etc/nginx/nginx.conf`. После испытания восстановить файл из эталона.
- **Примечание:** Не относится к функциям nginx; включается в ПМИ как проектное/инфраструктурное мероприятие. Статус отражает внешнюю меру. См. `Контроль целостности хранимого кода и конфигурации — проверка.md` (весь документ); функции 9.3 в `функции безопасности — проверка.md`; `Контроль выполнения кода — проверка.md` п. 1516.