Revisione delle capabilities, risistemazione della tabella con
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 28 Jun 2009 17:07:25 +0000 (17:07 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 28 Jun 2009 17:07:25 +0000 (17:07 +0000)
maggiori spiegazioni per alcune delle capabilities piu' generiche.

filedir.tex
prochand.tex
system.tex
thread.tex

index 98e87ca192444345692e938050df95e1a71cec96..eb9c3aee954640ed0f629c4e7fe2f53915526a7c 100644 (file)
@@ -674,15 +674,15 @@ o \const{S\_IFBLK} o \const{S\_IFCHR}), il valore di \param{dev} dovr
 usato per indicare a quale dispositivo si fa riferimento, altrimenti il suo
 valore verrà ignorato.  Solo l'amministratore può creare un file di
 dispositivo usando questa funzione (il processo deve avere la
-\textit{capability} \const{CAP\_MKNOD}), ma in Linux\footnote{questo è un
-  comportamento specifico di Linux, la funzione non è prevista dallo standard
-  POSIX.1 originale, mentre è presente in SVr4 e 4.4BSD, ma esistono
-  differenze nei comportamenti e nei codici di errore, tanto che questa è
-  stata introdotta in POSIX.1-2001 con una nota che la definisce portabile
-  solo quando viene usata per creare delle fifo, ma comunque deprecata essendo
-  utilizzabile a tale scopo la specifica \func{mkfifo}.} l'uso per la
-creazione di un file ordinario, di una fifo o di un socket è consentito anche
-agli utenti normali.
+\itindex{capabilities} \textit{capability} \const{CAP\_MKNOD}), ma in
+Linux\footnote{questo è un comportamento specifico di Linux, la funzione non è
+  prevista dallo standard POSIX.1 originale, mentre è presente in SVr4 e
+  4.4BSD, ma esistono differenze nei comportamenti e nei codici di errore,
+  tanto che questa è stata introdotta in POSIX.1-2001 con una nota che la
+  definisce portabile solo quando viene usata per creare delle fifo, ma
+  comunque deprecata essendo utilizzabile a tale scopo la specifica
+  \func{mkfifo}.} l'uso per la creazione di un file ordinario, di una fifo o
+di un socket è consentito anche agli utenti normali.
 
 I nuovi \itindex{inode} \textit{inode} creati con \func{mknod} apparterranno
 al proprietario e al gruppo del processo che li ha creati, a meno che non si
@@ -2646,7 +2646,7 @@ Per alcuni filesystem\footnote{i filesystem pi
 a scongiurare l'abuso dei \itindex{suid~bit} bit \acr{suid} e \acr{sgid}; essa
 consiste nel cancellare automaticamente questi bit dai permessi di un file
 qualora un processo che non appartenga all'amministratore\footnote{per la
-  precisione un processo che non dispone della capability
+  precisione un processo che non dispone della \itindex{capabilities} capacità
   \const{CAP\_FSETID}.} effettui una scrittura. In questo modo anche se un
 utente malizioso scopre un file \acr{suid} su cui può scrivere, un'eventuale
 modifica comporterà la perdita di questo privilegio.
@@ -2774,7 +2774,7 @@ l'utente che il gruppo a cui un file appartiene; i rispettivi prototipi sono:
 \end{functions}
 
 Con Linux solo l'amministratore\footnote{o in generale un processo con la
-  \itindex{capabilities} capability \const{CAP\_CHOWN}, vedi
+  \itindex{capabilities} capacità \const{CAP\_CHOWN}, vedi
   sez.~\ref{sec:proc_capabilities}.} può cambiare il proprietario di un file;
 in questo viene seguita la semantica usata da BSD che non consente agli utenti
 di assegnare i loro file ad altri utenti evitando eventuali aggiramenti delle
