LIMB
Вход Регистрация

тема

Nginx: Как не стать лёгкой добычей — базовая паранойя для выживания в сети #1

WWW_S · · 7 ответов · 791 просмотров

Ты думаешь, твой сервер на Nginx неуязвим? Что стандартный apt install nginx и дефолтный конфиг — это «нормальная защита»? Смешно. Прямо сейчас тысячи ботов сканируют порты, ищут кривые настройки, тупые уязвимости и глупые ошибки админов, которые думают, что «и так сойдёт».

Nginx — это не просто прокси или веб-сервер. Это твой первый рубеж обороны. И если ты накосячил в базовых вещах — тебя уже взломали. Просто ещё не сказали.

В этой статье — минимум теории, максимум жёстких практических правил, которые не дадут тебе проснуться однажды с битым сайтом, украденными данными или майнером в жопе.

Референс взят частично из https://www.cisecurity.org/benchmark/nginx, частично из шизотипичного  DevOps;

Момент номер раз:

1) Тут можно было бы расписать по robots.txt и sitemap.xml (Но ты же наврядли это всё делаешь?)
Гайд можно подсмотреть, разрешить индексацию определенным роботам, отключить индексацию по маске и т.д и т.п;

2) Лично я пользуюсь правилом, дружище у тебя не сходятся location | http method или тебя нет в разрешенном списке (Иди на 3 буквы):

ACL, довольно примитивная штукенция, обычно описываю в location:


Не удалось прогрузить медиа

На 3 буквы без локейшена посылаю вот так:

Не удалось прогрузить медиа


При проксировании методов до бэкенда, дружище, проверь на сколько он дырявый и какие методы http ему действительно нужны и лишнего не давай плз:

Проверка метода:

Не удалось прогрузить медиа


Захотел отправить DELETE? Жидко обосрался под себя;

