Dlaczego sudo jest wymagane do uruchomienia serwera WWW na danym porcie ip:?


9

Konfiguruję serwer WWW oparty na Pythonie na moim pudełku Debiana.

Ustawiać:

  • Debian OS jest oparty na VM, ale zmieniłem VirtualBox z NAT na Bridged.
  • Adres IP konfiguracji maszyny wirtualnej = 192.168.1.7(na ekranie administratora mojego routera lub ifconfig).
  • Udało mi się skonfigurować przekierowanie portów routera zarówno dla ssh, jak i HTTP.
  • Pomyślnie skonfigurowałem dynamiczne dny routera za pomocą dyndns.com.

Niezależnie od konkretnego serwera Python, którego używam (Django, CherryPy, biblioteka standardowa), muszę uruchomić serwer przy użyciu 192.168.1.7:80 sudo. W przeciwnym razie pojawia się błąd dotyczący braku uprawnień dostępu do portu. Żaden z samouczków serwera WWW nie wspomina o konieczności użycia sudopodczas określania portu ip:.

Pytanie: dlaczego muszę używać sudodo uruchamiania tych serwerów? Czy to wskazówka, że ​​nie powinienem używać 192.168.1.7? A może gdzieś nie ustawiam poprawnie pliku konfiguracyjnego?

Odpowiedzi:


11

Tylko procesy z uprawnieniami administratora mogą nasłuchiwać na uprzywilejowanych portach. Jest to standardowa konwencja bezpieczeństwa Uniksa.


Czy często uruchamianie serwerów WWW przy użyciu sudo na 80? A może jest jakaś inna strategia korzystania z portu> 1024 (np. 8000, 8080)?
Begbie00

@ Begbie00 Tak. Często serwery WWW działają na wyższych portach. Ale jest używany głównie w przypadku serwerów internetowych, które nie są publicznie dostępne w Internecie lub działają na komputerach, na których użytkownicy nie mają uprawnień root. Serwery WWW używane do programowania i testowania działają prawie wyłącznie na nieuprzywilejowanych portach.
Šimon Tóth

2
Niestety to stwierdzenie nie jest w pełni prawdziwe w przypadku nowoczesnych systemów uniksowych. Zobacz moją odpowiedź, by poznać szczegóły, ale na przykład nowoczesny Linux pozwala na bardziej szczegółową kontrolę uprawnień przy użyciu MOŻLIWOŚCI. Solaris ma również drobiazgowy system bezpieczeństwa o nazwie RBAC. Te mechanizmy umożliwiają przypisywanie uprawnień, takich jak wiązanie uprzywilejowanych portów, określonym użytkownikom lub programom.
SkyBeam

14

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 iptablesreguł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 binaryto powiązanie z uprzywilejowanymi portami, nawet jeśli uruchomiono je jako użytkownik inny niż root. Zobacz man capabilitiespo więcej szczegółów.


Czy możliwości są częścią POSIX, czy tylko specyficzne dla Linuksa?
Šimon Tóth

@Let_Me_Be Jak rozumiem z en.wikipedia.org/wiki/Capability-based_security POSIX zdefiniował koncepcję opartą na możliwościach, ale różni się od tego, co zostało zaimplementowane w Linuksie. Myślę więc, że możliwości Linuksa, takie jak CAP_NET_BIND_SERVICE, dotyczą tylko Linuksa.
SkyBeam
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.