@@ -2944,12 +2944,83 @@ molto pi
 situazione di \textsl{tutto o nulla}.
 
 Il meccanismo completo delle \textit{capabilities}\footnote{l'implementazione
-  di Linux si rifà ad una bozza per quello che dovrebbe divenire lo standard
-  POSIX.1e, che prevede questa funzionalità.} prevedeva anche la possibilità
-di associare le stesse \textit{capabilities} anche ai singoli file eseguibili,
-in modo da poter stabilire quali capacità possono essere utilizzate quando
-viene messo in esecuzione uno specifico programma; ma il supporto per questa
-funzionalità è stato introdotto soltanto a partire dal kernel 2.6.24.
+  si rifà ad una bozza di quello che doveva diventare lo standard POSIX.1e,
+  ormai abbandonato.} prevede inoltre la possibilità di associare le stesse ai
+singoli file eseguibili, in modo da poter stabilire quali capacità possono
+essere utilizzate quando viene messo in esecuzione uno specifico programma; ma
+il supporto per questa funzionalità è stato introdotto soltanto a partire dal
+kernel 2.6.24; fino ad allora doveva essere il programma stesso ad eseguire
+una riduzione esplicita delle sue capacità, cosa che ha reso l'uso di questa
+funzionalità poco diffuso, vista la presenza di meccanismi alternativi come
+\index{SELinux} SELinux.
+
+Per gestire questo meccanismo ciascun processo porta con sé tre distinti
+insiemi di \textit{capabilities}, che vengono denominati rispettivamente
+\textit{effective}, \textit{permitted} ed \textit{inherited}. Questi insiemi
+vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel
+  li mantiene, come i vari identificatori di sez.~\ref{sec:proc_setuid},
+  all'interno della \struct{task\_struct} di ciascun processo (vedi
+  fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
+  \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
+  \texttt{kernel\_cap\_t}; questo è attualmente definito come intero a 32 bit,
+  il che comporta un massimo di 32 \textit{capabilities} distinte.} in cui
+ciascun bit corrisponde ad una capacità diversa.
+
+L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
+per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
+sono mantenuti i diversi insiemi di identificatori di
+sez.~\ref{sec:proc_setuid}; il loro significato è il seguente:
+\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
+\item[\textit{effective}] l'insieme delle \textit{capabilities}
+  ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
+  kernel quando deve eseguire il controllo di accesso per le varie operazioni
+  compiute dal processo.
+\item[\textit{permitted}] l'insieme delle \textit{capabilities}
+  ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
+  \textsl{può} impostare come \textsl{effettive}. Se un processo cancella una
+  capacità da questo insieme non potrà più riassumerla (almeno che non esegua
+  un programma che è \acr{suid} di root).
+\item[\textit{inherited}] l'insieme delle \textit{capabilities}
+  ``\textsl{ereditabili}'', cioè quelle che vengono trasmesse ad un nuovo
+  programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione
+  del caso che questo sia \acr{suid} di root).
+\label{sec:capabilities_set}
+\end{basedescript}
+
+Oltre a questi tre insiemi, che sono relativi al singolo processo, il kernel
+mantiene un insieme generale valido per tutto il sistema, chiamato
+\itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ogni
+volta che un programma viene posto in esecuzione con \func{exec} il contenuto
+degli insiemi \textit{effective} e \textit{permitted} vengono mascherati con
+un \textsl{AND} binario del contenuto corrente del \textit{capabilities
+  bounding set}, così che il nuovo processo potrà disporre soltanto delle
+capacità in esso elencate.
+
+Il \textit{capabilities bounding set} è un parametro di sistema, accessibile
+attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che per
+questa sua caratteristica consente di impostare un limite generale alle
+capacità che possono essere accordate ai vari processi.  Questo valore può
+essere impostato ad un valore arbitrario esclusivamente dal primo processo
+eseguito nel sistema (di norma cioè da \texttt{/sbin/init}), ogni processo
+eseguito successivamente (cioè con \textsl{pid} diverso da 1) anche se
+eseguito con privilegi di amministratore potrà soltanto rimuovere uno dei bit
+già presenti dell'insieme: questo significa che una volta rimossa una
+\textit{capability} dal \textit{capabilities bounding set} essa non sarà più
+disponibile, neanche per l'amministratore, a meno di un riavvio.
+
+Quando un programma viene messo in esecuzione\footnote{cioè quando viene
+  eseguita la \func{execve} con cui lo si lancia; in corrispondenza di una
+  \func{fork} le \textit{capabilities} non vengono modificate.} esso eredita
+(nel senso che assume negli insiemi \textit{effective} e \textit{permitted})
+le \textit{capabilities} mantenute nell'insieme \textit{inherited}, a meno che
+non sia eseguito un programma \acr{suid} di root o la \func{exec} sia stata
+eseguita da un programma con \textsl{uid} reale zero; in tal caso il programma
+ottiene tutte le \textit{capabilities} presenti nel \textit{capabilities
+  bounding set}. In questo modo si può far si che ad un processo eseguito in
+un secondo tempo possano essere trasmesse solo un insieme limitato di
+capacità, impedendogli di recuperare quelle assenti nell'insieme
+\textit{inherited}. Si tenga presente invece che attraverso una \func{fork}
+vengono mantenute le stesse capacità del processo padre.
 
 
 
@@ -2961,7 +3032,21 @@ funzionalit
 % http://lwn.net/Articles/256519/
 % http://lwn.net/Articles/211883/
 
