Empêcher la création de directorys mais autoriser la création de files

J'ai un directory partagé via Samba. Je veux que les users puissent créer / modifier / supprimer des files mais pas créer / effacer des directorys. Je n'ai pas trouvé le moyen de le faire. Peut-être avec SELinux? Mais comment?

La façon élégante serait d'utiliser richacls . Mais ce n'est pas encore une partie officielle du kernel et peut donc être difficile à utiliser pour vous.

Une solution de contournement simple serait d'utiliser le directory mask parameters samba et de force directory security mode pour rendre les directorys nouvellement créés inutilisables aux users afin qu'ils apprennent à ne pas créer de directorys.

La façon amusante (et portable!) Serait de créer autant de sous-directorys (invisibles) que la limite du sous-directory du système de files est atteinte. Si un nouveau sous-directory est nécessaire, l'administrateur renomme simplement l'un d'entre eux.

Ce que vous pouvez faire est d'utiliser un système de files FUSE comme bindfs en combinaison avec un pirate de l'air LD_PRELOAD qui désactive les appels système mkdir et rmdir . Comme créer un file wrapper.c avec:

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

Comstackz-le avec:

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

Et courir:

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

Ce qui montera the-dir sur lui the-dir même mais sans la possibilité de créer ou de supprimer des directorys.

Vous pourrez toujours renommer les directorys.

Sous Linux et le système de files ext4, une façon détournée d'empêcher la création de directorys (et non d'autres types de files) est de s'appuyer sur le fait que les directorys nouvellement créés héritent des inputs ACL par défaut de leur directory parent -default ACL ensortinges) alors que les files ne reçoivent que les inputs ACL non-default correspondantes et sur ext4 au less, il n'y a qu'un espace limité par inode pour stocker ces inputs ACL.

Donc, si vous remplissez cet espace pour un directory avec des inputs ACL par défaut jusqu'au bord, vous serez toujours en mesure de créer des files, mais pas de directorys car le système ne sera pas en mesure de créer à la fois les valeurs par défaut et non- Entrées ACL par défaut:

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

(la condition de sortie sur cette boucle est lorsque setfacl échoue (ici sur ENOSPC car plus aucune input ACL ne peut être ajoutée)).

 $ getfacl . | grep -c default: 507 

507 inputs ACL par défaut ont été ajoutées (refusant l'access à n'importe quel file et directory créé pour les users 50000 à 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 

Même root ne peut pas créer de directorys là-dedans:

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

Cela n'empêche pas les users de supprimer ou de renommer des directorys là-bas (si certains ont été créés avant d'append ces lists de contrôle d'access par défaut).