Comment définir différemment les listes de contrôle d'accès par défaut Linux pour les répertoires et les fichiers

9

J'ai des ACL définies sur un répertoire comme suit:

# owner: root
# group: root
user::rwx
group::r--
mask::r-x
other::r--
default:user::r--
default:group::r--
default:mask::r-x
default:other::r--

J'aimerais que tous les nouveaux fichiers créés dans ce dossier soient u: apache: r-- et tous les nouveaux répertoires soient u: apache: rx. Comment spécifier cette intention à l'aide des ACL?

J'ai essayé le -dm u:apache:rXet ça ne semble pas faire autre chose que justerx

overt htdocs # getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:apache:r--
group::r--
mask::r-x
other::r--
default:user::r--
default:user:apache:r--
default:group::r--
default:mask::r--
default:other::r--

overt htdocs # setfacl -dm u:apache:rx .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

overt htdocs # rm blah.txt
overt htdocs # setfacl -dm u:apache:rX .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

L'autorisation X majuscule ne semble utile que pour définir les autorisations actuelles, pas pour définir les autorisations par défaut:

overt htdocs # setfacl -x u:apache blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
group::r--
mask::r--
other::r--

overt htdocs # setfacl -m u:apache:rX blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r--
group::r--
mask::r--
other::r--
joshperry
la source

Réponses:

6

Eh bien, mais votre exemple fait exactement ce que vous voulez;)

Regardez le deuxième:

htdocs ouvert # setfacl -dm u: apache: rx.
htdocs ouvert # touch blah.txt
htdocs ouvert # getfacl blah.txt
# fichier: blah.txt
# propriétaire: root
# groupe: racine
utilisateur :: r--
utilisateur: apache: rx #effective: r--
groupe :: r--
masque :: r--
autre :: r--

La ligne importante est:

user:apache:r-x #effective:r--

Même si acl est défini sur rx, il s'agit effectivement de r-- pour les fichiers. C'est à cause du masque.

Et le masque sera toujours uniquement rw- pour les fichiers si l'utilisateur l'a créé avec les autorisations rw- pour l'utilisateur. (Je ne suis pas sûr à 100% mais le masque ne peut pas être moins restrictif que les autorisations de base).

Donc, vous obtenez efficacement r-- pour les fichiers et rx pour les répertoires.
Parce que les répertoires créés auront l'utilisateur: rx -> le masque sera rx -> l'autorisation effective sera rx.
Pour les fichiers: ils auront r-- donc le masque sera r-- et les autorisations effectives pour les ACL seront r-- aussi. (Si vous créez un fichier et lui donnez des autorisations user :: rx, le masque sera modifié et les utilisateurs des acl obtiendront également le x)

soie
la source
Totalement manqué le #effectivetexte! Merci pour l'explication de la façon dont les masques affectent les autorisations effectives.
joshperry
2

Malheureusement, il n'y a tout simplement aucun moyen de le faire avec les ACL Linux. Il est vrai que le masque semblera faire exactement ce que vous voulez, en ce qui concerne les autorisations effectives. Mais la prochaine fois que vous effectuerez une opération qui recalcule le masque de droits, bam , tous vos fichiers seront rendus exécutables.

Vous pourriez tout aussi bien vous résigner à vous attendre à ce que tous les fichiers d'une ACL soient exécutables. C'est vraiment juste une commodité plutôt qu'une fonctionnalité de sécurité, et tant que vous ne placez pas ces dossiers dans votre $ PATH, cela ne devrait pas être un problème. Si cela vous dérange toujours, le seul choix est de placer vos dossiers contrôlés par ACL sur un système de fichiers monté sans option d'exécution.

Rashkae
la source
1

-d (ou --default) est utilisé pour définir les valeurs par défaut sur le répertoire afin que les choses qui y sont créées héritent des perms (comme vous semblez le faire).

Voici un rapide aperçu. http://www.vanemery.com/Linux/ACL/linux-acl.html#default

Il n'est pas possible d'avoir des fichiers avec une valeur par défaut et les répertoires avec une valeur par défaut différente.

Vous pouvez exécuter un script à partir de cron qui fait un setfacl sur tous les répertoires chaque minute - bien que ce soit moins qu'idéal d'une solution.

trouver / chemin / vers / top / dir -type d -exec setfacl -dm u: apache: rx {} \;

ou

trouver / chemin / vers / haut / dir -type d | xargs setfacl -dm u: apache: rx

aspitzer
la source
1

Ce post sur les ACL et les masques m'a vraiment aidé à comprendre comment faire ce que je voulais et pourquoi.

La partie manquante de ma compréhension était que lors de la création d'un fichier, le noyau utilise un jeu d'autorisations par défaut 0666 et pour les nouveaux répertoires 0777. Par conséquent, les répertoires par défaut auront le bit d'exécution (traversée) défini.

Le masque ACL est essentiellement un moyen de définir un umaskau niveau répertoire / fichier / utilisateur.

joshperry
la source