Разрешение пользователю позволить слушает порт ниже 1024

Я использую Vim/gVim.

Я раньше использовал Emacs, но я нашел, что gVim для общей работы быстрее над более медленными машинами, плюс, из-за его требования POSIX, vi доступен почти везде.

При использовании Vim или gVim, я использую мышь много, поддержка его является большой, я думаю.

Я начал использовать Emacs, потому что было легче использовать для неопытного пользователя. Я нашел, что использование нано было довольно подвержено ошибкам по некоторым причинам, и в какой-то момент я понял, что я намного более доволен использованием vi.

Прямо сейчас это - смесь. Я использую Eclipse и gedit довольно часто, также. Vim, однако, является все еще моим фаворитом и наиболее используемым редактором.

64
17.06.2018, 08:38
6 ответов

setcap 'cap_net_bind_service=+ep' /path/to/program

это будет работать на определенные процессы. Но позволить конкретному пользователю связывать с портами ниже 1024 необходимо будет добавить его к sudoers.

Взгляните на это обсуждение для больше.

52
27.01.2020, 19:32

(Некоторые из этих методов были упомянуты в других ответах; я даю несколько возможных вариантов в грубом порядке предпочтения.)

Можно перенаправить низкий порт к высокому порту и послушать на высоком порте.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080

Можно запустить сервер как корень и отбросить полномочия после того, как он начал слушать на привилегированном порте. Предпочтительно, вместо того, чтобы кодировать это самостоятельно, запустите свой сервер с обертки, которая делает задание для Вас. Если Ваш сервер запускает один экземпляр для каждого подключения, запустите его с inetd (или подобная программа такой как xinetd). Для inetd, используйте строку как это в /etc/inetd.conf:

http  stream  tcp  nowait  username:groupname  /path/to/server/executable  argv[0] argv[1]…

Если Ваш сервер слушает в единственном экземпляре, запустите его с программы такой как authbind. Любой создает пустой файл /etc/authbind/byport/80 и сделайте это исполняемым файлом пользователю, выполняющему сервер; или создайте /etc/authbind/byuid/1234, где 1234 является UID, выполняющий сервер, содержа строку 0.0.0.0/0:80,80.

Если Ваш исполняемый файл сервера хранится в файловой системе, которая поддерживает возможности, можно дать ему cap_net_bind_service возможность. Остерегайтесь этого, возможности являются все еще относительно новыми и все еще имеют несколько петель.

setcap cap_net_bind_service=ep /path/to/server/executable
31
27.01.2020, 19:32
  • 1
    В каждом случае я должен был иметь дело с, исполняемый файл был сценарием, который запустил Java или Python. Как парень без 10 часов для расходов на тонкости iptables решение покрывает его безболезненно. –  srking 22.03.2012, 21:35
  • 2
    Для iptables решения я должен был также добавить правило фильтра как -A INPUT -p tcp --dport 1080 -j ACCEPT иначе это не работало бы (у меня также есть a -j DROP вместилище.), Таким образом, меня оставляют с двумя сокетами слушания. –  thom_nic 10.01.2018, 05:18

Короткий ответ - то, что это не возможно дизайном.

Длинный ответ - то, что в мирах с открытым исходным кодом существует много людей, играющих с дизайном и придумывающих альтернативные методы. В целом это - широко принятая практика, что это не должно быть возможно. То, что Вы пробуете, вероятно, средства, Вы имеете другой отказ дизайна в своей системе и должны пересмотреть Вашу целую архитектуру системы в свете *, отклоняет последствия безопасности и лучшие практики.

Тем не менее одна программа для авторизации некорневого доступа к низким портам является authbind. И selinux и grsecurity также служат основами для такой точно настроенной аутентификации.

Наконец, если Вы хотите, чтобы определенные пользователи запустили определенные программы как корень и в чем Вы действительно нуждаетесь, должен только позволить пользователю перезапускать апача или что-то как этот, sudo Ваш друг!

