Perché 666 sono le autorizzazioni predefinite per la creazione di file?


12

Come ho scoperto, quando si utilizza umask, le autorizzazioni più elevate che è possibile assegnare ai file sono 666. Il che è fatto da umask 0000. Ciò è dovuto alle autorizzazioni predefinite per la creazione di file, che sembrano essere 666 su tutti i sistemi che conosco.

So che per i file abbiamo bisogno dei diritti eseguibili per mostrare i loro contenuti.
Ma perché limitiamo le autorizzazioni predefinite per la creazione di file su 666?


Che tipo di sistema? L'unico che umaskho incontrato è stato sempre 0022, creando il permesso predefinito 644.
Manatwork

No hai frainteso. Umask utilizza le autorizzazioni di file predefinite di 666 e sottrae il proprio valore (che è 0022 per il sistema). Quindi la maggior parte dei permessi che puoi impostare è umask 0000- che limita ancora ai permessi dei file di 666. (Ma a quanto pare le cartelle usano 777)
Peter

Ti ho preso. Questa è una buona domanda.
arte

2
Non hai bisogno delle autorizzazioni eseguibili per vedere il contenuto del file. Questo è il caso delle directory, motivo per cui le directory vengono create per impostazione predefinita con autorizzazioni di esecuzione.
Joseph R.,

1
Credo [ma dovrei cercare di più per essere sicuro] che questo è di progettazione, per evitare alcuni problemi di sicurezza: senza l'accesso a "chmod", non è possibile rendere eseguibile un file. umask 0000 crea file con 0666 e directory con 0777 [che, tra l'altro, è un'impostazione predefinita piuttosto terribile, per quanto riguarda la sicurezza!]
Olivier Dulac

Risposte:


10

Per quanto ne so, questo è codificato in utility standard. Ho creato stracesia un touchnuovo file sia una mkdircreazione di una nuova directory.

La touchtraccia ha prodotto questo:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

mentre la mkdirtraccia ha prodotto questo:

mkdir("newdir", 0777)                   = 0

A corto di codifica del processo di creazione di file / directory in C, non vedo un modo per modificare le autorizzazioni predefinite. Mi sembra, tuttavia, che non rendere i file eseguibili per impostazione predefinita abbia senso: non si desidera che qualsiasi testo casuale venga erroneamente frainteso come comandi di shell.

Aggiornare

Per darvi un esempio di come i bit di autorizzazione sono codificati nelle utility standard. Ecco alcune righe rilevanti da due file nel coreutilspacchetto che contiene il codice sorgente per entrambi touch(1)e mkdir(1), tra gli altri:

mkdir.c:

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   

In altre parole, se la modalità non è specificata, impostarla su S_IRWXUGO(leggi: 0777) modificata da umask_value.

touch.c è ancora più chiaro:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Cioè, concedi le autorizzazioni di lettura e scrittura a tutti (leggi: 0666), che saranno umaskovviamente modificate dal processo di creazione del file.

Potresti essere in grado di aggirare questo solo a livello di programmazione: ad esempio durante la creazione di file all'interno di un programma C, in cui effettui chiamate di sistema direttamente o all'interno di una lingua che ti consente di effettuare un syscall di basso livello (vedi ad esempio Perl sysopensotto perldoc -f sysopen).


Hai ragione, non voglio incidenti. Ma non avere modo di cambiarlo, è terribile! I valori standard dovrebbero essere 777. E abbiamo bisogno umask filee umask dir. Impostare due diversi valori predefiniti e bene. Ma ora non ho modo di creare file con exec perms.
Peter,

1
@PeterI Bene, mkdir(1)ti offre un -mpassaggio per specificare la modalità della directory al momento della creazione. Con i file, tuttavia, poiché la creazione di file utilizza open(2)syscall, lo strumento utilizzato per creare il file è quello responsabile del passaggio dei bit di modalità opene non si ha voce in capitolo. install(1)per impostazione predefinita, copia il file in una nuova posizione e imposta i bit di esecuzione, ma ciò non avviene al momento della creazione.
Joseph R.,

Quello che stai dicendo, touchad esempio, è responsabile di impostare i giusti valori. Sai dove memorizza i valori? Forse sono impostati in tutto il sistema, quindi possiamo cambiarli? Perché voglio liberarmi ;)
Peter,

@PeterI Vedi la risposta aggiornata.
Joseph R.,

1
@PeterI ho aggiornato di nuovo la risposta. Potresti essere in grado di creare il syscall direttamente dall'interno di una C o di un'altra lingua come Perl.
Joseph R.,

6

Prima di tutto, non esiste un valore predefinito globale, le autorizzazioni dipendono dall'applicazione che crea il file. Ad esempio, questo piccolo programma C creerà un file '/ tmp / foo' con autorizzazioni 0777 se umask è 0000 (in ogni caso le autorizzazioni saranno 0777 e ~ umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

Detto questo, molte applicazioni creano file con autorizzazioni di 0666. Ciò ha due motivi:

  1. Sicurezza: non si desidera che nessun file arbitrario sia eseguibile.
  2. Convenienza: la maggior parte dei file non deve essere eseguibile. È più facile impostare il bit eseguibile su alcuni file selezionati piuttosto che annullarlo sull'enorme quantità di altri file. Ovviamente, umask 0133 risolverebbe questo problema, ma poi non si vince nulla e non si può permettere ai programmi di creare file eseguibili anche se si desidera.

1
I file vengono creati senza il bit x (esegui) impostato per motivi di sicurezza. L'esecuzione involontaria di file [cw] potrebbe essere una "cosa negativa" (tm). Il programma chmod ti dà la possibilità di (ri) impostare i bit di autorizzazione secondo necessità.
ChuckCottrill,
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.