1. 1

# конспект · шаг 1 из 1

Конспект раздела: безопасность и лимиты

выжимка - её можно унести в заметки

Раздел про то, как не пустить лишнее и не дать одному клиенту забрать всё.

Два вопроса и четыре инструмента

СКОЛЬКО можно?   limit_req (частота)   limit_conn (соединения)   limit_rate (полоса)
КОМУ можно?      allow/deny   auth_basic   auth_request   satisfy

Дырявое ведро в одной таблице

Настройка Что происходит при всплеске
rate=1r/s без burst проходит один, остальные - отказ немедленно
burst=10 десять ждут очереди
burst=10 nodelay десять проходят сразу, ведро наполняется
limit_req_dry_run on ничего не отсекается, всё пишется в лог

Ключ считают по $binary_remote_addr после realip - иначе за прокси все клиенты станут одним.

Порядок правил доступа

  1. первое совпавшее allow/deny решает;
  2. свои правила в location отменяют унаследованные целиком;
  3. satisfy any - достаточно любого условия, satisfy all - нужны все;
  4. auth_request: 2xx пускаем, 401/403 отдаём, всё остальное - 500.

Шесть типовых дыр

Дыра Лечение
location /files без слеша при alias слеш с обеих сторон или root
.git, .env в корне location ~ /\.(?!well-known) { deny all; }
autoindex on после отладки выключить
исполнение файлов из /uploads/ deny до общей php-локации
потерянные заголовки безопасности помнить про массивы, add_header_inherit
server_tokens on off

Проверка curl'ом за минуту

$  команда
curl -sI https://shop.local/files../backup.sql
curl -sI https://shop.local/.git/config
curl -sI https://shop.local/admin/
for i in $(seq 1 20); do curl -s -o /dev/null -w "%{http_code} " https://shop.local/api/login; done

Чек-лист: что ты должен уметь объяснить

  • Почему при rate=1r/s из десяти одновременных проходит один.
  • Чем burst отличается от burst nodelay.
  • Что произойдёт с deny all уровня server, если в location написать allow.
  • Как satisfy any даёт «из офиса без пароля, снаружи - с паролем».
  • Почему location /files без слеша - это выдача чужих файлов.

Что показал стенд

опыт результат
rate=1r/s, десять одновременных 1 успех, 9 отказов; с burst=3 - 4 успеха, трое ждут 1-3 с
burst=3 nodelay те же 4 успеха, но мгновенно
limit_conn 2, пять скачиваний 2 успеха, 3 отказа
deny all в server плюс allow в location 200 - список наследуется всё или ничего
auth_delay 3s на неверном пароле 3,004 с против 0,0008
сервис auth_request ответил 302 клиент получил 500
блок проверки без internal доступен снаружи: 200 вместо 404
location /trav с alias, запрос /trav../secrets/db.env 200 и содержимое файла
.env, .git/HEAD, dump.sql на голом конфиге все 200
max_headers 5, двенадцать заголовков 400

Три правила, которые повторяются во всём разделе

  1. Список наследуется целиком или никак - у allow/deny, add_header, proxy_set_header, fastcgi_param. Полный набор на каждом уровне.
  2. Порядок фаз важнее порядка строк: return выполняется раньше и лимита, и deny, поэтому заглушка «для проверки» ничего не проверяет.
  3. Всё, что присылает клиент, - это заявление, а не факт: X-Forwarded-For, Referer, Host. Доверенным его делает только явный список адресов.

Комментарии

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

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

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