Nous avons des images Linux basées sur RH; sur lequel je dois «appliquer» quelques «archives spéciales» afin de les mettre à jour avec la dernière version de développement de notre produit.
La personne créant l'archive a figuré que dans notre image de base, certaines permissions sont fausses; donc on nous a dit de courir
sudo chgrp -R nobody /whatever
Nous l'avons fait; et plus tard, lorsque notre application fonctionne, des problèmes obscurs sont apparus.
Ce que j'ai trouvé plus tard: l'appel à chgrp effacera les informations de bit setuid sur nos binarys dans / whatever.
Et le problème actuel est: certains de nos binarys doivent avoir ce bit setuid afin de fonctionner correctement.
Longue histoire courte: y a-t-il un moyen d'exécuter cette command "chgrp" sans tuer mes bits setuid?
Je viens de courir ce qui suit sur mon Ubuntu local; conduisant au même résultat:
mkdir sticky cd sticky/ touch blub chmod 4755 blub ls -al blub
-> me montre le nom du file avec un fond rouge -> so, yep, setuid
chgrp -R myuser . ls -al blub
-> me montre le nom du file sans fond rouge -> setuid est parti
Si vous voulez implémenter votre chgrp -R nobody /whatever
tout en conservant le bit setuid, vous pouvez utiliser ces deux commands find
find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \ -exec chmod u+s {} + find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +
L'option find ... -perm 04000
reprend les files avec le set bit set. La première command applique alors le chgrp
puis un chmod
pour rétablir le bit setuid qui a été désactivé. Le second applique chgrp
à tous les files qui n'ont pas de bit setuid.
Dans tous les cas, vous ne voulez pas appeler chgrp
ou chmod
sur les liens symboliques car cela affecterait leurs cibles à la place, d'où le ! -type l
! -type l
.
La suppression du bit setgid
(au less sous Linux) setuid
sur des non-directorys est effectuée par le kernel lors de l'appel système chown()
effectué par chgrp
, et non par chgrp
lui-même. Donc, le seul moyen est de le restaurer ensuite.
Il efface également les capacités de security.
Donc, sur GNU Linux:
chown_preserve_sec() ( newowner=${1?}; shift for file do perms=$(stat -Lc %a -- "$file") || continue cap=$(getfattr -m '^security\.capability$' --dump -- "$file") || continue chown -- "$newowner" "$file" || continue [ -z "$cap" ] || printf '%s\n' "$cap" | setfattr --restore=- chmod -- "$perms" "$file" done )
Et exécutez (en tant que root
):
chown_preseve_sec :newgroup file1 file2...
pour modifier le groupe en essayant de conserver les permissions.
Récursivement, vous pourriez faire:
# save permissions (and ACLs). Remove the "# owner" and "# group" lines # to prevent them being restored! perms=$(getfacl -RPn . | grep -vE '^# (owner|group): ') # save capabilities cap=$(getfattr -Rhm '^security\.capability$' --dump .) chgrp -RP nobody . # restore permissions, ACLs and capabilities printf '%s\n' "$perms" | setfacl --restore=- [ -z "$cap" ] || printf '%s\n' "$cap" | setfattr -h --restore=-
(c'est tout en supposant que rien ne gâche les files en même time).
La chgrp
bits SUID et SGID sur chgrp
(ou chown
) est parfaitement raisonnable. C'est une mesure de security afin de prévenir les problèmes de security. Pour SGID (sur les exécutables, je présume) signifie exécuter ce programme avec le groupe effectif du propriétaire du groupe .
Si vous changez le propriétaire du groupe, alors en termes de security et de contrôle d'access c'est quelque chose de complètement différent, c'est-à-dire au lieu de courir avec le groupe efficace uvw
le programme fonctionne maintenant avec le groupe xyz
efficace.
Vous devez donc restaurer explicitement le bit SUID ou SGID lors du changement de propriété.
Addendum: Sur l'affirmation que chgrp (ou chown) devrait seulement effacer SGID (ou SUID, resp.)
En chgrp
ou en chgrp
les parameters de security d'un exécutable, vous devez effacer les attributes d'élévation de privilèges. La puissance d'Unix vient de la simplicité conceptuelle, et la security Unix est déjà assez délicate. À cette fin, retirer SUID et SGID de tout changement de propriétaire est simplement un filet de security – après tout, dans l'histoire d'Unix / Linux, il y a eu quelques vulnérabilités dues à des parameters SUID ou SGID erronés.
Donc, il n'y a pas de raison plus profonde pour laquelle Unix se comporte de cette façon, c'est juste une décision de design conservasortingce.
Comme d'habitude dans admin'ing il y a beaucoup de façons de faire.
La solution que je mets en place va comme ceci:
cd /home/me getfacl -R /whatever > whatever-permissions.org 2> /dev/null # A) change lines starting with # group: root # to # group: whatineed sed 's/^# group: root/# group: whatineed/g' whatever-permissions.org > whatever-permissions.new # B) change lines with group::xy # to group::xwy # (where x, y mean: whatever was there before) sed 's/^group::\(.\).\(.\)/group::\1w\2/g' whatever-permissions.new > whatever-permissions.new cd / setfacl --restore /home/me/whatever-permissions.new