X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=2ca508fd36d222356e6536dff9734594232127bd;hb=260bf7cea27648dc1d5a81b55b996fc4f710e507;hp=d2f2de6bbd92945ea106ef065ce4e4c0984ab1d8;hpb=70860564e1de946ab8d681bb41c601ba77721709;p=gapil.git diff --git a/filedir.tex b/filedir.tex index d2f2de6..2ca508f 100644 --- a/filedir.tex +++ b/filedir.tex @@ -79,8 +79,8 @@ suole chiamare questo tipo di associazione un collegamento diretto (o \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore nel qual caso \var{errno} viene impostata ai valori: \begin{errlist} - \item[\errcode{EXDEV}] \param{oldpath} e \param{newpath} non sono sullo - stesso filesystem. + \item[\errcode{EXDEV}] i file \param{oldpath} e \param{newpath} non sono + sullo stesso filesystem. \item[\errcode{EPERM}] il filesystem che contiene \param{oldpath} e \param{newpath} non supporta i link diretti o è una directory. \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di @@ -256,7 +256,7 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di \param{oldpath} o più in generale si è cercato di creare una directory come sotto-directory di se stessa. - \item[\errcode{ENOTDIR}] Uno dei componenti dei \itindex{pathname} + \item[\errcode{ENOTDIR}] uno dei componenti dei \itindex{pathname} \textit{pathname} non è una directory o \param{oldpath} è una directory e \param{newpath} esiste e non è una directory. \end{errlist} @@ -430,10 +430,9 @@ buffer, e lo richiude. Si tenga presente che la funzione non termina la stringa con un carattere nullo e la tronca alla dimensione specificata da \param{size} per evitare di sovrascrivere oltre le dimensioni del buffer. - \begin{figure}[htb] \centering - \includegraphics[width=8cm]{img/link_loop} + \includegraphics[width=8.5cm]{img/link_loop} \caption{Esempio di loop nel filesystem creato con un link simbolico.} \label{fig:file_link_loop} \end{figure} @@ -487,10 +486,10 @@ ci mostrerebbe invece l'esistenza di \file{temporaneo}. Benché in sostanza le directory non siano altro che dei file contenenti elenchi di nomi ed \index{inode} inode, non è possibile trattarle come file ordinari e devono essere create direttamente dal kernel attraverso una -opportuna system call.\footnote{questo permette anche, attraverso l'uso del - VFS, l'utilizzo di diversi formati per la gestione dei suddetti elenchi.} -La funzione usata per creare una directory è \funcd{mkdir}, ed il suo -prototipo è: +opportuna system call.\footnote{questo è quello che permette anche, attraverso + l'uso del VFS, l'utilizzo di diversi formati per la gestione dei suddetti + elenchi.} La funzione usata per creare una directory è \funcd{mkdir}, ed il +suo prototipo è: \begin{functions} \headdecl{sys/stat.h} \headdecl{sys/types.h} @@ -501,18 +500,17 @@ prototipo \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EEXIST}] Un file (o una directory) con quel nome esiste di + \item[\errcode{EEXIST}] un file (o una directory) con quel nome esiste di già. - \item[\errcode{EACCES}] - Non c'è il permesso di scrittura per la directory in cui si vuole inserire - la nuova directory. - \item[\errcode{EMLINK}] La directory in cui si vuole creare la nuova - directory contiene troppi file. Sotto Linux questo normalmente non avviene + \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory in + cui si vuole inserire la nuova directory. + \item[\errcode{EMLINK}] la directory in cui si vuole creare la nuova + directory contiene troppi file; sotto Linux questo normalmente non avviene perché il filesystem standard consente la creazione di un numero di file maggiore di quelli che possono essere contenuti nel disco, ma potendo avere a che fare anche con filesystem di altri sistemi questo errore può presentarsi. - \item[\errcode{ENOSPC}] Non c'è abbastanza spazio sul file system per creare + \item[\errcode{ENOSPC}] non c'è abbastanza spazio sul file system per creare la nuova directory o si è esaurita la quota disco dell'utente. \end{errlist} ed inoltre anche \errval{EPERM}, \errval{EFAULT}, \errval{ENAMETOOLONG}, @@ -521,44 +519,46 @@ prototipo \end{functions} La funzione crea una nuova directory vuota, che contiene cioè solo le due voci -standard (\file{.} e \file{..}), con il nome indicato dall'argomento -\param{dirname}. Il nome può essere indicato sia come \itindex{pathname} -\textit{pathname} assoluto che relativo. - -I permessi di accesso alla directory (vedi sez.~\ref{sec:file_access_control}) -sono specificati da \param{mode}, i cui possibili valori sono riportati in -tab.~\ref{tab:file_permission_const}; questi sono modificati dalla maschera di -creazione dei file (si veda sez.~\ref{sec:file_perm_management}). La -titolarità della nuova directory è impostata secondo quanto riportato in +standard presenti in ogni directory (cioè ``\file{.}'' e ``\file{..}''), con +il nome indicato dall'argomento \param{dirname}. Il nome può essere indicato +sia come \itindex{pathname} \textit{pathname} assoluto che come +\itindex{pathname} \textit{pathname} relativo. + +I permessi di accesso (vedi sez.~\ref{sec:file_access_control}) con cui la +directory viene creata sono specificati dall'argomento \param{mode}, i cui +possibili valori sono riportati in tab.~\ref{tab:file_permission_const}; si +tenga presente che questi sono modificati dalla maschera di creazione dei file +(si veda sez.~\ref{sec:file_perm_management}). La titolarità della nuova +directory è impostata secondo quanto riportato in sez.~\ref{sec:file_ownership_management}. -La funzione per la cancellazione di una directory è \funcd{rmdir}, il suo -prototipo è: +La funzione che permette la cancellazione di una directory è invece +\funcd{rmdir}, ed il suo prototipo è: \begin{prototype}{sys/stat.h}{int rmdir(const char *dirname)} Cancella una directory. \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EPERM}] Il filesystem non supporta la cancellazione di + \item[\errcode{EPERM}] il filesystem non supporta la cancellazione di directory, oppure la directory che contiene \param{dirname} ha lo \itindex{sticky~bit} \textit{sticky bit} impostato e l'user-ID effettivo del processo non corrisponde al proprietario della directory. - \item[\errcode{EACCES}] Non c'è il permesso di scrittura per la directory + \item[\errcode{EACCES}] non c'è il permesso di scrittura per la directory che contiene la directory che si vuole cancellare, o non c'è il permesso di attraversare (esecuzione) una delle directory specificate in \param{dirname}. - \item[\errcode{EBUSY}] La directory specificata è la directory di lavoro o la + \item[\errcode{EBUSY}] la directory specificata è la directory di lavoro o la radice di qualche processo. - \item[\errcode{ENOTEMPTY}] La directory non è vuota. + \item[\errcode{ENOTEMPTY}] la directory non è vuota. \end{errlist} ed inoltre anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOTDIR}, \errval{ENOMEM}, \errval{ELOOP}, \errval{EROFS}.} \end{prototype} La funzione cancella la directory \param{dirname}, che deve essere vuota (la -directory deve cioè contenere soltanto le due voci standard \file{.} e -\file{..}). Il nome può essere indicato con il \itindex{pathname} +directory deve cioè contenere soltanto le due voci standard ``\file{.}'' e +``\file{..}''). Il nome può essere indicato con il \itindex{pathname} \textit{pathname} assoluto o relativo. La modalità con cui avviene la cancellazione è analoga a quella di @@ -566,8 +566,8 @@ La modalit directory non diventa nullo e nessun processo ha la directory aperta lo spazio occupato su disco non viene rilasciato. Se un processo ha la directory aperta la funzione rimuove il link \index{inode} all'inode e nel caso sia l'ultimo, -pure le voci standard \file{.} e \file{..}, a questo punto il kernel non -consentirà di creare più nuovi file nella directory. +pure le voci standard ``\file{.}'' e ``\file{..}'', a questo punto il kernel +non consentirà di creare più nuovi file nella directory. \subsection{La creazione di file speciali} @@ -595,10 +595,10 @@ di queste funzioni \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EPERM}] Non si hanno privilegi sufficienti a creare l'inode, o + \item[\errcode{EPERM}] non si hanno privilegi sufficienti a creare l'inode, o il filesystem su cui si è cercato di creare \param{pathname} non supporta l'operazione. - \item[\errcode{EINVAL}] Il valore di \param{mode} non indica un file, una + \item[\errcode{EINVAL}] il valore di \param{mode} non indica un file, una fifo o un dispositivo. \item[\errcode{EEXIST}] \param{pathname} esiste già o è un link simbolico. \end{errlist} @@ -612,7 +612,7 @@ creare file regolari e fifo; l'argomento \param{mode} specifica il tipo di file che si vuole creare ed i relativi permessi, secondo i valori riportati in tab.~\ref{tab:file_mode_flags}, che vanno combinati con un OR binario. I permessi sono comunque modificati nella maniera usuale dal valore di -\var{umask} (si veda sez.~\ref{sec:file_perm_management}). +\itindex{umask} \textit{umask} (si veda sez.~\ref{sec:file_perm_management}). Per il tipo di file può essere specificato solo uno fra: \const{S\_IFREG} per un file regolare (che sarà creato vuoto), \const{S\_IFBLK} per un dispositivo @@ -652,7 +652,7 @@ sez.~\ref{sec:ipc_named_pipe}) lo standard POSIX specifica l'uso della funzione La funzione crea la fifo \param{pathname} con i permessi \param{mode}. Come per \func{mknod} il file \param{pathname} non deve esistere (neanche come link simbolico); al solito i permessi specificati da \param{mode} vengono -modificati dal valore di \var{umask}. +modificati dal valore di \itindex{umask} \textit{umask}. @@ -775,16 +775,16 @@ struttura precedentemente allocata e specificata dall'argomento \param{entry} (anche se non è assicurato che la funzione usi lo spazio fornito dall'utente). I vari campi di \struct{dirent} contengono le informazioni relative alle voci -presenti nella directory; sia BSD che SVr4\footnote{POSIX prevede invece solo - la presenza del campo \var{d\_fileno}, identico \var{d\_ino}, che in Linux è - definito come alias di quest'ultimo. Il campo \var{d\_name} è considerato - dipendente dall'implementazione.} prevedono che siano sempre presenti il -campo \var{d\_name}, che contiene il nome del file nella forma di una stringa -terminata da uno zero,\footnote{lo standard POSIX non specifica una lunghezza, - ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del campo è - definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 byte - usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero di -\index{inode} inode cui il file è associato (di solito corrisponde al campo +presenti nella directory; sia BSD che SVr4\footnote{lo standard POSIX prevede + invece solo la presenza del campo \var{d\_fileno}, identico \var{d\_ino}, + che in Linux è definito come alias di quest'ultimo. Il campo \var{d\_name} è + considerato dipendente dall'implementazione.} prevedono che siano sempre +presenti il campo \var{d\_name}, che contiene il nome del file nella forma di +una stringa terminata da uno zero,\footnote{lo standard POSIX non specifica + una lunghezza, ma solo un limite \const{NAME\_MAX}; in SVr4 la lunghezza del + campo è definita come \code{NAME\_MAX+1} che di norma porta al valore di 256 + byte usato anche in Linux.} ed il campo \var{d\_ino}, che contiene il numero +di \index{inode} inode cui il file è associato (di solito corrisponde al campo \var{st\_ino} di \struct{stat}). \begin{figure}[!htb] @@ -809,16 +809,16 @@ il nome del relativo campo; nel nostro caso sono definite le macro \footnotesize \begin{tabular}[c]{|l|l|} \hline - \textbf{Valore} & \textbf{Significato} \\ + \textbf{Valore} & \textbf{Tipo di file} \\ \hline \hline - \const{DT\_UNKNOWN} & tipo sconosciuto. \\ - \const{DT\_REG} & file normale. \\ - \const{DT\_DIR} & directory. \\ - \const{DT\_FIFO} & fifo. \\ - \const{DT\_SOCK} & socket. \\ - \const{DT\_CHR} & dispositivo a caratteri. \\ - \const{DT\_BLK} & dispositivo a blocchi. \\ + \const{DT\_UNKNOWN} & Tipo sconosciuto.\\ + \const{DT\_REG} & File normale.\\ + \const{DT\_DIR} & Directory.\\ + \const{DT\_FIFO} & Fifo.\\ + \const{DT\_SOCK} & Socket.\\ + \const{DT\_CHR} & Dispositivo a caratteri.\\ + \const{DT\_BLK} & Dispositivo a blocchi.\\ \hline \end{tabular} \caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type} @@ -1083,11 +1083,11 @@ prototipo \val{NULL} se fallisce, in quest'ultimo caso la variabile \var{errno} è impostata con i seguenti codici di errore: \begin{errlist} - \item[\errcode{EINVAL}] L'argomento \param{size} è zero e \param{buffer} non + \item[\errcode{EINVAL}] l'argomento \param{size} è zero e \param{buffer} non è nullo. - \item[\errcode{ERANGE}] L'argomento \param{size} è più piccolo della + \item[\errcode{ERANGE}] l'argomento \param{size} è più piccolo della lunghezza del \textit{pathname}. - \item[\errcode{EACCES}] Manca il permesso di lettura o di ricerca su uno dei + \item[\errcode{EACCES}] manca il permesso di lettura o di ricerca su uno dei componenti del \textit{pathname} (cioè su una delle directory superiori alla corrente). \end{errlist}} @@ -1134,8 +1134,8 @@ Per cambiare la directory di lavoro si pu \bodydesc{La funzione restituisce 0 in caso di successo e -1 per un errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{ENOTDIR}] Non si è specificata una directory. - \item[\errcode{EACCES}] Manca il permesso di ricerca su uno dei componenti + \item[\errcode{ENOTDIR}] non si è specificata una directory. + \item[\errcode{EACCES}] manca il permesso di ricerca su uno dei componenti di \param{path}. \end{errlist} ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, @@ -1241,8 +1241,8 @@ POSIX definisce la funzione \funcd{tmpfile}, il cui prototipo temporaneo in caso di successo e \val{NULL} in caso di errore, nel qual caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EINTR}] La funzione è stata interrotta da un segnale. - \item[\errcode{EEXIST}] Non è stato possibile generare un nome univoco. + \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale. + \item[\errcode{EEXIST}] non è stato possibile generare un nome univoco. \end{errlist} ed inoltre \errval{EFAULT}, \errval{EMFILE}, \errval{ENFILE}, \errval{ENOSPC}, \errval{EROFS} e \errval{EACCES}.} @@ -1399,6 +1399,7 @@ Si noti come i vari membri della struttura siano specificati come tipi primitivi del sistema (di quelli definiti in tab.~\ref{tab:intro_primitive_types}, e dichiarati in \file{sys/types.h}). +% TODO: aggiornare con i cambiamenti ai tempi fatti con il 2.6 \subsection{I tipi di file} \label{sec:file_types} @@ -1423,13 +1424,13 @@ riportato in tab.~\ref{tab:file_type_macro}. \textbf{Macro} & \textbf{Tipo del file} \\ \hline \hline - \macro{S\_ISREG(m)} & file regolare \\ - \macro{S\_ISDIR(m)} & directory \\ - \macro{S\_ISCHR(m)} & dispositivo a caratteri \\ - \macro{S\_ISBLK(m)} & dispositivo a blocchi\\ - \macro{S\_ISFIFO(m)} & fifo \\ - \macro{S\_ISLNK(m)} & link simbolico \\ - \macro{S\_ISSOCK(m)} & socket \\ + \macro{S\_ISREG(m)} & file normale.\\ + \macro{S\_ISDIR(m)} & directory.\\ + \macro{S\_ISCHR(m)} & dispositivo a caratteri.\\ + \macro{S\_ISBLK(m)} & dispositivo a blocchi.\\ + \macro{S\_ISFIFO(m)} & fifo.\\ + \macro{S\_ISLNK(m)} & link simbolico.\\ + \macro{S\_ISSOCK(m)} & socket.\\ \hline \end{tabular} \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h}).} @@ -1456,33 +1457,33 @@ un'opportuna combinazione. \textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{S\_IFMT} & 0170000 & maschera per i bit del tipo di file \\ - \const{S\_IFSOCK} & 0140000 & socket \\ - \const{S\_IFLNK} & 0120000 & link simbolico \\ - \const{S\_IFREG} & 0100000 & file regolare \\ - \const{S\_IFBLK} & 0060000 & dispositivo a blocchi \\ - \const{S\_IFDIR} & 0040000 & directory \\ - \const{S\_IFCHR} & 0020000 & dispositivo a caratteri \\ - \const{S\_IFIFO} & 0010000 & fifo \\ + \const{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\ + \const{S\_IFSOCK} & 0140000 & Socket.\\ + \const{S\_IFLNK} & 0120000 & Link simbolico.\\ + \const{S\_IFREG} & 0100000 & File regolare.\\ + \const{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\ + \const{S\_IFDIR} & 0040000 & Directory.\\ + \const{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\ + \const{S\_IFIFO} & 0010000 & Fifo.\\ \hline - \const{S\_ISUID} & 0004000 & set UID bit \itindex{suid~bit} \\ - \const{S\_ISGID} & 0002000 & set GID bit \itindex{sgid~bit} \\ - \const{S\_ISVTX} & 0001000 & sticky bit \itindex{sticky~bit}\\ + \const{S\_ISUID} & 0004000 & Set UID bit \itindex{suid~bit}.\\ + \const{S\_ISGID} & 0002000 & Set GID bit \itindex{sgid~bit}.\\ + \const{S\_ISVTX} & 0001000 & Sticky bit \itindex{sticky~bit}.\\ \hline -% \const{S\_IRWXU} & 00700 & bitmask per i permessi del proprietario \\ - \const{S\_IRUSR} & 00400 & il proprietario ha permesso di lettura \\ - \const{S\_IWUSR} & 00200 & il proprietario ha permesso di scrittura \\ - \const{S\_IXUSR} & 00100 & il proprietario ha permesso di esecuzione\\ +% \const{S\_IRWXU} & 00700 & Bitmask per i permessi del proprietario.\\ + \const{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\ + \const{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\ + \const{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\ \hline -% \const{S\_IRWXG} & 00070 & bitmask per i permessi del gruppo \\ - \const{S\_IRGRP} & 00040 & il gruppo ha permesso di lettura \\ - \const{S\_IWGRP} & 00020 & il gruppo ha permesso di scrittura \\ - \const{S\_IXGRP} & 00010 & il gruppo ha permesso di esecuzione \\ +% \const{S\_IRWXG} & 00070 & Bitmask per i permessi del gruppo.\\ + \const{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\ + \const{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\ + \const{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\ \hline -% \const{S\_IRWXO} & 00007 & bitmask per i permessi di tutti gli altri\\ - \const{S\_IROTH} & 00004 & gli altri hanno permesso di lettura \\ - \const{S\_IWOTH} & 00002 & gli altri hanno permesso di esecuzione \\ - \const{S\_IXOTH} & 00001 & gli altri hanno permesso di esecuzione \\ +% \const{S\_IRWXO} & 00007 & Bitmask per i permessi di tutti gli altri\\ + \const{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\ + \const{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\ + \const{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\ \hline \end{tabular} \caption{Costanti per l'identificazione dei vari bit che compongono il campo @@ -1557,7 +1558,7 @@ dimensione si possono usare le due funzioni \funcd{truncate} e \item[\errcode{EACCES}] il file non ha permesso di scrittura o non si ha il permesso di esecuzione una delle directory del \itindex{pathname} \textit{pathname}. - \item[\errcode{ETXTBSY}] Il file è un programma in esecuzione. + \item[\errcode{ETXTBSY}] il file è un programma in esecuzione. \end{errlist} ed anche \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{EROFS}, \errval{EIO}, \errval{EFAULT}, \errval{ELOOP}.} @@ -1590,12 +1591,12 @@ funzioni che effettuano cambiamenti su di essi. & \textbf{Opzione di \cmd{ls}} \\ \hline \hline - \var{st\_atime}& ultimo accesso ai dati del file &\func{read}, - \func{utime} & \cmd{-u}\\ - \var{st\_mtime}& ultima modifica ai dati del file &\func{write}, - \func{utime} & default\\ - \var{st\_ctime}& ultima modifica ai dati dell'inode&\func{chmod}, - \func{utime} & \cmd{-c} \\ + \var{st\_atime}& ultimo accesso ai dati del file & + \func{read}, \func{utime} & \cmd{-u}\\ + \var{st\_mtime}& ultima modifica ai dati del file & + \func{write}, \func{utime} & default\\ + \var{st\_ctime}& ultima modifica ai dati dell'inode & + \func{chmod}, \func{utime} & \cmd{-c}\\ \hline \end{tabular} \caption{I tre tempi associati a ciascun file.} @@ -1643,47 +1644,54 @@ tempo). \hline \hline \func{chmod}, \func{fchmod} - & -- & -- &$\bullet$& -- & -- & -- & \\ + & -- & -- &$\bullet$& -- & -- & -- &\\ \func{chown}, \func{fchown} - & -- & -- &$\bullet$& -- & -- & -- & \\ + & -- & -- &$\bullet$& -- & -- & -- &\\ + \func{creat} + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& + con \const{O\_CREATE} \\ \func{creat} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& con - \const{O\_CREATE} \\ \func{creat} - & -- &$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& - con \const{O\_TRUNC} \\ \func{exec} - &$\bullet$& -- & -- & -- & -- & -- & \\ + & -- &$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& + con \const{O\_TRUNC} \\ + \func{exec} + &$\bullet$& -- & -- & -- & -- & -- &\\ \func{lchown} - & -- & -- &$\bullet$& -- & -- & -- & \\ + & -- & -- &$\bullet$& -- & -- & -- &\\ \func{link} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& \\ + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{mkdir} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& \\ + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{mkfifo} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& \\ + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{open} - &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& con - \const{O\_CREATE} \\ \func{open} - & -- &$\bullet$&$\bullet$& -- & -- & -- & con - \const{O\_TRUNC} \\ \func{pipe} - &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- & \\ + &$\bullet$&$\bullet$&$\bullet$& -- &$\bullet$&$\bullet$& + con \const{O\_CREATE} \\ + \func{open} + & -- &$\bullet$&$\bullet$& -- & -- & -- & + con \const{O\_TRUNC} \\ + \func{pipe} + &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- &\\ \func{read} - &$\bullet$& -- & -- & -- & -- & -- & \\ + &$\bullet$& -- & -- & -- & -- & -- &\\ + \func{remove} + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& + se esegue \func{unlink}\\ \func{remove} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& se esegue - \func{unlink}\\ \func{remove} - & -- & -- & -- & -- &$\bullet$&$\bullet$& se esegue - \func{rmdir}\\ \func{rename} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& per entrambi - gli argomenti\\ \func{rmdir} - & -- & -- & -- & -- &$\bullet$&$\bullet$& \\ + & -- & -- & -- & -- &$\bullet$&$\bullet$& + se esegue \func{rmdir}\\ + \func{rename} + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& + per entrambi gli argomenti\\ + \func{rmdir} + & -- & -- & -- & -- &$\bullet$&$\bullet$&\\ \func{truncate}, \func{ftruncate} - & -- &$\bullet$&$\bullet$& -- & -- & -- & \\ + & -- &$\bullet$&$\bullet$& -- & -- & -- &\\ \func{unlink} - & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$& \\ + & -- & -- &$\bullet$& -- &$\bullet$&$\bullet$&\\ \func{utime} - &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- & \\ + &$\bullet$&$\bullet$&$\bullet$& -- & -- & -- &\\ \func{write} - & -- &$\bullet$&$\bullet$& -- & -- & -- & \\ + & -- &$\bullet$&$\bullet$& -- & -- & -- &\\ \hline \end{tabular} \caption{Prospetto dei cambiamenti effettuati sui tempi di ultimo @@ -1777,7 +1785,7 @@ realizzare. Una delle caratteristiche fondamentali di tutti i sistemi unix-like è quella del controllo di accesso ai file, che viene implementato per qualunque filesystem standard.\footnote{per standard si intende che implementa le - caratteristiche previste dallo standard POSIX. In Linux sono disponibili + caratteristiche previste dallo standard POSIX; in Linux sono disponibili anche una serie di altri filesystem, come quelli di Windows e del Mac, che non supportano queste caratteristiche.} In questa sezione ne esamineremo i concetti essenziali e le funzioni usate per gestirne i vari aspetti. @@ -1791,7 +1799,7 @@ cosiddetto \textit{owner}) ed un gruppo di appartenenza, secondo il meccanismo degli identificatori di utente e gruppo (\acr{uid} e \acr{gid}). Questi valori sono accessibili da programma tramite la funzione \func{stat}, e sono mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura -\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{Questo è vero solo +\struct{stat} (si veda sez.~\ref{sec:file_stat}).\footnote{questo è vero solo per filesystem di tipo Unix, ad esempio non è vero per il filesystem vfat di Windows, che non fornisce nessun supporto per l'accesso multiutente, e per il quale i permessi vengono assegnati in maniera fissa con un opzione in @@ -1800,12 +1808,12 @@ mantenuti nei campi \var{st\_uid} e \var{st\_gid} della struttura Il controllo di accesso ai file segue un modello abbastanza semplice che prevede tre permessi fondamentali strutturati su tre livelli di accesso. Esistono varie estensioni a questo modello,\footnote{come le \textit{Access - Control List} che possono essere aggiunte al filesystem standard con - opportune patch, la cui introduzione nei kernel ufficiali è iniziata con la - serie 2.5.x. per arrivare a meccanismi di controllo ancora più sofisticati - come il \textit{mandatory access control} di SE-Linux.} ma nella maggior -parte dei casi il meccanismo standard è più che sufficiente a soddisfare tutte -le necessità più comuni. I tre permessi di base associati ad ogni file sono: + Control List} che sono state aggiunte ai filesystem standard con opportune + estensioni (vedi sez.~\ref{sec:file_ACL}) per arrivare a meccanismi di + controllo ancora più sofisticati come il \textit{mandatory access control} + di SE-Linux.} ma nella maggior parte dei casi il meccanismo standard è più +che sufficiente a soddisfare tutte le necessità più comuni. I tre permessi di +base associati ad ogni file sono: \begin{itemize*} \item il permesso di lettura (indicato con la lettera \texttt{r}, dall'inglese \textit{read}). @@ -1865,17 +1873,17 @@ che permettono di accedere al valore numerico di questi bit nel campo \textbf{\var{st\_mode}} bit & \textbf{Significato} \\ \hline \hline - \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere \\ - \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere \\ - \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire \\ - \hline - \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere \\ - \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere \\ - \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire\\ - \hline - \const{S\_IROTH} & \textit{other-read}, tutti possono leggere \\ - \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere \\ - \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire\\ + \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\ + \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\ + \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\ + \hline + \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\ + \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\ + \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\ + \hline + \const{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\ + \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\ + \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\ \hline \end{tabular} \caption{I bit dei permessi di accesso ai file, come definiti in @@ -1962,7 +1970,7 @@ di accesso sono i seguenti: del file) allora: \begin{itemize*} \item se il relativo\footnote{per relativo si intende il bit di user-read se - il processo vuole accedere in scrittura, quello di user-write per + il processo vuole accedere in lettura, quello di user-write per l'accesso in scrittura, ecc.} bit dei permessi d'accesso dell'utente è impostato, l'accesso è consentito \item altrimenti l'accesso è negato @@ -1974,7 +1982,7 @@ di accesso sono i seguenti: consentito, \item altrimenti l'accesso è negato \end{itemize*} -\item se il bit dei permessi d'accesso per tutti gli altri è impostato, +\item Se il bit dei permessi d'accesso per tutti gli altri è impostato, l'accesso è consentito, altrimenti l'accesso è negato. \end{enumerate} @@ -2159,10 +2167,10 @@ contrario (o di errore) ritorna -1. \textbf{\param{mode}} & \textbf{Significato} \\ \hline \hline - \const{R\_OK} & verifica il permesso di lettura \\ - \const{W\_OK} & verifica il permesso di scritture \\ - \const{X\_OK} & verifica il permesso di esecuzione \\ - \const{F\_OK} & verifica l'esistenza del file \\ + \const{R\_OK} & Verifica il permesso di lettura. \\ + \const{W\_OK} & Verifica il permesso di scrittura. \\ + \const{X\_OK} & Verifica il permesso di esecuzione. \\ + \const{F\_OK} & Verifica l'esistenza del file. \\ \hline \end{tabular} \caption{Valori possibile per l'argomento \param{mode} della funzione @@ -2175,6 +2183,8 @@ eseguendo un programma coi privilegi di un altro utente (ad esempio attraverso l'uso del \itindex{suid~bit} \textit{suid bit}) che vuole controllare se l'utente originale ha i permessi per accedere ad un certo file. +% TODO documentare euidaccess (e eaccess) + Per cambiare i permessi di un file il sistema mette ad disposizione due funzioni \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente su un filename e su un file descriptor, i loro prototipi sono: @@ -2191,9 +2201,9 @@ filename e su un file descriptor, i loro prototipi sono: \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item[\errcode{EPERM}] L'user-ID effettivo non corrisponde a quello del + \item[\errcode{EPERM}] l'user-ID effettivo non corrisponde a quello del proprietario del file o non è zero. - \item[\errcode{EROFS}] Il file è su un filesystem in sola lettura. + \item[\errcode{EROFS}] il file è su un filesystem in sola lettura. \end{errlist} ed inoltre \errval{EIO}; \func{chmod} restituisce anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, @@ -2213,24 +2223,24 @@ file. \textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\ \hline \hline - \const{S\_ISUID} & 04000 & set user ID \itindex{suid~bit} \\ - \const{S\_ISGID} & 02000 & set group ID \itindex{sgid~bit}\\ - \const{S\_ISVTX} & 01000 & sticky bit \itindex{sticky~bit}\\ + \const{S\_ISUID} & 04000 & Set user ID \itindex{suid~bit}.\\ + \const{S\_ISGID} & 02000 & Set group ID \itindex{sgid~bit}.\\ + \const{S\_ISVTX} & 01000 & Sticky bit \itindex{sticky~bit}.\\ \hline - \const{S\_IRWXU} & 00700 & l'utente ha tutti i permessi \\ - \const{S\_IRUSR} & 00400 & l'utente ha il permesso di lettura \\ - \const{S\_IWUSR} & 00200 & l'utente ha il permesso di scrittura \\ - \const{S\_IXUSR} & 00100 & l'utente ha il permesso di esecuzione \\ + \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\ + \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\ + \const{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\ + \const{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\ \hline - \const{S\_IRWXG} & 00070 & il gruppo ha tutti i permessi \\ - \const{S\_IRGRP} & 00040 & il gruppo ha il permesso di lettura \\ - \const{S\_IWGRP} & 00020 & il gruppo ha il permesso di scrittura \\ - \const{S\_IXGRP} & 00010 & il gruppo ha il permesso di esecuzione \\ + \const{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\ + \const{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\ + \const{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\ + \const{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\ \hline - \const{S\_IRWXO} & 00007 & gli altri hanno tutti i permessi \\ - \const{S\_IROTH} & 00004 & gli altri hanno il permesso di lettura \\ - \const{S\_IWOTH} & 00002 & gli altri hanno il permesso di scrittura \\ - \const{S\_IXOTH} & 00001 & gli altri hanno il permesso di esecuzione \\ + \const{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\ + \const{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\ + \const{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\ + \const{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\ \hline \end{tabular} \caption{Valori delle costanti usate per indicare i vari bit di @@ -2298,17 +2308,22 @@ dell'interfaccia standard ANSI C che non prevede l'esistenza di utenti e gruppi, ed inoltre il problema si pone anche per l'interfaccia nativa quando i permessi non vengono indicati esplicitamente. -In tutti questi casi l'unico riferimento possibile è quello della modalità di -apertura del nuovo file (lettura/scrittura o sola lettura), che però può -fornire un valore che è lo stesso per tutti e tre i permessi di -sez.~\ref{sec:file_perm_overview} (cioè $666$ nel primo caso e $222$ nel -secondo). Per questo motivo il sistema associa ad ogni processo\footnote{è - infatti contenuta nel campo \var{umask} della struttura \struct{fs\_struct}, - vedi fig.~\ref{fig:proc_task_struct}.} una maschera di bit, la cosiddetta -\textit{umask}, che viene utilizzata per impedire che alcuni permessi possano -essere assegnati ai nuovi file in sede di creazione. I bit indicati nella -maschera vengono infatti cancellati dai permessi quando un nuovo file viene -creato. +\itindbeg{umask} + +Per le funzioni dell'interfaccia standard ANSI C l'unico riferimento possibile +è quello della modalità di apertura del nuovo file (lettura/scrittura o sola +lettura), che però può fornire un valore che è lo stesso per tutti e tre i +permessi di sez.~\ref{sec:file_perm_overview} (cioè $666$ nel primo caso e +$222$ nel secondo). Per questo motivo il sistema associa ad ogni +processo\footnote{è infatti contenuta nel campo \var{umask} della struttura + \struct{fs\_struct}, vedi fig.~\ref{fig:proc_task_struct}.} una maschera di +bit, la cosiddetta \textit{umask}, che viene utilizzata per impedire che +alcuni permessi possano essere assegnati ai nuovi file in sede di creazione. I +bit indicati nella maschera vengono infatti cancellati dai permessi quando un +nuovo file viene creato.\footnote{l'operazione viene fatta sempre: anche + qualora si indichi esplicitamente un valore dei permessi nelle funzioni di + creazione che lo consentono, i permessi contenuti nella \textit{umask} + verranno tolti.} La funzione che permette di impostare il valore di questa maschera di controllo è \funcd{umask}, ed il suo prototipo è: @@ -2329,6 +2344,7 @@ $022$). In questo modo voluti. Di norma questo valore viene impostato una volta per tutte al login a $022$, e gli utenti non hanno motivi per modificarlo. +\itindend{umask} \subsection{La gestione della titolarità dei file} @@ -2384,7 +2400,7 @@ sono: \bodydesc{Le funzioni restituiscono zero in caso di successo e -1 per un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item[\errcode{EPERM}] L'user-ID effettivo non corrisponde a quello del + \item[\errcode{EPERM}] l'user-ID effettivo non corrisponde a quello del proprietario del file o non è zero, o utente e gruppo non sono validi \end{errlist} Oltre a questi entrambe restituiscono gli errori \errval{EROFS} e @@ -2428,17 +2444,19 @@ riepilogo in cui si riassumono le caratteristiche di ciascuno di essi, in modo da poter fornire un quadro d'insieme. In tab.~\ref{tab:file_fileperm_bits} si sono riassunti gli effetti dei vari -bit per un file; per quanto riguarda l'applicazione dei permessi per -proprietario, gruppo ed altri si ricordi quanto illustrato in -sez.~\ref{sec:file_perm_overview}. Si rammenti che il valore dei permessi non -ha alcun effetto qualora il processo possieda i privilegi di amministratore. +bit dei permessi per un file; per quanto riguarda l'applicazione dei permessi +per proprietario, gruppo ed altri si ricordi quanto illustrato in +sez.~\ref{sec:file_perm_overview}. Per compattezza, nella tabelle si sono +specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} +\textit{sgid} e \textit{sticky} \itindex{sticky~bit} con la notazione +illustrata anche in fig.~\ref{fig:file_perm_bit}. \begin{table}[!htb] \centering \footnotesize \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline - \multicolumn{3}{|c|}{}& + \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& @@ -2447,20 +2465,20 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario\\ - -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario\\ - -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} - \textit{mandatory locking} è abilitato\\ - -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Se eseguito ha i permessi del proprietario.\\ + -&1&-&-&-&1&-&-&-&-&-&-&Se eseguito ha i permessi del gruppo proprietario.\\ + -&1&-&-&-&0&-&-&-&-&-&-&Il \itindex{mandatory~locking} + \textit{mandatory locking} è abilitato.\\ + -&-&1&-&-&-&-&-&-&-&-&-&Non utilizzato.\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di lettura per il proprietario.\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di scrittura per il proprietario.\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di esecuzione per il proprietario.\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di lettura per il gruppo proprietario.\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di scrittura per il gruppo proprietario.\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di esecuzione per il gruppo proprietario.\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di lettura per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di scrittura per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di esecuzione per tutti gli altri.\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per un @@ -2468,11 +2486,6 @@ ha alcun effetto qualora il processo possieda i privilegi di amministratore. \label{tab:file_fileperm_bits} \end{table} -Per compattezza, nella tabella si sono specificati i bit di \itindex{suid~bit} -\textit{suid}, \itindex{sgid~bit} \textit{sgid} e \textit{sticky} -\itindex{sticky~bit} con la notazione illustrata anche in -fig.~\ref{fig:file_perm_bit}. - In tab.~\ref{tab:file_dirperm_bits} si sono invece riassunti gli effetti dei vari bit dei permessi per una directory; anche in questo caso si sono specificati i bit di \itindex{suid~bit} \textit{suid}, \itindex{sgid~bit} @@ -2484,7 +2497,7 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \footnotesize \begin{tabular}[c]{|c|c|c|c|c|c|c|c|c|c|c|c|l|} \hline - \multicolumn{3}{|c|}{}& + \multicolumn{3}{|c|}{special}& \multicolumn{3}{|c|}{user}& \multicolumn{3}{|c|}{group}& \multicolumn{3}{|c|}{other}& @@ -2493,18 +2506,23 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \acr{s}&\acr{s}&\acr{t}&r&w&x&r&w&x&r&w&x& \\ \hline \hline - 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato\\ - -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file creati\\ - -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella directory\\ - -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario\\ - -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario\\ - -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario\\ - -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo proprietario\\ - -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo proprietario\\ - -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri\\ - -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri \\ - -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri\\ + 1&-&-&-&-&-&-&-&-&-&-&-&Non utilizzato.\\ + -&1&-&-&-&-&-&-&-&-&-&-&Propaga il gruppo proprietario ai nuovi file + creati.\\ + -&-&1&-&-&-&-&-&-&-&-&-&Limita l'accesso in scrittura dei file nella + directory.\\ + -&-&-&1&-&-&-&-&-&-&-&-&Permesso di visualizzazione per il proprietario.\\ + -&-&-&-&1&-&-&-&-&-&-&-&Permesso di aggiornamento per il proprietario.\\ + -&-&-&-&-&1&-&-&-&-&-&-&Permesso di attraversamento per il proprietario.\\ + -&-&-&-&-&-&1&-&-&-&-&-&Permesso di visualizzazione per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&1&-&-&-&-&Permesso di aggiornamento per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&-&1&-&-&-&Permesso di attraversamento per il gruppo + proprietario.\\ + -&-&-&-&-&-&-&-&-&1&-&-&Permesso di visualizzazione per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&1&-&Permesso di aggiornamento per tutti gli altri.\\ + -&-&-&-&-&-&-&-&-&-&-&1&Permesso di attraversamento per tutti gli altri.\\ \hline \end{tabular} \caption{Tabella riassuntiva del significato dei bit dei permessi per una @@ -2512,17 +2530,634 @@ illustrata in fig.~\ref{fig:file_perm_bit}. \label{tab:file_dirperm_bits} \end{table} -Nelle tabelle si è indicato con ``-'' il fatto che il valore degli altri bit -non è influente rispetto a quanto indicato in ciascuna riga; l'operazione fa -riferimento soltanto alla combinazione di bit per i quali il valore è -riportato esplicitamente. +Nelle tabelle si è indicato con il carattere ``-'' il fatto che il valore del +bit in questione non è influente rispetto a quanto indicato nella riga della +tabella; la descrizione dell'operazione fa riferimento soltanto alla +combinazione di bit per i quali è stato riportato esplicitamente un valore. +Si rammenti infine che il valore dei bit dei permessi non ha alcun effetto +qualora il processo possieda i privilegi di amministratore. + + + +\section{Caratteristiche e funzionalità avanzate} +\label{sec:file_dir_advances} + +Tratteremo qui alcune caratteristiche e funzionalità avanzate della gestione +di file e directory, affrontando anche una serie di estensioni +dell'interfaccia classica dei sistemi unix-like, principalmente utilizzate a +scopi di sicurezza, che sono state introdotte nelle versioni più recenti di +Linux. + + +\subsection{Gli attributi estesi} +\label{sec:file_xattr} + +\itindbeg{Extended~Attributes} + +Nelle sezioni precedenti abbiamo trattato in dettaglio le varie informazioni +che il sistema mantiene negli inode, e le varie funzioni che permettono di +modificarle. Si sarà notato come in realtà queste informazioni siano +estremamente ridotte. Questo è dovuto al fatto che Unix origina negli anni +'70, quando le risorse di calcolo e di spazio disco erano minime. Con il venir +meno di queste restrizioni è incominciata ad emergere l'esigenza di poter +associare ai file delle ulteriori informazioni astratte (quelli che vengono +chiamati i \textsl{meta-dati}) che però non potevano trovar spazio nei dati +classici mantenuti negli inode. + +Per risolvere questo problema alcuni sistemi unix-like (e fra questi anche +Linux) hanno introdotto un meccanismo generico che consenta di associare delle +informazioni ai singoli file,\footnote{l'uso più comune è quello della ACL, + che tratteremo nella prossima sezione, ma si possono inserire anche altre + informazioni.} detto \textit{Extended Attributes}. Gli \textsl{attributi + estesi} non sono altro che delle coppie nome/valore che sono associate +permanentemente ad un oggetto sul filesystem, analoghi di quello che sono le +variabili di ambiente (vedi sez.~\ref{sec:proc_environ}) per un processo. + +Altri sistemi (come Solaris, MacOS e Windows) hanno adottato un meccanismo +diverso in cui ad un file sono associati diversi flussi di dati, su cui +possono essere mantenute ulteriori informazioni, che possono essere accedute +con le normali operazioni di lettura e scrittura. Questi non vanno confusi con +gli \textit{Extended Attributes} (anche se su Solaris hanno lo stesso nome), +che sono un meccanismo molto più semplice, che pur essendo limitato (potendo +contenere solo una quantità limitata di informazione) hanno il grande +vantaggio di essere molto più semplici da realizzare, più +efficienti,\footnote{cosa molto importante, specie per le applicazioni che + richiedono una gran numero di accessi, come le ACL.} e di garantire +l'atomicità di tutte le operazioni. + +In Linux gli attributi estesi sono sempre associati al singolo inode e +l'accesso viene sempre eseguito in forma atomica, in lettura il valore +corrente viene scritto su un buffer in memoria, mentre la scrittura prevede +che ogni valore precedente sia sovrascritto. + +Si tenga presente che non tutti i filesystem supportano gli \textit{Extended + Attributes}, in particolare al momento della scrittura di queste dispense +essi sono presenti solo su \textsl{ext2}, \textsl{ext3} e \textsl{XFS}. +Inoltre a seconda della implementazione ci possono essere dei limiti sulla +quantità di attributi che si possono utilizzare.\footnote{ad esempio nel caso + di \textsl{ext2} ed \textsl{ext3} è richiesto che essi siano contenuti + all'interno di un singolo blocco (pertanto con dimensioni massime pari a + 1024, 2048 o 4096 byte a seconda delle dimensioni di quest'ultimo impostate + in fase di creazione del filesystem), mentre con \textsl{XFS} non ci sono + limiti ed i dati vengono memorizzati in maniera diversa (nell'inode stesso, + in un blocco a parte, o in una struttura ad albero dedicata) per mantenerne + la scalabilità.} Infine lo spazio utilizzato per mantenere gli attributi +estesi viene tenuto in conto per il calcolo delle quote di utente e gruppo +proprietari del file. + +Come meccanismo per mantenere informazioni aggiuntive associate al singolo +file, gli \textit{Extended Attributes} possono avere usi anche molto diversi +fra loro. Per poterli distinguere allora sono stati suddivisi in +\textsl{classi}, a cui poter applicare requisiti diversi per l'accesso e la +gestione. Per questo motivo il nome di un attributo deve essere sempre +specificato nella forma \texttt{namespace.attribute}, dove \texttt{namespace} +fa riferimento alla classe a cui l'attributo appartiene, mentre +\texttt{attribute} è il nome ad esso assegnato. In tale forma il nome di un +attributo esteso deve essere univoco. Al momento\footnote{della scrittura di + questa sezione, kernel 2.6.23, ottobre 2007.} sono state definite le quattro +classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}{|c|p{10cm}|} + \hline + \textbf{Nome} & \textbf{Descrizione} \\ + \hline + \hline + \const{security}& Gli \textit{extended security attributes}: vengono + utilizzati dalle estensioni di sicurezza del kernel (i + \itindex{Linux~Security~Modules} \textit{Linux + Security Modules}), per le realizzazione di meccanismi + evoluti di controllo di accesso come \index{SELinux} + SELinux.\\ + \const{system} & Gli \textit{extended security attributes}: sono usati + dal kernel per memorizzare dati di sistema associati ai + file come le \itindex{Access~Control~List} ACL (vedi + sez.~\ref{sec:file_ACL}) o le \itindex{capabilities} + \textit{capabilities} (vedi + sez.~\ref{sec:proc_capabilities}).\\ + \const{trusted} & I \textit{trusted extended attributes}: vengono + utilizzati per poter realizzare in user space + meccanismi che consentano di mantenere delle + informazioni sui file che non devono essere accessibili + ai processi ordinari.\\ + \const{user} & Gli \textit{extended user attributes}: utilizzati per + mantenere informazioni aggiuntive sui file (come il + \textit{mime-type}, la codifica dei caratteri o del + file) accessibili dagli utenti.\\ + \hline + \end{tabular} + \caption{I nomi utilizzati valore di \texttt{namespace} per distinguere le + varie classi di \textit{Extended Attributes}.} + \label{tab:extended_attribute_class} +\end{table} + + +Dato che uno degli usi degli \textit{Extended Attributes} è quello che li +impiega per realizzare delle estensioni (come le ACL, \index{SELinux} SELinux, +ecc.) al tradizionale meccanismo dei controlli di accesso di Unix, l'accesso +ai loro valori viene regolato in maniera diversa a seconda sia della loro +classe sia di quali, fra le estensioni che li utilizzano, sono poste in uso. +In particolare, per ciascuna delle classi riportate in +tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: +\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} +\item[\texttt{security}] L'accesso agli \textit{extended security attributes} + dipende dalle politiche di sicurezza stabilite da loro stessi tramite + l'utilizzo di un sistema di controllo basato sui + \itindex{Linux~Security~Modules} \textit{Linux Security Modules} (ad esempio + \index{SELinux} SELinux). Pertanto l'accesso in lettura o scrittura dipende + dalle politiche di sicurezza implementate all'interno dal modulo di + sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è + stato caricato nessun modulo di sicurezza l'accesso in lettura sarà + consentito a tutti i processi, mentre quello in scrittura solo ai processi + con privilegi amministrativi dotati della \index{capabilities} + \textit{capability} \const{CAP\_SYS\_ADMIN}. + +\item[\texttt{system}] Anche l'accesso agli \textit{extended system + attributes} dipende dalle politiche di accesso che il kernel realizza + anche utilizzando gli stessi valori in essi contenuti. Ad esempio nel caso + delle ACL l'accesso è consentito in lettura ai processi che hanno la + capacità di eseguire una ricerca sul file (cioè hanno il permesso di lettura + sulla directory che contiene il file) ed in scrittura al proprietario del + file o ai processi dotati della \textit{capability} \index{capabilities} + \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a + quella impiegata per gli ordinari permessi dei file.} + +\item[\texttt{trusted}] L'accesso ai \textit{trusted extended attributes}, sia + per la lettura che per la scrittura, è consentito soltanto ai processi con + privilegi amministrativi dotati della \index{capabilities} + \textit{capability} \const{CAP\_SYS\_ADMIN}. In questo modo si possono + utilizzare questi attributi per realizzare in user space dei meccanismi di + controllo che accedono ad informazioni non disponibili ai processi ordinari. + +\item[\texttt{user}] L'accesso agli \textit{extended user attributes} è + regolato dagli ordinari permessi dei file a cui essi fanno riferimento: + occorre avere il permesso di lettura per leggerli e quello di scrittura per + scriverli o modificarli. Dato l'uso di questi attributi, si è scelto cioè di + applicare per il loro accesso gli stessi criteri che si usano per l'accesso + al contenuto dei file (o delle directory) cui essi fanno riferimento. + + Questa scelta vale però soltanto per i file e le directory ordinarie, se + valesse in generale infatti si avrebbe un serio problema di sicurezza dato + che esistono diversi oggetti sul filesystem per i quali è normale avere + avere il permesso di scrittura consentito a tutti gli utenti, come i link + simbolici, o alcuni file di dispositivo come \texttt{/dev/null}. Se fosse + possibile usare su di essi gli \textit{extended user attributes} un utente + qualunque potrebbe inserirvi dati a piacere.\footnote{la cosa è stata notata + su XFS, dove questo comportamento permetteva, non essendovi limiti sullo + spazio occupabile dagli \textit{Extended Attributes}, di bloccare il + sistema riempiendo il disco.} + + La semantica del controllo di accesso che abbiamo indicato inoltre non + avrebbe alcun senso al di fuori di file e directory: i permessi di lettura e + scrittura per un file di dispositivo attengono alle capacità di accesso al + dispositivo sottostante,\footnote{motivo per cui si può formattare un disco + anche se \texttt{/dev} è su un filesystem in sola lettura.} mentre per i + link simbolici questi vengono semplicemente ignorati: in nessuno dei due + casi hanno a che fare con il contenuto del file, e nella discussione + relativa all'uso degli \textit{extended user attributes} nessuno è mai stato + capace di indicare una qualche forma sensata di utilizzo degli stessi per + link simbolici o file di dispositivo, e neanche per le fifo o i socket. + + Per questo motivo gli \textit{extended user attributes} sono stati + completamente disabilitati per tutto ciò che non sia un file regolare o una + directory.\footnote{si può verificare la semantica adottata consultando il + file \texttt{fs/xattr.c} dei sorgenti del kernel.} Inoltre per le + directory è stata introdotta una ulteriore restrizione, dovuta di nuovo alla + presenza ordinaria di permessi di scrittura completi su directory come + \texttt{/tmp}. Questo è un altro caso particolare, in cui il premesso di + scrittura viene usato, unito alla presenza dello \itindex{sticky~bit} + \textit{sticky bit}, per garantire il permesso di creazione di nuovi file. + Per questo motivo, per evitare eventuali abusi, se una directory ha lo + \itindex{sticky~bit} \textit{sticky bit} attivo sarà consentito scrivere i + suoi \textit{extended user attributes} soltanto se si è proprietari della + stessa, o si hanno i privilegi amministrativi della capability + \index{capabilities} \const{CAP\_FOWNER}. +\end{basedescript} + +Le funzioni per la gestione degli attributi estesi, come altre funzioni di +gestione avanzate specifiche di Linux, non fanno parte delle \acr{glibc}, e +sono fornite da una apposita libreria, \texttt{libattr}, che deve essere +installata a parte;\footnote{la versione corrente della libreria è + \texttt{libattr1}, e nel caso si usi Debian la si può installare con il + pacchetto omonimo ed il collegato \texttt{libattr1-dev}.} pertanto se un +programma le utilizza si dovrà indicare esplicitamente l'uso della suddetta +libreria invocando il compilatore con l'opzione \texttt{-lattr}. + +Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni, +\funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono +rispettivamente di richiedere gli attributi relativi a un file, a un link +simbolico e ad un file descriptor; i rispettivi prototipi sono: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{attr/xattr.h} + + \funcdecl{ssize\_t getxattr(const char *path, const char *name, void + *value, size\_t size)} + + \funcdecl{ssize\_t lgetxattr(const char *path, const char *name, void + *value, size\_t size)} + + \funcdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value, + size\_t size)} + + Le funzioni leggono il valore di un attributo esteso. + + \bodydesc{Le funzioni restituiscono un intero positivo che indica la + dimensione dell'attributo richiesto in caso di successo, e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà i valori: + \begin{errlist} + \item[\errcode{ENOATTR}] l'attributo richiesto non esiste. + \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value} + non è sufficiente per contenere il risultato. + \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal + filesystem o sono disabilitati. + \end{errlist} + Oltre a questi potranno essere restituiti tutti gli errori di \func{stat}, + ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso + all'attributo. } +\end{functions} + +Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento +un pathname che indica il file di cui si vuole richiedere un attributo, la +sola differenza è che la seconda, se il pathname indica un link simbolico, +restituisce gli attributi di quest'ultimo e non quelli del file a cui esso fa +riferimento. La funzione \func{fgetxattr} prende invece come primo argomento +un numero di file descriptor, e richiede gli attributi del file ad esso +associato. + +Tutte e tre le funzioni richiedono di specificare nell'argomento \param{name} +il nome dell'attributo di cui si vuole ottenere il valore. Il nome deve essere +indicato comprensivo di prefisso del \textit{namespace} cui appartiene (uno +dei valori di tab.~\ref{tab:extended_attribute_class}) nella forma +\texttt{namespace.attributename}, come stringa terminata da un carattere NUL. +Il suo valore verrà restituito nel buffer puntato dall'argomento \param{value} +per una dimensione massima di \param{size} byte;\footnote{gli attributi estesi + possono essere costituiti arbitrariamente da dati testuali o binari.} se +quest'ultima non è sufficiente si avrà un errore di \errcode{ERANGE}. + +Per evitare di dover indovinare la dimensione di un attributo per tentativi si +può eseguire una interrogazione utilizzando un valore nullo per \param{size}; +in questo caso non verrà letto nessun dato, ma verrà restituito come valore di +ritorno della funzione chiamata la dimensione totale dell'attributo esteso +richiesto, che si potrà usare come stima per allocare un buffer di dimensioni +sufficienti.\footnote{si parla di stima perché anche se le funzioni + restituiscono la dimensione esatta dell'attributo al momento in cui sono + eseguite, questa potrebbe essere modificata in qualunque momento da un + successivo accesso eseguito da un altro processo.} + +Un secondo gruppo di funzioni è quello che consente di impostare il valore di +un attributo esteso, queste sono \funcd{setxattr}, \funcd{lsetxattr} e +\funcd{fsetxattr}, e consentono di operare rispettivamente su un file, su un +link simbolico o specificando un file descriptor; i loro prototipi sono: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{attr/xattr.h} + + \funcdecl{int setxattr(const char *path, const char *name, const void + *value, size\_t size, int flags)} + + \funcdecl{int lsetxattr(const char *path, const char *name, const void + *value, size\_t size, int flags)} + + \funcdecl{int fsetxattr(int filedes, const char *name, const void *value, + size\_t size, int flags)} + + Impostano il valore di un attributo esteso. + + \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà i valori: + \begin{errlist} + \item[\errcode{ENOATTR}] si è usato il flag \const{XATTR\_REPLACE} e + l'attributo richiesto non esiste. + \item[\errcode{EEXIST}] si è usato il flag \const{XATTR\_CREATE} ma + l'attributo esiste già. + \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal + filesystem o sono disabilitati. + \end{errlist} + Oltre a questi potranno essere restituiti tutti gli errori di \func{stat}, + ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso + all'attributo. +} +\end{functions} + +Le tre funzioni prendono come primo argomento un valore adeguato al loro +scopo, usato in maniera del tutto identica a quanto visto in precedenza per le +analoghe che leggono gli attributi estesi. Il secondo argomento \param{name} +deve indicare, anche in questo caso con gli stessi criteri appena visti per le +analoghe \func{getxattr}, \func{lgetxattr} e \func{fgetxattr}, il nome +(completo di suffisso) dell'attributo su cui si vuole operare. + +Il valore che verrà assegnato all'attributo dovrà essere preparato nel buffer +puntato da \param{value}, e la sua dimensione totale (in byte) sarà indicata +dall'argomento \param{size}. Infine l'argomento \param{flag} consente di +controllare le modalità di sovrascrittura dell'attributo esteso, esso può +prendere due valori: con \const{XATTR\_REPLACE} si richiede che l'attributo +esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre +con \const{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual +caso verrà creato, altrimenti si avrà errore ed il valore attuale non sarà +modificato. Utilizzando per \param{flag} un valore nullo l'attributo verrà +modificato se è già presente, o creato se non c'è. + +Le funzioni finora illustrate permettono di leggere o scrivere gli attributi +estesi, ma sarebbe altrettanto utile poter vedere quali sono gli attributi +presenti; a questo provvedono le funzioni \funcd{listxattr}, +\funcd{llistxattr} e \funcd{flistxattr} i cui prototipi sono: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{attr/xattr.h} + + \funcdecl{ssize\_t listxattr(const char *path, char *list, size\_t size)} + + \funcdecl{ssize\_t llistxattr(const char *path, char *list, size\_t size)} + + \funcdecl{ssize\_t flistxattr(int filedes, char *list, size\_t size)} + + Leggono la lista degli attributi estesi di un file. + + \bodydesc{Le funzioni restituiscono un intero positivo che indica la + dimensione della lista in caso di successo, e $-1$ in caso di errore, nel + qual caso \var{errno} assumerà i valori: + \begin{errlist} + \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value} + non è sufficiente per contenere il risultato. + \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal + filesystem o sono disabilitati. + \end{errlist} + Oltre a questi potranno essere restituiti tutti gli errori di \func{stat}, + ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso + all'attributo. +} +\end{functions} + +Come per le precedenti le tre funzioni leggono gli attributi rispettivamente +di un file, un link simbolico o specificando un file descriptor, da +specificare con il loro primo argomento. Gli altri due argomenti, identici per +tutte e tre, indicano rispettivamente il puntatore \param{list} al buffer dove +deve essere letta la lista e la dimensione \param{size} di quest'ultimo. + +La lista viene fornita come sequenza non ordinata dei nomi dei singoli +attributi estesi (sempre comprensivi del prefisso della loro classe) ciascuno +dei quali è terminato da un carattere nullo. I nomi sono inseriti nel buffer +uno di seguito all'altro. Il valore di ritorno della funzione indica la +dimensione totale della lista in byte. + +Come per le funzioni di lettura dei singoli attributi se le dimensioni del +buffer non sono sufficienti si avrà un errore, ma è possibile ottenere dal +valore di ritorno della funzione una stima della dimensione totale della lista +usando per \param{size} un valore nullo. + +Infine per rimuovere semplicemente un attributo esteso, si ha a disposizione +un ultimo gruppo di funzioni: \funcd{removexattr}, \funcd{lremovexattr} e +\funcd{fremovexattr}; i rispettivi prototipi sono: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{attr/xattr.h} + + \funcdecl{int removexattr(const char *path, const char *name)} + + \funcdecl{int lremovexattr(const char *path, const char *name)} + + \funcdecl{int fremovexattr(int filedes, const char *name)} + + + Rimuovono un attributo esteso di un file. + + \bodydesc{Le funzioni restituiscono 0 in caso di successo, e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà i valori: + \begin{errlist} + \item[\errcode{ENOATTR}] l'attributo richiesto non esiste. + \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal + filesystem o sono disabilitati. + \end{errlist} + ed inoltre tutti gli errori di \func{stat}. +} +\end{functions} + +Le tre funzioni rimuovono l'attributo esteso indicato dall'argomento +\param{name} rispettivamente di un file, un link simbolico o specificando un +file descriptor, da specificare con il loro primo argomento. Anche in questo +caso l'argomento \param{name} deve essere specificato con le modalità già +illustrate in precedenza per le altre funzioni relative agli attributi estesi. + + +\itindend{Extended~Attributes} + +% TODO trattare gli attributi estesi e le funzioni la documentazione di +% sistema è nei pacchetti libxattr1-dev e attr + + +\subsection{Le \textit{Access Control List}} +\label{sec:file_ACL} + + +\itindbeg{Access~Control~List} + +Il modello classico dei permessi di Unix, per quanto funzionale ed efficiente, +è comunque piuttosto limitato e per quanto possa aver coperto per lunghi anni +le esigenze più comuni con un meccanismo semplice e potente, non è in grado di +rispondere in maniera adeguata a situazioni che richiedono una gestione +complessa dei permessi di accesso.\footnote{già un requisito come quello di + dare accesso in scrittura ad alcune persone ed in sola lettura ad altre non + si può soddisfare in maniera semplice.} + +Per questo motivo erano state progressivamente introdotte nelle varie versioni +di Unix dei meccanismi di gestione dei permessi dei file più flessibili, nella +forma delle cosiddette \textit{Access Control List} (indicate usualmente con +la sigla ACL). Nello sforzo di standardizzare queste funzionalità era stato +creato un gruppo di lavoro il cui scopo era estendere lo standard POSIX 1003 +attraverso due nuovi insiemi di specifiche, la POSIX 1003.1e per l'interfaccia +di programmazione e la POSIX 1003.2c per i comandi di shell. + +Gli obiettivi erano però forse troppo ambizioni, e nel gennaio del 1998 i +finanziamenti vennero ritirati senza che si fosse arrivati alla definizione di +uno standard, dato però che una parte della documentazione prodotta era di +alta qualità venne deciso di rilasciare al pubblico la diciassettesima bozza +del documento, quella che va sotto il nome di \textit{POSIX 1003.1e Draft 17}, +che è divenuta la base sulla quale si definiscono le cosiddette \textit{Posix + ACL}. + +A differenza di altri sistemi (ad esempio FreeBSD) nel caso di Linux si è +scelto di realizzare le ACL attraverso l'uso degli +\itindex{Extended~Attributes} \textit{Extended Attributes} (appena trattati in +sez.~\ref{sec:file_xattr}), e fornire tutte le relative funzioni di gestione +tramite una libreria, \texttt{libacl} che nasconde i dettagli implementativi +delle ACL e presenta ai programmi una interfaccia che fa riferimento allo +standard POSIX 1003.1e. + +Anche in questo caso le funzioni di questa libreria non fanno parte delle +\acr{glibc} e devono essere installate a parte;\footnote{la versione corrente + della libreria è \texttt{libacl1}, e nel caso si usi Debian la si può + installare con il pacchetto omonimo e con il collegato \texttt{libacl1-dev} + per i file di sviluppo.} pertanto se un programma le utilizza si dovrà +indicare esplicitamente l'uso della libreria \texttt{libacl} invocando il +compilatore con l'opzione \texttt{-lacl}. Si tenga presente inoltre che per +poterle utilizzare le ACL devono essere attivate esplicitamente montando il +filesystem\footnote{che deve supportarle, ma questo è ormai vero per + praticamente tutti i filesystem più comuni, con l'eccezione di NFS per il + quale esiste però un supporto sperimentale.} su cui le si vogliono +utilizzare con l'opzione \texttt{acl} attiva. Dato che si tratta di una +estensione è infatti opportuno utilizzarle soltanto laddove siano necessarie. + +Una ACL è composta da un insieme di voci, e ciascuna voce è a sua volta +costituita da un \textsl{tipo}, da un eventuale +\textsl{qualificatore},\footnote{deve essere presente soltanto per le voci di + tipo \const{ACL\_USER} e \const{ACL\_GROUP}.} e da un insieme di permessi. +Ad ogni oggetto sul filesystem si può associare una ACL che ne governa i +permessi di accesso, detta \textit{access ACL}. Inoltre per le directory si +può impostare una ACL aggiuntiva, detta \textit{default ACL}, che serve ad +indicare quale dovrà essere la ACL assegnata di default nella creazione di un +file all'interno della directory stessa. Come avviene per i permessi le ACL +possono essere impostate solo del proprietario del file, o da un processo con +la capability \index{capabilities} \const{CAP\_FOWNER}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}{|l|p{8cm}|} + \hline + \textbf{Tipo} & \textbf{Descrizione} \\ + \hline + \hline + \const{ACL\_USER\_OBJ} & voce che contiene i diritti di accesso del + proprietario del file.\\ + \const{ACL\_USER} & voce che contiene i diritti di accesso per + l'utente indicato dal rispettivo + qualificatore.\\ + \const{ACL\_GROUP\_OBJ}& voce che contiene i diritti di accesso del + gruppo proprietario del file.\\ + \const{ACL\_GROUP} & voce che contiene i diritti di accesso per + il gruppo indicato dal rispettivo + qualificatore.\\ + \const{ACL\_MASK} & voce che contiene la maschera dei massimi + permessi di accesso che possono essere garantiti + da voci del tipo \const{ACL\_USER}, + \const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}.\\ + \const{ACL\_OTHER} & voce che contiene i diritti di accesso di chi + non corrisponde a nessuna altra voce dell'ACL.\\ + \hline + \end{tabular} + \caption{Le costanti che identificano i tipi delle voci di una ACL.} + \label{tab:acl_tag_types} +\end{table} + +L'elenco dei vari tipi di voci presenti in una ACL, con una breve descrizione +del relativo significato, è riportato in tab.~\ref{tab:acl_tag_types}. Tre di +questi tipi, \const{ACL\_USER\_OBJ}, \const{ACL\_GROUP\_OBJ} e +\const{ACL\_OTHER}, corrispondono direttamente ai tre permessi ordinari dei +file (proprietario, gruppo proprietario e tutti gli altri) e una ACL valida +deve sempre contenere una ed una sola voce per ciascuno di questi tipi. + +Una ACL può poi contenere un numero arbitrario di voci di tipo +\const{ACL\_USER} e \const{ACL\_GROUP}, ciascuna delle quali indicherà i +permessi assegnati all'utente e al gruppo indicato dal relativo qualificatore; +ovviamente un utente o gruppo potranno essere indicati una sola volta +all'interno di una ACL. Inoltre se in una ACL esiste una voce di uno di questi +due tipi è obbligatoria anche la presenza di una ed una sola voce di tipo +\const{ACL\_MASK}, che negli altri casi è opzionale. + +Quest'ultimo tipo di voce contiene la maschera dei permessi che possono essere +assegnati tramite voci di tipo \const{ACL\_USER}, \const{ACL\_GROUP} e +\const{ACL\_GROUP\_OBJ}, se in una di queste voci si fosse specificato un +permesso non presente in \const{ACL\_MASK} questo verrebbe ignorato. L'uso di +\const{ACL\_MASK} è di particolare utilità quando associata ad una +\textit{default ACL} di una directory in quanto i permessi così specificati +vengono ereditati da tutti i file creati nella stessa, ottenendo una sorta di +\itindex{umask} \textit{umask} associata ad un oggetto sul filesystem +piuttosto che a un processo. + +Dato che le ACL vengono a costituire una estensione dei permess ordinari, uno +dei problemi che si erano posti nella loro standardizzazione era appunto +quello della corrispondenza fra questi e le ACL. Come accennato i permessi +ordinari vengono mappati le tre voci di tipo \const{ACL\_USER\_OBJ}, +\const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER} che devono essere presenti in +qualunque ACL; un cambiamento ad una di queste voci viene automaticamente +riflesso sui permessi ordinari dei file\footnote{per permessi ordinari si + intende quelli mantenuti nell'\textit{inode}, che devono restare dato che un + filesystem può esseere montato senza abilitare le ACL.} e viceversa. In +realtà la mappatura è diretta solo per le voci \const{ACL\_USER\_OBJ} e +\const{ACL\_OTHER}, nel caso di \const{ACL\_GROUP\_OBJ} questo vale fintanto +che non è presente una voce di tipo \const{ACL\_MASK}, nel qual caso valgono +invece i permessi in essa specificati.\footnote{questo diverso comportamento a + seconda delle condizioni è stato introdotto dalla standardizzazione + \textit{POSIX 1003.1e Draft 17} per mantenere il comportamento invariato sui + sistemi dotati di ACL per tutte quelle applicazioni che sono conformi + soltanto all'ordinario standard \textit{POSIX 1003.1}.} + +Un secondo aspetto dell'incidenza delle ACL sul comportamento del sistema è +quello relativo alla creazione di nuovi file,\footnote{o oggetti sul + filesystem, il comportamento discusso vale per le funzioni \func{open} e + \func{creat} (vedi sez.~\ref{sec:file_open}), \func{mkdir} (vedi + sez.~\ref{sec:file_dir_creat_rem}), \func{mknod} e \func{mkfifo} (vedi + sez.~\ref{sec:file_mknod}).} che come accennato può essere modificato dalla +presenza di una default ACL sulla directory che contiene quel file. Se questa +non c'è valgono le regole illustrate in sez.~\ref{sec:file_perm_management} +per cui essi sono determinati dalla \itindex{umask} \textit{umask} del +processo, e la sola differenza è che i permessi ordinari da esse risultanti +vengono automaticamente rimappati su una ACL di accesso assegnata al nuovo +file che contiene solo le tre voci di tipo \const{ACL\_USER\_OBJ}, +\const{ACL\_GROUP\_OBJ} e \const{ACL\_OTHER}. + +Se invece è presente una ACL di default sulla directory che contiene il nuovo +file questa diventerà la sua ACL di accesso, a meno di non aver indicato nelle +funzioni di creazione che lo consentono uno specifico insieme di +permessi.\footnote{tutte le funzioni citate in precedenza supportano un + argomento \var{mode} che indichi un insieme di permssi iniziale.} In tal +caso quelli non presenti in tale insieme saranno eliminati dalle voci +corrispondenti nella ACL. + +Ovviamente la presenza della ACL modifica anche le regole del controllo di +accesso ai file illustrate in sez.~\ref{sec:file_perm_overview}; per il +controllo vengono sempre utilizzati gli identificatori del gruppo +\textit{effective} del processo, ed i passi attraverso i quali viene stabilito +se esso ha diritto di accesso sono i seguenti: +\begin{enumerate} +\item Se l'user-ID del processo è nullo l'accesso è sempre garantito senza + nessun ulteriore controllo. +\item Se l'user-ID del processo corrisponde al proprietario del file allora: + \begin{itemize*} + \item se la voce \const{ACL\_USER\_OBJ} contiene il permesso richiesto, + l'accesso è consentito + \item altrimenti l'accesso è negato + \end{itemize*} +\item Se l'user-ID del processo corrisponde ad un qualunque qualificatore + presente in una voce \const{ACL\_USER} allora: + \begin{itemize*} + \item se la voce \const{ACL\_USER} corrispondente e la voce + \const{ACL\_MASK} contengono entrambe il permesso richiesto, l'accesso è + consentito + \item altrimenti l'accesso è negato + \end{itemize*} +\item Se il group-ID del processo o uno dei group-ID supplementari corrisponde + al gruppo proprietario del file o a un qualunque qualificatore di una voce + di tipo allora: + \begin{itemize*} + \item se il bit dei permessi d'accesso del gruppo è impostato, l'accesso è + consentito, + \item altrimenti l'accesso è negato + \end{itemize*} +\item Se il bit dei permessi d'accesso per tutti gli altri è impostato, + l'accesso è consentito, altrimenti l'accesso è negato. +\end{enumerate} + + + +\itindend{Access~Control~List} + + +% TODO trattare le ACL, la documentazione di sistema è nei pacchetti +% libacl1-dev e acl +% vedi anche http://www.suse.de/~agruen/acl/linux-acls/online/ + -% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con -% dentro chroot, gli attributi estesi, ecc. \subsection{La funzione \func{chroot}} \label{sec:file_chroot} +% TODO intrudurre nuova sezione sulle funzionalità di sicurezza avanzate, con +% dentro chroot SELinux e AppArmor ??? + Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione \func{chroot} viene usata spesso per restringere le capacità di accesso di un programma ad una sezione limitata del filesystem, per cui ne parleremo in @@ -2547,8 +3182,8 @@ cambiando la directory di lavoro. Normalmente la directory radice di un processo coincide anche con la radice del filesystem usata dal kernel, e dato che il suo valore viene ereditato dal padre da ogni processo figlio, in generale i processi risolvono i -\itindsub{pathname}{assoluto}\textit{pathname} assoluti a partire sempre dalla -stessa directory, che corrisponde alla \file{/} del sistema. +\itindsub{pathname}{assoluto} \textit{pathname} assoluti a partire sempre +dalla stessa directory, che corrisponde alla radice del sistema. In certe situazioni però, per motivi di sicurezza, è utile poter impedire che un processo possa accedere a tutto il filesystem; per far questo si può @@ -2561,7 +3196,7 @@ prototipo \bodydesc{La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore \var{errno} può assumere i valori: \begin{errlist} - \item[\errcode{EPERM}] L'user-ID effettivo del processo non è zero. + \item[\errcode{EPERM}] l'user-ID effettivo del processo non è zero. \end{errlist} ed inoltre \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ENOMEM}, \errval{ENOTDIR}, \errval{EACCES}, \errval{ELOOP}; @@ -2604,6 +3239,9 @@ contiene i file. Si tenga presente per replicare all'interno della \textit{chroot jail} tutti i file (in genere programmi e librerie) di cui il server potrebbe avere bisogno. + + + % LocalWords: sez like filesystem unlink MacOS Windows VMS inode kernel unistd % LocalWords: un'etichetta int const char oldpath newpath errno EXDEV EPERM st % LocalWords: EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls @@ -2633,7 +3271,12 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: gid Control List patch mandatory control execute group other all % LocalWords: dell' effective passwd IGID locking swap saved text IRWXU IRWXG % LocalWords: IRWXO ext reiser capability FSETID mask capabilities chroot jail -% LocalWords: FTP Di filter reiserfs +% LocalWords: FTP Di filter reiserfs Attributes Solaris Posix FreeBSD libacl +% LocalWords: XFS SELinux namespace attribute security trusted Draft Modules +% LocalWords: attributes mime ADMIN FOWNER libattr lattr getxattr lgetxattr +% LocalWords: fgetxattr attr ssize ENOATTR ENOTSUP NUL setxattr lsetxattr list +% LocalWords: fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr +% LocalWords: removexattr lremovexattr fremovexattr attributename lacl %%% Local Variables: %%% mode: latex