-\begin{table}[!h!btp]
+
+
+Un elenco delle delle \textit{capabilities} disponibili su Linux, con una
+breve descrizione ed il nome delle costanti che le identificano, è riportato
+in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
+  tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
+    capabilities}) e dalle definizioni in \texttt{linux/capabilities.h}, è
+  aggiornato al kernel 2.6.26.} la tabella è divisa in due parti, la prima
+riporta le \textit{capabilities} previste anche nella bozza dello standard
+POSIX1.e, la seconda quelle specifiche di Linux.  Come si può notare dalla
+tabella alcune \textit{capabilities} attengono a singole funzionalità e sono
+molto specializzate, mentre altre hanno un campo di applicazione molto vasto,
+che è opportuno dettagliare maggiormente.
+
+\begin{table}[!h!bt]
   \centering
   \footnotesize
   \begin{tabular}{|l|p{12cm}|}
@@ -2972,46 +3057,27 @@ funzionalit
 %
 % POSIX-draft defined capabilities.
 %
-    \const{CAP\_AUDIT\_WRITE}&Consente la scrittura di dati nel giornale di
-                              auditing del kernel.\\ 
-    \const{CAP\_AUDIT\_CONTROL}& Consente di abilitare e disabilitare il
-                              controllo dell'auditing.\footnotemark\\ 
+    \const{CAP\_AUDIT\_WRITE}&La capacità di scrivere dati nel giornale di
+                              auditing del kernel (dal kernel 2.6.11).\\ 
+    \const{CAP\_AUDIT\_CONTROL}& La capacità di abilitare e disabilitare il
+                              controllo dell'auditing (dal kernel 2.6.11).\\ 
+    % TODO verificare questa roba dell'auditing
     \const{CAP\_CHOWN}      & La capacità di cambiare proprietario e gruppo
                               proprietario di un file (vedi
                               sez.~\ref{sec:file_ownership_management}).\\
     \const{CAP\_DAC\_OVERRIDE}& La capacità di evitare il controllo dei
                               permessi di lettura, scrittura ed esecuzione dei
-                              file, (vedi sez.~\ref{sec:file_access_control})
-                              caratteristici del modello classico del
-                              controllo di accesso chiamato
-                              \itindex{Discrectionary~Access~Control~(DAC)} 
-                              \textit{Discrectionary Access Control} (da cui
-                              il nome DAC).\\  
+                              file,\footnotemark (vedi
+                              sez.~\ref{sec:file_access_control}).\\
     \const{CAP\_DAC\_READ\_SEARCH}& La capacità di evitare il controllo dei
-                              permessi di lettura, scrittura ed esecuzione per
+                              permessi di lettura ed esecuzione per
                               le directory (vedi
                               sez.~\ref{sec:file_access_control}).\\
-    \const{CAP\_FOWNER}     & La capacità di evitare il controllo che 
-                              l'user-ID effettivo del processo (o meglio il
-                              \textit{filesystem user-ID}, vedi
-                              sez.~\ref{sec:proc_setuid}) coincida con
-                              quello del proprietario di un file per tutte
+    \const{CAP\_FOWNER}     & La capacità di evitare il controllo della
+                              proprietà di un file per tutte
                               le operazioni privilegiate non coperte dalle
                               precedenti \const{CAP\_DAC\_OVERRIDE} e
-                              \const{CAP\_DAC\_READ\_SEARCH}. Queste
-                              comprendono i cambiamenti dei permessi e dei
-                              tempi del file (vedi
-                              sez.~\ref{sec:file_perm_management} e 
-                              sez.~\ref{sec:file_file_times}), le impostazioni 
-                              degli attributi estesi (con il comando 
-                              \cmd{chattr}) e delle ACL, poter ignorare lo
-                              \itindex{sticky~bit} \textit{sticky bit} nella
-                              cancellazione dei file (vedi
-                              sez.~\ref{sec:file_special_perm}), la possibilità
-                              di impostare il flag di \const{O\_NOATIME} con
-                              \func{open} e \func{fcntl} (vedi
-                              sez.~\ref{sec:file_open} e
-                              sez.~\ref{sec:file_fcntl}).\\
+                              \const{CAP\_DAC\_READ\_SEARCH}.\\
     \const{CAP\_FSETID}     & La capacità di evitare la cancellazione
                               automatica dei bit \itindex{suid~bit} \acr{suid}
                               e \itindex{sgid~bit} \acr{sgid} quando un file
@@ -3021,49 +3087,25 @@ funzionalit
                               quando questo è relativo ad un gruppo cui non si
                               appartiene (vedi
                               sez.~\ref{sec:file_perm_management}).\\ 
+    \const{CAP\_SETFCAP}    & La capacità di impostare le
+                              \textit{capabilities} di un file (dal kernel
+                              2.6.24).\\  
     \const{CAP\_KILL}       & La capacità di mandare segnali a qualunque
                               processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
     \const{CAP\_SETGID}     & La capacità di manipolare i group ID dei
                               processi, sia il principale che i supplementari,
