Estou iniciando um servidor web como não root usando um arquivo de unidade systemd .
Estou ficando listen tcp :80: bind: permission denied
mesmo já tendo corrido
setcap cap_net_bind_service=+ep
no executável.
Em um arquivo de unidade de exemplo na internet eu encontrei
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
para ser usado no arquivo de unidade. Então eu tentei isso e, de repente, o aplicativo pode vincular a porta 80.
O que isso me diz? setcap
é antigo/obsoleto/ignorado? Apenas pelo systemd ou pelo Linux em geral?
É correto dizer que, em geral, o systemd não funcionará com recursos de arquivo gerenciados
setcap
e exigirá que você os configure como parte da unidade de serviço.Portanto, não é como
setcap
se estivesse completamente obsoleto... (Pode haver usos válidos para ele fora dos serviços lançados pelo systemd.) Mas realmente não funciona para os serviços do systemd, pelo menos.De fato, os recursos de arquivo (definidos por
setcap
) sempre foram duvidosos e questionáveis, desde o início... Eles exigem o uso de recursos "herdáveis", que foram um pouco mal concebidos e tinham muitas deficiências... O recurso do kernel do "ambiente" Os recursos foram introduzidos para resolver muitos desses problemas e é o que os sistemas mais recentes estão adotando (systemd incluído aqui, como você pode ver, você está configurandoAmbientCapabilities=
para que seu serviço consiga se conectar a portas baixas).O tópico dos recursos é bastante complexo... Para uma introdução talvez mais suave a esse problema, você pode verificar "Herdar recursos" no LWN. Para os detalhes completos (incluindo algumas notações algébricas sobre os conjuntos de recursos), consulte a página de manual dos recursos(7) .