A solução é executar o programa em si como root, com permissão para arquivos em / etc.
Estou escrevendo um programa em python que precisa editar alguns arquivos em / etc. Algum sistema algum próprio. Como obtenho essas permissões de dentro do próprio programa sem executar o sudo, pois o programa não será interativo?
Ainda não sei onde vou iniciar meu programa automaticamente, mas provavelmente usarei monit ou similar para esse propósito.
A solução é executar o programa em si como root, com permissão para arquivos em / etc.
Existem duas possibilidades:
em relação a 1) Você pode tentar adicionar direitos adicionais através de ACLs (eu iria desencorajar strongmente a alteração das permissões do UNIX, muitos programas têm expectativas e eles serão alterados com a próxima atualização, etc.).
setfacl -m "u:auto_user:rw" /etc/passwd
(Você precisa ter ACLs estendidas ativadas neste sistema de arquivos)
Com este método você corre o risco de que esses direitos de acesso estejam sendo usados por outro programa. Por exemplo: se você adicionar o usuário do apache para permitir a modificação de / etc / passwd, qualquer um que adquira o controle do usuário do apache pode agora adulterar este arquivo. As contas de usuários geralmente são menos intensamente protegidas do que o acesso no nível da raiz.
em relação a 2) Você eleva os direitos para acessar esse arquivo. Você pode fazer isso com o sudo e a variável NOPASSWD, mas é necessário ter cuidado para definir os direitos de acesso corretos. Algo como
auto_user = NOPASSWD: /bin/sed ... /etc/passwd
não é seguro (sed pode gerar cascas)! A melhor solução seria escrever um programa especializado, que a) filtre entrada e b) faça exatamente o que você quer fazer.
Qualquer programa (seja interativo, como vi
ou não interativo, como sed
) tem um ID de usuário efetivo (EUID) que o sistema usa para decidir quais arquivos ele pode acessar e quais operações ele pode executar (ler, escrever e / ou executar). (Há também um conjunto de IDs de grupo que são usados para os mesmos propósitos se o EUID for diferente do proprietário do arquivo. E se nem EUID nem qualquer GID corresponderem, o acesso será controlado pelos bits de permissão "Outros".)
Se o seu programa for executado como root
(EUID 0), ele poderá acessar qualquer coisa que possa ser acessada, embora as coisas ainda possam ser feitas somente para leitura. (É claro que root
pode alterar a permissão de tais coisas, portanto somente leitura é apenas um aviso para root
.)
Uma maneira comum de permitir o acesso a alguns usuários ou programas, sem permitir acesso a todos, é alterar o proprietário do arquivo para um usuário especial criado para essa finalidade. Por exemplo, as pessoas geralmente fazem um administrador da Web ou um usuário administrador do banco de dados que pode editar os arquivos de configuração apropriados.
No seu caso, você pode criar um usuário especial, alterar o proprietário dos arquivos em /etc
que deve ser acessível e, em seguida, executar seu programa como esse usuário usando su
.
Outra abordagem é mover os arquivos editáveis para outro lugar e colocar links simbólicos para esse local em /etc
.
No entanto, você deve ter certeza de que os usuários / UIDs / GIDs que podem acessar os arquivos são confiáveis com qualquer que seja a funcionalidade. Por exemplo, você não desejaria que os usuários não-raiz pudessem editar o arquivo de senha, porque eles poderiam facilmente obter privilégios de root.