Я хотел бы запускать приложения, над которыми я работаю, которые привязываются к номерам портов меньше 1000, не требуя корневого доступа.
Я использую Linux Mint и имею root-доступ для его настройки. В идеале я хотел бы иметь возможность делать это через SSH.
Также рад услышать, если это невозможно или я не должен этого делать, если это так.
РЕДАКТИРОВАТЬ: В основном я счастлив использовать более высокие номера портов для разработки, но Flash ожидает политику сокетов на порту 843. В настоящее время мне нужно запустить приложение как root, и поэтому я не могу запустить его из моего Makefile, который является PITA .
Конечно, это возможно. Вам нужно только предоставить двоичный CAP_NET_BIND_SERVICE.
sudo setcap cap_net_bind_service=ep some-binary
В Linux возможности root разбиты на набор возможностей. CAP_NET_BIND_SERVICE - это возможность привязки к портам <= 1024.
Вероятно, даже можно использовать AppArmor, SELinux или другой модуль безопасности Linux (LSM), чтобы предоставить программе доступ для привязки именно этого одного порта, но я думаю, что это будет пустой тратой времени. Безопасность на самом деле не зависит от номеров портов, как это было в далеком прошлом.
Вот сценарий для OSX для перенаправления портов 80 и 443 на непривилегированные порты:
echo "
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -
Другой способ заставить ваш демон отвечать на запросы с меньшего номера порта - использовать iptables или аналогичный для перенаправления порта с меньшим номером на порт с более высоким номером, который слушает ваш демон:
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
Замените 80 на порт, который нужно открыть, а 8080 на порт прослушивателя вашего приложения.
Я думаю, что есть способ сделать это, но я не уверен на 100%, что это сработает.
это привязка порта, для которого требуется root, а не приложение, использующее его, поэтому приведенный ниже метод может работать, но вам в первую очередь нужен доступ sudo.
Сначала вы запускаете свой процесс как пользователь root, используя sudo myApp
После привязки порта вы можете переключить владельца процесса на непривилегированного пользователя.
Я смутно помню библиотеку под названием «authbind», которая делает то, что вам нужно, обертывая системный вызов bind () (через библиотеку LD_PRELOAD) и, если запрашивается привилегированный порт, порождает корневую программу setuid, которая получает копию дескриптор файла, затем проверяет, действительно ли приложению разрешено связываться с портом, выполняет bind () и завершает работу.
Не уверен в статусе проекта, но метод должен быть довольно простым для (повторного) внедрения, если потребуется.