Exigir que o sudo exclua arquivos, mas ainda permita a gravação

Exigir que o sudo exclua arquivos, mas ainda permita a gravação

Eu tenho todos os meus arquivos em uma invasão de servidor e ele tem uma quantidade de espaço razoavelmente excessiva, então não terei que excluir nada com frequência.

Ainda tenho coisas escrevendo para o ataque o tempo todo, então não quero usar o sudo para fazer isso. Mas é possível definir permissões para que a gravação seja permitida, mas a exclusão de arquivos não?

Presumo que isso também exigirá que eu use sudo para comandos mv, mas isso não é um problema

Informação extra:

Raid usa btrfs raid1

O sistema operacional está em uma unidade separada (servidor Ubuntu 14.04)

Responder1

Você precisa de permissões de gravação de diretório para criar ou excluir arquivos. Você precisa de permissões de gravação de arquivo para alterar o arquivo.

Considerando esta árvore:

FolderA: (no write permissions for you)
   - FileX (write permissions)
   - FileY (write permissions)

Agora você pode alterar FileX e FileY, mas não pode excluí-los. Você também não pode criar um FileZ na PastaA.

Responder2

Eu não acho que seja possível. A criação e exclusão de arquivos no Unix são controladas pela capacidade de gravar no diretório --- basicamente o mesmo sinalizador.

Agora o que você pode fazer é criar dois diretórios --- um com permissão de gravação e outro restrito ao root.

[romano:~/tmp/test] % ls -l
total 8
drwxrwxr-x 2 romano romano 4096 Oct  8 18:06 normal
drwxrwxr-x 2 root   root   4096 Oct  8 18:06 onlyroot

Você normalmente trabalha normal. Suponha que você tenha nele:

[romano:~/tmp/test/normal] % ls
one.txt  three.txt  two.txt

Você pode excluir arquivos claramente e criar novos; suponha que você queira proteger " one.txt" contra exclusão. O que você pode fazer é criar um link físico para ele em onlyroot:

[romano:~/tmp/test/normal] 1 % sudo ln one.txt ../onlyroot

Isso criará outro nome para one.txtin onlyroot(usando uma quantidade insignificante de espaço; o arquivo não será copiado). Agora, como usuário normal, você pode excluir one.txta normalpasta, mas terá uma versão intocável abaixo dela onlyroot.

[romano:~/tmp/test/normal] % ls
one.txt  three.txt  two.txt
[romano:~/tmp/test/normal] % rm one.txt
rm: remove regular empty file ‘one.txt’? y
[romano:~/tmp/test/normal] % cd ..
[romano:~/tmp/test] % cd onlyroot 
[romano:~/tmp/test/onlyroot] % ls
one.txt
[romano:~/tmp/test/onlyroot] % rm one.txt 
rm: remove regular empty file ‘one.txt’? y
rm: cannot remove ‘one.txt’: Permission denied

Responder3

No meu entendimento (com base emhttps://btrfs.wiki.kernel.org/index.php/Project_ideas#RichACLs_.2F_NFS4_ACLS), o btrfs suporta apenas permissões Unix tradicionais e ACLs POSIX.1e e, portanto, não pode fazer o que deseja.

Muitos/a maioria dos outros sistemas de arquivos suportam pelo menos um dos richacls do Linux (que eu não acredito que esteja na linha principal ainda), ACLs NFSv4, ACLs ZFS ou ACLs do Windows, todos os quais permitem negar especificamente 'exclusão', mas eu não não imagine que você estaria disposto a desistir dos recursos do btrfs apenas por isso.

Por outro lado, como você pretende especificamente proteger contra erros simples, talvez seja melhor aproveitar as vantagens dos recursos de instantâneo do btrfs usando algo como autosnap.

Responder4

Acho que uma solução seria apenas criar uma função no seu bashrc, por exemplo:

sudowrapper () { 
sudo -k;sudo "$@";sudo -K; 
}

vimf() {
    echo "pass" | sudowrapper -S nvim "$1"
}

sudowrapperé necessário fazer sudoesquecer as credenciais toda vez que vimffor chamado, caso contrário, ocorrerá um comportamento estranho.

Faça isso apenas se quiser evitar que você mesmo faça algo errado. Se seu objetivo é evitar que outras pessoas façam algo ruim, então escrever sua senha .bashrcé uma má ideia.

informação relacionada