-                              (vedi sez.~\ref{sec:proc_setgroups} che quelli
+                              (vedi sez.~\ref{sec:proc_setgroups}) che quelli
                               trasmessi tramite i socket \textit{unix domain}
                               (vedi sez.~\ref{sec:unix_socket}).\\
     \const{CAP\_SETUID}     & La capacità di manipolare gli user ID del
-                              processo (con \func{setuid}, \func{setreuid},
-                              \func{setresuid}, \func{setfsuid}) e di
-                              trasmettere un valore arbitrario
-                              dell'\textsl{uid} nel passaggio delle
-                              credenziali coi socket \textit{unix domain} (vedi
-                              sez.~\ref{sec:unix_socket}).\\ 
+                              processo (vedi sez.~\ref{sec:proc_setuid}) e di
+                              trasmettere un user ID arbitrario nel passaggio
+                              delle credenziali coi socket \textit{unix
+                                domain} (vedi sez.~\ref{sec:unix_socket}).\\ 
 %
 % Linux specific capabilities
 %
 \hline
-    \const{CAP\_SETPCAP}    & La capacità di impostare o rimuovere una capacità
-                              (limitatamente a quelle che il processo
-                              chiamante ha nel suo insieme di capacità
-                              permesse) da qualunque processo.\\
-% TODO cambiata nel 2.4.24 rc1 ? 
-    \const{CAP\_LINUX\_IMMUTABLE}& La capacità di impostare gli attributi
-                              \textit{immutable} e \itindex{append~mode}
-                              \textit{append only} per i file su un
-                              filesystem che supporta questi 
-                              attributi estesi.\\ 
-    \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porre in ascolto server
-                              su porte riservate (vedi 
-                              sez.~\ref{sec:TCP_func_bind}).\\ 
-    \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
-                              \itindex{broadcast} \textit{broadcast} e
-                              \itindex{multicast} \textit{multicast}.\\ 
-    \const{CAP\_NET\_ADMIN} & La capacità di eseguire alcune operazioni
-                              privilegiate sulla rete (impostare le opzioni
-                              privilegiate dei socket, abilitare il
-                              \itindex{multicast} \textit{multicasting},
-                              impostare interfacce di rete e 
-                              tabella di instradamento).\\
-    \const{CAP\_NET\_RAW}   & La capacità di usare socket \texttt{RAW} e
-                              \texttt{PACKET} (quelli che permettono di creare
-                              pacchetti nei protocolli di basso livello).\\
     \const{CAP\_IPC\_LOCK}  & La capacità di effettuare il \textit{memory
                               locking} \itindex{memory~locking} con le
                               funzioni \func{mlock}, \func{mlockall},
@@ -3074,50 +3116,64 @@ funzionalit
                               per le operazioni sugli oggetti di
                               intercomunicazione fra processi (vedi
                               sez.~\ref{sec:ipc_sysv}).\\  
-    \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del
-                              kernel. \\ 
-    \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte
-                              di I/O con \func{ioperm} e \func{iopl} (vedi
-                              sez.~\ref{sec:file_io_port}).\\
+    \const{CAP\_LEASE}      & La capacità di creare dei \textit{file lease}
+                              \index{file!lease} (vedi
+                              sez.~\ref{sec:file_asyncronous_lease})
+                              pur non essendo proprietari del file (dal kernel
+                              2.4).\\ 
+    \const{CAP\_LINUX\_IMMUTABLE}& La capacità di impostare sui file gli
+                              attributi \textit{immutable} e
+                              \itindex{append~mode} \textit{append only} (se
+                              supportati).\\
+    \const{CAP\_MKNOD}      & La capacità di creare
+                              \index{file!di~dispositivo} file di dispositivo
+                              con \func{mknod} (vedi
+                              sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\ 
+    \const{CAP\_NET\_ADMIN} & La capacità di eseguire alcune operazioni
+                              privilegiate sulla rete.\\
+    \const{CAP\_NET\_BIND\_SERVICE}& La capacità di porsi in ascolto
+                              su porte riservate (vedi
+                              sez.~\ref{sec:TCP_func_bind}).\\ 
+    \const{CAP\_NET\_BROADCAST}& La capacità di consentire l'uso di socket in
+                              \itindex{broadcast} \textit{broadcast} e
+                              \itindex{multicast} \textit{multicast}.\\ 
+    \const{CAP\_NET\_RAW}   & La capacità di usare socket \texttt{RAW} e
+                              \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
+    \const{CAP\_SETPCAP}    & La capacità di impostare o rimuovere una
+                              capacità.\\ 
+    % TODO cambiata nel 2.4.24 rc1 ? 
+    \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti
+                              amministrativi. \\
+    \const{CAP\_SYS\_BOOT}  & La capacità di fare eseguire un riavvio del
+                              sistema.\\
+% TODO trattare reboot e kexec 
     \const{CAP\_SYS\_CHROOT}& La capacità di eseguire la funzione
                               \func{chroot} (vedi
                               sez.~\ref{sec:file_chroot}).\\
-    \const{CAP\_SYS\_PTRACE}& Consente di tracciare qualunque processo con
-                              \func{ptrace} (vedi 
-                              sez.~\ref{sec:xxx_ptrace}).\\
+    \const{CAP\_MAC\_ADMIN} & La capacità amministare il MAC di Smack (dal
+                              kernel 2.6.25).\\  
+    \const{CAP\_MAC\_OVERRIDE}& La capacità evitare il MAC di Smack (dal
+                              kernel 2.6.25).\\  
+    \const{CAP\_SYS\_MODULE}& La capacità di caricare e rimuovere moduli del
+                              kernel. \\ 
+    \const{CAP\_SYS\_NICE}  & La capacità di modificare le priorità dei
+                              processi. \\ 
     \const{CAP\_SYS\_PACCT} & La capacità di usare le funzioni di
                               \textit{accounting} dei processi (vedi
                               sez.~\ref{sec:sys_bsd_accounting}).\\ 
-    \const{CAP\_SYS\_ADMIN} & La capacità di eseguire una serie di compiti
-                              amministrativi (come impostare le quote,
-                              attivare e disattivare la swap, montare,
-                              rimontare e smontare filesystem, ecc.). \\
-    \const{CAP\_SYS\_BOOT}  & La capacità di fare eseguire un riavvio del
-                              sistema.\\
-% TODO trattare reboot e kexec 
-    \const{CAP\_SYS\_NICE}  & La capacità di modificare le priorità dei
-                              processi (vedi sez.~\ref{sec:proc_priority}). \\ 
+    \const{CAP\_SYS\_PTRACE}& La capacità  di tracciare qualunque processo con
+                              \func{ptrace} (vedi 
+                              sez.~\ref{sec:xxx_ptrace}).\\
+    \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte
+                              di I/O con \func{ioperm} e \func{iopl} (vedi
+                              sez.~\ref{sec:file_io_port}).\\
     \const{CAP\_SYS\_RESOURCE}& La capacità di superare le limitazioni sulle
-                              risorse, aumentare le quote disco, usare lo
-                              spazio disco riservato all'amministratore.\\ 
+                              risorse.\\ 
     \const{CAP\_SYS\_TIME}  & La capacità di modificare il tempo di sistema
                               (vedi sez.~\ref{sec:sys_time}).\\ 
     \const{CAP\_SYS\_TTY\_CONFIG}& La capacità di simulare un \textit{hangup}
                               della console, con la funzione
                               \func{vhangup}.\\
-    \const{CAP\_MKNOD}      & La capacità di creare
-                              \index{file!di~dispositivo} file di dispositivo
-                              con la funzione \func{mknod} (vedi
-                              sez.~\ref{sec:file_mknod}).\footnotemark\\ 
-    \const{CAP\_LEASE}      & La capacità di creare dei \textit{file lease}
-                              \index{file!lease} su di un file (vedi
-                              sez.~\ref{sec:file_asyncronous_lease})
-                              indipendentemente dalla proprietà dello
-                              stesso.\footnotemark\\
-    \const{CAP\_SETFCAP}    & La capacità di impostare le
-                              \textit{capabilities} di un file (non
-                              supportata).\\ 
-% TODO verificare questa roba dell'auditing
     \hline
   \end{tabular}
   \caption{Le costanti che identificano le \textit{capabilities} presenti nel
@@ -3125,90 +3181,67 @@ funzionalit
 \label{tab:proc_capabilities}
 \end{table}
 
-\footnotetext[21]{queste prime due capacità sono presenti soltanto a partire dai
-  kernel della serie 2.6.11.}
-
-\footnotetext[22]{questa capacità è presente soltanto a partire dai kernel
-  della serie 2.4.x.}
-
-\footnotetext{questa capacità è presente soltanto a partire dai kernel della
-  serie 2.4.x.}
+\footnotetext{vale a dire i permessi caratteristici del modello classico del
+  controllo di accesso chiamato \itindex{Discrectionary~Access~Control~(DAC)}
+  \textit{Discrectionary Access Control} (da cui il nome DAC).}
+
+La prima di queste capacità ``\textsl{ampie}'' è \const{CAP\_FOWNER}, che
+rimuove le restrizioni poste ad un processo che non ha la proprietà di un file
+in un vasto campo di operazioni;\footnote{vale a dire la richiesta che
+  l'user-ID effettivo del processo (o meglio il \textit{filesystem user-ID},
+  vedi sez.~\ref{sec:proc_setuid}) coincida con quello del proprietario.}
+queste comprendono i cambiamenti dei permessi e dei tempi del file (vedi
+sez.~\ref{sec:file_perm_management} e sez.~\ref{sec:file_file_times}), le
+impostazioni degli attributi estesi e delle ACL (vedi
+sez.~\ref{sec:file_xattr} e \ref{sec:file_ACL}), poter ignorare lo
+\itindex{sticky~bit} \textit{sticky bit} nella cancellazione dei file (vedi
+sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag di
+\const{O\_NOATIME} con \func{open} e \func{fcntl} (vedi
+sez.~\ref{sec:file_open} e sez.~\ref{sec:file_fcntl}) senza restrizioni.
+
+Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
+la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
+privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
+il \itindex{multicast} \textit{multicasting}, eseguire la configurazione delle
+interfacce di rete (vedi sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la
+tabella di instradamento.
+
+Una terza \textit{capability} con vasto campo di applicazione è
+\const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
+come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
+disattivare la swap, montare, rimontare e smontare filesystem (vedi
+sez.~\ref{sec:sys_file_config}), effettuare operazioni di controllo sugli
+oggetti dell'IPC di SysV (vedi sez.~\ref{sec:ipc_sysv}), operare sugli
+attributi estesi di classe \texttt{security} o \texttt{trusted} (vedi
+sez.~\ref{sec:file_xattr}), specificare un user-ID arbitrario nella
+trasmissione delle credenziali dei socket (vedi sez.~\ref{sec:socket_xxx}),
+assegnare classi privilegiate per lo scheduling dell'I/O (vedi
+sez.~\ref{sec:io_priority}), superare il limite di sistema sul numero massimo
+di file aperti,\footnote{quello indicato da \procfile{/proc/sys/fs/file-max}.}
+effettuare operazioni privilegiate sulle chiavi mantenute dal kernel (vedi
+sez.~\ref{sec:io_priority}), usare la funzione \func{lookup\_dcookie} (vedi
+sez.~\ref{sec:xxx_profiling}), usare \const{CLONE\_NEWNS} con \func{unshare},
+(vedi sez.~\ref{sec:process_clone}).
+
+Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
+aumentare le priorità di esecuzione dei processi, come la diminuzione del
+valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
+priorità \textit{real-time} (vedi sez.~\ref{sec:proc_real_time}), o
+l'impostazione delle affinità di processore (vedi
+sez.~\ref{sec:proc_sched_multiprocess}); ma con l'introduzione di priorità
+anche riguardo le operazioni di accesso al disco, e, nel caso di sistemi NUMA,
+alla memoria, essa viene a coprire anche la possibilità di assegnare priorità
+arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
+politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
+
+Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
+possibilità di superare i limiti imposti sulle risorse di sistema, come usare
+lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
+usare la funzione \func{ioctl} per cotrollare il \textit{journaling} sul
+filesystem \acr{ext3}, non subire le quote disco, aumentare i limiti sulle
+risorse (vedi sez.~\ref{sec:sys_resource_limit}) e sulle dimensioni dei
+messaggi delle code del SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
 
-Per gestire questo nuovo meccanismo ciascun processo porta con sé tre distinti
-insiemi di \textit{capabilities}, che vengono denominati rispettivamente
-\textit{effective}, \textit{permitted} ed \textit{inherited}. Questi insiemi
-vengono mantenuti in forma di tre diverse maschere binarie,\footnote{il kernel
-  li mantiene, come i vari identificatori di sez.~\ref{sec:proc_setuid},
-  all'interno della \struct{task\_struct} di ciascun processo (vedi
-  fig.~\ref{fig:proc_task_struct}), nei tre campi \texttt{cap\_effective},
-  \texttt{cap\_inheritable}, \texttt{cap\_permitted} del tipo
-  \texttt{kernel\_cap\_t}; questo è attualmente definito come intero a 32 bit,
-  il che comporta un massimo di 32 \textit{capabilities} distinte.} in cui
-ciascun bit corrisponde ad una capacità diversa; se ne è riportato
-l'elenco,\footnote{si tenga presente che l'elenco delle \textit{capabilities}
-  presentato questa tabella, ripreso dalla relativa pagina di manuale
-  (accessibile con \texttt{man capabilities}) e dalle definizioni in
-  \texttt{sys/capabilities.h}, è quello aggiornato al kernel 2.6.6.} con una
-breve descrizione, ed il nome delle costanti che identificano i singoli bit,
-in tab.~\ref{tab:proc_capabilities}; la tabella è divisa in due parti, la
-prima riporta le \textit{capabilities} previste nella bozza dello standard
-POSIX1.e, la seconda quelle specifiche di Linux.
-
-L'utilizzo di tre distinti insiemi serve a fornire una interfaccia flessibile
-per l'uso delle \textit{capabilities}, con scopi analoghi a quelli per cui
-sono mantenuti i diversi insiemi di identificatori di
-sez.~\ref{sec:proc_setuid}; il loro significato è il seguente:
-\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{effective}] l'insieme delle \textit{capabilities}
-  ``\textsl{effettive}'', cioè di quelle che vengono effettivamente usate dal
-  kernel quando deve eseguire il controllo di accesso per le varie operazioni
-  compiute dal processo.
-\item[\textit{permitted}] l'insieme delle \textit{capabilities}
-  ``\textsl{permesse}'', cioè l'insieme di quelle capacità che un processo
-  \textsl{può} impostare come \textsl{effettive}. Se un processo cancella una
-  capacità da questo insieme non potrà più riassumerla (almeno che non esegua
-  un programma che è \acr{suid} di root).
-\item[\textit{inherited}] l'insieme delle \textit{capabilities}
-  ``\textsl{ereditabili}'', cioè quelle che vengono trasmesse ad un nuovo
-  programma eseguito attraverso una chiamata ad \func{exec} (con l'eccezione
-  del caso che questo sia \acr{suid} di root).
-\label{sec:capabilities_set}
-\end{basedescript}
-
-Oltre a questi tre insiemi, che sono relativi al singolo processo, il kernel
-mantiene un insieme generale valido per tutto il sistema, chiamato
-\itindex{capabilities~bounding~set} \textit{capabilities bounding set}. Ogni
-volta che un programma viene posto in esecuzione con \func{exec} il contenuto
-degli insiemi \textit{effective} e \textit{permitted} vengono mascherati con
-un \textsl{AND} binario del contenuto corrente del \textit{capabilities
-  bounding set}, così che il nuovo processo potrà disporre soltanto delle
-capacità in esso elencate.
-
-Il \textit{capabilities bounding set} è un parametro di sistema, accessibile
-attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che per
-questa sua caratteristica consente di impostare un limite generale alle
-capacità che possono essere accordate ai vari processi.  Questo valore può
-essere impostato ad un valore arbitrario esclusivamente dal primo processo
-eseguito nel sistema (di norma cioè da \texttt{/sbin/init}), ogni processo
-eseguito successivamente (cioè con \textsl{pid} diverso da 1) anche se
-eseguito con privilegi di amministratore potrà soltanto rimuovere uno dei bit
-già presenti dell'insieme: questo significa che una volta rimossa una
-\textit{capability} dal \textit{capabilities bounding set} essa non sarà più
-disponibile, neanche per l'amministratore, a meno di un riavvio.
-
-Quando un programma viene messo in esecuzione\footnote{cioè quando viene
-  eseguita la \func{execve} con cui lo si lancia; in corrispondenza di una
-  \func{fork} le \textit{capabilities} non vengono modificate.} esso eredita
-(nel senso che assume negli insiemi \textit{effective} e \textit{permitted})
-le \textit{capabilities} mantenute nell'insieme \textit{inherited}, a meno che
-non sia eseguito un programma \acr{suid} di root o la \func{exec} sia stata
-eseguita da un programma con \textsl{uid} reale zero; in tal caso il programma
-ottiene tutte le \textit{capabilities} presenti nel \textit{capabilities
-  bounding set}. In questo modo si può far si che ad un processo eseguito in
-un secondo tempo possano essere trasmesse solo un insieme limitato di
-capacità, impedendogli di recuperare quelle assenti nell'insieme
-\textit{inherited}. Si tenga presente invece che attraverso una \func{fork}
-vengono mantenute le stesse capacità del processo padre.
 
 Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
 funzioni che permettono rispettivamente di leggere ed impostare i valori dei
