Mamy serwer bastionowy B. Musimy SSH od A do B do C, używając klucza prywatnego.
Jaka jest lepsza opcja:
Umieść prywatny klucz SSH na serwerze B. Czytamy, że złym pomysłem jest robienie tego w środowisku produkcyjnym.
Od tutaj :
Nigdy nie umieszczaj kluczy prywatnych SSH w instancji bastionu. Zamiast tego użyj przekazywania agenta SSH, aby połączyć się najpierw z bastionem, a stamtąd z innymi instancjami w prywatnych podsieciach. Pozwala to zachować prywatny klucz SSH tylko na komputerze.
Użyj przekazywania agenta SSH . Aby skonfigurować przekazywanie agentów, muszę zezwolić na przekazywanie TCP. Podczas konfigurowania przekazywania agenta na hoście przekazującym tworzony jest plik gniazda, który jest mechanizmem, za pomocą którego można przekazać klucz do miejsca docelowego. W ustawieniach Bastionu w AWS:
Przekazywanie TCP: Ustawienie wartości true spowoduje włączenie przekazywania TCP (tunelowanie SSH). Może to być bardzo przydatne, ale stanowi również zagrożenie bezpieczeństwa, dlatego zalecamy zachowanie domyślnego (wyłączonego) ustawienia, chyba że jest to wymagane
Również stąd :
Przekazywanie agentów SSH uważane jest za szkodliwe
Co jest lepsze? Co z alternatywą z drugiego łącza: ProxyCommand , rozumiem, że to pomaga w przypadku problemu z plikiem gniazda, ale nadal uważam, że muszę włączyć przekazywanie TCP, więc czy jest wystarczająco bezpieczne?
ssh hostb
polecenie, aby mógł wyszukać hostb w lokalnej konfiguracji i wiedzieć, że musi się połączyć przez hosta. Nie można tego zrobić, jeśli umieścisz konfigurację na hosta ...Odpowiedzi:
Użyj ProxyCommand lub ProxyJump
Polecam użyć
ProxyCommand
(lub nawet lepiej,ProxyJump
ponieważ składnia jest łatwiejsza, ale wymaga openssh 7.3+, myślę, że po stronie klienta) i nie trzeba wdrażać klucza prywatnego na Bastionie, wszystko pozostaje lokalne.Przykład z ProxyJump
Na komputerze klienckim piszesz plik
~/.ssh/config
o podobnej treści do poniższej:W ten sposób
ssh srvC
połączysz się z C za pośrednictwem B (bastion) bez przekazywania agenta ani wdrażania klucza prywatnego do bastionu.W powyższym przykładzie „bastion” jest aliasem dla twojego hosta Bastion, a srvC jest aliasem dla twojego serwera C. W polu
HostName
musisz podać IP lub prawdziwą w pełni kwalifikowaną nazwę domeny dla swoich hostów. Dla użytkowników musisz zaktualizowaćUser
prawidłową nazwę logowania na Bastionie i serwerze C. WreszcieIdentityFile
opcja jest opcjonalna, jeśli używasz lokalnego agenta (np. KeeAgent lub ssh-agent), ale jeśli nie jest uruchomiony, to również będzie pracuj i pytaj o każde kluczowe hasło.Wdrażanie kluczy publicznych
Oczywiście musisz wdrożyć klucze publiczne zarówno do bastionu, jak i srvC. Możesz użyć (znak $ ma tylko zilustrować monit, nie wpisuj go):
Uwaga: powyższe będzie działać tylko wtedy, gdy uwierzytelnianie hasłem jest nadal dozwolone. Po powyższym wdrożeniu i sprawdzeniu, czy wszystko działa zgodnie z przeznaczeniem, należy zabronić uwierzytelniania hasła na 2 serwerach.
Przykład z ProxyCommand zamiast ProxyJump
Jeśli masz starszą wersję OpenSSH, która nie obsługuje
ProxyJump
(po stronie klienta), zamień:przez
O ile rozumiem, jest to podobne.
źródło
Widziałem odpowiedź na temat ProxyJump. Porozmawiajmy o ProxyCommand .
Ale czekaj, czekaj! Mogę napisać do ciebie, jak zhakować serwer, który korzysta z przekazywania agentów, znacznie łatwiej byłoby zrozumieć różnicę!
Hakujmy!
Podstawowe kroki: możesz przeczytać mój post tutaj
Podstawowe kroki są następujące:
Jak korzystać z AgentForwarding
-Utwórz config w ~ / .ssh / config
-Dodaj swój klucz uwierzytelniający do ssh-agent
-Połącz się z bastionem
-Podłącz serwer aplikacji od bastionu
Hakerstwo!
Możesz zadać mi pytanie:
Czy mój serwer jest bezpieczny? Odpowiedź jest dość prosta:
Dlaczego?
A gdzie jest problem?
Dlaczego?
Jak zhakować serwery, jeśli zaatakowałeś hosta bastionu?
Śledź cel
W katalogu / tmp możesz zobaczyć coś takiego:
Otwórzmy plik tymczasowy
Zobaczmy połączenia z tym identyfikatorem procesu.
wynik:
i kto jest połączony?
wynik:
Możemy również zobaczyć pliki gniazd:
wynik:
A co się stanie, gdy klient zostanie podłączony do zdalnego serwera? Zobaczmy:
Możemy nawet sprawdzić, czy plik gniazda jest używany przy użyciu netstat:
Kradzież informacji o gnieździe i adres IP
Teraz musimy ukraść informacje o gnieździe, gdy sesja hosta bastionu jest otwarta . Och, potrzebujemy również adresu IP serwera docelowego , więc po prostu użyj netstat:
Końcowy etap użyć przekierowanego pliku gniazda
Sprawdź, czy klucz jest załadowany .
wynikiem powinno być coś takiego :
Serwer został zhakowany, jak rozwiązać problem bezpieczeństwa?
Polecenie proxy
Podstawowe operacje: jak przesyłać pliki przez serwery (z klienta na serwer, z serwera na klienta), możesz przeczytać w moim poście tutaj
Wniosek
Więcej informacji znajdziesz na moim blogu . Dodatkowo mam kilka zrzutów ekranu, więc może ci się przydać.
źródło
channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed.
. Masz pojęcie dlaczego? W bezpiecznym dzienniku widzę:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
Wystarczy użyć przekazywania agenta SSH, jak większość innych.
Zaleta: w bastionie nie ma kluczy, których można by użyć w niewłaściwy sposób.
Mam nadzieję, że to pomoże :)
źródło