Списъкът с отворени портове е и списъкът на начините да се стигне до сървъра. Всичко останало — защитни стени, WAF, откриване на пробиви — са надстройки над него. Затова проверката „какво слуша при мен“ стои първа във всеки одит и точно тя най-често дава неприятен резултат: половината от намереното не сте го отворили вие, а инсталационният скрипт на някой пакет.
Четем изхода
sudo ss -tulpn
Ключове: t — TCP, u — UDP, l — само слушащите, p — процес, n — без преобразуване на номерата в имена. Без sudo колоната с процеса ще е празна и смисълът се губи.
Гледа се колоната Local Address:Port, а разликата там е принципна:
127.0.0.1:3306— услугата е достъпна само от самата машина. Това е добре;0.0.0.0:3306— от всички IPv4 адреси, тоест от интернет. Това трябва да се провери;[::]:3306— същото за IPv6. Отделен ред, за който редовно се забравя;203.0.113.25:443— на конкретен адрес, обикновено съзнателно.
После при всеки ред с 0.0.0.0 или [::] задавате един въпрос: трябва ли външен човек да може да стигне дотук? За 80 и 443 отговорът е да. За почти всичко останало — не.
Обичайни находки
Redis, порт 6379. Най-опасният възможен ред. По подразбиране Redis не изисква парола, а командите му позволяват записване на файл на диска — тоест чужд ключ в authorized_keys. Между появата на Redis на публичен адрес и използването му минават часове, понякога по-малко. Проверете bind 127.0.0.1 и protected-mode yes в конфигурацията.
Memcached, 11211/UDP. Дори вътре да няма нищо ценно, вашият сървър става усилвател в чужди атаки — а оплакванията идват от хостинг доставчика.
MySQL и PostgreSQL, 3306 и 5432. Парола има, но налучкването върви непрекъснато, а версиите на базите се обновяват по-рядко, отколкото трябва. Навън не са нужни почти никога: приложението е на същата машина, а за работа стига SSH тунел.
Elasticsearch 9200, MongoDB 27017. Исторически без удостоверяване по подразбиране. Публичните инстанции на тези услуги са постоянен източник на новини за изтичане на данни.
API на Docker, 2375. Отворен управляващ порт на Docker е root на машината съвсем без парола. Появява се обикновено след експерименти с отдалечен достъп до Docker.
Контролни панели и phpMyAdmin на своите портове: 8080, 8083, 10000. Не че никога не бива да се отварят, но точно те привличат основния поток опити.
Поправяйте на ниво услуга, а не на защитна стена
Изкушението всяка находка да се затвори с правило на UFW е разбираемо, но това е втората линия, а не първата. Правило може да се изтрие по невнимание, защитната стена да се изключи за малко при отстраняване на проблем, а Docker публикува портове напълно заобикаляйки UFW. Задаването на привързването в конфигурацията на услугата преживява всичко това:
- MySQL/MariaDB —
bind-address = 127.0.0.1; - PostgreSQL —
listen_addresses = 'localhost'; - Redis —
bind 127.0.0.1 ::1; - Docker Compose — публикуване като
"127.0.0.1:5432:5432".
Защитната стена се добавя отгоре като застраховка, а не вместо това.
Да се намери процесът, когато не знаете какво е
ss показва името и pid. По-нататък:
sudo systemctl status <pid>
sudo lsof -i :8080
Първата команда назовава systemd модула, към който принадлежи процесът — обикновено това стига, за да се разбере какво е и нужно ли е. Непознат процес, който слуша на висок порт и е стартиран извън системните директории — например от /tmp или /dev/shm — вече не е въпрос на конфигурация, а повод за отделно разследване.
Проверката отвън е задължителна
ss отговаря на въпроса „какво слуша“, а не „до какво може да се стигне“. Между двете стоят защитната стена, NAT и правилата на доставчика. Единственият честен отговор дава сканиране от друга машина:
nmap -Pn -p- 203.0.113.25
nmap -Pn -p- -6 2001:db8::1
Втората команда не я пропускайте: IPv6 адрес има почти всеки VPS, правилата за него се пишат отделно, а услугата слуша и на двете версии на протокола едновременно.
Това не е еднократна проверка
Списъкът с отворени портове се променя сам. Инсталирахте пакет — той донесе услуга и отвори порт. Обновихте панела — той възстанови настройката по подразбиране. Стартирахте контейнер — той публикува порт покрай защитната стена. Еднократната проверка отговаря за днешния ден и за нищо повече.
Стойността е не в самия списък, а в промените му: нов порт, какъвто вчера го е нямало, е кратък и много красноречив сигнал. Точно така си струва да се гледа на него — като на моментна снимка с история, а не като на изход от ss, възпроизведен по памет. Демонстрационната страница по-долу показва точно това.