4
27.01.2020, 19:32
  • 1
    действительно не дает Вам очень в современном мире. –  pjc50 06.04.2011, 19:47
  • 2
    @pjc50: Да это делает. Это о подразумеваемом доверии. Низкие номера портов подразумевают высокое доверие. SSH, POP, FTP и другие демоны, как ожидают, попросят системные пароли уровня и другие учетные данные, когда их порты будут открыты. Если бы пользователям разрешили послушать на низких портах на поле, то они могли бы запустить фальшивых демонов на неиспользованном (или разрушенный) порты и получить пароли от не подозревающих пользователей. Те пароли могли затем использоваться на том поле для взлома других учетных записей, включая корень. –  Caleb 07.04.2011, 15:40
  • 3
    Это - довольно слабая форма безопасности. Если Вы соединились с чем-то и не сделали транзакцию сертификата затем, Вы понятия не имеете о том, с кем Вы говорите - т.е. нападения на MITM. –  pjc50 13.06.2011, 15:57
  • 4
    я предполагаю то, что необходимо, показывают для портов: затем Вы могли "показанный почту port25" затем (a) Ваш почтовый демон не должен быть запущен с корня privs и (b) никто больше не может угнать его. –  pjc50 13.06.2011, 16:07
  • 5
    В то время как это, возможно, было верно "дизайном", когда Linux был в своем младенчестве, он имеет очень мало смысла затем и теперь. Безопасность - все о том, что пользователь может и не может сделать. Разрешение только пользователю root для использования порта 80, например, является огромной угрозой безопасности, потому что это означает, что необходимо предоставить корневой доступ к людям, которые должны использовать порт 80, но не должны иметь корневого доступа. При доверии некорневому пользователю X для использования порта 80, необходимо смочь закодировать то доверие ОС. К счастью, как Вы упомянутый, существуют дрянные обходные решения, которые позволяют это, как authbind. –  B T 30.05.2015, 10:36

Вы могли использовать netcat или xinetd или iptables перенаправление портов, или использовать апача в качестве прокси фронтэнда и выполнить процесс на непривилегированном порте.

3
27.01.2020, 19:32

Authbind, @Gilles уже упомянул это, но я хотел бы подробно остановиться на нем немного.

Это имеет удобное управление доступом (детали в странице справочника): можно отфильтровать доступ портом, интерфейсным адресом, uid, диапазонами адреса или порта и комбинации их.

Это имеет очень полезный параметр --depth:

- уровни глубины

Причины authbind для влияния на программы, которые являются уровнями глубоко в графике вызова. Значение по умолчанию равняется 1.

"Уровни глубоко" означают, когда сценарий (или программа), запускает другой скрипт, это убывает уровень. Таким образом, если Вы имеете --depth 5 это означает на уровнях 1 (или это 0?) до 5 у Вас есть разрешение связать, тогда как на уровне 6 и на, Вы не делаете. Полезный, когда Вы хотите, чтобы сценарий имел доступ, но не программы, которые он запускает с или без Вашего ведома.


Для иллюстрирования у Вас могло быть что-то вроде этого: ради безопасности у Вас есть пользователь java это предназначено, чтобы только выполнить Java, и Вы хотите предоставить ему доступ к порту 80:

echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80

Я создал ../byport/80 file, учитывая его к java группа пользователей (у каждого пользователя есть своя собственная группа), и сделала ее исполняемым файлом группой, что означает, что это - исполняемый файл java пользователь. Если Вы предоставляете доступ портом, файл должен быть исполняемым файлом пользователем, который должен иметь доступ, таким образом, мы сделали это.

Это могло бы быть достаточно для среднестатистического американца, но потому что Вы знаете, как использовать --depth параметр, Вы работаете (как java пользователь) authbind --depth [depth] my_web_app's_start_script запуск в --depth 1 и прокладывание себе путь вплоть до Вас находит наименьшую глубину, которая работает, и используйте это.

Прочитайте страницу справочника для деталей.

4
27.01.2020, 19:32

Я попробовал метод iptables PREROUTING REDIRECT, но обнаружил, что он также влияет на пересылаемые пакеты. То есть, если машина также пересылает пакеты между интерфейсами (например, если она действует как точка доступа Wi-Fi, подключенная к сети Ethernet), то правило iptables также будет улавливать подключения подключенных клиентов к Интернет-адресатам и перенаправлять их на машина. Это не то, что я хотел - я хотел только перенаправить соединения, которые были направлены на саму машину.

Одна из возможностей - использовать переадресацию порта TCP. Например. using socat :

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

Однако одним из недостатков этого метода является то, что приложение, которое прослушивает порт 8080, затем не знает адрес источника входящих соединений (например, для ведения журнала или других целей идентификации).

1
27.01.2020, 19:32

Теги

Похожие вопросы