Para maior clareza, o problema com o seu código é que os usuários sem privilégios só podem seteuid em um alguns casos com base em como o executável foi chamado. Então, precisamos de outra solução.
Este é um problema interessante. Existem diferentes maneiras de resolvê-lo. Não sei se existe uma solução de melhores práticas aceitas, mas aqui estão algumas opções.
-
Defina as permissões de grupo em
/var/cache/utility
.Essa abordagem permite que o seu utilitário seja executado sob as permissões dos iniciadores. Certifique-se de que o usuário esteja no grupo que possui
/var/cache/utility
e altere as permissões para que a atribuição de grupo seja fixa para todo o conteúdo. Você pode conseguir isso com o seguinte:mkdir /var/cache/utility chown -R :user /var/cache/utility chmod 2770 /var/cache/utility usermod -a -G users joe
Agora, como
joe
está nousers
, quando ele executa seu utilitário, tudo fica bem. A premissa de grupo de quaisquer arquivos modificados em/var/cache/utility
permaneceráusers
. O problema é que não há nenhum grupo ao qual todos os usuários pertençam automaticamente. Portanto, esse método não funcionará automaticamente para todos os usuários. Existe também o problema de segurança. Seu utilitário pode modificar arquivos em/var/cache/utility
de uma maneira bem comportada, mas esses métodos abrem as comportas para o oeste selvagem da terra do usuário. -
Divida seu utilitário em front-ends e back-ends.
Dividir o utilitário em front-ends e back-ends é inconveniente, mas o força a formalizar a interface operacional. A comunicação entre as partes pode ter duas formas comuns:
-
Comunicações de soquete, sejam soquetes unix ou soquetes TCP. Isso requer que seu back-end seja um serviço.
-
Ferramentas de linha de comando. Isso é consideravelmente mais simples do que usar soquetes, e seu back-end não é executado continuamente.
A idéia é uid-execute-sticky-bit em seu back-end, para que ele seja executado automaticamente sob a conta do proprietário, independentemente do usuário atualmente conectado. O front-end ainda será executado sob as credenciais do usuário.
Veja se você pode dividir seu utilitário para que toda a manipulação do cache seja executada pelo back-end, mas outras atividades são executadas no front-end. Você pode definir o uid do back-end da seguinte forma:
chmod u+s /usr/bin/utility-back-end
Existe uma visão geral razoavelmente boa desta técnica aqui . Ainda é um tanto inconveniente particionar o software dessa forma, mas é a melhor solução que conheço. O comando a seguir listará todos os utilitários em seu sistema que já usam este método:
find / -xdev \( -perm -4000 \) -type f -print0 | xargs -0 ls -l
-
Espero que ajude.