Pokud chcete implementovat chgrp -R nobody /whatever
při zachování setuid bitu můžete použít tyto dva find
příkazy
find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \
-exec chmod u+s {} +
find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +
find ... -perm 04000
volba vybírá soubory s nastaveným bitem setuid. První příkaz pak použije chgrp
a poté chmod
k obnovení setuid bitu, který byl sražen. Druhý platí chgrp
všem souborům, které nemají setuid bit.
V žádném případě nechcete volat chgrp
nebo chmod
na symbolické odkazy, protože by to ovlivnilo jejich cíle, proto ! -type l
.
Mazání bitů SUID a SGID na chgrp
(nebo chown
) je naprosto rozumné. Je to bezpečnostní opatření, aby se předešlo problémům se zabezpečením. Pro SGID (předpokládám, že u spustitelných souborů) znamená spustit tento program s efektivní skupinou vlastníka skupiny .
Pokud změníte vlastníka skupiny, pak je to z hlediska zabezpečení a řízení přístupu něco úplně jiného, tj. místo spuštění s efektivní skupinou uvw
program nyní běží s efektivní skupinou xyz
.
Proto musíte při změně vlastnictví explicitně obnovit bit SUID nebo SGID.
Dodatek:K tvrzení, že chgrp (nebo chown) by měl vymazat pouze SGID (nebo SUID, resp.)
Podle chown
ing nebo chgrp
Pokud změníte nastavení zabezpečení pro spustitelný soubor, a to je dostatečný důvod k vymazání všech atributů zvyšujících oprávnění. Síla Unixu pochází z koncepční jednoduchosti a zabezpečení Unixu je již poměrně složité. Za tímto účelem je odstranění SUID a SGID při jakékoli změně vlastnictví jednoduše záchrannou sítí – koneckonců v historii Unixu/Linuxu existovalo několik zranitelností kvůli nesprávným nastavením SUID nebo SGID.
Neexistuje tedy žádný hlubší důvod, proč se Unix chová tímto způsobem, je to pouze konzervativní návrhové rozhodnutí.
Vymazání setuid
, setgid
bit (alespoň na Linuxu) na neadresářích provádí jádro na chown()
systémové volání provedené chgrp
, nikoli podle chgrp
sám. Takže jediný způsob je obnovit jej později.
Také vymaže možnosti zabezpečení.
Takže na 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
)
A spusťte (jako root
):
chown_preseve_sec :newgroup file1 file2...
změnit skupinu při pokusu o zachování oprávnění.
Rekurzivně můžete udělat:
# 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=-
(to vše za předpokladu, že by se jinak nic nepletlo se soubory současně).