From: Simone Piccardi Date: Mon, 7 Nov 2005 23:20:12 +0000 (+0000) Subject: Inserito programma per impostare l'accounting BSD, prima documentazione X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=bd6a0ffe99bfb70905408f576010faafb2502916 Inserito programma per impostare l'accounting BSD, prima documentazione sull'interfaccia di basso livello delle capabilities. --- diff --git a/listati/cap_user_header_t.h b/listati/cap_user_header_t.h new file mode 100644 index 0000000..791aa9e --- /dev/null +++ b/listati/cap_user_header_t.h @@ -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; diff --git a/prochand.tex b/prochand.tex index f94d863..bd0cd21 100644 --- a/prochand.tex +++ b/prochand.tex @@ -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 diff --git a/sources/AcctCtrl.c b/sources/AcctCtrl.c index c60f958..705cc7a 100644 --- a/sources/AcctCtrl.c +++ b/sources/AcctCtrl.c @@ -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); diff --git a/system.tex b/system.tex index 446c0f6..cd65f17 100644 --- a/system.tex +++ b/system.tex @@ -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