Я создаю пакет, содержащий веб-службу, которая должна прослушивать порт 443. Сама служба написана на Go, поэтому я не могу использовать authbind для управления разрешениями порта. Вместо этого я решил использовать setcap:
me@buildbox $ setcap CAP_NET_BIND_SERVICE=+eip opt/myservice/myservice
me@buildbox $ getcap opt/myservice/myservice
opt/myservice/myservice = cap_net_bind_service+eip
Однако эта возможность не сохраняется, когда я устанавливаю пакет на свои серверы.
me@myserver $ apt-get install myservice
...
# installs normally
...
me@myserver $ getcap /opt/myservice/myservice
me@myserver $ # ^ No output == no capabilities
Я действительно не хочу, чтобы эта служба запускалась с правами root, но у меня возникают проблемы с решением, которое сохраняется при установке пакета. Могу ли я как-то установить возможности в пакете debian? Есть ли другой метод, который позволяет достичь желаемого конечного результата (служба может подключаться к порту 443, но не запускается как root).
Пользователь Zoredache ответил на это в комментариях. Я отправляю этот ответ, чтобы убедиться, что люди, которые задают этот вопрос, знают, что проблема решена.
В пакете debian я добавил postinst
файл в DEBIAN/
, который dpkg выполняет после копирования файлов в файловую систему. В postinst
содержит следующее:
#!/bin/sh
set -e
setcap CAP_NET_BIND_SERVICE=+eip /opt/myservice/myservice
Это сработало для меня. Сейчас я не помню, но я считаю, что пакет действительно должен был быть установлен пользователем с доступом sudo на целевой машине.