Mamy publiczny serwer, który akceptuje połączenia SSH od wielu klientów za firewallami.
Każdy z tych klientów tworzy tunel zwrotny SSH za pomocą ssh -R
polecenia z ich serwerów sieciowych na porcie 80 na naszym serwerze publicznym.
Port docelowy (po stronie klienta) tunelu Reverse SSH to 80, a port źródłowy (po stronie serwera publicznego) zależy od użytkownika. Planujemy utrzymywać mapę adresów portów dla każdego użytkownika.
Na przykład klient A tunelowałby swój serwer sieciowy na porcie 80 do naszego portu 8000; klient B od 80 do 8001; klient C od 80 do 8002.
Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver
Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver
Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver
Zasadniczo próbujemy powiązać każdego użytkownika z portem i nie pozwolić mu na tunelowanie do innych portów.
Gdybyśmy korzystali z funkcji tunelowania w przód SSH ssh -L
, moglibyśmy zezwolić na tunelowanie portu przy użyciu permitopen=host:port
konfiguracji. Jednak nie ma odpowiednika dla odwrotnego tunelu SSH.
Czy istnieje sposób ograniczenia portów tunelowania wstecznego na użytkownika?
źródło
Odpowiedzi:
Ponieważ nie zezwoliłeś pogrubioną czcionką, zakładam, że chcesz pewnego rodzaju odrzucenie w czasie wykonywania po stronie klienta SSH, które zapobiega wiązaniu portów. Mam dla ciebie kopię kodu źródłowego:
serverloop.c:
Niestety, jak widać, nie ma wielu warunków, które uniemożliwiają przekierowanie portów oprócz standardowych.
Już miałam zalecić tę samą sugestię do użycia
mod_owner
wiptables
środku, ale Jeff mnie do tego pobił.Najczystszym rozwiązaniem byłoby po prostu zmodyfikowanie tego pliku (na przykład możesz użyć,
pw->pw_uid
aby uzyskać identyfikator użytkownika łączącego się i zmapować go do właściwego portu) i ponownie skompilować serwer SSH, ale to zależy od tego, jak dobrze się z tym czujesz .źródło
Moja sugestia używa do tego SELinux. Musisz skonfigurować profile użytkowników, które pozwolą na otwarcie portów. Te
sshd
widelce procesowe i krople do przywilejów użytkownika przed otwarciem portu do przodu, więc cokolwiek stosowane do procesów użytkownika będą egzekwowane nasshd
. Pamiętaj, że musisz ograniczyć się do wszystkich procesów użytkownika, ponieważ kiedyś można było użyćnetcat
do przekierowania innego portu. Później postaram się znaleźć dla ciebie odpowiednią składnię (lub każdy inny użytkownik może ją dla mnie edytować).Możesz też spróbować użyć
iptables
.To jednak nie uniemożliwi im otwarcia portu i odmówienia innemu użytkownikowi.
źródło