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