allow/deny
Тема дорожной карты · Nginx
Nginx предоставляет IP-контроль доступа через модуль ngx_http_access_module, который включает директивы allow и deny для построения списка разрешённых или заблокированных IP-адресов внутри любого блока location, server или http. Список разрешённых IP-адресов формируется перечислением доверенных CIDR-диапазонов через allow с последующим deny all;: allow 192.168.1.0/24; allow 10.0.0.0/8; deny all; — в результате Nginx вернёт 403 Forbidden любому клиенту, не совпадающему ни с одним правилом allow. Когда веб-сервер или обратный прокси находится за балансировщиком нагрузки, переменная $remote_addr отражает IP вышестоящего прокси, а не реального клиента; в таких случаях необходимо настроить set_real_ip_from и real_ip_header X-Forwarded-For; для извлечения исходного IP клиента до применения правил allow/deny. Списки разрешённых IP-адресов обычно применяются к административным панелям, мониторинговым эндпоинтам вроде /nginx_status и внутренним API, где ограничение доступа известными офисными или VPN-адресами является достаточной мерой безопасности. Сочетание IP-списка разрешённых адресов с аутентификацией через auth_basic или auth_request обеспечивает многоуровневую защиту критически важных ресурсов, защищённых Nginx.
Как это работает
allow/deny имеет встроенную HTTP Basic auth (auth_basic + auth_basic_user_file с htpasswd), верификацию client TLS-сертов (ssl_client_certificate + ssl_verify_client on) и auth_request для делегированной auth (subrequest к auth-сервису — идеально для OAuth-flow, SSO, JWT-верификации через sidecar). Для SSO + OIDC — модуль lua-resty-openidc (с OpenResty/Lua) или vouch-proxy как sidecar.
Когда применять
HTTP Basic — для непубличных admin / internal dashboards: быстро настроить, достаточно поверх HTTPS. auth_request — для делегирования к OAuth-прокси (oauth2-proxy, vouch-proxy) когда нужен реальный SSO. Client TLS-серты — для very-high-assurance B2B API или замены VPN. Не пишите свою JWT-верификацию в nginx — OpenResty/Lua или sidecar.
Типичные ошибки
Ловушки allow/deny: HTTP Basic поверх HTTP (credentials в открытом виде — всегда HTTPS); htpasswd-файлы в git ("internal only"); JWT-верификация через regex в nginx (пожалуйста, нет); неверно защищены /.well-known/ пути (admin-эндпойнты утекают).