Shodan - wyszukiwarka urządzeń podłączonych do internetu - indeksuje codziennie miliony serwerów. W całym internecie można znaleźć tysiące instancji Elasticsearch bez hasła, setki paneli Kubernetes dostępnych bez uwierzytelnienia i wiele otwartych instancji Redis ze wszystkimi danymi aplikacji. Wirtualna Tarcza sprawdza 36+ portów pod kątem niebezpiecznych ekspozycji.
Dlaczego otwarte porty infrastrukturalne są tak groźne?
Typowe strony WWW są chronione przez firewalle i reverse proxy - Nginx lub Cloudflare przyjmuje ruch na portach 80 i 443, reszta jest blokowana. Problem zaczyna się gdy deweloperzy otwierają porty do debugowania ('tylko na chwilę'), deploye Docker wystawiają porty przez -p 0.0.0.0:PORT, lub automatyczne konfiguracje Kubernetes nie uwzględniają zewnętrznych reguł firewalla.
- Shodan co godzinę skanuje cały internet - Twój VPS jest indeksowany
- Automatyczne boty atakują znane porty w ciągu minut od wystawienia
- Brak hasła = natychmiastowy, pełny dostęp do danych
- Kubernetes API bez autentykacji = RCE na wszystkich węzłach klastra
- Prometheus bez auth = pełny profil ruchu, użytkowników, błędów
Port 6443 - Kubernetes API Server
Kubernetes API Server (port 6443/TCP) to centralny punkt kontrolny klastra. Pozwala tworzyć, modyfikować i usuwać wszystkie zasoby: pods, secrets, config maps, service accounts. Bez poprawnej autoryzacji (RBAC) lub z przypadkowo wystawionym anonymous access - atakujący może uruchomić dowolny kontener na wszystkich węzłach.
Wskazówka - Kubernetes API nigdy nie powinien być dostępny publicznie. Użyj VPN, bastion hosta lub kubectl port-forward wyłącznie z zaufanych sieci. W managed Kubernetes (GKE, EKS, AKS) włącz 'private endpoint'.
Sprawdź ekspozycję:
curl -k https://TW_IP:6443/api/v1/namespaces
Niebezpieczna odpowiedź:
{"kind": "NamespaceList", "items": [...]} ← anonymous access włączony
Bezpieczna odpowiedź:
{"kind":"Status","status":"Failure","reason":"Unauthorized","code":401}
Najczęstszy błąd:
--anonymous-auth=true w konfiguracji kube-apiserver
lub ClusterRoleBinding do roli 'system:anonymous'Port 10250 - Kubelet API
Kubelet (port 10250) zarządza podami na poszczególnym węźle. Jeśli jego API jest dostępne bez uwierzytelnienia, atakujący może wykonać dowolne polecenie w każdym działającym podzie przez endpoint /exec. To de facto RCE na kontenerze produkcyjnym.
Eksploatacja bez auth:
curl -k https://TW_NODE_IP:10250/exec/default/POD_NAME/container \
-d '{"command":["cat","/etc/passwd"]}'
Ochrona:
# /etc/kubernetes/kubelet-config.yaml
authentication:
anonymous:
enabled: false ← to musi być false
webhook:
enabled: true
authorization:
mode: WebhookPort 2375/2376 - Docker API (Remote)
Docker domyślnie nasłuchuje na Unix socket (/var/run/docker.sock) dostępnym tylko lokalnie. Jeśli ktoś uruchomił Dockera z flagą -H tcp://0.0.0.0:2375 lub skonfigurował /etc/docker/daemon.json z 'hosts: [tcp://0.0.0.0:2375]' - cały Docker API jest dostępny bez TLS i bez autentykacji. Atakujący może uruchomić kontener z podłączonym /etc/host i uzyskać root na hoście.
Sprawdź:
curl http://TW_IP:2375/version
Jeśli zwraca JSON z wersją Dockera - jesteś zaatakowany.
Naprawa - wyłącz remote API:
# /etc/docker/daemon.json
{
"hosts": ["unix:///var/run/docker.sock"]
// NIE dodawaj tcp:// tutaj
}
Jeśli potrzebujesz remote API - użyj TLS:
# daemon.json
{
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2376"],
"tls": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server-cert.pem",
"tlskey": "/etc/docker/server-key.pem"
}Port 5601 - Kibana (Elasticsearch frontend)
Kibana to interfejs webowy do Elasticsearch. W starszych wersjach (< 7.x) domyślnie nie wymagał logowania. Nawet w nowszych wersjach - błędy konfiguracji prowadzą do publicznego dostępu do wszystkich indeksów Elasticsearch, historii logów, danych użytkowników i metadanych infrastruktury.
Wskazówka - Kibana powinna być dostępna wyłącznie za VPN lub przez tunelowanie SSH. Jeśli musisz udostępnić ją przez internet - skonfiguruj Kibana Security (X-Pack) z SSL i user authentication. Domyślne dane logowania (elastic:changeme) są pierwszą rzeczą którą sprawdza automatyczny skaner.
Port 9200/9300 - Elasticsearch bez hasła
Elasticsearch przez lata działał w trybie 'open by default' - bez autentykacji. Efekt: ponad 100 tys. instancji z danymi był publicznie dostępnych na Shodanie. Incydenty obejmowały wycieki danych medycznych, baz e-commerce i logów aplikacji z danymi osobowymi milionów użytkowników.
Test: curl http://TW_IP:9200/_cat/indices?v Jeśli widzisz listę indeksów - baza jest publiczna. Ochrona: # /etc/elasticsearch/elasticsearch.yml xpack.security.enabled: true network.host: 127.0.0.1 ← słuchaj tylko lokalnie # Lub przez IPTables: iptables -A INPUT -p tcp --dport 9200 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp --dport 9200 -j DROP
Port 9100 - Prometheus Node Exporter (metryki serwera)
Prometheus Node Exporter eksportuje metryki systemu operacyjnego: użycie CPU, RAM, dysku, sieci, procesy, interfejsy sieciowe. To cenny rekonesans dla atakującego - wie dokładnie jak duże jest obciążenie, kiedy serwer jest bezczynny, jakie procesy działają i jaka wersja kernela jest używana.
- Metryki ujawniają architekturę infrastruktury (nazwy hostów, usług)
- Informacje o wersji kernela pomagają celować w konkretne CVE
- Monitoring spamu i skryptów przez anomalie CPU/sieci
- Nazwy dysków, montowania, systemy plików - mapa serwera
Wskazówka - Node Exporter powinien być dostępny wyłącznie lokalnie lub z sieci wewnętrznej Prometheus. Dodaj --web.listen-address=127.0.0.1:9100 lub skonfiguruj firewall. Jeśli używasz Kubernetes - Prometheus powinien sięgać do node exporterów przez wewnętrzną sieć pod, nie przez publiczny IP.
Port 2379/2380 - etcd (baza danych Kubernetes)
etcd to rozproszony magazyn kluczy/wartości gdzie Kubernetes przechowuje CAŁY stan klastra: wszystkie secrets, tokeny, certyfikaty, konfiguracje. Dostęp do etcd = dostęp do każdego hasła, klucza API i certyfikatu w klastrze. To absolutnie krytyczny komponent który nigdy nie powinien być publicznie dostępny.
Port 9001 - MinIO (S3-compatible storage)
MinIO to open-source storage kompatybilny z AWS S3. Panel zarządzania (port 9001) z domyślnymi danymi dostępowymi (minioadmin:minioadmin) lub bez autentykacji daje pełny dostęp do wszystkich przechowywanych plików: backupów baz danych, plików użytkowników, certyfikatów.
Jak sprawdzić które porty są otwarte na Twoim serwerze?
Wirtualna Tarcza skanuje 36+ portów infrastrukturalnych przy każdym audycie i kategoryzuje je: oczekiwane (22 SSH, 80 HTTP, 443 HTTPS - zielone), niebezpieczne (czerwone), niezidentyfikowane (żółte). Wynik pokazuje dokładnie co jest widoczne z internetu.
Możesz też sprawdzić ręcznie: # Lokalnie z zewnętrznej sieci (np. od dostawcy chmury): nmap -sV -p 1-65535 TW_IP # Szybki skan najpopularniejszych portów: nmap --top-ports 1000 TW_IP # Z serwera - co nasłuchuje: ss -tlnp # Linux netstat -an | grep LISTEN