Standardowe zachowanie polega na tym, że użytkownicy nieuprzywilejowani nie mogą łączyć się z portami uprzywilejowanymi (numery portów poniżej 1024). Dlatego aplikacja, która chciałaby powiązać na przykład z portem 80, będzie musiała uruchomić się uprzywilejowanym (zwykle oznacza to uruchomienie jako root), aby połączyć się z tym portem.
Powszechnym podejściem jest uruchamianie małego procesu „nasłuchiwania” z uprzywilejowanym użytkownikiem, który akceptuje połączenie, a następnie uruchamia nieuprzywilejowany proces do obsługi żądania. Usunięcie uprawnień do przetwarzania żądań odbywa się ze względów bezpieczeństwa. Jeśli ktoś jest w stanie wykorzystać proces, który obsługuje żądanie, zwykle pozwala intruzowi na wykonywanie poleceń przy użyciu tych samych uprawnień, co proces przetwarzania. Dlatego źle byłoby obsłużyć całe żądanie za pomocą uprzywilejowanego procesu.
Jednak w wielu aplikacjach często jest obecnie uruchamiany jako użytkownik inny niż root; ale takie procesy oczywiście nie mogą łączyć się z uprzywilejowanymi portami niż w standardowej konfiguracji. Tak więc serwery takie jak Tomcat lub JBoss łączyły się z portami wysokoportowymi, takimi jak 8080, więc nie potrzebują uprzywilejowanego odbiornika.
Oczywiście, jeśli udostępnisz taki proces w Internecie, prawdopodobnie zapewnisz dostęp do portu 80, ponieważ każda przeglądarka najpierw spróbuje połączyć się z portem 80, gdy używany jest protokół HTTP. W celu obejścia tego problemu często stosuje się zaporę ogniową lub translator portów między aplikacją a publicznym Internetem. Więc żądania trafiają do zapory żądającej portu 80, ale zapora przekazuje żądanie do jakiegoś wewnętrznego hosta na porcie 8080. W ten sposób prawdziwy serwer WWW może działać na wysokich portach, będąc publicznie dostępnym na porcie 80.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
Czasami to przekierowanie odbywa się po prostu przy użyciu iptables
reguły NAT:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Pozwala to na uruchomienie nieuprzywilejowanej aplikacji nasłuchującej na porcie 8080, podczas gdy wszystkie przychodzące żądania dla portu 80 są po prostu przekierowywane na port 8080.
Jednak przy użyciu nowoczesnych jąder Linuksa istnieje jeszcze jedna możliwość: Użyj możliwości.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
Umożliwiłoby binary
to powiązanie z uprzywilejowanymi portami, nawet jeśli uruchomiono je jako użytkownik inny niż root. Zobacz man capabilities
po więcej szczegółów.