Perché setuid viene ignorato nelle directory?


19

Sui sistemi Linux, puoi riuscire chmod u+s $some_directory, ma invece di forzare la proprietà di nuove sottodirectory e file di essere il proprietario della directory di contenimento (e impostare anche le sottodirectory u+s) come ci si potrebbe aspettare, il sistema ignora semplicemente il bit setuid. Le sottodirectory e i file continuano a ereditare gli UID dei loro processi di creazione e le sottodirectory non sono impostate per impostazione predefinita.

Perché setuid viene ignorato nelle directory e come posso far sì che il sistema lo riconosca?


Mi chiedo se l'opzione di montaggio "nosuid" possa influire su questo.
Heptite,

Il filesystem in questione non è montato, nosuidanche se ce n'è un altro (un ramdisk /dev/shm) che / è / montato nosuid, e sembra trattare il setuidbit esattamente allo stesso modo. 6_9
Blacklight Shining


2
Per quanto riguarda l'implementazione, il codice sorgente Linux è prontamente disponibile, non esitate a implementare questa funzione. Dato che esiste già su FreeBSD, puoi tranquillamente copiare il codice su, ne sono sicuro. Naturalmente, quei bit non avrebbero ancora alcun significato sul sistema Linux di qualcun altro.
mikebabcock,

Risposte:


16

Ricordiamo che i bit setuid e setgid sono stati inventati per uno scopo completamente diverso: far funzionare un eseguibile con l'UID o GID del suo proprietario, piuttosto che l'UID o GID dell'utente che esegue il file. Qualsiasi altro utilizzo è solo una funzionalità aggiuntiva.

Questi bit non hanno alcuna funzione su file ordinari che non sono eseguibili. (E anche script di shell su alcune distro, a causa di problemi di sicurezza.) Inizialmente, non avevano alcuna funzione per le directory. Ovviamente qualcuno ha deciso che sarebbe bello prendere il setgid inutilizzato nelle directory e usarlo per imporre la coerenza della proprietà del gruppo. Dopotutto, se stai giocando con la proprietà del gruppo, è perché più di una persona sta lavorando con il file, e probabilmente ha senso che tutti i file in una determinata directory appartengano allo stesso gruppo, indipendentemente da chi li ha creati. Le preoccupazioni dovute a qualcuno che si dimentica di eseguire newgrp vengono eliminate.

Quindi, perché non implementare la stessa funzione per setuid e il file uid? Bene, uid è molto più semplice di gid. Se lo implementate, spesso un file non appartiene all'utente che lo ha creato! Presumibilmente l'utente può comunque modificare il file (supponendo che umask sia qualcosa di sano), ma non può cambiare i bit di autorizzazione. Difficile vederne l'utilità.


Vorrei che fosse implementato, anche solo per coerenza ... X3 In ogni caso, a meno di una soluzione come un cronjob per passare periodicamente e cambiare la proprietà, / c'è / c'è un modo per forzare la proprietà del file?
Blacklight Shining

4
Sono tentato di citare Emerson su Foolish Coerency. Prima che tu possa convincermi che è una caratteristica desiderabile, dovrai mostrarmi un caso d'uso in cui ha senso.
Isaac Rabinovitch il

1
FreeBSD chmod (2) in realtà ha discusso di questo, ma menziona solo che non dovrebbe essere generalmente usato a causa di "buchi di sicurezza" non specificati. Ho il sospetto che la maggior parte altri Unix non ha adottato questa caratteristica perché, mentre ha alcuni casi d'uso, non è che terribilmente utile.
jjlin,

1
"Difficile vedere l'utilità di quello" -> impostato su una directory home, quindi gli script di provisioning in esecuzione come root non possono dimenticare di chown qualcosa per caso?
ufotds,

1
eseguire script di superutente nella tua home directory è una pessima idea
Isaac Rabinovitch il

7

Credo che la risposta a questa domanda riguardi i problemi di sicurezza del "file giveaway" che hanno portato la maggior parte dei moderni sistemi operativi simili a Unix a non consentire il "giveaway file". Il "file giveaway" è quando un utente non superutente cambia la proprietà di un file in una persona diversa da quell'utente. Questa capacità offre molte opportunità di malizia.

Poiché non sono consentiti omaggi di file, setuid su directory, che eseguono la stessa funzione in un altro formato, non è consentito o ignorato se impostato.

Per quanto riguarda la modifica del comportamento, è necessario modificare le librerie e le utilità del sistema operativo.


2

Un ottimo caso d'uso per implementarlo è questo:

Supponiamo che tu abbia un server multi-sito con 3 siti sicuri. Hai creato 3 gruppi, uno per ciascuno dei diversi manutentori dei siti. Tutti i file in tutti i siti devono essere di proprietà dell'utente apache in modo che apache possa leggere e scrivere su di essi (drupal / wordpress, ecc.).

Se il setuid ma funzionasse come il bit setgid per le autorizzazioni delle directory sarebbe simile a questo:

/var/www/sitea - apache:groupa  rwS rwS ---
/var/www/siteb - apache:groupb  rwS rwS ---
/var/www/sitec - apache:groupc  rwS rwS ---

In questo modo ogni gruppo di manutentori ha avuto accesso a vedere e toccare solo il loro contenuto, ma l'apache dell'utente del server web poteva servire tutto il contenuto e non è necessario che gli utenti si preoccupino di cambiare la proprietà dei file caricati.

