Eu tenho um programa em C que precisa acessar um diretório protegido cheio de coisas. texto strong A idéia é que apenas o programa ou o administrador tenham acesso.
No passado, em plataformas Linux, usei os bits SETUID e SETGID do sistema de arquivos com bastante êxito. O programa é executado bem, seja qual for o UID e o GID que o sistema de arquivos diz ser o proprietário do executável, não importa quem o execute.
Em vez disso, costumava ser executado com sucesso.
Eu não sei exatamente quando essa mudança ocorreu porque eu só tento atualizar o sistema operacional quando há uma falha de hardware, então eu recebo as duas atualizações de uma só vez ... Então, dado muitas versões são ignoradas, eu, só que a partir de agora, o sistema de desenvolvimento que está no Fedora Core 17 não está mais honrando esses bits. Como o FC 19 é o lançamento atual, imagino que as coisas só são piores com o lançamento mais recente, não melhor.
Aqui está a saída 'ls -l':
-rwsrwsr-x 1 cu cu 26403 Aug 28 2012 comp
Ao investigar uma solução, encontrei a man page de chmod que diz isso:
Additional restrictions may cause the set-user-ID and set-group-ID
bits of MODE or RFILE to be ignored. This behavior depends on the
policy and functionality of the underlying chmod system call. When
in doubt, check the underlying system behavior.
OK, mas não tenho IDEA como verificar essa política e funcionalidade como sugerido! Eles não ofereceram nenhuma ajuda a não ser usar o comando info - mas não achei nada útil, apenas dados sobre o usuário padrão e a propriedade do grupo para a criação de novos arquivos.
O SELINUX está desativado.
Perguntas:
-
Qual é a maneira "correta" de fazer esse tipo de coisa no mundo moderno?
era?
-
Como faço para verificar as políticas e alterá-las?
Obrigado por qualquer entrada.
MAIS DADOS:
O programa C simplesmente tem essa linha que está ramificando para gerar um erro - um trecho:
line=malloc(large);
if (!line) printf("virtual memory exhausted\n");
if (line && FileExists(filename))
{
if (access(filename,R_OK)==0)
{
cfile=fopen(filename, "r");