Dlaczego?
Warto wiedzieć co się dzieje na naszym serwerze, dzięki temu możemy podjąć celne działania aby coś naprawić, przyspieszyć czy lepiej zabezpieczyć.
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:
https://lvlup.rok.ovh/t/whitelista-udp-na-kvm-game-pro/264
Jak to zrobić?
W większości systemów wystarczy polecenie:
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
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:
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:
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:
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ę:
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ć:
apt-get update
apt-get install net-tools
Dla CentOS i innych pochodnych RHEL wystarczy:
yum install net-tools