From 7a4f8b0f8a5bdda6d7c27b87803bdea5e2891af0 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 12 Aug 2001 13:59:46 +0000 Subject: [PATCH] Finito umask, chmod & C. --- filedir.tex | 107 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 91 insertions(+), 16 deletions(-) diff --git a/filedir.tex b/filedir.tex index c5b2c9a..0ee1b39 100644 --- a/filedir.tex +++ b/filedir.tex @@ -487,6 +487,33 @@ il valore da fornire sarebbe $4755$. \label{tab:filedir_permission_const} \end{table} +Il cambiamento dei permessi di un file attraverso queste funzioni ha comunque +alcune limitazioni, provviste per motivi di sicurezza. Questo significa che +anche se si è proprietari del file non tutte le operazioni sono permesse, in +particolare: +\begin{itemize} +\item siccome solo l'amministratore può settare lo \textit{sticky bit} se se + l'\textit{effective user id} del processo non è zero esso viene + automaticamente cancellato (senza notifica di errore) qualora sia stato + indicato in \var{mode}. +\item per via della semantica SVR4 nella creazione dei nuovi file, si può + avere il caso in cui il file creato da un processo è assegnato a un gruppo + per il quale il processo non ha privilegi. Per evitare che si possa + assegnare il bit \textsl{sgid} ad un file appartenente a un gruppo per cui + non si hanno diritti, questo viene automaticamente cancellato (senza + notifica di errore) da \var{mode} qualora il gruppo del file non corrisponda + a quelli associati al processo (la cosa non avviene quando + l'\textit{effective user id} del processo è zero). +\end{itemize} + +Per alcuni filesystem\footnote{il filesystem \textsl{ext2} supporta questa + caratteristica, che è mutuata da BSD.} è inoltre prevista una ulteriore +misura di sicurezza, volta ad scongiurare l'abuso dei bit \textsl{suid} e +\textsl{sgid}; essa consiste nel cancellare automaticamente questi bit qualora +un processo che non appartenga all'amministratore scriva su un file. In questo +modo anche se un utente malizioso scopre un file \textsl{suid} su cui può +scrivere, un eventuale modifica comporterà la perdita di ogni ulteriore +privilegio. \subsection{La funzione \texttt{umask}} @@ -494,22 +521,75 @@ il valore da fornire sarebbe $4755$. Oltre che dai valori indicati in sede di creazione, i permessi assegnati ai nuovi file sono controllati anche da una maschera di bit settata con la -funzione \func{umask}. Questa maschera è una caratteristica di ogni processo e -viene utilizzata per impedire che alcuni permessi possano essere assegnati ai -nuovi file in sede di creazione, i bit indicati nella maschera vengono infatti -esclusi quando un nuovo file viene creato. +funzione \func{umask}, il cui prototipo è: -In genere questa maschera serve per impostare un default che escluda alcuni -permessi (usualmente quello di scrittura per gruppo e altri, corrispondente ad -un valore di 022). Essa è utile perché le routine l'interfaccia degli stream -non prevede l'esistenza dei processi, e pertanto i nuovi file vengono sempre -creati con i permessi fissati su 066. +\begin{prototype}{stat.h} +{mode\_t umask(mode\_t mask)} + + Setta la maschera dei permessi dei bit al valore specificato da \var{mask} + (di cui vengono presi solo i 9 bit meno significativi). + + La funzione ritorna il precedente valore della maschera. È una delle poche + funzioni che non restituisce codici di errore. +\end{prototype} +Questa maschera è una caratteristica di ogni processo e viene utilizzata per +impedire che alcuni permessi possano essere assegnati ai nuovi file in sede di +creazione, i bit indicati nella maschera vengono infatti esclusi quando un +nuovo file viene creato. +In genere questa maschera serve per impostare un default che escluda alcuni +permessi (usualmente quello di scrittura per il gruppo e gli altri, +corrispondente ad un valore di $022$). Essa è utile perché le routine +dell'interfaccia ANSI C degli stream non prevedono l'esistenza dei permessi, e +pertanto tutti i nuovi file vengono sempre creati con un default di $666$ +(cioè permessi di lettura e scrittura per tutti, si veda +\tabref{tab:filedir_permission_const} per un confronto); in questo modo è +possibile cancellare automaticamente i permessi non voluti, senza doverlo fare +esplicitamente. + +In genere il valore di \func{umask} viene stabilito una volta per tutte al +login, e di norma gli utenti non hanno motivi per modificarlo. Se però si +vuole che un processo possa creare un file che chiunque possa leggere allora +occorrerà cambiare il valore di \func{umask}. \subsection{Le funzioni \texttt{chown}, \texttt{fchown} e \texttt{lchown}} \label{sec:filedir_chown} +Come per i permessi, il sistema fornisce anche delle funzioni che permettano +di cambiare utente e gruppo cui il file appartiene; le funzioni in questioni +sono tre e i loro prototipi sono i seguenti: + +\begin{functions} + \headdecl{sys/types.h} + \headdecl{sys/stat.h} + + \funcdecl{int chmod(const char *path, mode\_t mode)} Cambia i permessi del + file indicato da \var{path} al valore indicato da \var{mode}. + + \funcdecl{int fchmod(int fd, mode\_t mode)} Analoga alla precedente, ma usa + il file descriptor \var{fd} per indicare il file. + + Le funzioni restituiscono zero in caso di successo e -1 per un errore, in + caso di errore \texttt{errno} viene settato ai valori: + \begin{errlist} + \item \macro{EPERM} L'\textit{effective user id} non corrisponde a quello + del proprietario del file o non è zero. + \end{errlist} + Oltre a questi entrambe restituiscono gli errori \macro{EROFS} e + \macro{EIO}; \func{chmod} restituisce anche \macro{EFAULT}, + \macro{ENAMETOOLONG}, \macro{ENOENT}, \macro{ENOMEM}, \macro{ENOTDIR}, + \macro{EACCES}, \macro{ELOOP}; \func{chmod} anche \macro{EBADF}. +\end{functions} + + + + + + + + + @@ -558,13 +638,8 @@ i seguenti: descriptor \var{filedes}. Le funzioni restituiscono zero in caso di successo e -1 per un errore, in - caso di errore \texttt{errno} viene settato ai valori: - \begin{errlist} - \item \texttt{EACCESS} non c'è il permesso di accedere al file. - \item \texttt{ENOTDIR} una componente del pathname non è una directory. - \item \texttt{ENOMEM} il kernel non ha a disposizione memoria sufficiente a - completare l'operazione. - \item \texttt{ENAMETOOLONG} il filename è troppo lungo. + caso di errore \texttt{errno} viene settato ai valori \macro{EACCESS}, + \macro{ENOTDIR}, \macro{ENOMEM}, \macro{ENAMETOOLONG}. \end{errlist} \end{functions} -- 2.30.2