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,743 @@
# Функции безопасности nginx — результаты проверки
**Дата проверки:** 10.06.2026
**Объект проверки:** upstream nginx (официальная документация nginx.org)
**Метод:** анализ официальной документации и составление примеров конфигурации (без практических тестов на работающем экземпляре)
## Сводная таблица
| № | Функция безопасности | Статус | Модуль / механизм |
|---|---------------------|--------|-------------------|
| 1.1 | Ограничение доступа по IP-адресу | Подтверждено | ngx_http_access_module; allow; deny |
| 1.2 | Аутентификация по имени пользователя и паролю | Подтверждено | ngx_http_auth_basic_module; auth_basic; auth_basic_user_file |
| 1.3 | Аутентификация по клиентскому TLS-сертификату | Подтверждено с оговорками | ngx_http_ssl_module; ssl_verify_client |
| 1.4 | Авторизация через внешний сервис | Подтверждено с оговорками | ngx_http_auth_request_module; auth_request |
| 1.5 | Комбинирование нескольких проверок доступа | Подтверждено | satisfy; access; auth_basic; auth_request |
| 2.1 | Разделение правил по виртуальным серверам и путям | Подтверждено | ngx_http_core_module; server; location |
| 2.2 | Ограничение HTTP-методов | Подтверждено | ngx_http_core_module; limit_except |
| 2.3 | Запрет доступа к служебным и скрытым файлам | Подтверждено | location; deny all |
| 2.4 | Запрет прямого доступа к внутренним ресурсам | Подтверждено | ngx_http_core_module; internal |
| 3.1 | Поддержка HTTPS/TLS | Подтверждено с оговорками | ngx_http_ssl_module; ssl_certificate |
| 3.2 | Ограничение версий TLS и шифров | Подтверждено | ngx_http_ssl_module; ssl_protocols; ssl_ciphers |
| 3.3 | Проверка клиентского сертификата | Подтверждено | ssl_client_certificate; ssl_verify_client |
| 3.4 | Принудительное использование HTTPS | Подтверждено | return 301/308; Strict-Transport-Security |
| 4.1 | Журналирование HTTP-запросов | Подтверждено | ngx_http_log_module; access_log |
| 4.2 | Журналирование ошибок | Подтверждено | error_log |
| 4.3 | Настройка формата журналов | Подтверждено | log_format |
| 4.4 | Передача журналов в syslog | Подтверждено | access_log syslog; error_log syslog |
| 5.1 | Ограничение частоты запросов | Подтверждено | ngx_http_limit_req_module; limit_req |
| 5.2 | Ограничение количества соединений | Подтверждено | ngx_http_limit_conn_module; limit_conn |
| 5.3 | Ограничение размера клиентского запроса | Подтверждено | ngx_http_core_module; client_max_body_size |
| 5.4 | Ограничение скорости отдачи данных | Подтверждено | ngx_http_core_module; limit_rate |
| 5.5 | Настройка таймаутов соединений | Подтверждено | client_*_timeout; send_timeout; keepalive_timeout |
| 6.1 | Сокрытие версии nginx | Подтверждено | server_tokens off |
| 6.2 | Управление страницами ошибок | Подтверждено | error_page |
| 6.3 | Управление листингом директорий | Подтверждено | ngx_http_autoindex_module; autoindex |
| 7.1 | Обратное проксирование HTTP/HTTPS | Подтверждено | ngx_http_proxy_module; proxy_pass |
| 7.2 | Балансировка и группы upstream | Подтверждено | ngx_http_upstream_module; upstream |
| 7.3 | Управление заголовками при проксировании | Подтверждено | proxy_set_header |
| 8.1 | Задание корневой директории сайта | Подтверждено | ngx_http_core_module; root |
| 8.2 | Задание альтернативного пути для location | Подтверждено | ngx_http_core_module; alias |
| 8.3 | Проверка существования файлов и маршрутизация | Подтверждено | ngx_http_core_module; try_files |
| 8.4 | Ограничение доступа к произвольным каталогам ОС | Подтверждено | root; alias; location; права ФС |
| 9.1 | Исключение неиспользуемых модулей | Подтверждено | configure; load_module |
| 9.2 | Отключение неиспользуемых возможностей конфигурацией | Подтверждено | конфигурация nginx |
| 9.3 | Контроль целостности конфигурации и разрешённых директорий | Не применимо к nginx напрямую (внешняя мера) | afick или иной FIM |
---
- **1. Идентификация и аутентификация**
- **1.1 Ограничение доступа по IP-адресу**
- Описание реализации: nginx позволяет ограничивать доступ к ресурсам по IP-адресам клиентов. Для этого используются правила разрешения и запрета доступа.
- Модуль / механизм: ngx_http_access_module; директивы allow, deny
- Комментарий: Подтверждено официальной документацией nginx: модуль предназначен для ограничения доступа по адресам клиентов.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_access_module` входит в стандартную сборку nginx.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_access_module.html
- **Результат:** Модуль `ngx_http_access_module` входит в стандартную сборку nginx. Директивы `allow` и `deny` задают правила доступа по IP-адресу, сети CIDR, `all` или `unix:`. Правила обрабатываются последовательно; первое совпавшее правило определяет результат.
- **Пример конфигурации:**
```nginx
location /admin/ {
allow 192.168.1.0/24;
allow 10.0.0.1;
deny all;
}
```
- **1.2 Аутентификация по имени пользователя и паролю**
- Описание реализации: nginx поддерживает HTTP Basic Authentication: пользователь вводит имя и пароль, nginx проверяет их по файлу пользователей.
- Модуль / механизм: ngx_http_auth_basic_module; директивы auth_basic, auth_basic_user_file
- Комментарий: Подтверждено официальной документацией nginx: модуль валидирует имя пользователя и пароль по протоколу HTTP Basic Authentication.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_auth_basic_module` реализует HTTP Basic Authentication.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
- **Результат:** Модуль `ngx_http_auth_basic_module` реализует HTTP Basic Authentication. Директива `auth_basic` включает аутентификацию и задаёт текстовое сообщение для диалога; `auth_basic_user_file` указывает файл с парами «пользователь:хеш_пароля» (формат htpasswd).
- **Пример конфигурации:**
```nginx
location /secure/ {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/htpasswd;
}
```
- **Примечание:** Файл паролей создаётся утилитой `htpasswd` (пакет apache2-utils или httpd-tools).
- **1.3 Аутентификация по клиентскому TLS-сертификату**
- Описание реализации: nginx может запрашивать и проверять клиентский сертификат при HTTPS-соединении.
- Модуль / механизм: ngx_http_ssl_module; директивы ssl_client_certificate, ssl_verify_client, ssl_verify_depth
- Комментарий: Реализуется через SSL/TLS-модуль nginx. Сам SSL-модуль требует включения при сборке и использует OpenSSL.
- Проверка:
- **Статус:** Подтверждено с оговорками
- **Ревью функции:** Описание и механизм в целом адекватны; учтены оговорки сборки, конфигурации или эксплуатации. Модуль `ngx_http_ssl_module` поддерживает проверку клиентских сертификатов.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_client
- **Результат:** Модуль `ngx_http_ssl_module` поддерживает проверку клиентских сертификатов. Директива `ssl_verify_client on` требует обязательного предъявления и проверки сертификата; `ssl_client_certificate` задаёт файл доверенного CA; `ssl_verify_depth` ограничивает глубину цепочки. Модуль требует сборки с `--with-http_ssl_module` и библиотекой OpenSSL.
- **Пример конфигурации:**
```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;
ssl_verify_depth 2;
}
```
- **Примечание:** Акцент на идентификации клиента; для контекста защиты канала см. также п. 3.3.
- **1.4 Авторизация через внешний сервис**
- Описание реализации: nginx может выполнять подзапрос во внешний сервис авторизации и разрешать или запрещать доступ по результату ответа.
- Модуль / механизм: ngx_http_auth_request_module; директивы auth_request, auth_request_set
- Комментарий: Модуль официально поддерживается, но в upstream nginx не собирается по умолчанию и должен включаться параметром сборки --with-http_auth_request_module.
- Проверка:
- **Статус:** Подтверждено с оговорками
- **Ревью функции:** Описание и механизм в целом адекватны; учтены оговорки сборки, конфигурации или эксплуатации. Модуль `ngx_http_auth_request_module` выполняет подзапрос к указанному URI;
- **Источник:** https://nginx.org/en/docs/http/ngx_http_auth_request_module.html
- **Результат:** Модуль `ngx_http_auth_request_module` выполняет подзапрос к указанному URI; доступ разрешается при ответе 2xx, запрещается при 401/403. Директива `auth_request_set` позволяет передать значения из заголовков ответа авторизационного сервиса в переменные nginx. В официальной сборке модуль включается флагом `--with-http_auth_request_module`; в большинстве дистрибутивных пакетов он уже присутствует.
- **Пример конфигурации:**
```nginx
location = /auth {
internal;
proxy_pass http://auth-service:8080/validate;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
location / {
auth_request /auth;
proxy_pass http://backend;
}
```
- **Примечание:** См. `Требования безопасности для включения в ТУ — проверка.md` п. 4; `Минимизация поверхности атаки nginx — проверка.md` п. 4.
- **1.5 Комбинирование нескольких проверок доступа**
- Описание реализации: nginx позволяет комбинировать несколько механизмов проверки доступа, например ограничение по IP и Basic Authentication.
- Модуль / механизм: satisfy; совместно с access, auth_basic, auth_request
- Комментарий: В документации nginx указано, что одновременное ограничение доступа по адресу, паролю и подзапросу управляется директивой satisfy.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `satisfy` управляет логикой комбинирования проверок `allow`/`deny`, `auth_basic` и `auth_request`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#satisfy
- **Результат:** Директива `satisfy` управляет логикой комбинирования проверок `allow`/`deny`, `auth_basic` и `auth_request`. Значение `all` (по умолчанию) требует прохождения всех проверок; значение `any` — достаточно одной успешной.
- **Пример конфигурации:**
```nginx
location /admin/ {
satisfy all;
allow 192.168.1.0/24;
deny all;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/htpasswd;
}
```
- **Примечание:** См. `Требования безопасности для включения в ТУ — проверка.md` п. 4; `Минимизация поверхности атаки nginx — проверка.md` п. 4.
- **2. Разграничение доступа к ресурсам**
- **2.1 Разделение правил по виртуальным серверам и путям**
- Описание реализации: nginx позволяет задавать разные правила обработки и доступа для разных виртуальных серверов и URL-путей.
- Модуль / механизм: ngx_http_core_module; блоки server, location
- Комментарий: Это базовый механизм конфигурации nginx. Используется для разделения публичных, служебных и закрытых разделов сайта.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Блоки `server` определяют виртуальные хосты (по `listen`, `server_name`), блоки `location` — правила для URI-префиксов, регулярных выражений и точных совпадений.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#server , https://nginx.org/en/docs/http/ngx_http_core_module.html#location
- **Результат:** Блоки `server` определяют виртуальные хосты (по `listen`, `server_name`), блоки `location` — правила для URI-префиксов, регулярных выражений и точных совпадений. Это базовый механизм разграничения доступа и обработки запросов.
- **Пример конфигурации:**
```nginx
server {
listen 80;
server_name public.example.com;
location / {
root /var/www/public;
}
}
server {
listen 80;
server_name admin.example.com;
location / {
allow 10.0.0.0/8;
deny all;
root /var/www/admin;
}
}
```
- **2.2 Ограничение HTTP-методов**
- Описание реализации: nginx позволяет задавать отдельные правила доступа для методов, отличных от явно разрешённых.
- Модуль / механизм: ngx_http_core_module; директива limit_except
- Комментарий: Используется для ограничения методов вроде PUT, DELETE, если они не требуются приложению.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `limit_except` задаёт методы, для которых применяются вложенные директивы доступа.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_except
- **Результат:** Директива `limit_except` задаёт методы, для которых применяются вложенные директивы доступа. Методы, не перечисленные в `limit_except`, обрабатываются без дополнительных ограничений внутри данного блока.
- **Минимальный аудит конфигурации:**
```bash
nginx -T 2>/dev/null | grep -E 'limit_except|request_method'
```
- **Пример конфигурации:**
```nginx
location /uploads/ {
limit_except GET HEAD {
deny all;
}
}
```
- **2.3 Запрет доступа к служебным и скрытым файлам**
- Описание реализации: nginx позволяет запрещать доступ к отдельным путям и шаблонам URI через правила location и deny all.
- Модуль / механизм: location, регулярные выражения, deny all
- Комментарий: Это не отдельный модуль безопасности, а конфигурационный механизм безопасной настройки.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Комбинация `location` с регулярными выражениями и `deny all` позволяет блокировать доступ к скрытым файлам (`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_access_module.html , https://nginx.org/en/docs/http/ngx_http_core_module.html#location
- **Результат:** Комбинация `location` с регулярными выражениями и `deny all` позволяет блокировать доступ к скрытым файлам (`.git`, `.env`, `.htaccess` и т.п.). Это стандартный конфигурационный паттерн безопасности.
- **Пример конфигурации:**
```nginx
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~* \.(bak|sql|log|conf)$ {
deny all;
}
```
- **2.4 Запрет прямого доступа к внутренним ресурсам**
- Описание реализации: nginx поддерживает внутренние location-блоки, которые недоступны напрямую клиенту и могут использоваться только для внутренних перенаправлений.
- Модуль / механизм: ngx_http_core_module; директива internal
- Комментарий: Применяется для скрытия служебных маршрутов и файлов от прямого обращения пользователя.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `internal` ограничивает доступ к location только для внутренних запросов (error_page, rewrite, auth_request, X-Accel-Redirect и др.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#internal
- **Результат:** Директива `internal` ограничивает доступ к location только для внутренних запросов (error_page, rewrite, auth_request, X-Accel-Redirect и др.). Прямые клиентские запросы к такому location возвращают 404.
- **Пример конфигурации:**
```nginx
location /protected-files/ {
internal;
alias /var/data/files/;
}
location /download {
# Клиент обращается сюда; nginx внутренне отдаёт файл
rewrite ^ /protected-files/document.pdf last;
}
```
- **3. Защита соединения и передаваемых данных**
- **3.1 Поддержка HTTPS/TLS**
- Описание реализации: nginx поддерживает HTTPS при наличии SSL-модуля. Можно задавать сертификаты, ключи, версии TLS и наборы шифров.
- Модуль / механизм: ngx_http_ssl_module; ssl_certificate, ssl_certificate_key, ssl_protocols, ssl_ciphers
- Комментарий: SSL-модуль nginx предоставляет поддержку HTTPS, требует OpenSSL и должен быть включён при сборке.
- Проверка:
- **Статус:** Подтверждено с оговорками
- **Ревью функции:** Описание и механизм в целом адекватны; учтены оговорки сборки, конфигурации или эксплуатации. Модуль `ngx_http_ssl_module` обеспечивает HTTPS.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html
- **Результат:** Модуль `ngx_http_ssl_module` обеспечивает HTTPS. Директивы `ssl_certificate` и `ssl_certificate_key` задают серверный сертификат и ключ; `ssl_protocols` и `ssl_ciphers` — параметры TLS. Модуль требует OpenSSL и включения при сборке (`--with-http_ssl_module`).
- **Пример конфигурации:**
```nginx
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
```
- **3.2 Ограничение версий TLS и шифров**
- Описание реализации: nginx позволяет задавать допустимые версии TLS и наборы шифров.
- Модуль / механизм: ngx_http_ssl_module; ssl_protocols, ssl_ciphers
- Комментарий: Для ТУ/ПМИ нужно отдельно фиксировать допустимую криптографическую политику.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `ssl_protocols` задаёт разрешённые версии протокола (TLSv1.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols , https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers
- **Результат:** Директива `ssl_protocols` задаёт разрешённые версии протокола (TLSv1.2, TLSv1.3 и др.); `ssl_ciphers` — список шифронаборов в формате OpenSSL. Дополнительно доступны `ssl_prefer_server_ciphers` и параметры для TLS 1.3 (`ssl_conf_command` в новых версиях).
- **Пример конфигурации:**
```nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
```
- **Примечание:** Конкретная криптографическая политика должна быть зафиксирована в ТУ/ПМИ отдельно.
- **3.3 Проверка клиентского сертификата**
- Описание реализации: nginx может проверять клиентские TLS-сертификаты по доверенному центру сертификации.
- Модуль / механизм: ssl_client_certificate, ssl_verify_client
- Комментарий: Может использоваться как механизм строгой аутентификации клиента.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `ssl_verify_client` поддерживает значения `on`, `off`, `optional`, `optional_no_ca`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_verify_client
- **Результат:** Директива `ssl_verify_client` поддерживает значения `on`, `off`, `optional`, `optional_no_ca`. При `on` клиент обязан предъявить сертификат, подписанный доверенным CA из `ssl_client_certificate`. Режим `optional` запрашивает сертификат, но не прерывает соединение при его отсутствии.
- **Пример конфигурации:**
```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/client-ca.crt;
ssl_verify_client optional;
ssl_verify_depth 3;
}
```
- **Примечание:** В отличие от п. 1.3, здесь акцент на защите канала и политике доверия к клиентским сертификатам.
- **3.4 Принудительное использование HTTPS**
- Описание реализации: nginx может перенаправлять HTTP-запросы на HTTPS и добавлять заголовки безопасности.
- Модуль / механизм: return 301/308; add_header Strict-Transport-Security
- Комментарий: HSTS реализуется через HTTP-заголовок, а не отдельным модулем безопасности.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Редирект HTTP→HTTPS реализуется директивой `return` (301 или 308).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return , https://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
- **Результат:** Редирект HTTP→HTTPS реализуется директивой `return` (301 или 308). Заголовок HSTS (`Strict-Transport-Security`) добавляется через `add_header` в HTTPS-блоке. Отдельного модуля HSTS в nginx нет.
- **Пример конфигурации:**
```nginx
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
```
- **4. Регистрация событий и аудит**
- **4.1 Журналирование HTTP-запросов**
- Описание реализации: nginx ведёт журнал HTTP-запросов в настраиваемом формате.
- Модуль / механизм: ngx_http_log_module; access_log, log_format
- Комментарий: Официальный модуль nginx записывает request logs в заданном формате.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_log_module` записывает access log.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_log_module.html
- **Результат:** Модуль `ngx_http_log_module` записывает access log. Директива `access_log` задаёт путь (или syslog) и формат; по умолчанию используется формат `combined`. Журналирование можно отключить (`access_log off`) на уровне server/location.
- **Пример конфигурации:**
```nginx
http {
access_log /var/log/nginx/access.log combined;
}
```
- **4.2 Журналирование ошибок**
- Описание реализации: nginx ведёт журнал ошибок, где фиксируются проблемы обработки запросов, конфигурации и взаимодействия с backend.
- Модуль / механизм: error_log
- Комментарий: Официальная документация указывает, что nginx пишет error log и позволяет задавать место и уровень журналирования.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `error_log` задаёт файл (или syslog) и уровень детализации: `debug`, `info`, `notice`, `warn`, `error`, `crit`, `alert`, `emerg`.
- **Источник:** https://nginx.org/en/docs/ngx_core_module.html#error_log
- **Результат:** Директива `error_log` задаёт файл (или syslog) и уровень детализации: `debug`, `info`, `notice`, `warn`, `error`, `crit`, `alert`, `emerg`. Уровень по умолчанию — `error`.
- **Пример конфигурации:**
```nginx
error_log /var/log/nginx/error.log warn;
```
- **4.3 Настройка формата журналов**
- Описание реализации: nginx позволяет задавать собственный формат access log с нужными полями.
- Модуль / механизм: log_format
- Комментарий: Для ПМИ можно проверять наличие обязательных полей в журнале.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `log_format` определяет именованный формат с произвольным набором переменных (`$remote_addr`, `$request`, `$status`, `$body_bytes_sent`, `$http_user_agent` и др.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
- **Результат:** Директива `log_format` определяет именованный формат с произвольным набором переменных (`$remote_addr`, `$request`, `$status`, `$body_bytes_sent`, `$http_user_agent` и др.). Формат применяется в `access_log`.
- **Пример конфигурации:**
```nginx
log_format audit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
access_log /var/log/nginx/audit.log audit;
```
- **4.4 Передача журналов в syslog**
- Описание реализации: nginx поддерживает запись access_log и error_log в syslog.
- Модуль / механизм: access_log syslog:...; error_log syslog:...
- Комментарий: Подтверждено официальной документацией nginx по syslog.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. nginx поддерживает запись `access_log` и `error_log` в syslog с параметрами `server`, `facility`, `tag`, `severity`.
- **Источник:** https://nginx.org/en/docs/syslog.html
- **Результат:** nginx поддерживает запись `access_log` и `error_log` в syslog с параметрами `server`, `facility`, `tag`, `severity`. Формат: `syslog:server=address[,parameter=value]`.
- **Пример конфигурации:**
```nginx
error_log syslog:server=192.168.1.1:514,facility=local7,tag=nginx,severity=error;
access_log syslog:server=192.168.1.1:514,facility=local7,tag=nginx,severity=info combined;
```
- **Примечание:** См. ПМИ п. 14 в `Проверочные мероприятия для ПМИ — проверка.md`; `Контроль целостности хранимого кода и конфигурации — проверка.md` п. 13; `Минимально необходимые полномочия nginx — проверка.md` п. 5.
- **5. Ограничение нагрузки и защита от избыточных запросов**
- **5.1 Ограничение частоты запросов**
- Описание реализации: nginx может ограничивать частоту обработки запросов по заданному ключу, например по IP-адресу клиента.
- Модуль / механизм: ngx_http_limit_req_module; limit_req_zone, limit_req
- Комментарий: Модуль использует метод leaky bucket и официально предназначен для ограничения request rate.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_limit_req_module` реализует алгоритм leaky bucket.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
- **Результат:** Модуль `ngx_http_limit_req_module` реализует алгоритм leaky bucket. `limit_req_zone` определяет зону и ключ (например, `$binary_remote_addr`); `limit_req` применяет ограничение с параметрами `rate` и `burst`.
- **Пример конфигурации:**
```nginx
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
}
}
}
```
- **Примечание:** См. `Требования безопасности для включения в ТУ — проверка.md` п. 15; `Проверочные мероприятия для ПМИ — проверка.md` п. 15.
- **5.2 Ограничение количества соединений**
- Описание реализации: nginx может ограничивать количество соединений по заданному ключу, например по IP-адресу клиента.
- Модуль / механизм: ngx_http_limit_conn_module; limit_conn_zone, limit_conn
- Комментарий: Официальный модуль ограничивает количество соединений per defined key.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_limit_conn_module` ограничивает число одновременных соединений по ключу.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
- **Результат:** Модуль `ngx_http_limit_conn_module` ограничивает число одновременных соединений по ключу. `limit_conn_zone` задаёт зону; `limit_conn` применяет лимит.
- **Пример конфигурации:**
```nginx
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10;
}
}
}
```
- **Примечание:** См. `Требования безопасности для включения в ТУ — проверка.md` п. 16; `Проверочные мероприятия для ПМИ — проверка.md` п. 16.
- **5.3 Ограничение размера клиентского запроса**
- Описание реализации: nginx позволяет ограничивать максимальный размер тела клиентского запроса.
- Модуль / механизм: ngx_http_core_module; client_max_body_size
- Комментарий: Используется для защиты от чрезмерно больших запросов и нежелательных загрузок.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `client_max_body_size` задаёт максимальный размер тела запроса.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
- **Результат:** Директива `client_max_body_size` задаёт максимальный размер тела запроса. Значение по умолчанию — 1m. При превышении nginx возвращает 413 (Request Entity Too Large).
- **Пример конфигурации:**
```nginx
server {
client_max_body_size 10m;
}
```
- **Примечание:** См. `Требования безопасности для включения в ТУ — проверка.md` п. 15; `Проверочные мероприятия для ПМИ — проверка.md` п. 15.
- **5.4 Ограничение скорости отдачи данных**
- Описание реализации: nginx позволяет ограничивать скорость передачи ответа клиенту.
- Модуль / механизм: ngx_http_core_module; limit_rate
- Комментарий: Используется для управления нагрузкой и потреблением ресурсов.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `limit_rate` ограничивает скорость отдачи ответа клиенту (байт/с).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate
- **Результат:** Директива `limit_rate` ограничивает скорость отдачи ответа клиенту (байт/с). Дополнительно `limit_rate_after` позволяет отдавать начальный объём без ограничения.
- **Пример конфигурации:**
```nginx
location /downloads/ {
limit_rate 500k;
}
```
- **Примечание:** См. `Требования безопасности для включения в ТУ — проверка.md` п. 16; `Проверочные мероприятия для ПМИ — проверка.md` п. 16.
- **5.5 Настройка таймаутов соединений**
- Описание реализации: nginx позволяет задавать таймауты чтения заголовков, тела запроса, отправки ответа и keepalive.
- Модуль / механизм: client_header_timeout, client_body_timeout, send_timeout, keepalive_timeout
- Комментарий: Снижает риск удержания ресурсов медленными или зависшими соединениями.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директивы `client_header_timeout`, `client_body_timeout`, `send_timeout` и `keepalive_timeout` задают таймауты на разных этапах обработки соединения.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html
- **Результат:** Директивы `client_header_timeout`, `client_body_timeout`, `send_timeout` и `keepalive_timeout` задают таймауты на разных этапах обработки соединения. Значения по умолчанию: 60s для header/body/send, 75s для keepalive.
- **Пример конфигурации:**
```nginx
http {
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
keepalive_timeout 30s;
}
```
- **6. Управление раскрытием информации**
- **6.1 Сокрытие версии nginx**
- Описание реализации: nginx позволяет отключить отображение версии сервера в стандартных ответах.
- Модуль / механизм: server_tokens off
- Комментарий: Важно: server_tokens off скрывает версию, но не всегда полностью скрывает сам факт использования nginx.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `server_tokens off` убирает номер версии из заголовка `Server` и со страниц ошибок nginx.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens
- **Результат:** Директива `server_tokens off` убирает номер версии из заголовка `Server` и со страниц ошибок nginx. Заголовок `Server` по-прежнему содержит слово «nginx».
- **Минимальный аудит конфигурации:**
```bash
nginx -T 2>/dev/null | grep server_tokens
```
- **Пример конфигурации:**
```nginx
http {
server_tokens off;
}
```
- **Примечание:** Для полного сокрытия идентификатора сервера требуются дополнительные меры (например, заголовки через `more_clear_headers` в сторонних модулях).
- **6.2 Управление страницами ошибок**
- Описание реализации: nginx позволяет задавать собственные страницы ошибок и внутренние перенаправления.
- Модуль / механизм: error_page
- Комментарий: Позволяет не раскрывать технические детали пользователю.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `error_page` перенаправляет обработку указанных кодов ошибок на URI, именованный location или внешний адрес.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
- **Результат:** Директива `error_page` перенаправляет обработку указанных кодов ошибок на URI, именованный location или внешний адрес. Позволяет показывать пользовательские страницы вместо стандартных сообщений nginx.
- **Пример конфигурации:**
```nginx
error_page 404 /custom_404.html;
error_page 500 502 503 504 /custom_50x.html;
location = /custom_404.html {
root /var/www/errors;
internal;
}
```
- **6.3 Управление листингом директорий**
- Описание реализации: nginx может формировать листинг директорий через autoindex, если режим включён.
- Модуль / механизм: ngx_http_autoindex_module; autoindex
- Комментарий: Модуль официально формирует directory listing для запросов, оканчивающихся /, когда не найден индексный файл. Для безопасной конфигурации должен быть отключён, если не требуется.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_autoindex_module` включается директивой `autoindex on` и формирует HTML-листинг каталога при отсутствии индексного файла.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_autoindex_module.html
- **Результат:** Модуль `ngx_http_autoindex_module` включается директивой `autoindex on` и формирует HTML-листинг каталога при отсутствии индексного файла. По умолчанию `autoindex off`. Для безопасной конфигурации рекомендуется явно отключать или не включать.
- **Минимальный аудит конфигурации:**
```bash
nginx -T 2>/dev/null | grep autoindex
```
- **Пример конфигурации:**
```nginx
location /public-files/ {
autoindex off;
root /var/www/files;
}
```
- **7. Обратное проксирование и изоляция backend-сервисов**
- **7.1 Обратное проксирование HTTP/HTTPS**
- Описание реализации: nginx может принимать клиентские запросы и передавать их внутренним backend-сервисам.
- Модуль / механизм: ngx_http_proxy_module; proxy_pass
- Комментарий: Официальный модуль proxy передаёт запросы другому серверу.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Модуль `ngx_http_proxy_module` передаёт HTTP-запросы на backend через `proxy_pass`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- **Результат:** Модуль `ngx_http_proxy_module` передаёт HTTP-запросы на backend через `proxy_pass`. Поддерживается проксирование на HTTP и HTTPS upstream.
- **Пример конфигурации:**
```nginx
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
```
- **7.2 Балансировка и группы upstream**
- Описание реализации: nginx позволяет определять группы backend-серверов и использовать их для proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, grpc_pass.
- Модуль / механизм: ngx_http_upstream_module; upstream
- Комментарий: Документация nginx описывает upstream как механизм групп серверов для разных pass-директив.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Блок `upstream` определяет группу backend-серверов с методами балансировки (round-robin по умолчанию, `least_conn`, `ip_hash`, `hash`).
- **Источник:** https://nginx.org/en/docs/http/ngx_http_upstream_module.html
- **Результат:** Блок `upstream` определяет группу backend-серверов с методами балансировки (round-robin по умолчанию, `least_conn`, `ip_hash`, `hash`). Используется с `proxy_pass`, `fastcgi_pass`, `uwsgi_pass`, `scgi_pass`, `grpc_pass`.
- **Пример конфигурации:**
```nginx
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
}
}
```
- **7.3 Управление заголовками при проксировании**
- Описание реализации: nginx позволяет явно задавать заголовки, передаваемые backend-сервису.
- Модуль / механизм: proxy_set_header
- Комментарий: Важно для корректной передачи адреса клиента и исключения нежелательных/подменённых заголовков.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `proxy_set_header` задаёт или переопределяет заголовки запроса к backend.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
- **Результат:** Директива `proxy_set_header` задаёт или переопределяет заголовки запроса к backend. По умолчанию nginx передаёт ряд заголовков, но `Host` и `Connection` могут требовать явной настройки. `proxy_pass_request_headers` управляет передачей клиентских заголовков.
- **Пример конфигурации:**
```nginx
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
```
- **8. Управление статическим содержимым и директориями веб-приложений**
- **8.1 Задание корневой директории сайта**
- Описание реализации: nginx обслуживает файлы из директории, заданной директивой root.
- Модуль / механизм: ngx_http_core_module; root
- Комментарий: Используется для определения разрешённой области веб-контента.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `root` задаёт корневую директорию для запросов в данном server/location.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#root
- **Результат:** Директива `root` задаёт корневую директорию для запросов в данном server/location. Путь к файлу формируется как `root` + URI.
- **Пример конфигурации:**
```nginx
server {
root /var/www/example.com;
location / {
index index.html;
}
}
```
- **8.2 Задание альтернативного пути для location**
- Описание реализации: nginx позволяет сопоставлять URI с другой директорией файловой системы через alias.
- Модуль / механизм: ngx_http_core_module; alias
- Комментарий: Требует осторожной настройки, чтобы не открыть произвольные каталоги ОС.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `alias` заменяет часть URI на указанный путь файловой системы.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#alias
- **Результат:** Директива `alias` заменяет часть URI на указанный путь файловой системы. При некорректной настройке (особенно с регулярными выражениями) возможен path traversal.
- **Пример конфигурации:**
```nginx
location /images/ {
alias /var/www/static/images/;
}
```
- **Примечание:** Для location с регулярным выражением `alias` должен содержать захватывающие группы; завершающий слэш обязателен.
- **8.3 Проверка существования файлов и маршрутизация**
- Описание реализации: nginx позволяет проверять наличие файлов и выполнять внутреннюю маршрутизацию через try_files.
- Модуль / механизм: ngx_http_core_module; try_files
- Комментарий: Используется для контроля, какой файл или маршрут будет обработан.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Директива `try_files` проверяет существование файлов/каталогов в указанном порядке и выполняет внутреннее перенаправление на последний параметр при отсутствии совпадений.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
- **Результат:** Директива `try_files` проверяет существование файлов/каталогов в указанном порядке и выполняет внутреннее перенаправление на последний параметр при отсутствии совпадений.
- **Пример конфигурации:**
```nginx
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
```
- **8.4 Ограничение доступа к произвольным каталогам ОС**
- Описание реализации: nginx должен быть настроен так, чтобы обслуживать файлы только из разрешённых директорий.
- Модуль / механизм: root, alias, location, deny all, права ФС
- Комментарий: Это не отдельный модуль nginx, а требование безопасной конфигурации.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. nginx обслуживает только те пути, которые явно заданы через `root`/`alias` в `location`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_core_module.html#root , https://nginx.org/en/docs/http/ngx_http_access_module.html
- **Результат:** nginx обслуживает только те пути, которые явно заданы через `root`/`alias` в `location`. Безопасная конфигурация ограничивает `location /`, запрещает доступ к системным путям и сочетается с правами файловой системы (процесс nginx не должен иметь доступ к чувствительным каталогам).
- **Пример конфигурации:**
```nginx
server {
root /var/www/site;
location / {
try_files $uri =404;
}
location ~ ^/(\.\.|etc|proc|sys) {
deny all;
}
}
```
- **Примечание:** Дополнительно на уровне ОС следует ограничить права пользователя, от которого работает nginx. См. `Минимально необходимые полномочия nginx — проверка.md` п. 3; `Контроль выполнения кода — проверка.md` п. 14.
- **9. Минимизация поверхности атаки**
- **9.1 Исключение неиспользуемых модулей**
- Описание реализации: nginx может собираться с разным составом модулей; неиспользуемые модули могут быть исключены из сборки или не загружаться.
- Модуль / механизм: Параметры сборки; dynamic modules; load_module
- Комментарий: Это проектная мера снижения поверхности атаки.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. При сборке nginx параметры `./configure` позволяют включать/отключать модули (`--without-http_autoindex_module`, `--with-http_ssl_module` и др.
- **Источник:** https://nginx.org/en/docs/configure.html , https://nginx.org/en/docs/ngx_core_module.html#load_module
- **Результат:** При сборке nginx параметры `./configure` позволяют включать/отключать модули (`--without-http_autoindex_module`, `--with-http_ssl_module` и др.). Динамические модули подключаются через `load_module` в конфигурации; неиспользуемые модули можно не загружать.
- **Пример конфигурации:**
```nginx
# Загрузка только необходимых динамических модулей
load_module modules/ngx_http_geoip_module.so;
# Статические модули определяются при сборке:
# ./configure --without-http_autoindex_module --with-http_ssl_module
```
- **Примечание:** См. `Минимизация поверхности атаки nginx — проверка.md` п. 12.
- **9.2 Отключение неиспользуемых возможностей конфигурацией**
- Описание реализации: Неиспользуемые возможности должны быть отключены в конфигурации: autoindex, лишние методы, лишние proxy/FastCGI-направления.
- Модуль / механизм: Конфигурация nginx
- Комментарий: Это не отдельная функция nginx, а требование безопасной эксплуатации.
- Проверка:
- **Статус:** Подтверждено
- **Ревью функции:** Описание реализации и заявленный механизм соответствуют документации nginx. Неиспользуемые возможности отключаются конфигурацией: `autoindex off`, ограничение методов через `limit_except`, удаление неиспользуемых `location` с `proxy_pass`/`fastcgi_pass`.
- **Источник:** https://nginx.org/en/docs/http/ngx_http_autoindex_module.html , https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_except
- **Результат:** Неиспользуемые возможности отключаются конфигурацией: `autoindex off`, ограничение методов через `limit_except`, удаление неиспользуемых `location` с `proxy_pass`/`fastcgi_pass`. Это требование безопасной эксплуатации, а не отдельный модуль.
- **Пример конфигурации:**
```nginx
server {
autoindex off;
location / {
limit_except GET HEAD POST {
deny all;
}
}
# Неиспользуемые направления не включаются в конфигурацию
# location /legacy-api/ { proxy_pass http://old-backend; }
}
```
- **Примечание:** См. `Минимизация поверхности атаки nginx — проверка.md` п. 410.
- **9.3 Контроль целостности конфигурации и разрешённых директорий**
- Описание реализации: Конфигурация nginx и разрешённые директории веб-контента должны контролироваться внешним механизмом целостности.
- Модуль / механизм: afick или иной утверждённый механизм
- Комментарий: nginx не выполняет контроль целостности сам. Это внешняя мера, требуемая для сертификационной логики.
- Проверка:
- **Статус:** Не применимо к nginx напрямую (внешняя мера)
- **Ревью функции:** Корректно отнесено к внешней мере: nginx не реализует функцию напрямую. nginx не реализует контроль целостности файлов (FIM).
- **Источник:** https://nginx.org/en/docs/ (функция FIM в nginx не описана)
- **Результат:** nginx не реализует контроль целостности файлов (FIM). Данное требование выполняется внешними средствами: afick, AIDE, OSSEC или иным утверждённым механизмом. Контролируемые объекты: `/etc/nginx/` (конфигурация), директории `root`/`alias` веб-контента.
- **Пример реализации:**
```
# /etc/afick.conf (фрагмент)
/etc/nginx/ R
/var/www/ R
```
- **Примечание:** См. `Минимизация поверхности атаки nginx — проверка.md` п. 410.
- **Примечание:** Для ПМИ проверяется наличие и работоспособность внешнего средства, а не конфигурация nginx. Статус отражает внешнюю меру (см. `Контроль целостности хранимого кода и конфигурации — проверка.md`; ПМИ п. 24; `Контроль выполнения кода — проверка.md` п. 1516).