Finito umask, chmod & C.
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 12 Aug 2001 13:59:46 +0000 (13:59 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 12 Aug 2001 13:59:46 +0000 (13:59 +0000)
filedir.tex

index c5b2c9a163575aa26b7d72125ec9e185a8c41736..0ee1b396f777da6e1848c3207554e051495fef7f 100644 (file)
@@ -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}