Evitar a criação de diretórios, mas permitir a criação de arquivos

5

Eu tenho um diretório compartilhado pelo Samba. Eu quero que os usuários possam criar / modificar / apagar arquivos, mas não criar / apagar diretórios. Eu não encontrei uma maneira de fazer isso. Talvez com o SELinux? Mas como?

    
por acvF 04.06.2013 / 17:23

3 respostas

8

A maneira elegante seria usar richacls . Mas isso ainda não é uma parte oficial do kernel e, portanto, pode ser difícil de usar para você.

Uma solução fácil seria usar os parâmetros samba directory mask e force directory security mode para tornar os diretórios recém-criados inúteis (inacessíveis) para os usuários, para que eles aprendam a não criar diretórios.

O jeito engraçado (e portátil!) seria criar tantos subdiretórios (invisíveis) que o limite do subdiretório do sistema de arquivos é atingido. Se um novo subdiretório for necessário, o administrador simplesmente renomeia um deles.

    
por 04.06.2013 / 17:37
6

O que você pode fazer é usar um sistema de arquivos FUSE como bindfs em combinação com um sequestrador LD_PRELOAD que desativa as chamadas do sistema mkdir e rmdir . Como criar um arquivo wrapper.c com:

#include <errno.h>
int mkdir() { errno = EPERM; return -1; }
int rmdir() { errno = EPERM; return -1; }

Compile com:

gcc -fPIC -shared -o wrapper.so wrapper.c

E corra:

LD_PRELOAD=$PWD/wrapper.so bindfs the-dir the-dir

Que montará the-dir sobre si mesmo, mas sem a capacidade de criar ou excluir diretórios.

Você ainda poderá renomear os diretórios.

    
por 04.06.2013 / 18:42
2

No sistema de arquivos Linux e ext4, uma maneira hacky de impedir que diretórios (e não outros tipos de arquivos) sejam criados é confiar no fato de que os diretórios recém-criados herdam as entradas ACL padrão de seu diretório pai (além das entradas de ACL não padrão correspondentes) enquanto os arquivos só recebem as entradas de ACL não-padrão correspondentes e no ext4 pelo menos, há apenas um espaço limitado por inode para armazenar aqueles Entradas ACL.

Assim, se você preencher esse espaço para um diretório com entradas de ACL padrão até a borda, ainda poderá criar arquivos lá, mas não os diretórios, pois o sistema não conseguir criar as entradas de ACL padrão e não padrão:

$ i=50000; while setfacl -m "d:u:${i}:-" .; do i=$((i + 1)); done
setfacl: .: No space left on device

(a condição de saída nesse loop é quando setfacl falha (aqui no ENOSPC porque não é possível adicionar mais entradas de ACL)).

$ getfacl . |  grep -c default:
507

507 entradas de ACL padrão foram adicionadas (efetivamente negando o acesso a qualquer arquivo e diretório criado para usuários 50000 a 50506).

$ touch file
$ mkdir dir
mkdir: cannot create directory ‘dir’: No space left on device
$ ls -l
total 4
-rw-r--r--+ 1 chazelas chazelas 0 Nov 27 13:35 file

Mesmo root não pode criar diretórios lá:

$ sudo mkdir x
mkdir: cannot create directory ‘x’: No space left on device

Isso não impede que os usuários removam ou renomem diretórios (se alguns foram criados antes de você adicionar essas ACLs padrão).

    
por 27.11.2014 / 14:45