Inserito programma per impostare l'accounting BSD, prima documentazione
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 7 Nov 2005 23:20:12 +0000 (23:20 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 7 Nov 2005 23:20:12 +0000 (23:20 +0000)
sull'interfaccia di basso livello delle capabilities.

listati/cap_user_header_t.h [new file with mode: 0644]
prochand.tex
sources/AcctCtrl.c
system.tex

diff --git a/listati/cap_user_header_t.h b/listati/cap_user_header_t.h
new file mode 100644 (file)
index 0000000..791aa9e
--- /dev/null
@@ -0,0 +1,12 @@
+#define _LINUX_CAPABILITY_VERSION  0x19980330
+
+typedef struct __user_cap_header_struct {
+       int version;
+       int pid;
+} *cap_user_header_t;
+typedef struct __user_cap_data_struct {
+        int effective;
+        int permitted;
+        int inheritable;
+} *cap_user_data_t;
index f94d8635a377835f4d4ad56ff97437bc66bbb9d1..bd0cd21c848b4256530a6a3febca997e74b1d899 100644 (file)
@@ -2060,7 +2060,7 @@ implementata.\footnote{per attualmente si intende fino al kernel 2.6.13, e
 \label{tab:proc_capabilities}
 \end{table}
 
-\footnotetext[18]{questa capacità è presente soltato a partire dai kernel
+\footnotetext[21]{questa capacità è presente soltato a partire dai kernel
   della serie 2.4.x.}
 
 \footnotetext{questa capacità è presente soltato a partire dai kernel della
@@ -2089,21 +2089,20 @@ 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è quelle che vengono effettivamente usate dal
-  kernel per eseguire il controllo di accesso per le operazioni compiute dal
-  processo.
+  ``\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 che un processo \textsl{può}
-  impostare come \textsl{effettive} se ha la capacità \const{CAP\_SETPCAP}. Se
-  un processo cancella una capacità da questo insieme non potrà più
-  riassumerla (almeno che non esegua un programma che è \acr{suid} di root).
+  ``\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{ereditate}, 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).
+  ``\textsl{ereditate}'', 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).
 \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
@@ -2121,21 +2120,75 @@ 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 può al più rimuovere uno dei bit
-dell'insieme: questo significa che una volta rimossa da esso una
-\textit{capability} essa non sarà più disponibile, neanche per
-l'amministratore, a meno di un riavvio.
-
+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 viene messo in esecuzione (con \func{exec}) un processo eredita le
+Quando viene messo in esecuzione (con \func{exec}) un processo 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}.
+  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} Linux usa due funzioni,
+\funcd{capget} e \funcd{capset}, che permettono rispettivamente di leggerne ed
+impostarne i valori, i cui rispettivi prototipi sono:
+\begin{functions}
+  \headdecl{sys/capability.h}
+
+  \funcdecl{int capget(cap\_user\_header\_t hdrp, cap\_user\_data\_t datap)}
+  Legge le \textit{capabilities}.
+
+  \funcdecl{int capset(cap\_user\_header\_t hdrp, const cap\_user\_data\_t
+    datap)} 
+  Imposta le \textit{capabilities}.
+
+  
+  \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in caso
+    di errore, nel qual caso \var{errno} può assumere i valori:
+    \begin{errlist}
+    \item[\errcode{ESRCH}] si è fatto riferimento ad un processo inesistente.
+    \item[\errcode{EPERM}] si è tentato di aggiungere una capacità
+      nell'insieme delle \textit{capabilities} permesse, o di impostare una
+      capacità non presente nell'insieme di quelle permesse negli insieme
+      delle effettive o ereditate, o si è cercato di impostare una
+      \textit{capability} di un altro processo senza avare
+      \const{CAP\_SETPCAP}. 
+  \end{errlist}
+  ed inoltre \errval{EFAULT} ed \errval{EINVAL}}
+\end{functions}
+
+Queste due funzioni costituiscono una interfaccia di basso livello, ed usano
+due strutture specifiche di Linux, la cui definizione è riportata in
+fig.~\ref{fig:cap_kernel_struct}. Queste ultime, come le due funzioni
+precedenti, sono soggette ad essere modificate con il cambiamento del kernel
+(in particolare i tipi di dati delle strutture) ed anche se finora
+l'interfaccia è risultata stabile, 
+
 
