Come mai un utente può cancellare 755 file di un altro utente?


35

Ho uno script di caricamento di backup che scp i file su un altro server usando l'utente upload. Un altro script sul server di destinazione quindi li chown a un altro utente e imposta la modalità file su 755.

Se poi SSH nel server di destinazione utilizzando l' uploadutente, sono in grado di eliminare i file di proprietà. Non dovrebbero essere letti solo?

Ecco come appare un file sul server di destinazione e l'utente uploadè in grado di eliminarlo.

-rwxr-xr-x 1 maciekish maciekish 650M Nov  1 01:07 2014-11-01-data.tar.bz2

L'utente è uploadstato appena aggiunto utilizzando useradde non fa parte del maciekishgruppo.

Quando uploadprovo ad eliminare il file come tramite ssh, mi viene chiesto se desidero eliminare "Scrivi file normale protetto" e sono in grado di dirlo Yed eliminarlo.


Risposte:


64

I file sono di sola lettura; tuttavia, l'eliminazione di un file non lo modifica ma solo la directory principale (sostanzialmente rimuove il file dall'elenco delle directory) e sembra che tu abbia i permessi di scrittura completi per la directory.

È possibile impostare il stickybit, ovvero il flag "eliminazione limitata", che impedirà a chiunque tranne il proprietario di rinominare o eliminare i file in quella directory (come in /tmp). Per fare ciò, esegui chmod o+t *directory*come proprietario della directory.


12

In un tipico filesystem Unix, qualsiasi file può essere identificato da un numero arbitrario di voci di directory, ognuna delle quali contiene un "collegamento reale".

Dal punto di vista dell'implementazione c'è una differenza tra l'eliminazione dell'ultima voce della directory (hard link) per un file e la semplice eliminazione di un riferimento su molti. Tuttavia, da un punto di vista semantico non c'è differenza.

Se esistono più collegamenti fissi a un file, scrivere sul file usando uno di essi altera il file visto da tutti. L'utilizzo rmsu un collegamento, tuttavia, impedisce semplicemente che il file non sia accessibile tramite quel collegamento. Altri collegamenti al file continuano a vedere esattamente lo stesso file.


3
Comunemente noto come hard link.
Bob,

1
@Bob: so che il termine "collegamento reale" viene utilizzato per descrivere i riferimenti creati in un file già esistente; nei casi in cui un file non ha mai avuto più di un riferimento ad esso, quel riferimento solitario è ancora chiamato "hard link"?
supercat

3
Non c'è differenza tra i collegamenti. Crea il file A, crea il collegamento reale B, elimina il file A. B è ora un file o un collegamento reale? Per capire come funziona, è meglio vederlo come N hard link e non come 1 file e (N-1) hard link. Ci sono anche i collegamenti che esistono quando viene aperto un file.
gnasher729,

@ gnasher729: Sono d'accordo che nei casi in cui esistono più collegamenti o sono esistiti in un file, ha senso fare riferimento a tutti loro come "collegamenti fissi" se non vi è alcuna differenza semantica tra di loro. D'altra parte, penso che sia dal punto di vista semantico sia da quello delle prestazioni ci potrebbero essere dei vantaggi nel distinguere tra una voce di directory che è sempre stata l'unico riferimento a un file, rispetto a quella a cui potrebbero essere stati creati altri collegamenti reali. In ogni caso, non sapevo se sarebbe stato corretto fare riferimento alle voci della directory ", ognuna delle quali è chiamata" hard link "".
supercat

2
@supercat non è incredibilmente comune, ma è corretto. Considera il campo st_nlink("numero di collegamenti reali") in struct stat. In parole povere, le directory contengono collegamenti diretti ai file.
Hobbs
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.