index 3693f9186eafdf8b12df0eba71943a2cfb61b2ca..cd5c04bd7fa5b8a7f6b4b178ab3865b69e3fddb3 100644 (file)
@@ -631,7 +631,7 @@ comune dopo l'esecuzione di una \func{fork} 
 \item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit});
 \item il valori di \textit{nice}, le priorità real-time e le affinità di
   processore (vedi sez.~\ref{sec:proc_sched_stand},
-  sez.~\ref{sec:proc_real_time} e sez.\ref{sec:proc_sched_multiprocess});
+  sez.~\ref{sec:proc_real_time} e sez.~\ref{sec:proc_sched_multiprocess});
 \item le variabili di ambiente (vedi sez.~\ref{sec:proc_environ}).
 \end{itemize*}
 Le differenze fra padre e figlio dopo la \func{fork} invece sono:
@@ -648,7 +648,6 @@ Le differenze fra padre e figlio dopo la \func{fork} invece sono:
   per il figlio vengono cancellati.
 \end{itemize*}
 
-
 Una seconda funzione storica usata per la creazione di un nuovo processo è
 \func{vfork}, che è esattamente identica a \func{fork} ed ha la stessa
 semantica e gli stessi errori; la sola differenza è che non viene creata la
@@ -666,8 +665,9 @@ venne introdotta in BSD per migliorare le prestazioni.
 
 Dato che Linux supporta il \itindex{copy~on~write} \textit{copy on write} la
 perdita di prestazioni è assolutamente trascurabile, e l'uso di questa
-funzione (che resta un caso speciale della system call \func{\_\_clone}) è
-deprecato; per questo eviteremo di trattarla ulteriormente.
+funzione, che resta un caso speciale della system call \func{clone} (che
+tratteremo in dettaglio in sez.~\ref{sec:process_clone}) è deprecato; per
+questo eviteremo di trattarla ulteriormente.
 
 
 \subsection{La conclusione di un processo}
@@ -2888,8 +2888,8 @@ utilizzato per un compito importante (ad esempio per applicazioni real-time o
 la cui risposta è critica) e si vuole la massima velocità, con questa
 interfaccia diventa possibile selezionare gruppi di processori utilizzabili in
 maniera esclusiva.  Lo stesso dicasi quando l'accesso a certe risorse (memoria
-o periferiche) può avere un costo diverso a seconda del processore (come
-avviene nelle architetture NUMA).
+o periferiche) può avere un costo diverso a seconda del processorecome
+avviene nelle architetture NUMA (\textit{Non-Uniform Memory Access}).
 
 Infine se un gruppo di processi accede alle stesse risorse condivise (ad
 esempio una applicazione con più \itindex{thread} \textit{thread}) può avere
@@ -2971,6 +2971,18 @@ non avranno alcun risultato effettivo.
 \itindend{CPU~affinity}
 
 
