Come impedire a chgrp di cancellare "bit setuid"?


8

Abbiamo immagini Linux basate su RH; su cui devo "applicare" alcuni "archivi speciali" per aggiornarli all'ultima versione di sviluppo del nostro prodotto.

La persona che ha creato l'archivio ha capito che nella nostra immagine di base, alcune autorizzazioni sono sbagliate; così ci hanno detto di correre

sudo chgrp -R nobody /whatever

Lo abbiamo fatto; e più tardi, quando la nostra applicazione è in esecuzione, sono emersi problemi oscuri.

Quello che ho trovato più tardi: la chiamata a chgrp sarà cancellare le informazioni setuid po 'sui nostri binari all'interno di / qualcosa.

E il vero problema è: alcuni dei nostri binari devono avere quel bit setuid impostato per funzionare correttamente.

Per farla breve: c'è un modo per eseguire quel comando "chgrp" senza uccidere i miei bit setuid?

Ho appena eseguito il seguente sul mio Ubuntu locale; portando allo stesso risultato:

mkdir sticky
cd sticky/
touch blub
chmod 4755 blub 
ls -al blub 

-> mi mostra il nome del file con sfondo rosso -> quindi, sì, setuid

chgrp -R myuser .
ls -al blub 

-> mi mostra il nome del file senza sfondo rosso -> setuid è sparito


1
Il 4XXXbit si chiama setuid bit ( s), non appiccicoso. Sticky è il tbit e il suo scopo è un po 'diverso: en.wikipedia.org/wiki/Sticky_bit
zuazo

2
(1) Stai impostando il setuidbit, non il stickybit. (2) Non cancellare il setuidbit quando lo fai chgrpo chownsarebbe un problema di sicurezza.
Satō Katsura,

1
Questo comportamento cambia tra le distribuzioni. Ma come spiegato qui , il cambiamento del bit setuid dipende dal comportamento di syscall sottostante.
zuazo,

Grazie a tutti. Hai ragione, si tratta del bit setuid! Grazie per l'aiuto. E accetto anche che questo sia "funziona come progettato". Ora ho solo bisogno di trovare il modo più sano di fare ciò che deve essere fatto senza uccidere quei pezzi. Considero di utilizzare gefacl per creare un dump di testo, rielaborare la configurazione del testo e quindi applicare quello. Ciò dovrebbe darmi il pieno controllo di ciò che accadrà.
GhostCat

Risposte:


7

Se vuoi implementare il tuo chgrp -R nobody /whatevermantenendo il bit setuid puoi usare questi due findcomandi

find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \
                                      -exec chmod u+s {} +
find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +

L' find ... -perm 04000opzione raccoglie i file con il bit setuid impostato. Il primo comando quindi applica chgrpe quindi a chmodper ripristinare il bit setuid che è stato eliminato. Il secondo si applica chgrpa tutti i file che non hanno un bit setuid.

In ogni caso, non si desidera chiamare chgrpo chmodsu collegamenti simbolici poiché ciò influirebbe invece sui loro obiettivi, quindi il ! -type l.


Nota che chgrpcancella anche il bit setgid (e le funzionalità su Linux) che potrebbe anche essere necessario ripristinare.
Stéphane Chazelas,

@ StéphaneChazelas hai ragione, ma dato che nessuno ha menzionato il setgid, non mi sono preoccupato di fornire una soluzione. La soluzione è banalmente estensibile, tuttavia, con un terzofind
roaima,

Beh, non può essere una terza scoperta, dovresti coprire i casi u + g, solo tu, solo g. In ogni caso, dovresti essere in grado di farlo in un'unica findchiamata. Non mi piacciono le lunghe file in SE quando devi scorrere il testo. La mia aggiunta di! -tipo l'ho fatto superare il limite
Stéphane Chazelas il

Bene, l'unico findapproccio con -exec +può essere difficile da fare in modo affidabile se questo finisce per suddividere le chmod/ chgrps in diverse invocazioni.
Stéphane Chazelas,

1
In realtà, penso che find . ! -type l -exec chgrp nobody {} + \( -perms -6000 -exec chmod gu+s {} + -o -perms -4000 -exec chmod u+s {} + -o -perms -2000 -exec chmod g+s {} + \)dovrebbe essere OK. Perché le chgrpcorrispondenze per più file, per ogni file dovrebbe essere fatto prima della chmods.
Stéphane Chazelas,

5

Cancellare i bit SUID e SGID su chgrp(o chown) è perfettamente ragionevole. È una misura di sicurezza per prevenire problemi di sicurezza. Per SGID (su eseguibili, presumo) significa eseguire questo programma con un gruppo effettivo del proprietario del gruppo .

Se cambi il proprietario del gruppo, in termini di sicurezza e controllo degli accessi questo è qualcosa di completamente diverso, cioè invece di funzionare con un gruppo efficace uvwil programma ora funziona con un gruppo efficace xyz.

Pertanto, è necessario ripristinare esplicitamente il bit SUID o SGID al cambio di proprietà.

Addendum: sull'affermazione che chgrp (o chown) dovrebbe cancellare solo SGID (o SUID, resp.)

Inserendo chowno chgrpmodificando le impostazioni di sicurezza per un eseguibile, questo è un motivo sufficiente per cancellare qualsiasi privilegio che eleva gli attributi. Il potere di Unix deriva dalla semplicità concettuale e la sicurezza di Unix è già piuttosto complicata. A tal fine, la rimozione di SUID e SGID in caso di modifica della proprietà è semplicemente una rete di sicurezza - dopotutto, nella storia di Unix / Linux c'erano alcune vulnerabilità dovute a impostazioni SUID o SGID errate.

Quindi non esiste un motivo più profondo per cui Unix si comporti in questo modo, è solo una decisione conservativa di progettazione.


1
Questo spiega perfettamente perché la modifica del proprietario cancella il bit SUID e la modifica del gruppo cancella il bit SGID. Ma la domanda riguarda il bit SUID durante un'operazione di cambio di gruppo che non influisce sull'utente con cui viene eseguito SUID. Quindi ci deve essere una spiegazione diversa.
Ben Voigt,

1
@BenVoigt: lo spiega abbastanza bene. Sia chown che chgrp chiamano syscall chown (), che cancella suid e sgid su file normali, qualunque cosa accada.
Giosuè,

1
@Joshua: questa è una descrizione. La spiegazione è "per evitare il caso che invece di essere eseguito con un gruppo efficace uvwil programma ora verrà eseguito con un gruppo efficace xyz", ma ciò non si applica al caso in discussione.
Ben Voigt,

Lo fa. Inserendo chowno chgrpmodificando l'impostazione di sicurezza, questa è una ragione sufficiente per cancellare il privilegio di elevare gli attributi. È molto probabile che ciò colpisca altrimenti gli incauti.
Contromodalità

4

La cancellazione del bit setuid, setgid(almeno su Linux) su non-directory viene fatta dal kernel al momento della chown()chiamata di sistema effettuata chgrp, non da chgrpsola. Quindi l'unico modo è ripristinarlo in seguito.

Cancella anche le funzionalità di sicurezza.

Quindi, su 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
)

Ed esegui (come root):

chown_preseve_sec :newgroup file1 file2...

per cambiare il gruppo mentre si tenta di conservare le autorizzazioni.

Ricorsivamente, potresti fare:

# 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=-

(tutto ciò presuppone che nulla stia altrimenti confondendo i file allo stesso tempo).


1

Come al solito nell'amministrazione ci sono molti modi per procedere.

La soluzione che ho messo in atto va così:

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::x.y
# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.