From: Simone Piccardi Date: Wed, 8 Aug 2001 21:02:11 +0000 (+0000) Subject: Riscritti meglio guid e sgid X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=ce9c6c2650b8aeb8b5ada49220365741beff8ded Riscritti meglio guid e sgid --- diff --git a/filedir.tex b/filedir.tex index db9c352..9843aff 100644 --- a/filedir.tex +++ b/filedir.tex @@ -1,4 +1,4 @@ -\chapter{Files e directories} +\chapter{File e directory} \label{cha:files_and_dirs} In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono @@ -35,20 +35,21 @@ accesso molto pi Ad ogni file unix associa sempre l'utente che ne è proprietario (il cosiddetto \textit{owner}) e il gruppo di appartenenza, secondo il meccanismo degli identificatori di utenti e gruppi (\textsl{uid} e \textsl{gid}), e accessibili -da programm tramite i campi \var{st\_uid} e \var{st\_gid} della struttura +da programma tramite i campi \var{st\_uid} e \var{st\_gid} della struttura \var{stat} (si veda \secref{sec:filedir_stat}). Ad ogni file viene inoltre associato un insieme di permessi che sono divisi in tre classi, e cioè attribuiti rispettivamente all'utente proprietario del file, a un qualunque utente faccia parte del gruppo cui appartiene il file, e a tutti gli altri utenti. -I permessi sono espressi da un insieme di 12 bit: di questi i nove meno -significativi sono usati a gruppi di tre per indicare i permessi base di -lettura, scrittura ed esecuzione (indicati rispettivamente con le lettere -\textsl{w}, \textit{r} \textsl{x} nei comandi di sistema) applicabili -rispettivamente al proprietario, al gruppo, a tutti. I restanti tre bit -(\textsl{suid}, \textsl{sgid}, e \textsl{sticky}) sono usati per indicare -alcune caratteristiche più complesse su cui torneremo in seguito (vedi +I permessi, così come vengono presi dai comandi e dalle routine di sistema +sono espressi da un numero di 12 bit; di questi i nove meno significativi sono +usati a gruppi di tre per indicare i permessi base di lettura, scrittura ed +esecuzione (indicati rispettivamente con le lettere \textsl{w}, \textit{r} +\textsl{x} nei comandi di sistema) applicabili rispettivamente al +proprietario, al gruppo, a tutti. I restanti tre bit (\textsl{suid}, +\textsl{sgid}, e \textsl{sticky}) sono usati per indicare alcune +caratteristiche più complesse su cui torneremo in seguito (vedi \secref{sec:filedir_suid_sgid} e \secref{sec:filedir_sticky}). Anche i permessi sono tenuti per ciascun file (di qualunque tipo, quindi anche @@ -61,9 +62,9 @@ In genere ci si riferisce a questi permessi usando le lettere \textsl{u} (per \textit{user}), \textsl{g} (per \textit{group}) e \textsl{o} (per \textit{other}), inoltre se si vuole indicare tutti questi gruppi insieme si usa la lettera \textsl{a} (per \textit{all}). Si tenga ben presente questa -distinzione, dato che in certi casi, mutuando la termimologia in uso nel VMS, +distinzione, dato che in certi casi, mutuando la terminologia in uso nel VMS, si parla dei permessi base come di permessi di owner, group ed all, le cui -iniziali possono da luogo a confuzione. Le costanti che permettono di accedere +iniziali possono da luogo a confusione. Le costanti che permettono di accedere al valore numerico di questi bit sono riportate in \ntab. \begin{table}[htb] @@ -191,44 +192,66 @@ permessi per il gruppo non vengono neanche controllati; lo stesso vale se il processo appartiene ad un gruppo appropriato, in questo caso i permessi per tutti gli altri non vengono controllati. -\subsection{I flag \texttt{suid} e \texttt{sgid}} +\subsection{I flag \textsl{suid} e \textsl{sgid}} \label{sec:filedir_suid_sgid} -Quandi si lancia un programma in genere l'\textit{effective user id} e -l'\textit{effective group id} sono settati rispettivamente all'uid e al gid -dell'utente che ha lanciato il programma. - - -Ma nei dodici bit del campo \var{st\_mode} relativi ai permessi esiste un bit -speciale, il \textit{set-user-ID bit} o suid, che se settato fa si che quando -un programma viene lanciato invece di avere assegnato come \textit{effective - user id} l'uid di chi lo lancia, assume quello del proprietario del file. -Analogamente il \textit{set-group-ID bit} o sgid settato per un file ha lo -stesso effetto sull'\textit{effective group id}. - -Questa caratteristica viene usata per permettere agli utenti normali di usare -programmi che abbisognano di privilegi speciali; l'esempio classico è il -comando \cmd{passwd} che ha la necessità di modificare il file delle password, -che può essere scritto solo dall'amministratore. Per questo il comando -\cmd{passwd} appartiene a root e ha il suid bit settato per cui quando viene -lanciato da un utente normale ha comunque i privilegi di root. +Come si è accennato (in \secref{sec:filedir_perm_overview}) nei dodici bit del +campo \var{st\_mode} usati per il controllo di accesso oltre ai bit dei +permessi veri e propri, ci sono altri tre bit che vengono usati per indicare +alcune proprietà speciali dei file. Due di questi sono i bit detti +\textsl{suid} e \textsl{sgid}. + +Come spiegato in dettaglio in \secref{sec:prochand_exec}, quando si lancia un +programma il comportamendo normale del kernel è quello di settare +l'\textit{effective user id} e l'\textit{effective group id} del nuovo +processo all'uid e al gid del processo corrente, che corrispondono dell'utente +con cui si è entrati nel sistema. + +Se però il file del programma (che ovviamente deve essere eseguibile) ha il +bit \textsl{suid} (o \textit{set-user-ID bit}) settato al posto dell'uid del +processo originario il kernel assegnerà come \textit{effective user id} al +nuovo processo l'uid del proprietario del file. Analogamente avere il bit +\textsl{sgid} (o \textit{set-group-ID bit}) settato ha lo stesso effetto +sull'\textit{effective group id}. + +I bit \textsl{suid} e \textsl{sgid} vengono usati per permettere agli utenti +normali di usare programmi che abbisognano di privilegi speciali; l'esempio +classico è il comando \cmd{passwd} che ha la necessità di modificare il file +delle password, quest'ultimo ovviamente può essere scritto solo +dall'amministratore, ma non è necessairo chiamare l'amministratore per +cambiare la propria pasword. Infatti il comando \cmd{passwd} appartiene a root +ma ha il suid bit settato per cui quando viene lanciato da un utente normale +parte con i privilegi di root. Chiaramente avere un processo che ha privilegi superiori a quelli che avrebbe -normalmente un utente comporta vari rischi, e questo tipo di programmi devono -essere scritti accuratamente (torneremo sull'argomento in +normalmente l'utente che lo ha lanciato comporta vari rischi, e questo tipo di +programmi devono essere scritti accuratamente (torneremo sull'argomento in \secref{sec:prochand_perms}). I due bit suid e sgid possono essere controllati all'interno di \var{st\_mode} con l'uso delle due costanti \macro{S\_ISUID} e \macro{S\_ISGID}, definite in -\tabref{tab:filedir_file_mode_flags}. +\tabref{tab:filedir_file_mode_flags}. I file possono essere identificati con +il comando \cmd{ls -l} in quanto presentano la lettera \cmd{s} al posto della +\cmd{x} in corrispondenza dei permessi di utente o gruppo. La stessa lettera +\cmd{s} può essere usata nel comando \cmd{chmod} per settare questi bit. + +Gli stessi bit vengono ad assumere in significato completamente diverso per le +directory, in questo caso infatti linux usa la convezione di SVR4 per indicare +con questi bit l'uso della semantica BSD nella creazione di nuovi file +(si veda \secref{sec:filedir_ownership}). + +Infine il caso in cui il file abbia il bit \textsl{sgid} settato ma non il +corrispondente bit per l'esecuzione viene utilizzato per attivare per quel +file il \textit{mandatory locking} (argomento affrontato nei dettagli in +\secref{sec:xxx_mandatory_lock}). \subsection{Il flag \texttt{sticky}} \label{sec:filedir_sticky} -L'ultimo +L'ultimo -\subsection{La titolarità di nuovi files e directory} +\subsection{La titolarità di nuovi file e directory} \label{sec:filedir_ownership} @@ -266,7 +289,7 @@ nell'inode. Vedremo in questa sezione come sia possibile accedervi usando la funzione \texttt{stat} ed esamineremo alcune funzioni utilizzabili per manipolare una parte di questa informazione. Tutto quello che invece riguarda il meccanismo di controllo di accesso ad i file e le relative funzioni di -manipolazione sarà invece esaminanto in \secref{sec:filedir_access_control}. +manipolazione sarà invece esaminato in \secref{sec:filedir_access_control}. \subsection{Le funzioni \texttt{stat}, \texttt{fstat} e \texttt{lstat}} @@ -439,7 +462,7 @@ poi si effettua il confronto con la combinazione di tipi scelta. \subsection{La dimensione dei file} \label{sec:filedir_file_size} -Il membro \var{st\_size} contiene la dimensione del file in bytes (se il file +Il membro \var{st\_size} contiene la dimensione del file in byte (se il file è un file normale, nel caso di un link simbolico al dimensione è quella del pathname che contiene). @@ -773,7 +796,7 @@ effettua con la funzione \texttt{unlink}; il suo prototipo (valore specifico ritornato da linux che non consente l'uso di \texttt{unlink} con le directory, e non conforme allo standard POSIX, che prescrive invece l'uso di \texttt{EPERM} in caso l'operazione non sia - consnetita o il processo non abbia privilegi sufficienti). + consentita o il processo non abbia privilegi sufficienti). \item \texttt{EROFS} \var{pathname} è su un filesystem montato in sola lettura. \item \texttt{EISDIR} \var{pathname} fa riferimento a una directory. @@ -913,7 +936,7 @@ dichiarate nell'header file \texttt{unistd.h}. La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore. La variabile \texttt{errno} viene settata secondo i codici di - errore standard di accesso ai files (trattati in dettaglio in + errore standard di accesso ai file (trattati in dettaglio in \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti: \begin{errlist} \item \texttt{EEXIST} Un file (o una directory) con quel nome esiste di @@ -992,7 +1015,7 @@ link simbolico e quali possono operare direttamente sul suo contenuto. \end{table} si noti che non si è specificato il comportamento delle funzioni che operano con i file descriptor, in quanto la gestione del link simbolico viene in -genere effttuata dalla funzione che restituisce il file descriptor +genere effettuata dalla funzione che restituisce il file descriptor (normalmente la \func{open}). \begin{figure}[htb] @@ -1049,7 +1072,7 @@ programma deve includere il file \texttt{sys/types.h}. La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore \texttt{errno} viene settata secondo i codici di errore standard - di accesso ai files (trattati in dettaglio in + di accesso ai file (trattati in dettaglio in \secref{sec:filedir_access_control}) ai quali si aggiungono i seguenti: \begin{errlist} \item \texttt{EACCESS} @@ -1159,7 +1182,7 @@ per cambiare directory di lavoro. Entrambe le funzioni restituiscono zero in caso di successo e -1 per un errore, in caso di errore \texttt{errno} viene settata secondo i codici di - errore standard di accesso ai files (trattati in dettaglio in + errore standard di accesso ai file (trattati in dettaglio in \secref{sec:filedir_access_control}) ai quali si aggiunge il codice \texttt{ENOTDIR} nel caso il \texttt{filename} indichi un file che non sia una directory.