+%TODO trattare le priorità di I/O
+% vedi man ioprio_set e Documentation/block/ioprio.txt
+
+\subsection{Le priorità per le operazioni di I/O}
+\label{sec:io_priority}
+
+Una delle 
+
+
+%TODO trattare le funzionalità per il NUMA
+% vedi man numa e le pagine di manuale relative
+% vedere anche dove metterle...
 
 \section{Problematiche di programmazione multitasking}
 \label{sec:proc_multi_prog}
index 9a37199c62aff381f3cf0754065acf843777579f..76361d4ad0230713e9437eaebc3b659f6aceb497 100644 (file)
@@ -661,8 +661,8 @@ inclusa nei sorgenti del kernel, nella directory \file{Documentation/sysctl}.
 
 Ma oltre alle informazioni ottenibili da \func{sysctl} dentro \file{proc} sono
 disponibili moltissime altre informazioni, fra cui ad esempio anche quelle
-fornite da \func{uname} (vedi sez.~\ref{sec:sys_config}) che sono mantenute
-nei file \procrelfile{/proc/sys/kernel}{ostype},
+fornite da \func{uname} (vedi sez.~\ref{sec:sys_uname}) che sono mantenute nei
+file \procrelfile{/proc/sys/kernel}{ostype},
 \procrelfile{/proc/sys/kernel}{hostname},
 \procrelfile{/proc/sys/kernel}{osrelease},
 \procrelfile{/proc/sys/kernel}{version} e
