
Gixy-Next: Сканер безопасности конфигурации NGINX и проверка производительности
# Gixy-Next: сканер безопасности конфигураций NGINX для аудита безопасности
## Обзор
<a href="https://gixy.io/"><img width="192" height="192" alt="Gixy-Next Mascot Logo" style="float: right;" align="right" src="https://assets.kitploit.com/production/public/readmes/10695/943d5c952685014f6540ef9cb02fe9d8cd895479a41a8f78786b5f2997207ec0.jpg" /></a>
Gixy-Next (Gixy) — это открытый сканер безопасности и инструмент усиления защиты конфигураций NGINX, который статически анализирует ваш nginx.conf для выявления ошибок конфигурации безопасности, пробелов в усилении защиты и распространённых проблем производительности до того, как они попадут в продакшен. Это активно поддерживаемый форк [Gixy](https://github.com/yandex/gixy) от Yandex. Исходный код Gixy-Next [доступен на GitHub](https://github.com/megamansec/gixy-next).
Gixy-Next также можно запустить в браузере на [этой странице](https://gixy.io/scanner/). Загрузка не требуется; вы можете сканировать свои конфигурации на сайте (локально, с использованием WebAssembly).
### Быстрый старт
Gixy-Next (CLI `gixy` или `gixy-next`) распространяется на [PyPI](https://pypi.python.org/pypi/Gixy-Next). Вы можете установить его с помощью pip или uv:
```shell-session
# pip
pip3 install gixy-next
# uv
uv pip install gixy-next
```
Затем вы можете запустить его:
```shell-session
# gixy defaults to reading /etc/nginx/nginx.conf
gixy
# But you can also specify a path to the configuration
gixy /opt/nginx.conf
```
Вы также можете экспортировать конфигурацию NGINX в один дамп-файл (см. [nginx -T Live Configuration Dump](https://gixy.io/nginx-config-dump)):
```shell-session
# Dumps the full NGINX configuration into a single file (including all includes)
nginx -T > ./nginx-dump.conf
# Scan the dump elsewhere (or via stdin):
gixy ./nginx-dump.conf
# or
cat ./nginx-dump.conf | gixy -
```
### Веб-сканер
Вместо загрузки и локального запуска Gixy-Next вы можете воспользоваться [этой веб-страницей](https://gixy.io/scanner/) и просканировать конфигурацию прямо из браузера (локально, с помощью WebAssembly).
### Сканирование с помощью Docker
Gixy-Next доступен в виде Docker-образа в [Docker Hub](https://hub.docker.com/r/megamansec/gixy-next/) или [GitHub Registry](https://github.com/MegaManSec/Gixy-Next/pkgs/container/gixy-next).
Просканируйте локальный файл конфигурации, смонтировав его в контейнер:
```shell-session
# Use Github Registry
docker run --pull=always --rm -v "$PWD/nginx.conf:/nginx.conf:ro" ghcr.io/megamansec/gixy-next /nginx.conf
# Or Docker Hub
docker run --pull=always --rm -v "$PWD/nginx.conf:/nginx.conf:ro" megamansec/gixy-next /nginx.conf
```
Сканирование дампа живой конфигурации NGINX:
```shell-session
# Dumps the full NGINX configuration into a single file (including all includes)
nginx -T > ./nginx-dump.conf
# Use Github Registry
docker run --pull=always --rm -v "$PWD/nginx-dump.conf:/nginx-dump.conf:ro" ghcr.io/megamansec/gixy-next /nginx-dump.conf
# Or Docker Hub
docker run --pull=always --rm -v "$PWD/nginx-dump.conf:/nginx-dump.conf:ro" megamansec/gixy-next /nginx-dump.conf
```
Сканирование из stdin:
```shell-session
# Use Github Registry
nginx -T | docker run --pull=always --rm -i ghcr.io/megamansec/gixy-next gixy-next -
# Or Docker Hub
nginx -T | docker run --pull=always --rm -i megamansec/gixy-next gixy-next -
```
## Что он умеет
Gixy-Next способен обнаруживать широкий спектр проблем безопасности и производительности в конфигурациях NGINX в файле `nginx.conf` и подключаемых файлах конфигурации. Поддерживаются следующие плагины:
- [[add_header_content_type] Установка Content-Type через add_header](https://gixy.io/plugins/add_header_content_type/)
- [[add_header_multiline] Многострочные заголовки ответа](https://gixy.io/plugins/add_header_multiline/)
- [[add_header_redefinition] Переопределение заголовков ответа директивой "add_header"](https://gixy.io/plugins/add_header_redefinition/)
- [[alias_traversal] Обход путей через неправильно настроенный alias](https://gixy.io/plugins/alias_traversal/)
- [[allow_without_deny] Allow указан без deny](https://gixy.io/plugins/allow_without_deny/)
- [[default_server_flag] Отсутствует флаг default_server](https://gixy.io/plugins/default_server_flag/)
- [[error_log_off] `error_log` установлен в `off`](https://gixy.io/plugins/error_log_off/)
- [[filesystem_root_exposure] Корень файловой системы используется как корень документов](https://gixy.io/plugins/filesystem_root_exposure/)
- [[hash_without_default] Отсутствует default в блоках hash](https://gixy.io/plugins/hash_without_default/)
- [[host_spoofing] Подделка заголовка Host запроса](https://gixy.io/plugins/host_spoofing/)
- [[http2_misdirected_request] Отсутствует защита от misdirected-request в HTTP/2](https://gixy.io/plugins/http2_misdirected_request/)
- [[http_splitting] HTTP Response Splitting](https://gixy.io/plugins/http_splitting/)
- [[if_is_evil] If is evil при использовании в контексте location](https://gixy.io/plugins/if_is_evil/)
- [[invalid_regex] Некорректные группы захвата в регулярном выражении](https://gixy.io/plugins/invalid_regex/)
- [[low_keepalive_requests] Низкое значение `keepalive_requests`](https://gixy.io/plugins/low_keepalive_requests/)
- [[missing_worker_processes] Отсутствует `worker_processes`](https://gixy.io/plugins/missing_worker_processes/)
- [[mixed_case_variable] Ссылки на переменные со смешанным регистром](https://gixy.io/plugins/mixed_case_variable/)
- [[origins] Проблемы с валидацией заголовков referer/origin](https://gixy.io/plugins/origins/)
- [[overlapping_captures] Перекрывающиеся захваты в контексте rewrite redirect/args](https://gixy.io/plugins/overlapping_captures/)
- [[proxy_buffering_off] Отключение `proxy_buffering`](https://gixy.io/plugins/proxy_buffering_off/)
- [[proxy_pass_normalized] `proxy_pass` может отправить непредусмотренный путь на upstream](https://gixy.io/plugins/proxy_pass_normalized/)
- [[proxy_set_header_redefinition] Переопределение заголовков проксируемого запроса директивой "proxy_set_header"](https://gixy.io/plugins/proxy_set_header_redefinition/)
- [[quic_bpf_reuseport] QUIC-соединения молча отбрасываются после перезагрузки](https://gixy.io/plugins/quic_bpf_reuseport/)
- [[regex_redos] Отказ в обслуживании через регулярные выражения (ReDoS)](https://gixy.io/plugins/regex_redos/)
- [[resolver_external] Использование внешних DNS-серверов](https://gixy.io/plugins/resolver_external/)
- [[return_bypasses_allow_deny] Директива return обходит ограничения allow/deny](https://gixy.io/plugins/return_bypasses_allow_deny/)
- [[ssl_ecdh_curve] Постквантовые группы не дают NGINX запуститься на старых версиях OpenSSL](https://gixy.io/plugins/ssl_ecdh_curve/)
- [[ssl_stapling_letsencrypt] OCSP stapling ничего не делает для сертификата Let's Encrypt](https://gixy.io/plugins/ssl_stapling_letsencrypt/)
- [[ssl_stapling_without_resolver] OCSP stapling молча не работает без resolver](https://gixy.io/plugins/ssl_stapling_without_resolver/)
- [[ssrf] Server Side Request Forgery](https://gixy.io/plugins/ssrf/)
- [[stale_dns_cache] Устаревшие/закэшированные DNS-записи, используемые в proxy_pass](https://gixy.io/plugins/stale_dns_cache/)
- [[status_page_exposed] Проверяет, что status_page не открыта всему миру](https://gixy.io/plugins/status_page_exposed/)
- [[try_files_is_evil_too] Директива `try_files` опасна без open_file_cache](https://gixy.io/plugins/try_files_is_evil_too/)
- [[unanchored_regex] Непривязанные регулярные выражения](https://gixy.io/plugins/unanchored_regex/)
- [[unnamed_groups] Безымянные группы захвата в строке запроса rewrite](https://gixy.io/plugins/unnamed_groups/)
- [[valid_referers] none/blocked в valid_referers](https://gixy.io/plugins/valid_referers/)
- [[version_disclosure] Использование небезопасных значений для server_tokens](https://gixy.io/plugins/version_disclosure/)
- [[worker_rlimit_nofile_vs_connections] `worker_rlimit_nofile` должен быть как минимум вдвое больше `worker_connections`](https://gixy.io/plugins/worker_rlimit_nofile_vs_connections/)
Что-то не обнаружено? Пожалуйста, откройте [issue](https://github.com/MegaManSec/Gixy-Next/issues) на GitHub с указанием того, что отсутствует!
## Использование (флаги)
По умолчанию `gixy` читает конфигурацию NGINX системы из `/etc/nginx/nginx.conf`. Вы также можете указать расположение, передав его в `gixy`:
```shell-session
# Analyze the configuration in /opt/nginx.conf
gixy /opt/nginx.conf
```
Вы можете запустить целевой поднабор проверок с помощью `--tests`:
```shell-session
# Only run these checks
gixy --tests http_splitting,ssrf,version_disclosure
```
Или пропустите несколько шумных проверок с помощью `--skips`:
```shell-session
# Run everything except these checks
gixy --skips low_keepalive_requests,worker_rlimit_nofile_vs_connections
```
Чтобы сообщать только о проблемах определённой серьёзности или выше, используйте составной флаг `-l`:
```shell-session
# -l for LOW severity issues and higher, -ll for MEDIUM and higher, and -lll for only HIGH severity issues
gixy -ll
```
По умолчанию вывод `gixy` имеет ANSI-цвета; лучше всего просматривать его в совместимом терминале. Вы можете использовать флаг `--format` (`-f`) со значением `text`, чтобы получить вывод без цветов:
```shell-session
$ gixy -f text
==================== Results ===================
Problem: [http_splitting] Possible HTTP-Splitting vulnerability.
Description: Using variables that can contain "\n" may lead to http injection.
Additional info: https://gixy.io/plugins/http_splitting/
Reason: At least variable "$action" can contain "\n"
Pseudo config:
include /etc/nginx/sites/default.conf;
server {
location ~ /v1/((?<action>[^.]*)\.json)?$ {
add_header X-Action $action;
}
}
==================== Summary ===================
Total issues:
Informational: 0
Low: 0
Medium: 0
High: 1
```
Вы также можете использовать `-f json`, чтобы получить воспроизводимый машиночитаемый вывод в формате JSON:
```shell-session
$ gixy -f json
[{"config":"\nserver {\n\n\tlocation ~ /v1/((?<action>[^.]*)\\.json)?$ {\n\t\tadd_header X-Action $action;\n\t}\n}","description":"Using variables that can contain \"\\n\" or \"\\r\" may lead to http injection.","file":"/etc/nginx/nginx.conf","line":4,"path":"/etc/nginx/nginx.conf","plugin":"http_splitting","reason":"At least variable \"$action\" can contain \"\\n\"","reference":"https://gixy.io/plugins/http_splitting/","severity":"HIGH","summary":"Possible HTTP-Splitting vulnerability."}]
```
Вы также можете использовать `-f sarif`, чтобы получить лог [SARIF 2.1.0](https://sarifweb.azurewebsites.net/), например, для загрузки в GitHub code scanning:
```shell-session
# Write a SARIF report to a file, e.g. for `github/codeql-action/upload-sarif`
gixy -f sarif -o gixy-results.sarif
```
Дополнительные флаги использования можно найти, передав `--help` в `gixy`. Больше информации также можно найти в [Руководстве по использованию](https://gixy.io/usage/).
## Конфигурация и параметры плагинов
Некоторые плагины предоставляют параметры, которые можно задать через флаги CLI или файл конфигурации. Подробнее об этом можно прочитать в [Руководстве по конфигурации](https://gixy.io/configuration/).
## Gixy-Next для безопасности и соответствия требованиям NGINX
В отличие от запуска `nginx -t`, который проверяет только синтаксис, Gixy-Next фактически анализирует вашу конфигурацию и обнаруживает неукреплённые экземпляры и уязвимости.
С помощью Gixy-Next вы можете выполнять автоматизированный аудит безопасности конфигурации NGINX, который может запускаться локально при каждом изменении — будь то для аудита, соответствия требованиям или общего тестирования, — помогая получать практически применимые результаты, которые помогают предотвратить нестабильные/медленные серверы NGINX и снизить риск от небезопасных директив и небезопасных настроек по умолчанию.
## Участие в разработке
Gixy-Next поддерживается [Joshua Rogers](https://joshua.hu), но вклад всегда приветствуется! Вы можете помочь нам разными способами, например:
- Сообщать об ошибках.
- Предлагать новые плагины для обнаружения.
- Улучшать документацию.
- Исправлять, рефакторить, улучшать и писать новый код.
Перед отправкой любых изменений в pull request, пожалуйста, прочитайте документ с рекомендациями по участию, [Contributing to Gixy-Next](https://gixy.io/contributing/).
Официальная домашняя страница Gixy-Next — [https://gixy.io/](https://gixy.io/). Любые изменения в документации Gixy-Next автоматически отражаются на этом сайте.
Исходный код можно найти по адресу [https://github.com/MegaManSec/Gixy-Next](https://github.com/MegaManSec/Gixy-Next).
## Что такое Gixy? (Предыстория)
_Gixy_ — это анализатор конфигурации NGINX, который был [изначально](https://github.com/yandex/gixy) разработан Эндрю Красичковым из Yandex. Он был впервые выпущен в 2017 году и с тех пор остался без поддержки. Он не поддерживает современные версии Python, содержит множество ошибок и ограничен в своей функциональности и способности обнаруживать уязвимые конфигурации NGINX. Запуск оригинального Gixy сегодня на современной системе приведёт к следующей ошибке:
```text
File "gixy/core/sre_parse/sre_parse.py", line 61, in <module>
"t": SRE_FLAG_TEMPLATE,
^^^^^^^^^^^^^^^^^
NameError: name 'SRE_FLAG_TEMPLATE' is not defined. Did you mean: 'SRE_FLAG_VERBOSE'?
```
Gixy-Next, таким образом, — это форк, который добавляет поддержку современных систем, новые проверки, улучшения производительности, рекомендации по усилению безопасности и поддержку современных версий Python и NGINX.
### Почему не `gixy-ng`?
Gixy-Next на самом деле является форком `gixy-ng`, который, в свою очередь, был форком оригинального `gixy`. Gixy-Next был создан после того, как сопровождающий `gixy-ng` начал вносить большое количество изменений с помощью ИИ и автогенерируемого кода, которые были как непомерно большими для проверки, так и сломанными.
Спустя некоторое время сопровождающий `gixy-ng` начал коммитить в кодовую базу изменения, сгенерированные ИИ, которые вносили очевидные регрессии, ломали критическое поведение инструмента (что заметил бы любой, кто им пользуется), добавляли случайные артефакты ИИ-инструментов и вносили код, который просто не делал того, что должен был делать. Что самое важное, сопровождающий также **добавил рекламу своего бизнеса во всю документацию, весь вывод и весь исходный код** `gixy-ng`.
Иными словами, сопровождающий `gixy-ng` взял оригинальный `gixy`, попросил ИИ внести изменения, внёс кучу багов (и прочего ИИ-мусора), а затем добавил рекламу в код. Он также принимал вклады в виде merge-запросов, но удалял информацию об авторе (см. [этот](https://joshua.hu/gixy-ng-new-version-gixy-updated-checks#quality-degradation) пост и [этот](https://joshua.hu/gixy-ng-ai-slop-gixy-next-maintained) пост).
Gixy-Next сосредоточен на восстановлении качества и был проверен в боевых условиях на конфигурациях NGINX длиной почти в 100 000 строк. Он исправляет баги и ошибочные срабатывания, внесённые изменениями в `gixy-ng`, удаляет артефакты/мусор ИИ-инструментов и старается поддерживать кодовую базу удобной для проверки и сопровождения. Этот форк — для тех, кто заинтересован в чистом коде и долгосрочной сопровождаемости.