Puis-je créer un répertoire public sous un répertoire privé?

20

J'ai un dossier personnel / a / b sur le serveur avec l'autorisation 700. Je ne veux pas que les autres répertorient le contenu dans / a / b. Le propriétaire de / a est root.

Maintenant, je dois ouvrir toutes les autorisations du répertoire / a / b / c à tous les utilisateurs.

J'ai changé l'autorisation de / a / b / c en 777 mais elle est toujours inaccessible pour les autres.

Lee
la source
2
Vous devez définir le «bit d'exécution» pour permettre la traversée du répertoire (pour traverser / a et / a / b), cela pourrait résoudre votre problème:chmod +x /a/b
ex0ns

Réponses:

34

Vous pouvez. Il vous suffit de définir le bit exécutable sur le /a/brépertoire. Cela empêchera de voir quoi que ce soit b, mais vous pouvez toujours tout faire si vous allez directement à a/b/c.

% mkdir -p a/b/c
% chmod 711 a/b
% sudo chown root a/b
% ll a/b
  ls: cannot open directory a/b: Permission denied
% touch a/b/c/this.txt
% ls a/b/c
  this.txt

Sachez que même si d'autres ne peuvent pas répertorier le contenu de /a/b, ils peuvent accéder aux fichiers de ce répertoire s'ils devinent le nom du fichier.

% echo hello | sudo tee a/b/f
% cat a/b/f
hello
% cat a/b/doesntexist
cat: a/b/doesntexist: No such file or directory

Assurez-vous donc de conserver les autorisations appropriées (pas de groupe / monde) sur tous les autres fichiers / répertoires du brépertoire, car cela évitera cette mise en garde.

stevieb
la source
Au lieu de définir le bit exécutable, pourriez-vous également fournir un lien dur vers un / b / c qui réside dans un autre emplacement?
Moby Disk
2
@MobyDisk Vous ne pouvez pas créer de lien dur vers un répertoire.
Michael Hampton
Cela ne fonctionnerait pas, car quoi qu'il en soit, vous devez toujours lire bpour c
créer un
3
Notez qu'il y a quelques mises en garde importantes à cela. Si l'un des fichiers a/bcontient des autorisations de groupe / autres différentes de zéro et qu'un adversaire connaît ou peut deviner leurs noms, cet adversaire peut interagir avec ces fichiers.
Kevin
Vrai @Kevin, les autorisations pour tout ce qui se trouve sous bdevraient avoir des autorisations définies pour se protéger contre cela avant la création c, puis une diligence est nécessaire lorsque d'autres éléments sont remplis bpour s'assurer que les autorisations sont sécurisées pour le seul propriétaire.
stevieb
9

Avec ces autorisations, vous ne pouvez pas atteindre votre objectif. Pour accéder au répertoire c, vous devez autoriser tous les autres utilisateurs à parcourir le répertoire, bce qui se fait en accordant l'autorisation d'exécution pour ce répertoire. Avec le /a/bmode 711, vous pouvez obtenir ce que vous voulez car vous accordez la traversée de répertoire mais refusez la lecture et l'écriture. Mais gardez à l'esprit que même si d'autres utilisateurs ne peuvent pas répertorier les fichiers /a/b, ils peuvent avoir accès aux fichiers s'ils supposent le nom et que les fichiers disposent d'autorisations suffisamment ouvertes.

John
la source
3

Si un utilisateur ne peut pas accéder /a/b, il ne peut accéder à aucun fichier sous /a/b/c. Les autorisations sur ne /a/b/csont pas pertinentes car la traversée du répertoire s'arrête à /a/b.

Si tout ce que vous voulez est d'empêcher le répertoire /a/bd'être répertorié, mais que les utilisateurs accèdent aux fichiers /a/bs'ils acceptent un nom de fichier, vous pouvez rendre /a/bexécutable mais non lisible. Sur un répertoire, l'autorisation de lecture contrôle uniquement la liste du contenu du répertoire, tandis que l'autorisation d'exécution contrôle l'accès aux entrées de ce répertoire.

# chmod u=rwx,go=x /a/b
# chmod u=rwx,go=rx /a/b/c
# echo 'hello' >/a/b/existingfile
# su bob -c 'ls -l /a/b'
ls: /a/b: Permission denied
# su bob -c 'cat /a/b/nosuchfile'
cat: /a/b/nosuchfile: No such file or directory
# su bob -c 'cat /a/b/existingfile'
hello
# su bob -c 'ls -l /a/b/c'
 contents of /a/b/

Si vous ne souhaitez pas que d'autres utilisateurs puissent accéder aux fichiers à l' /a/bexception de /a/b/c, vous pouvez exposer /a/b/cvia une autre vue, via un montage de liaison .

# chmod u=rwx,go=x /a/b
# chmod u=rwx,go=rx /a/b/c
# mkdir /c
# mount --bind /a/b/c /c
# su bob -c 'ls /a/b/c'
ls: /a/b/c: Permission denied
# su bob -c 'ls -l /c'
 contents of /a/b/
Gilles 'SO- arrête d'être méchant'
la source