Długo szukałem rozwiązania w Google, ale nie mogłem znaleźć odpowiedzi.
Jestem na Ubuntu Linux i chcę uruchomić serwer na porcie 80, ale z powodu mechanizmu bezpieczeństwa Ubuntu pojawia się następujący błąd:
java.net.BindException: Odmowa dostępu: 80
Myślę, że powinno być wystarczająco proste, aby albo wyłączyć ten mechanizm bezpieczeństwa, aby port 80 był dostępny dla wszystkich użytkowników, albo przypisać wymagane uprawnienia bieżącemu użytkownikowi, aby uzyskać dostęp do portu 80.
Odpowiedzi:
Krótka odpowiedź: nie możesz. Porty poniżej 1024 można otwierać tylko przez rootowanie. Zgodnie z komentarzem - cóż, możesz, używając CAP_NET_BIND_SERVICE , ale takie podejście zastosowane do bin Java spowoduje, że każdy program Java będzie działał z tym ustawieniem, co jest niepożądane, jeśli nie stanowi zagrożenia bezpieczeństwa.
Długa odpowiedź: możesz przekierowywać połączenia na porcie 80 na inny port, który możesz otworzyć jako zwykły użytkownik.
Uruchom jako root:
Ponieważ urządzenia sprzężenia zwrotnego (takie jak localhost) nie używają reguł przekierowania, jeśli musisz użyć localhost itp., Dodaj również tę regułę ( dzięki @Francesco ):
UWAGA: Powyższe rozwiązanie nie jest odpowiednie dla systemów z wieloma użytkownikami, ponieważ każdy użytkownik może otworzyć port 8080 (lub inny wysoki port, z którego zdecydujesz się skorzystać), w ten sposób przechwytując ruch. (Kuponów do CesarB ).
EDYCJA: jak na pytanie w komentarzu - aby usunąć powyższą zasadę:
Spowoduje to wyświetlenie czegoś takiego:
Reguła, którą jesteś zainteresowany, to nr. 2, aby go usunąć:
źródło
sudo iptables --list
. Wiem, czym jest iptables, ale nigdy tak naprawdę nie korzystałem z tego wcześniej.Użyj authbind .
Działa nawet z Javą, jeśli włączysz stos Java tylko IPv4. Używam:
źródło
AUTHBIND=yes
w / etc / default / tomcat6authbind
aby tak się stało. Ze strony podręcznika: „/ etc / authbind / byport / port jest testowany. Jeśli ten plik jest dostępny do wykonania dla wywołującego użytkownika, zgodnie z access (2), wówczas autoryzacja jest powiązana z portem”. Np na porcie 80sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80
. Początkowa instalacjaauthbind
zazwyczaj nie ma żadnych wstępnie skonfigurowanych autoryzacji.Jeśli twój system to obsługuje, możesz użyć funkcji. Zobacz możliwości człowieka, potrzebna będzie CAP_NET_BIND_SERVICE.
W nowszych systemach Debian / Ubuntu możesz uruchomić:
źródło
Innym rozwiązaniem jest skonfigurowanie aplikacji jako „setuid”, aby mogła się łączyć z portem 80. Jako root wykonaj następujące czynności
Pamiętaj, że jeśli to zrobisz, chyba że zrobisz to całkowicie poprawnie, narazisz Cię na potencjalne dziury w zabezpieczeniach, ponieważ Twoja aplikacja będzie rozmawiać z siecią i będzie działać z pełnymi uprawnieniami roota. Jeśli skorzystasz z tego rozwiązania, powinieneś spojrzeć na kod źródłowy Apache lub Lighttpd lub coś podobnego, gdzie używają uprawnień roota do otwarcia portu, ale natychmiast porzuć te uprawnienia i „zostań” uprzywilejowanym użytkownikiem, aby porywacz nie może przejąć całego komputera.
Aktualizacja: Jak widać w tym pytaniu , wydaje się, że jądra Linuksa od wersji 2.6.24 mają nową możliwość, która pozwala oznaczyć plik wykonywalny (ale oczywiście nie skrypt) jako posiadający funkcję „
CAP_NET_BIND_SERVICE
”. Jeśli zainstalujesz pakiet debian „libcap2-bin”, możesz to zrobić, wydając polecenieźródło
Po prostu używam Nginx z przodu. Może działać również na localhost.
apt-get install nginx
.. lub ..
pkg_add -r nginx
.. lub co kiedykolwiek pasuje do twojego systemu operacyjnego.
Wszystko, czego potrzebujesz w nginx.conf, jeśli działa na localhost, to:
źródło
Podejście zaproponowane przez Sunny i CesarB:
działa dobrze, ale ma niewielką wadę - nie uniemożliwia użytkownikowi bezpośredniego połączenia z portem 8080 zamiast 80.
Rozważ następujący scenariusz, gdy może to stanowić problem.
Załóżmy, że mamy serwer, który akceptuje połączenia HTTP na porcie 8080 i połączenia HTTPS na porcie 8181.
Używamy iptables do ustanowienia następujących przekierowań:
Załóżmy teraz, że nasz serwer zdecyduje o przekierowaniu użytkownika ze strony HTTP na stronę HTTPS. O ile nie zmienimy dokładnie odpowiedzi, przekieruje na nią
https://host:8181/
. W tym momencie jesteśmy przykręceni:https://host:8181/
adresu URL i musielibyśmy utrzymywać ten adres URL, aby uniknąć zerwania zakładek.Stosuję następujące podejście:
W połączeniu z domyślną regułą ODRZUCENIA w łańcuchu WEJŚCIA ta metoda uniemożliwia użytkownikom bezpośrednie połączenie z portami 8080, 8181
źródło
Tradycyjnie w Uniksie tylko root może się łączyć z niskimi portami (<1024).
Najprostszym sposobem obejścia tego problemu jest uruchomienie serwera na wysokim porcie (na przykład 8080) i użycie prostej reguły iptables do przekazywania połączeń z portu 80 na port 8080. Zauważ, że dzięki temu tracisz dodatkową ochronę przed niskie porty; każdy użytkownik na twoim komputerze może połączyć się z portem 8080.
źródło
Jeśli twój system to obsługuje, możesz użyć funkcji. Widzisz
man capabilities
, potrzebowałbyś tegoCAP_NET_BIND_SERVICE
. Nie, nigdy ich nie używałem i nie wiem, czy naprawdę działają :-)źródło
Użyj odwrotnego proxy (nginx, apache + mod_proxy) lub buforującego odwrotnego proxy (Squid, Varnish) przed serwerami aplikacji!
Dzięki zwrotnemu proxy możesz osiągnąć wiele interesujących rzeczy, takich jak:
źródło
Możesz użyć programu redir:
źródło
Użyj sudo.
Skonfiguruj sudo, aby zwykły użytkownik mógł uruchamiać odpowiednie polecenia:
Lub
Lub
Lub
(Lub cokolwiek innego polecenia / skryptu, którego używasz do uruchamiania / zatrzymywania określonego serwera / aplikacji)
źródło
odpowiedź słoneczna jest poprawna, ale możesz napotkać dodatkowe problemy, ponieważ interfejs pętli zwrotnej nie korzysta z tabeli PREROUTING,
więc reguły iptables do dodania są dwa:
źródło
W Linuksie masz dwie inne opcje:
Oba rozszerzenia jądra systemu Linux umożliwiają przyznanie praw dostępu na bardzo drobnym poziomie szczegółowości. Umożliwiłoby to przyznanie temu procesowi otwarcia portu 80, ale nie odziedziczyłby żadnych innych praw root.
Z tego, co słyszałem, grsecurity jest znacznie prostszy w użyciu, ale SELinux jest bezpieczniejszy.
źródło
Jednym z rozwiązań jest użycie iptables do wykonania PAT na pakietach dla portu 80. Możesz to wykorzystać do przekierowania pakietów na przykład do lokalnego portu 8080. Upewnij się i dostosuj wychodzące pakiety z powrotem do portu 80.
Z mojego doświadczenia wynika, że funkcje drobnoziarnistych uprawnień systemu Linux nie są kompilowane do standardowych jąder ze względu na problemy z bezpieczeństwem.
źródło
Jeśli próbujesz to zrobić, aby polecenie uruchomione przez użytkownika mogło korzystać z portu 80, wówczas jedynymi rozwiązaniami są sztuczki iptables lub ustawienie wykonywalnego setuid-root-root.
Sposób, w jaki robi to Apache (łączy się z portem 80, ale działa jako ktoś inny niż root), polega na uruchomieniu jako root, powiązaniu z portem, a następnie zmianie własności procesu na nieuprzywilejowanego użytkownika po porcie jest skonfigurowany. Jeśli pisana aplikacja może być uruchamiana przez użytkownika root, możesz ją zmienić na właściciela innego niż prywatny po skonfigurowaniu portów. Ale jeśli jest to tylko dla przeciętnego użytkownika do uruchomienia z wiersza poleceń, musisz użyć jednego z innych rozwiązań.
źródło
Kiedy mam różne aplikacje do obsługi stron internetowych (skrypty python, silniki tomcat, ...), których nie chcę uruchamiać jako root, zwykle konfiguruję przed nimi serwer WWW Apache. Apache nasłuchuje na porcie 80, a tomcat nasłuchuje na 8080.
W konfiguracji apache: s:
Aby uzyskać więcej informacji, zobacz dokumentację mod-proxy: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
źródło
Myślę, że najlepszym rozwiązaniem jest sgid twojej aplikacji i jak tylko zostanie ona powiązana z portem, powinna zrezygnować z uprawnień, przełączając się na innego użytkownika.
źródło
Niektóre systemy hostów nie pozwalają na korzystanie z modułu NAT, w tym przypadku „iptables” nie rozwiązuje problemu.
Co powiesz na Xinetd?
W moim przypadku (ubuntu 10.04)
Wklej konfigurację:
Następnie:
http://docs.codehaus.org/display/JETTY/port80 wyjaśnia lepiej.
źródło
Tak na marginesie, FreeBSD i Solaris (ktoś pamięta , że jeden?) Pozwalają zrobić to (wiążą się z niskimi portów) bez przekroczenia uprawnień (czyli przy użyciu programów, aby przejść do katalogu głównego). Ponieważ podałeś Linuksa, zamieszczam to jako powiadomienie dla innych osób, które mogą znaleźć to pytanie.
źródło
Nekromancja.
Prosty. Z normalnym lub starym jądrem nie.
Jak zauważyli inni, iptables może przekierować port.
Jak zauważyli także inni, CAP_NET_BIND_SERVICE może również wykonać zadanie.
Oczywiście CAP_NET_BIND_SERVICE nie powiedzie się, jeśli uruchomisz program ze skryptu, chyba że ustawisz ograniczenie interpretera powłoki, co jest bezcelowe, możesz równie dobrze uruchomić swoją usługę jak root ...
np. W przypadku Java, musisz ją zastosować do JVVA JVM
Oczywiście oznacza to, że każdy program Java może powiązać porty systemowe.
Dito dla mono / .NET.
Jestem też całkiem pewien, że xinetd nie jest najlepszym pomysłem.
Ale skoro obie metody to hacki, dlaczego nie po prostu podnieść limit przez zniesienie ograniczenia?
Nikt nie powiedział, że musisz uruchomić normalne jądro, więc możesz po prostu uruchomić własne.
Po prostu pobierasz źródło najnowszego jądra (lub tego samego, co aktualnie posiadasz). Następnie przejdziesz do:
Tam szukasz tej linii
i zmień na
jeśli nie chcesz mieć niepewnej sytuacji ssh, zmień to na: # zdefiniuj PROT_SOCK 24
Zasadniczo użyłbym najniższego potrzebnego ustawienia, np. 79 dla http lub 24, gdy używasz SMTP na porcie 25.
To już wszystko.
Skompiluj jądro i zainstaluj je.
Restart.
Zakończone - ten głupi limit Zniknął, i działa również w przypadku skryptów.
Oto jak skompilujesz jądro:
https://help.ubuntu.com/community/Kernel/Compile
W skrócie, użyj iptables, jeśli chcesz zachować bezpieczeństwo, skompiluj jądro, jeśli chcesz mieć pewność, że to ograniczenie nigdy więcej nie będzie Ci przeszkadzać.
źródło
sudo setcap cap_net_bind_service=+ep /path-to-java/java
), ale zawsze otrzymuję,java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
jeśli Java ma ustawione ograniczenia. zobacz także pierwszą część unix.stackexchange.com/a/16670/55508<javahome>/lib/amd64/jli/
dold.so.conf
i bieganiesudo ldconfig