Я уже давно гуглил о решении, но не смог найти ответ.
Я использую Ubuntu Linux и хочу запустить сервер на порту 80, но из-за механизма безопасности Ubuntu я получаю следующую ошибку:
java.net.BindException: в доступе отказано: 80
Я думаю, должно быть достаточно просто отключить этот механизм безопасности, чтобы порт 80 был доступен для всех пользователей, или назначить текущему пользователю необходимые привилегии для доступа к порту 80.
Ответы:
Краткий ответ: вы не можете. Порты ниже 1024 могут быть открыты только root. Что касается комментария - ну, вы можете, используя CAP_NET_BIND_SERVICE , но этот подход, примененный к java bin, приведет к запуску любой java-программы с этим параметром, что нежелательно, если не представляет угрозу безопасности.
Длинный ответ: вы можете перенаправить соединения через порт 80 на другой порт, который вы можете открыть как обычный пользователь.
Запустите с правами root:
Поскольку петлевые устройства (например, localhost) не используют правила предварительной маршрутизации, если вам нужно использовать localhost и т. Д., Добавьте также и это правило ( спасибо @Francesco ):
ПРИМЕЧАНИЕ. Приведенное выше решение не очень подходит для многопользовательских систем, поскольку любой пользователь может открыть порт 8080 (или любой другой порт высокого разрешения, который вы решите использовать), таким образом перехватывая трафик. (Кредиты для CesarB ).
РЕДАКТИРОВАТЬ: в соответствии с вопросом комментария - чтобы удалить вышеуказанное правило:
Это выведет что-то вроде:
Правило, которое вас интересует, это nr. 2, чтобы удалить его:
источник
sudo iptables --list
. Я знаю, что iptables и делает, но я никогда не использовал его до этого.Используйте authbind .
Он даже работает с Java, если вы включите стек Java только для IPv4. Я использую:
источник
AUTHBIND=yes
в / etc / default / tomcat6authbind
чтобы фактически позволить этому произойти. Со страницы man: «/ etc / authbind / byport / port проверяется. Если этот файл доступен для выполнения вызывающему пользователю, согласно access (2), то привязка к порту разрешена». Например, для порта 80sudo touch /etc/authbind/byport/80 ; sudo chmod 777 /etc/authbind/byport/80
. Первоначальная установкаauthbind
обычно не имеет предварительно настроенных авторизаций.Если ваша система поддерживает это, вы можете использовать возможности. Посмотрите возможности человека, вам нужен CAP_NET_BIND_SERVICE.
В более новой версии Debian / Ubuntu вы можете запустить:
источник
Другое решение - настроить приложение так, чтобы оно могло связываться с портом 80. От имени пользователя root выполните следующие действия.
Имейте в виду, что если вы сделаете это, если это не сделано абсолютно правильно, вы столкнетесь с потенциальными пробелами в безопасности, потому что ваше приложение будет общаться с сетью и будет работать с полными привилегиями суперпользователя. Если вы воспользуетесь этим решением, вам следует взглянуть на исходный код Apache или Lighttpd или чего-то подобного, где они используют привилегии root для открытия порта, но затем сразу же откажутся от этих привилегий и «станут» пользователями с более низкими привилегиями, чтобы угонщик не может захватить весь ваш компьютер.
Обновление: Как видно из этого вопроса , похоже, что ядра Linux начиная с 2.6.24 имеют новую возможность, позволяющую пометить исполняемый файл (но, конечно, не скрипт) как обладающий
CAP_NET_BIND_SERVICE
способностью « ». Если вы устанавливаете пакет debian "libcap2-bin", вы можете сделать это, выполнив командуисточник
Я просто использую Nginx впереди. Он также может работать на локальном хосте.
apt-get install nginx
.. или же ..
pkg_add -r nginx
.. или то, что когда-либо подходит вашей ОС.
Все, что вам нужно в nginx.conf, если вы работаете на localhost, это:
источник
Подход, предложенный Sunny и CesarB:
работает нормально, но имеет небольшой недостаток - он не мешает пользователю подключаться напрямую к порту 8080 вместо 80.
Рассмотрим следующий сценарий, когда это может быть проблемой.
Допустим, у нас есть сервер, который принимает HTTP-соединения через порт 8080 и HTTPS-соединения через порт 8181.
Мы используем iptables для установки следующих перенаправлений:
Теперь предположим, что наш сервер решает перенаправить пользователя со страницы HTTP на страницу HTTPS. Если мы тщательно не перепишем ответ, он будет перенаправлен на
https://host:8181/
. На данный момент мы облажались:https://host:8181/
URL в закладки, и нам нужно будет поддерживать этот URL, чтобы не сломать их закладки.Я использую следующий подход:
В сочетании с правилом REJECT по умолчанию в цепочке INPUT этот подход не позволяет пользователям напрямую подключаться к портам 8080, 8181.
источник
Традиционно в Unix только root может связываться с низкими портами (<1024).
Самый простой способ обойти это - запустить сервер на высоком порту (например, 8080) и использовать простое правило iptables для переадресации соединений с порта 80 на порт 8080. Обратите внимание, что при этом вы теряете дополнительную защиту от низкие порты; любой пользователь на вашей машине может подключиться к порту 8080.
источник
Если ваша система поддерживает это, вы можете использовать возможности. Видишь
man capabilities
, тот, который тебе нуженCAP_NET_BIND_SERVICE
. Нет, я никогда не использовал их сам и не знаю, действительно ли они работают :-)источник
Используйте обратный прокси (nginx, apache + mod_proxy) или кеширующий обратный прокси (Squid, Varnish) перед своими серверами приложений!
С обратным прокси-сервером вы можете получить много интересных вещей, таких как:
источник
Вы можете использовать программу redir:
источник
Используйте sudo.
Настройте sudo, чтобы обычный пользователь мог запускать соответствующие команды:
Или же
Или же
Или же
(Или любую другую команду / скрипт, который вы используете для запуска / остановки вашего конкретного веб-сервера / приложения)
источник
Солнечный ответ правильный, но вы можете столкнуться с дополнительными проблемами, так как интерфейс обратной связи не использует таблицу PREROUTING,
поэтому правила iptables, которые нужно добавить, два:
источник
В Linux у вас есть два других варианта:
Оба расширения ядра Linux позволяют предоставлять права доступа на очень мелком уровне. Это позволило бы вам разрешить этому процессу открыть порт 80, но он не наследовал бы ни одно из других корневых прав.
Из того, что я слышал, grsecurity намного проще в использовании, но SELinux более безопасен.
источник
Одним из решений является использование iptables для выполнения PAT на пакетах для порта 80. Это можно использовать, например, для маршрутизации пакетов на локальный порт 8080. Обязательно и настройте исходящие пакеты обратно на порт 80.
По моему опыту, детализированные функции разрешений Linux не скомпилированы в стандартные ядра из-за проблем безопасности.
источник
Если вы пытаетесь сделать это так, чтобы пользовательская команда могла использовать порт 80, то ваши единственные решения - это хитрости iptables или установка исполняемого файла setuid-to-root.
Способ, подобный Apache, делает это (он связывается с портом 80, но работает от имени другого пользователя, а не от root) - запускать от имени пользователя root, связываться с портом, а затем после владения портом менять владельца процесса на непривилегированного пользователя. настроен. Если приложение, которое вы пишете, может быть запущено пользователем root, вы можете изменить его владельца на непривилегированного пользователя после настройки портов. Но если это только для обычного пользователя, запускаемого из командной строки, то вам придется использовать одно из других решений.
источник
Когда у меня есть различные приложения для веб-обслуживания (скрипты Python, механизмы tomcat и т. Д.), Которые я не хочу запускать от имени пользователя root, я обычно настраиваю перед ними веб-сервер apache. Apache слушает порт 80, а tomcat слушает 8080.
В конфиге apache: s:
Для получения дополнительной информации см. Документацию мод-прокси: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html.
источник
Я думаю, что лучшим решением является sgid вашего приложения, и как только оно привязано к порту, оно должно отбросить привилегии, переключившись на другого пользователя.
источник
Некоторые хост-системы не позволяют использовать модуль NAT, «iptables» не решает проблему в этом случае.
Как насчет xinetd?
В моем случае (Ubuntu 10.04)
Вставьте конфигурацию:
Затем:
http://docs.codehaus.org/display/JETTY/port80 объясняет лучше.
источник
Кроме того, FreeBSD и Solaris (кто-нибудь помнит этот ?) Позволяют вам делать это (привязывать к низким портам) без повышения привилегий (то есть, используя программы для переключения в root). Поскольку вы указали Linux, я просто публикую это как уведомление для других, которые могут найти этот вопрос.
источник
Necromancing.
Просто. С нормальным или старым ядром у вас нет.
Как отмечают другие, iptables может переадресовывать порт.
Как также отметили другие, CAP_NET_BIND_SERVICE также может выполнять эту работу.
Конечно, CAP_NET_BIND_SERVICE потерпит неудачу, если вы запустите свою программу из скрипта, если вы не установите ограничение на интерпретатор оболочки, что бессмысленно, вы можете просто запустить свой сервис как root ...
например, для Java вы должны применить его в JAVA JVM
Очевидно, это означает, что любая Java-программа может связывать системные порты.
Дито для моно / .NET.
Я также уверен, что xinetd не лучшая идея.
Но поскольку оба метода являются хакерами, почему бы просто не снять ограничение, сняв ограничение?
Никто не говорил, что вам нужно запустить нормальное ядро, поэтому вы можете просто запустить свое собственное.
Вы просто скачиваете исходный код для самого последнего ядра (или того же, что у вас есть в настоящее время). После этого вы идете к:
Там вы ищете эту строку
и изменить его на
если вы не хотите иметь небезопасную ситуацию с ssh, измените ее следующим образом: #define PROT_SOCK 24
Как правило, я бы использовал самый низкий параметр, который вам нужен, например, 79 для http или 24 при использовании SMTP на порту 25.
Это уже все.
Скомпилируйте ядро и установите его.
Перезагрузка.
Закончено - этот глупый предел ушел, и это также работает для сценариев.
Вот как вы собираете ядро:
https://help.ubuntu.com/community/Kernel/Compile
Короче говоря, используйте iptables, если вы хотите оставаться в безопасности, скомпилируйте ядро, если вы хотите быть уверенным, что это ограничение вас больше не беспокоит.
источник
sudo setcap cap_net_bind_service=+ep /path-to-java/java
), но всегда получаю,java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
если в java установлены заглавные буквы. см. также первую часть unix.stackexchange.com/a/16670/55508<javahome>/lib/amd64/jli/
кld.so.conf
и работаетsudo ldconfig