Um site que mantenho é composto de vários aplicativos locais, todos com proxy da mesma instância nginx . Cada aplicativo está sendo executado sob seu próprio usuário e expondo um soquete unix gravável pelo grupo de servidores da web www-data
.
Todos os usuários do aplicativo fazem parte do www-data
grupo, portanto podem chown seus soquetes. Como posso melhorar minha configuração, de modo que uma vulnerabilidade em um aplicativo não possa mais ser usada para tentar escalar privilégios por meio de conexões diretas com outros soquetes?
Minha solução anterior: crie um novo grupo para cada usuário e adicione o servidor da web a todos eles. Esta solução é menos preferível, pois complica a adição/remoção de aplicativos e requer uma reinicialização forçada do servidor da web para atualizar os grupos.
Semelhante a como os serviços podem herdar portas privilegiadas do systemd , eles podem receber acesso a soquetes locais que, de outra forma, não teriam permissão para abrir. O Systemd cria o soquete unix e passa apenas a descrição do arquivo para o serviço - dessa forma, o serviço não precisa de permissões de acesso no arquivo do soquete.
Configure o soquete usando
/etc/systemd/system/example.socket
assim: (lerman systemd.socket
)E use esse soquete
/etc/systemd/system/example.service
assim: (lerman systemd.unit
)Observe que muitos programas, incluindo uwsgi, entendem
LISTEN_FDS
em seu ambiente, portanto, codificar o descritor de arquivo 3 geralmente é desnecessário.Aplique e inicie a unidade usando:
Se uma conta de serviço tentar abrir o soquete de outro serviço, ele não terá sucesso - os soquetes pertencem e podem ser lidos exclusivamente por
www-data
(ou seja, apenas o servidor da Web executado sob esse usuário pode acessá-los).