Также пожалуйста не забывай, все лгут, разробан может оставить включенный swagger, эндпоинт actuator`а (актуально для спринг), эндпоинт с метриками - это всё может сыграть с тобой злую шутку;
Лучше передай разработчикам, чтобы хотябы basic auth повесили со своей стороны, либо на разные порты открывали бизнес функционал, а на другие метрики;
Помни отдавай 403 на всё что ты не понимаешь))

3) Добрые дяди решают проксанировать твой сайт, как ты думаешь на что они будут смотреть?

На заголовки, по хорошему потуши пожалуйста их, в nginx.conf
Не удалось прогрузить медиа

А нахера, чтобы не стать легкой мишенью брат, представь выкатывается 0day на nginx для определенной версией;
Какой нибудь скрипт-малютка кидает curl -v site.com/ и видет в ответе версию nginx, нехорошо ;)
Бэкенд также лучше обезличить;

Кстати многие ебать какие умники в локейшен добавляют проксирование с кредами;

Представь ты обращаешься curl /api/v1, а к твоему заголовку докидывается базовая учётка в base64 энкоде - это днище чел (Если очень хочется нарули на lua пару портяночек, но я люблю работать с тем что идёт из коробки, без лишнего)

4) Помнишь тех дядей из 3го пункта, эти дяди также могут проверить насколько дыряво сконфигурирован твой веб-сервер;
Есть такая директива server_name, и многие чудики публикуют внутренние и внедние ресурсы на default обработчике;
Допустим у тебя есть открытый ресурс, выставленный в dmz - site.com, а на этом же nginx ты держишь админку admin.local;
Эта вся херня называет пробивом виртуального хоста, и если ты не озаботишься его настройкой, ИБшники тебя просто могут отпиздить ;)

Запомни оставить приманку, server_name default заверни левый сертификат на 80/443, чтобы хацкер кучевряжился с заведомой приманочкой, а нужные ресурсы разрули отдельно;
Также обращай внимение на интерфейс на котором ты будешь случать входящий трафик nginx; (0.0.0.0) привет;

В общем если товарищь Админ пропустит данную статья, я еще напишу парочку моментов про проксирование php, которая я не так давно исправлял;

Всем хорошего дня!

Остались вопросы или интересные предложения пожалуйста напиши комментарий! ;)
👍67 🤔8 😢9 💯13
Еще парочка легкий моментов;


В дирректории со статикой пожалуйста не храни .bash_rc, .bash_history, .psql_history;

Есть история как чуваки без HISTORY переменной в дирректорию со статикой сохранили креды от бд;
А вот пример с пыхой (Не обращайте внимание что ping/status доступны тут, они на уровне обстракций выше были заблокированы):

Было:


upstream php-upstream-chizik {
    server 127.0.0.1:9000;
}
server {
    listen 80;
    root /srv/www/public;
    index index.php index.html index.htm;
    
    server_name localhost;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-upstream-chizik;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
   location ~ ^/(status|ping)$ {
        allow all;
        fastcgi_pass php-upstream-chizik;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        include fastcgi_params;
    }
}
👍2
Привет, хорошая статья. Но есть некоторые моменты...
Code:
location /admin/ {
allow 192.168.1.100; # Разрешаем один IP
allow 10.0.0.0/24; # Разрешаем подсеть
deny all; # Блокируем всех остальных
...
}


Это не сработает, если сайт накрыт cloudflare. Если используется прокси, то ты должен зайти в панель и там ограничить доступ к директории по ip адресу.


Прямо сейчас тысячи ботов сканируют порты

Настрой ufw разреши к 80, 443 порта доступ только к пуллу ip cloudflare, к ssh только свой айпи для остальных блок. И никто тебя не сможет сканить.
👍1
Стало:

upstream php-upstream-chizik {
    server 127.0.0.1:9000;
}
   server {
    listen 8080;
    server_name localhost;
       location / {
        fastcgi_pass php-upstream-chizik;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /srv/www/public/index.php;
        fastcgi_param PATH_INFO $uri;
    }
    location ~ ^/(status|ping)$ {
        fastcgi_pass php-upstream-chizik;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /srv/www/public/index.php;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    }    
}
👍5 ❤️1
Ответstudent

Привет, хорошая статья. Но есть некоторые моменты... Code: location /admin/ { allow 192.168.1.100; # Разрешаем один IP allow 10.0.0.0/24; # Разрешаем подсеть deny all; # Блокируем всех остальных ... } Это не сработает…

Да тут соглы, еще не будет работать если из под докера завернуто это дело, или в каком-нибудь k8s;
Там просто не будет передаваться без танцев с бубнами X-real-IP ну и вроде X-forwarded-for также не будет передаваться;
👍1
Ответstudent

Привет, хорошая статья. Но есть некоторые моменты... Code: location /admin/ { allow 192.168.1.100; # Разрешаем один IP allow 10.0.0.0/24; # Разрешаем подсеть deny all; # Блокируем всех остальных ... } Это не сработает…

А еще можно ридеректить на porn сайты или же отдавать файловые бомбы;
Можно еще fail2ban зарулить или настроить ограничения по rps, в этом вся гибкость системы))
👍3
Слушай, норм тема с cloudflare сейчас прогоню)

Представим ситуацию у нас full проксирование для ipv4, но дядя хостер добавил нам ipv6 адресочек на интерфейсы;

По умолчанию ipv6 включен;
sysctl я бы не доверял и на уровне гроба вырубил конфижечку;
Не удалось прогрузить медиа


sudo update-grub

Далее т.к у меня не было пакета;
 apt update && apt install ufw  --no-install-recommends -y ;
Статики к сожалению нет ;(

Прогоняем следующий скрипт, и проверяем выхлоп; (следующим делом ребутим тачку, после подъема проверяем что у нас нет ipv6 биндов в "ss -tulpn" ну и в "ip a | grep inet6")
#!/bin/bash

CLOUDFLARE_SUBNETS=(
  "173.245.48.0/20"
  "103.21.244.0/22"
  "103.22.200.0/22"
  "103.31.4.0/22"
  "141.101.64.0/18"
  "108.162.192.0/18"
  "190.93.240.0/20"
  "188.114.96.0/20"
  "197.234.240.0/22"
  "198.41.128.0/17"
  "162.158.0.0/15"
  "104.16.0.0/13"
  "104.24.0.0/14"
  "172.64.0.0/13"
  "131.0.72.0/22"
)


ufw delete allow 80/tcp 2>/dev/null
ufw delete allow 443/tcp 2>/dev/null


ufw allow 22/tcp

for subnet in "${CLOUDFLARE_SUBNETS[@]}"; do
  ufw allow from "$subnet" to any port 80 proto tcp
  ufw allow from "$subnet" to any port 443 proto tcp
done

ufw deny 80/tcp
ufw deny 443/tcp

echo "y" | ufw enable
echo -e "\nТекущие правила UFW:"
ufw status numbered
echo -e "\nНастройка завершена. Порт 22 открыт для всех, порты 80 и 443 только для Cloudflare."
👍3

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.