Weryfikacja nasłuchiwanych portów w systemach linux
Sieć Internet to od dawna nie jest bezpieczne miejsce, warto zobaczyć dla kogo zostawiamy otwarte drzwi i do czego one prowadzą. Takim odpowiednikiem drzwi jest w sieciach komputerowych są porty.
Gdy będziemy wiedzieli z jakich aplikacji korzystamy, będziemy wtedy wiedzieli co dodać do własnych regułek firewalla iptables lub whitelisty UDP:
Jak to zrobić?
W większości systemów wystarczy polecenie:
1 2 | netstat -l |
Jak to czytać?
Na początku wydaje się to włoskim daniem makaronowym ale wystarczy przyjrzeć się bliżej że wynik tego polecenia to kopalnia wiedzy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN tcp 0 0 *:40833 *:* LISTEN tcp 0 0 localhost:27017 *:* LISTEN tcp 0 0 localhost:mysql *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 *:46834 *:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 [::]:43937 [::]:* LISTEN tcp6 0 0 [::]:57793 [::]:* LISTEN tcp6 0 0 [::]:sunrpc [::]:* LISTEN udp 0 0 localhost:608 *:* udp 0 0 *:674 *:* udp 0 0 *:59774 *:* udp 0 0 *:bootpc *:* udp 0 0 *:sunrpc *:* udp 0 0 *:41251 *:* udp6 0 0 [::]:674 [::]:* udp6 0 0 [::]:43086 [::]:* udp6 0 0 [::]:40189 [::]:* udp6 0 0 [::]:sunrpc [::]:* Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 7424585 /tmp/mongodb-27017.sock unix 2 [ ACC ] STREAM LISTENING 24344048 /run/user/1000/systemd/private unix 2 [ ACC ] STREAM LISTENING 7467947 /run/user/1002/systemd/private unix 2 [ ACC ] STREAM LISTENING 7459911 /run/user/1001/systemd/private unix 2 [ ACC ] SEQPACKET LISTENING 7951 /run/udev/control unix 2 [ ACC ] STREAM LISTENING 7885 /run/systemd/journal/stdout unix 2 [ ACC ] STREAM LISTENING 7931 /run/lvm/lvmetad.socket unix 2 [ ACC ] STREAM LISTENING 7952 /run/lvm/lvmpolld.socket unix 2 [ ACC ] STREAM LISTENING 13305 /var/lib/lxd/unix.socket unix 2 [ ACC ] STREAM LISTENING 13303 /run/uuidd/request unix 2 [ ACC ] STREAM LISTENING 13304 /var/run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 13306 /run/acpid.socket unix 2 [ ACC ] STREAM LISTENING 13307 /run/snapd.socket unix 2 [ ACC ] STREAM LISTENING 13308 /run/snapd-snap.socket unix 2 [ ACC ] STREAM LISTENING 14766 @ISCSIADM_ABSTRACT_NAMESPACE unix 2 [ ACC ] STREAM LISTENING 24019 /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 42459 /var/run/mysqld/mysqld.sock unix 2 [ ACC ] STREAM LISTENING 45141 /run/rpcbind.sock |
Po tym wyniku możemy stwierdzić że na tym systemie działa baza MySQL i MongoDB.
Tu mamy MySQL:
1 2 | tcp 0 0 localhost:mysql *:* LISTEN |
MySQL używa domyślnie portu 3306 i jest to dość znana od wielu lat aplikacja dlatego aplikacja od razu zamiast tego numeru portu mówi nam że jest to port używany przez MySQL
A tu MongoDB:
1 2 | tcp 0 0 localhost:27017 *:* LISTEN |
Mongo jest mniej znane i znacznie młodsze, tu zostaje nam wyświetlony port 27017
.
Możemy też użyć netstat -ln
, wtedy uzyskamy listę wszystkich portów bez wykrywania od czego jest co.
Obie aplikacje mają localhost:
przed portem więc nasłuchują tylko lokalnie, czyli nie można dostać się do nich z zewnątrz z sieci. Jest to bezpieczne rozwiązanie gdyż lepiej nie dawać dostępu obcym do naszej bazy nawet jeśli jest zabezpieczona hasłem.
Przykładowo jeśli zezwolimy na dostęp z zewnątrz, może okazać się kiedyś w przyszłości że jest luka która umożliwia zalogowanie się bez hasła a my zapomnimy o aktualizacji i problem gotowy.
Tu możemy zobaczyć nasłuchujący serwer SSH na standardowym porcie:
1 2 | tcp 0 0 *:ssh *:* LISTEN |
Jest wystawiony na zewnątrz ale SSH to sprawdzona aplikacja i jakoś musimy się też dostać do serwera więc nie ma co się za bardzo obawiać o ile mamy długie i losowo wygenerowane hasło lub logujemy się parą kluczy (publicznego i prywatnego).
Na dole mamy jeszcze ciekawostkę:
1 2 | unix 2 [ ACC ] STREAM LISTENING 42459 /var/run/mysqld/mysqld.sock |
Jest to port ale nie do końca. Jest to socket (wtyczka) która umożliwia łączenie się aplikacji nie poprzez standardowy adres sieciowy lecz plik. Niektóre aplikacje obsługują łączenie się przez UNIXowe sockety i tu właśnie mamy tego przykład. Te pliki nie są w żaden sposób wystawione na świat, są dobrym rozwiązaniem aby połączyć ze sobą usługi na jednym serwerze z różnymi użytkownikami gdyż można zmieniać uprawnienia użytkowników do tego zasobu jak każdemu innemu plikowi na dysku.
To nie działa!
Jeśli nie mamy takiego polecenia w systemie jak netstat
, należy doinstalować paczkę net-tools
.
W przypadku Debiana i pochodnych np. Ubuntu wystarczy wykonać te komendy aby ją zainstalować:
1 2 3 | apt-get update apt-get install net-tools |
Dla CentOS i innych pochodnych RHEL wystarczy:
1 2 | yum install net-tools |