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,664 @@
# Проверочные мероприятия для ПМИ — результаты проверки
**Дата проверки:** 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.