# конспект · шаг 7 из 7
Конспект: доступ и авторизация
Четыре способа не пустить кого попало - и правила, по которым они складываются.
allow / deny
location /admin/ {
allow 192.168.1.0/24;
deny all; # порядок важен: первое подошедшее правило выигрывает
}
deny all;
allow 192.168.1.0/24; # ← недостижимо, закрыто всем
Наследование целиком или никак: свой allow в location отменяет все
унаследованные правила, включая deny all сверху. Нужен запрет - повтори его
внутри.
auth_basic
location /admin/ {
auth_basic "restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
auth_delay 3s; # тормозим подбор
}
satisfy: как складывать условия
satisfy any; # достаточно ЛЮБОГО: из офиса без пароля, снаружи - с паролем
allow 192.168.1.0/24;
deny all;
auth_basic "restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
satisfy all (по умолчанию) - нужны все условия сразу.
auth_request: вынести решение в приложение
location /private/ {
auth_request /auth;
proxy_pass http://app:8000;
}
location = /auth {
internal; # снаружи - 404
proxy_pass http://auth-service:9000/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
Правило: 2xx - пускаем, 401/403 - отдаём клиенту, всё остальное - 500.
Ловушки джокера
- Порядок
allow/deny: первое совпавшее правило решает, остальные не смотрятся. allowв location отменилdeny allсверху - самая частая дыра.auth_basicпо http передаёт пароль в открытом виде - только за TLS.internalзабыли - служебный эндпоинт авторизации доступен снаружи.- С 1.31.0 модуль
ngx_http_tunnel_moduleнаучилauth_basic/satisfy/auth_delayработать и на forward proxy.
Что показал стенд
| опыт | результат |
|---|---|
deny all в server плюс один allow в location |
200 - внешний список выброшен целиком |
deny all; затем allow мой-адрес; |
403 - allow недостижим |
allow чужой; без deny all |
200 - не подошло ни одно правило |
auth_basic без пароля / с паролем |
401 / 200 |
auth_basic off; во вложенном блоке |
200 без авторизации |
satisfy any и адрес из allow |
200 без пароля |
auth_delay 3s, неверный пароль |
3,004 с против 0,0008 |
auth_request: сервис ответил 200/204/401/403/302/500 |
200/200/401/403/500/500 |
| прямой запрос к блоку проверки | с internal 404, без него 200 |
valid_referers: без / чужой / свой Referer |
200 / 403 / 200 |
Ловушки джокера
- Своя строка
allowотменяет весь внешний список - полный набор пишут на каждом уровне. returnв блоке выполняется раньшеdeny- заглушка «для проверки» ничего не проверяет.- Ответ 302 от сервиса авторизации превращается в 500. Редирект на форму входа делает фронтенд, получив 401.
- Забытый
internalпревращает блок проверки в публичную точку. Refererприсылает клиент:valid_referersзащищает трафик, а не доступ, и без словаnoneотрежет своих же.- Подпись
secure_linkс$remote_addrломает докачку при смене сети.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий