Безопасность сервера на котором уже крутится твой мега-стартапИногда безопасность ломается не из-за супер-0day, модной вирусни, user/password от бд: postgres/postgres (все совпадения случайны), а из-за банального: у тебя на VPS торчит порт, который временно открыл и забыл. А интернет не забывает, его постоянно сканируют.
Что реально происходит в сетиУ твоего сервера есть публичный IP. Для внешнего мира он как витрина, туда стучатся все кому не попадя. И по этой витрине ходят роботы. Очень типичная цепочка выглядит так:
Скан → найден порт → баннер/версия → подбор пароля/эксплойт → закрепление
Сканируют все, всегда, без личных причин. Просто потому что это дёшево и масштабируется.
Кто ты воин?Если хочешь быстро почувствовать как оно, посмотри на свой сервер глазами атакующего (с другого хоста):
nmap -sS -sV -Pn -p- <твой ip>
Тебя интересует только открыт ли 22 (ssh), а любые неожиданные вещи: 2375 (Docker API), 9200 (Elasticsearch), 5432 (PostgreSQL), 6379 (Redis), 8080/8000 (админки), 9090 (метрики/Prometheus) и т.д.
Главная мысль: "Если сервис слушает
0.0.0.0, он уже считается публичным!", даже если там есть пароль.
Почему пароль слабая защитаПароль - это последняя линия. Первая линия - это, чтобы до сервиса вообще не дошли. Потому что есть брутфорс и словари, есть утечки паролей, есть баги в сервисах, есть неверные настройки, есть админки без rate-limit. И даже без взлома, открытый порт = лишний шум в логах + лишняя нагрузка.
База: закрыть все, кроме нужногоСамый спокойный подход: default deny, и дальше открываешь только то, что реально нужно. Пример минимального nftables: разрешаем установленные соединения, loopback, SSH и HTTP/HTTPS, остальное в drop.
nft add table inet filter
nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input tcp dport { 80, 443 } accept
Если хочешь сделать ещё правильнее, ограничь SSH по IP (например, только твой офис/VPN):
nft add rule inet filter input ip saddr <YOUR_IP>/32 tcp dport 22 accept
И сразу становится заметно: даже если на сервере случайно поднялся Redis на
0.0.0.0, то извне его не видно.
Важный выводЕсли порт открыт, то им кто-то уже интересуется. Сделай так, чтобы интересоваться было нечем.
LinuxCamp | #security