# конспект · шаг 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 - иначе за прокси все
клиенты станут одним.
Порядок правил доступа
- первое совпавшее
allow/denyрешает; - свои правила в location отменяют унаследованные целиком;
satisfy any- достаточно любого условия,satisfy all- нужны все;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 |
Три правила, которые повторяются во всём разделе
- Список наследуется целиком или никак - у
allow/deny,add_header,proxy_set_header,fastcgi_param. Полный набор на каждом уровне. - Порядок фаз важнее порядка строк:
returnвыполняется раньше и лимита, иdeny, поэтому заглушка «для проверки» ничего не проверяет. - Всё, что присылает клиент, - это заявление, а не факт:
X-Forwarded-For,Referer,Host. Доверенным его делает только явный список адресов.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий