GNU/Linux >> Znalost Linux >  >> Linux

Jak zabránit chgrp ve vymazání „setuid bitu“?

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ě).


Linux
  1. Journalctl:Jak zabránit zkrácení textu v terminálu?

  2. Zabránit Sigintu v dosahování dětských procesů?

  3. Příklady příkazů chgrp v Linuxu

  1. chgrp:příkaz nenalezen

  2. Linux NFLOG - dokumentace, konfigurace z C

  3. Jak zabránit procesu v zápisu souborů

  1. Zabránit spuštění Tmux na Ssh?

  2. Jak zabránit `ls` v třídění výstupu?

  3. Zabránit konzoli v vyčištění obrazovky?