Un altro caso d'uso è per i caricamenti anonimi ftp / http o anche sftp / ssh. Il gruppo e il GID nella directory di caricamento sarebbero root, così come il proprietario e l'UID. Le altre autorizzazioni sarebbero -wx. Ciò consentirebbe a chiunque di SCRIVERE l'accesso alla directory di caricamento, ma non potrebbe leggere nulla una volta che è stato caricato e root possederebbe tutti i file appena creati.

Quindi ci sono due casi d'uso perfettamente validi e validi per abilitare la funzionalità UID nelle directory in modo che corrisponda al bit GID.

Steven Mercurio


1
Questo non sembra rispondere alla domanda che è stata posta.
Kevin Panko,

2
@KevinPanko No, non risponde alla mia domanda. Potrebbe anche essere fuori tema per il sito ("a cosa serve un caso d'uso <nonexistent feature X>?"). Tuttavia, riguarda la mia domanda e io, come richiedente, la trovo utile.
Blacklight Shining

0

Un po 'tardi alla festa, ma nel caso in cui i futuri lettori si imbattano in questo;) Come affermato da altri, su un file system OS-X standard il setUID per le directory viene ignorato - e non sembra esserci un modo semplice per aggirare questo ( mount -o.... o cosa no). Come spesso accade, la pagina man in realtà non è conforme al comportamento OS-X che afferma letteralmente:

4000 (il set-user-ID-on-esecuzione bit) [...] Le directory con il set-user-id bit set imporranno che tutti i file e le sottodirectory in essi creati siano di proprietà del proprietario della directory e non di l'uid del processo di creazione [...]

ma elenca anche la possibilità di ottenere lo stesso effetto senza rinunciare alla proprietà originale. Linux usa '[g /] setfacls' per effetti simili (sono autorizzazioni non realmente visibili a prima vista, quindi a volte può essere un fastidio).

Per quanto riguarda il "come posso ottenere effetti simili", leggi l'intera pagina man e giocherella con:

chmod +a 'guest allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' ./[DIRECTORY]

puoi controllare tramite

ls -le

se tutto sembra a posto. Altre opzioni includono l'inserimento di regole in posizioni specifiche, la rimozione o la sostituzione di regole specifiche. Le due opzioni degne di nota qui sono " file_inherite directory_inherit" che consentono di allegare le regole a una nuova directory / file.

Non mi piace molto usare setUID, ma setGID è molto utile sui server di file in cui la semplice impostazione del gruppo 'principale' non funziona o i client hanno maschere di file che non consentono la scrittura di gruppo. Ciò sarebbe risolto da:

chmod +a 'mygroup allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' /fileserver/groupfolders/mygroup

Benvenuto in Stack Exchange! Questa è una buona risposta, sebbene per quanto riguarda OS X piuttosto che le distro Linux (che, come hai detto, utilizzano un sistema ACL diverso), qui non sembra abbastanza rilevante. Sarebbe sicuramente una buona idea per una domanda su come rendere OS X onorare le directory setuid; forse dovresti postarne uno ?
Blacklight Shining il

A proposito, la parte che hai lasciato fuori dalla pagina di manuale di OS X su in chownrealtà sembra piuttosto importante! “[…] Se il file system sottostante supporta questa funzione: vedi chmod (2) e l' opzione suiddir per mount (8).” In realtà non avevo mai notato quel bit prima. Se HFS implementa suiddir, puoi effettivamente farlo accadere su un sistema OS X comune.
Blacklight Shining il

(E gli ACL di OS X sono "non realmente visibili a prima vista" come lo sono gli ACL di Linux.)
Blacklight Shining

0

Bene, dovrebbe rispettare lo standard. Riesco a pensare a diversi scenari con sftp-only che mi risparmierebbe molti problemi, sia con acl che con acl-mask-set che sshd fa, e il reset che devo fare per quella maschera.

La sicurezza di default è abbastanza utile, ma se non la fai diventare un'opzione, stai solo creando un winghtmare.

https://www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html

Ad ogni modo, è come procede ora Linux, quindi basta usare acl per aggirare quelli.


-1

Secondo http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories il bit setuid viene ignorato per le directory su entrambi i sistemi UNIX e Linux. Tuttavia, è possibile farlo funzionare come previsto su FreeBSD.


Non utile: ho chiesto perché è setuidstato ignorato per le directory e se era possibile farlo riconoscere su Linux.
Blacklight Shining

Sembra ovvio che sia ignorato su Linux perché ignorato su Unix, il che rende il comportamento corretto per Linux per adattarsi a * nix reale. Sentiti libero di leggere l'articolo in questione. Stessa risposta su greenend.org.uk/rjk/tech/perms.html del 2004, anche un duplicato di serverfault.com/questions/371541/…
mikebabcock,

Allora perché viene ignorato su Unix?
Isaac Rabinovitch il

@IsaacRabinovitch da quando Blacklight ha chiarito che la domanda riguarda Linux, non è rilevante [lingua in guancia] ma sospetto che sia un comportamento semplicemente indefinito in cui più Unix hanno fatto cose diverse con esso e non fare nulla è un presupposto più sicuro.
mikebabcock,

La domanda / è / taggata linux, sì, ma ciò non significa che preferirò un vago “È fatto in questo modo perché altri sistemi lo fanno in questo modo” rispondo a una risposta che spiega perché è fatto in questo modo su altri sistemi. (Forse il linuxtag dovrebbe essere semplicemente rimosso?)
Blacklight Shining
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.