@@ -922,9 +922,16 @@ semplice invocare direttamente il programma \cmd{mount}, per cui ne
 tralasceremo la trattazione, rimandando al manuale delle \acr{glibc}
 \cite{glibc} per la documentazione completa.
 
+% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C)
+% TODO documentare swapon e swapoff (man 2 ...)
+
+
+% TODO documentare keyctl ????
+% (fare sezione dedicata ????)
+%\subsection{La gestione delle chiavi}
+%\label{sec:keyctl_management}
 
 
-% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C)
 
 \subsection{La gestione delle informazioni su utenti e gruppi}
 \label{sec:sys_user_group}
@@ -1804,6 +1811,10 @@ minimo indicato dal secondo valore (sempre in percentuale di spazio disco
 libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve
 essere controllata detta percentuale.
 
+% TODO trattare quote disco 
+% vedi man quotactl
+%\section{La gestione delle quote disco}
+%\label{sec:disk_quota}
 
 
 
index 971a7b330ac97c111c2d7eb87b40b8c0bda9f7cd..93eb19766b3ed784e1c201b24b859a230025ac0e 100644 (file)
@@ -57,12 +57,12 @@ dei processi:
 \end{itemize}
 
 
-
-
 \subsection{I \textit{thread} e Linux}
 \label{sec:linux_thread}
 
 
+\subsection{La system call \func{clone}}
+\label{sec:process_clone}