Como permitir que o usuário A apague o arquivo de B em nome de B?

3

A e B são usuários não-root em um mesmo grupo. Suponha que haverá alguns arquivos de lixo B gerados dentro de um diretório (também gerado e pertencente a B) após uma regressão executada por B, mas eu preciso de A para fazer o trabalho de limpeza no caso de a regressão de B ser terminada e não poder fazer a limpeza corretamente.

Eu sei que a maneira mais fácil é deixar B definir umask 0002 antes da regressão, mas infelizmente, de alguma forma, a ferramenta de regressão irá sobrescrever essa configuração e gerar arquivos de lixo graváveis apenas por B.

Então eu tento usar o recurso suid para fazer o truque.

o diretório de demonstração é como abaixo

/proj/ttt> ll
total 0
-rw-r--r-- 1 B users  0 Mar 16 00:50 garbage.file

Eu tento criar um script (limpeza) de propriedade de B para limpar arquivos de lixo.

#!/bin/bash
# cleanup
echo EUID=$EUID UID=$UID
rm -f garbage.file

então adiciono suid a este script com "chmod ug + s cleanup". Os diretórios se tornam

/proj/ttt> ll
total 0
-rwsr-sr-x 1 B users 57 Mar 16 00:50 cleanup
-rw-r--r-- 1 B users  0 Mar 16 00:50 garbage.file

Eu também adiciono o bit "s" para os diretórios pais

drwsr-sr-x 2 B users 4096 Mar 16 00:57 ttt

Mas quando executo este script como A, parece que o 's' não funciona e A não pode excluir o arquivo de lixo.

/proj/ttt> ./cleanup   # executed by A
EUID=25264 UID=25264   # user B's uid is 25220, user A's uid is 25264
rm: cannot remove 'garbage.file': Permission denied

Eu não sei o que há de errado com a minha tentativa, ou se essa abordagem é viável no final?

Ou há alguma outra maneira melhor de fazer o trabalho?

    
por Alex C 16.03.2017 / 09:45

1 resposta

2

A maneira padrão de fazer isso é criar um novo grupo, fazer os membros A e B desse grupo e certificar-se de que todos os arquivos (ou pelo menos os diretórios, se quiserem excluir) em questão pertençam a esse grupo. e ter permissões de grupo apropriadas.

Pense nos grupos como "regras" no seu conjunto de permissões: todas as regras especiais geralmente exigem a criação de um grupo.

Uma maneira de impor a propriedade correta do grupo é definir o bit setgid (group) em um diretório adequado que pertença a este grupo, então todos os arquivos criados neste diretório também pertencerão automaticamente a este grupo. Você tentou fazer isso, mas não tenho certeza se essa foi sua intenção. Observe que você não pode definir o bit setuid (usuário) em um diretório.

Geralmente é desencorajado usar os executáveis setuid, a menos que seja realmente necessário. Se você quiser seguir esse caminho, algumas entradas sudoer provavelmente seriam melhores.

    
por 16.03.2017 / 10:30

Tags