Комментарий пользователя
Поднял ВМ в облаке под небольшой сервис на nginx. Просканировал ее снаружи через nmap — открыты 22/TCP и 80/TCP. Везде пишут «закройте все ненужные порты», но не совсем понимаю, где найти конкретику. 22 мне нужен, чтобы вообще попадать на сервер, 80 нужен сайту. Получается, закрывать нечего? С чего начать и на что смотреть в первую очередь?
Ответ специалиста
Здравствуйте, Никита!
Порт не обязан быть «закрытым» — он должен быть недоступен всем, кому не нужен. В вашем случае разница принципиальная: и 22, и 80 останутся рабочими, просто перестанут смотреть в весь интернет.
Есть группа портов, которые опасно держать открытыми наружу практически всегда. С них и рекомендуется начинать ревизию:
3306/TCP (MySQL) и 5432/TCP (PostgreSQL) — не должны быть доступны из интернета. Открытый порт БД — это прямой путь к утечке.
23/TCP (Telnet) и 21/TCP (FTP) — передают данные в открытом виде, поэтому легко перехватываются. От Telnet стоит отказаться совсем в пользу SSH, вместо FTP взять SFTP или FTPS;
445/TCP (SMB) — канал распространения вредоносного ПО: через него работал WannaCry, позже — шифровальщики Ryuk и Cryptolocker. Не нужен — отключайте, нужен — только актуальная версия протокола и никогда не наружу;
3389/TCP (RDP) — постоянная цель атак из-за слабых паролей и уязвимостей самой службы. Ограничение по IP плюс многофакторная аутентификация;
5900/TCP (VNC) — та же проблема слабых паролей. Только через приватную сеть.
Ваши 22 и 80 в этом списке тоже есть, но логика с ними немного другая. 22/TCP — самый часто открытый порт в интернете и главная мишень для подбора паролей, поэтому по нему нужны ключи вместо паролей и доступ только с доверенных адресов (white list). 80/TCP закрывать бессмысленно, это и есть ваш сервис и его защищают иначе — переходом на HTTPS и, если сервис серьезный, WAF от инъекций и XSS.
Практически для ограничения 22/TCP есть два основных способа. Локально — правилом iptables на самом сервере, тогда при сканировании снаружи порт получит статус filtered вместо open.
Второй способ — облачный межсетевой экран, и его стоит рассматривать как основной. Фильтрация здесь происходит до сервера, поэтому при разрешении только для доверенного адреса nmap снаружи вообще не видит хост.
Важный момент, который чаще всего пропускают: не ориентируйтесь только на список стандартных портов. Уязвимые службы регулярно оказываются на неожиданных номерах. Порт открывается при установке сервиса незаметно и узнать о нем можно только сканированием собственного периметра.
Порядок действий в вашем случае рекомендуем следующий.
1. Просмотрите слушающие порты и службы:
$ sudo netstat -tulpn # все слушающие порты и службы
$ whatis <имя службы> # что это за сервис
2. По каждому найденному порту ответьте на вопрос, должен ли он быть открыт. Если служба им не пользуется, то закрывайте. Сокращение числа открытых портов упрощает контроль и снижает вероятность эксплуатации уязвимостей.
3. Обновите ПО и накатите патчи. А дальше — то, что на вашем масштабе даст больше всего пользы: настройте себе оповещение о новых открытых портах. Полноценный SIEM для одной ВМ избыточен, но задачу решает и простой скрипт по расписанию: cron раз в сутки снимает список слушающих портов через ss или nmap, сравнивает с сохраненным эталоном и, если появилось что-то новое, присылает сообщение в Telegram. К слову, когда придет такое оповещение, у нас есть чек-лист с разбором дальнейших действий.