+\begin{figure}[!htb]
+  \footnotesize
+  \centering
+  \begin{minipage}[c]{15cm}
+    \includestruct{listati/tms.h}
+  \end{minipage} 
+  \normalsize 
+  \caption{Le strutture specifiche di Linux per l'interfaccia di gestione di
+    basso livello delle \textit{capabilities}.}
+  \label{fig:cap_kernel_struct}
+\end{figure}
 
 
+sono definite in una apposita struttura del kernel, 
 
+Per la gestione delle \textit{capabilities} lo standard POSIX.1e prevede l'uso
+di uno specifico tipo di dato \type{cap\_t}, che 
 
 
 
index c60f9586dc971c8c2b5dc09851c024cb5a3b1cfe..705cc7a23b86bcdbd5c9d41675e7791ec9dc2dc2 100644 (file)
@@ -70,11 +70,15 @@ int main(int argc, char *argv[])
      *               Main code beginning
      * 
      * ***********************************************************/
-    if ((argc - optind) != 1) {          /* There must be remaing parameters */
-       printf("Wrong number of arguments %d\n", argc - optind);
-        usage();
+    if (i == -1) {
+       printf("Specify option\n");
+       usage();
     }
     if (enable) {
+       if ((argc - optind) != 1) {      /* There must be remaing parameters */
+           printf("Wrong number of arguments %d\n", argc - optind);
+           usage();
+       }
        i = acct(argv[optind]);
     } else {
        i = acct(NULL);
index 446c0f67c51648c1ad29ad48f441b57495ccddea..cd65f17f3f976e32cde376ffbfb40aaa1ebba877 100644 (file)
@@ -1702,13 +1702,13 @@ viene valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti),
 questo è anche il massimo valore che può essere assegnato a questo argomento.
 
 
-\subsection{La contabilità in stile BSD}
+\subsection{La \textsl{contabilità} in stile BSD}
 \label{sec:sys_bsd_accounting}
 
-Una ultima modalità per monitorare l'uso delle risorse è quella, se si è
-compilato il kernel con il relativo supporto,\footnote{se cioè si è abilitata
-  l'opzione di compilazione \texttt{CONFIG\_BSD\_PROCESS\_ACCT}.} di attivare
-il cosiddetto \textit{BSD accounting}, che consente di registrare su file una
+Una ultima modalità per monitorare l'uso delle risorse è, se si è compilato il
+kernel con il relativo supporto,\footnote{se cioè si è abilitata l'opzione di
+  compilazione \texttt{CONFIG\_BSD\_PROCESS\_ACCT}.} quella di attivare il
+cosiddetto \textit{BSD accounting}, che consente di registrare su file una
 serie di informazioni\footnote{contenute nella struttura \texttt{acct}
   definita nel file \texttt{include/linux/acct.h} dei sorgenti del kernel.}
 riguardo alla \textsl{contabilità} delle risorse utilizzate da ogni processo
@@ -1741,9 +1741,11 @@ contenuti nella stringa puntata da \param{filename}; la funzione richiede che
 il processo abbia i privilegi di amministratore (è necessaria la
 \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi
 sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \const{NULL} per
-\param{filename} il \textit{BSD accounting} viene invece disabilitato.
+\param{filename} il \textit{BSD accounting} viene invece disabilitato. Un
+semplice esempio per l'uso di questa funzione è riportato nel programma
+\texttt{AcctCtrl.c} dei sorgenti allegati alla guida.
 
-Quando si attiva la contabilità il file che si indica deve esistere; esso
+Quando si attiva la contabilità, il file che si indica deve esistere; esso
 verrà aperto in sola scrittura;\footnote{si applicano al pathname indicato da
   \param{filename} tutte le restrizioni viste in cap.~\ref{cha:file_intro}.}
 le informazioni verranno registrate in \textit{append} in coda al file tutte