1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# конспект · шаг 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 ломает докачку при смене сети.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.