X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=d1ba1b048063f143d4959670b8de7575f0297d37;hb=889a015512d1a1e864e02b14d281f213cf896914;hp=a9db2f9cd84baea7b9d3fb819f7b5a6259ff0076;hpb=b68014de87099a61ac1a2eeec57618d04749849b;p=gapil.git diff --git a/filedir.tex b/filedir.tex index a9db2f9..d1ba1b0 100644 --- a/filedir.tex +++ b/filedir.tex @@ -16,10 +16,11 @@ In questo capitolo tratteremo in dettaglio le modalità con cui si gestiscono file e directory, iniziando dalle funzioni di libreria che si usano per copiarli, spostarli e cambiarne i nomi. Esamineremo poi l'interfaccia che permette la manipolazione dei vari attributi di file e directory ed alla fine -faremo una trattazione dettagliata su come è strutturato il sistema base di -protezioni e controllo dell'accesso ai file e sulle funzioni che ne permettono -la gestione. Tutto quello che riguarda invece la manipolazione del contenuto -dei file è lasciato ai capitoli successivi. +prenderemo in esame la struttura di base del sistema delle protezioni e del +controllo dell'accesso ai file e le successive estensioni (\textit{Extended + Attributes}, ACL, quote disco, \textit{capabilities}). Tutto quello che +riguarda invece la manipolazione del contenuto dei file è lasciato ai capitoli +successivi. @@ -41,8 +42,8 @@ riguarda il comportamento e gli effetti delle varie funzioni. \label{sec:file_link} Una caratteristica comune a diversi sistemi operativi è quella di poter creare -dei nomi fittizi (come gli alias del MacOS o i collegamenti di Windows o i -nomi logici del VMS) che permettono di fare riferimento allo stesso file +dei nomi fittizi (come gli alias del vecchio MacOS o i collegamenti di Windows +o i nomi logici del VMS) che permettono di fare riferimento allo stesso file chiamandolo con nomi diversi o accedendovi da directory diverse. Questo è possibile anche in ambiente Unix, dove tali collegamenti sono @@ -1483,7 +1484,7 @@ il suo prototipo è: \end{errlist}} \end{prototype} -La funzionne genera un nome univoco sostituendo le \code{XXXXXX} finali di +La funzionane genera un nome univoco sostituendo le \code{XXXXXX} finali di \param{template}; dato che \param{template} deve poter essere modificata dalla funzione non si può usare una stringa costante. Tutte le avvertenze riguardo alle possibili \itindex{race~condition} \textit{race condition} date per @@ -1596,7 +1597,7 @@ funzioni \funcd{stat}, \funcd{fstat} e \funcd{lstat}, i cui prototipi sono: \errval{EACCES}, \errval{ENOMEM}, \errval{ENAMETOOLONG}.} \end{functions} -La funzione \func{stat} legge le informazion del file il cui pathname è +La funzione \func{stat} legge le informazioni del file il cui pathname è specificato dalla stringa puntata da \param{file\_name} e le inserisce nel buffer puntato dall'argomento \param{buf}; la funzione \func{lstat} è identica a \func{stat} eccetto che se \param{file\_name} è un link simbolico vengono @@ -1792,9 +1793,9 @@ dimensione si possono usare le due funzioni \funcd{truncate} e \errval{EROFS}, \errval{EIO}, \errval{EFAULT}, \errval{ELOOP}.} \end{functions} -Emtrambe le funzioni fan sì che la dimensione del file sia troncata ad un +Entrambe le funzioni fan sì che la dimensione del file sia troncata ad un valore massimo specificato da \param{length}, e si distinguono solo per il -fatto che il file viene indicato con il pathame \param{file\_name} per +fatto che il file viene indicato con il pathname \param{file\_name} per \func{truncate} e con il file descriptor \param{fd} per \funcd{ftruncate}; se il file è più lungo della lunghezza specificata i dati in eccesso saranno perduti. @@ -1805,7 +1806,7 @@ lunghezza scelta; nel caso di Linux viene esteso con la creazione di un \index{file!\textit{hole}} \textsl{buco} nel \itindex{sparse~file} file e ad una lettura si otterranno degli zeri; si tenga presente però che questo comportamento è supportato solo per filesystem nativi, ad esempio su un -filesystem non nativo come il VFAT di windows questo non è possibile. +filesystem non nativo come il VFAT di Windows questo non è possibile. \subsection{I tempi dei file} \label{sec:file_file_times} @@ -1995,7 +1996,7 @@ I tempi di ultimo accesso e modifica possono essere modificati esplicitamente usando la funzione \funcd{utime}, il cui prototipo è: \begin{prototype}{utime.h} {int utime(const char *filename, struct utimbuf *times)} - Modidica i tempi di ultimo accesso e modifica di un file. + Modifica i tempi di ultimo accesso e modifica di un file. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: @@ -2057,7 +2058,7 @@ precisione; il suo prototipo è: \begin{prototype} {sys/time.h} {int utimes(const char *filename, struct timeval times[2])} - Modidica i tempi di ultimo accesso e modifica di un file. + Modifica i tempi di ultimo accesso e modifica di un file. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: @@ -2708,7 +2709,7 @@ in particolare accade che: \end{enumerate} Per alcuni filesystem\footnote{i filesystem più comuni (\textsl{ext2}, - \textsl{ext3}, \textsl{ext4}, \textsl{reiserfs}) supportano questa + \textsl{ext3}, \textsl{ext4}, \textsl{ReiserFS}) supportano questa caratteristica, che è mutuata da BSD.} è inoltre prevista un'ulteriore misura di sicurezza, volta a scongiurare l'abuso dei \itindex{suid~bit} bit \acr{suid} e \acr{sgid}; essa consiste nel cancellare automaticamente questi @@ -4096,7 +4097,6 @@ ACL di default associata a \func{path}.\footnote{questo però è una estensione \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EBADF}]. \item[\errcode{EINVAL}] o \param{acl} non è una ACL valida, o \param{type} ha in valore non corretto. \item[\errcode{ENOSPC}] non c'è spazio disco sufficiente per contenere i @@ -4147,8 +4147,185 @@ ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con \itindend{Access~Control~List} +\subsection{La gestione delle quote disco} +\label{sec:disk_quota} + +Quella delle quote disco è una funzionalità introdotta inizialmente da BSD, e +presente in Linux fino dai kernel dalla serie 2.0, che consente di porre dei +tetti massimi al consumo delle risorse di un filesystem (spazio disco e +\textit{inode}) da parte di utenti e gruppi. Dato che la funzionalità ha senso +solo per i filesystem su cui si mantengono i dati degli utenti\footnote{in + genere la si attiva sul filesystem che contiene le \textit{home} degli + utenti, dato che non avrebbe senso per i file di sistema che in genere + appartengono all'amministratore.} essa deve essere esplicitamente richiesta; +questo si fa tramite due distinte opzioni di montaggio, \texttt{usrquota} e +\texttt{grpquota} che abilitano le quote rispettivamente per gli utenti e per +i gruppi. Grazie a questo è possibile usare le limitazioni sulle quote solo +sugli utenti o solo sui gruppi. + +Il meccanismo prevede che per ciascun filesystem che supporta le quote disco +(i vari \textit{extN}, \textit{btrfs}, \textit{XFS}, \textit{JFS}, +\textit{ReiserFS}) il kernel provveda sia a mantenere aggiornati i dati +relativi al consumo delle risorse da parte di utenti e/o gruppi che a far +rispettare i limiti imposti dal sistema, con la generazione di un errore di +\errval{EDQUOT} per tutte le operazioni sui file che porterebbero ad un +superamento degli stessi. Si tenga presente che questi due compiti sono +separati, il primo si attiva al montaggio del filesystem con le quote +attivate, il secondo deve essere abilitato esplicitamente. + +Per il mantenimento dei dati di consumo delle risorse vengono usati due file +riservati (uno per le quote utente e l'altro per le quote gruppo) nella +directory radice del filesystem su cui si sono attivate le quote;\footnote{la + cosa vale per tutti i filesystem tranne \textit{XFS} che mantiene i dati + internamente.} con la versione 2 del supporto delle quote, l'unica rimasta +in uso, questi file sono \texttt{aquota.user} e \texttt{aquota.group}, in +precedenza erano \texttt{quota.user} e \texttt{quota.group}. Dato che i file +vengono aggiornati soltanto se il filesystem è stato montato con il supporto +delle quote, se si abilita questo in un secondo tempo (o se si eseguono +operazioni sul filesystem senza averlo abilitato) i dati contenuti possono non +corrispondere esattamente allo stato corrente del consumo delle risorse; per +questo in genere prima di montare in scrittura un filesystem su cui sono +abilitate le quote in genere viene utilizzato il comando \cmd{quotacheck} per +verificare e aggiornare i dati. + +Le restrizioni sul consumo delle risorse prevedono due limiti, il primo viene +detto \textit{soft limit} e può essere superato per brevi periodi di tempo, il +secondo viene detto \textit{hard limit} non può mai essere superato. Il +periodo di tempo per cui è possibile superare il \textit{soft limit} è detto +``\textsl{periodo di grazia}'' (\textit{grace period}), passato questo tempo +il passaggio del \textit{soft limit} viene trattato allo stesso modo +dell'\textit{hard limit}. Questi limiti riguardano separatamente sia lo +spazio disco (i blocchi) che il numero di file (gli \textit{inode}) e devono +pertanto essere specificati per entrambe le risorse. + +La funzione che consente di controllare tutti i vari aspetti della gestione +delle quote è \funcd{quotactl}, ed il suo prototipo è: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{sys/quota.h} + + \funcdecl{quotactl(int cmd, const char *dev, int id, caddr\_t addr)} + + Esegue una operazione di controllo sulle quote disco. + + \bodydesc{La funzione restituisce $0$ in caso di successo e $-1$ in caso di + errore, nel qual caso \var{errno} assumerà uno dei valori: + \begin{errlist} + \item[\errcode{EACCES}] il file delle quote non è un file ordinario. + \item[\errcode{EBUSY}] si è richiesto \const{Q\_QUOTAON} ma le quote sono + già attive. + \item[\errcode{EFAULT}] l'indirizzo \param{addr} non è valido. + \item[\errcode{EIO}] errore di lettura/scrittura sul file delle quote. + \item[\errcode{EMFILE}] non si può aprire il file delle quote avendo + superato il limite sul numero di file aperti nel sistema. + \item[\errcode{EINVAL}] o \param{cmd} non è un comando valido, + o il dispositivo \param{dev} non esiste. + \item[\errcode{ENODEV}] \param{dev} non corrisponde ad un \textit{mount + point} attivo. + \item[\errcode{ENOPKG}] il kernel è stato compilato senza supporto per le + quote. + \item[\errcode{ENOTBLK}] \param{dev} non è un dispositivo a blocchi. + \item[\errcode{EPERM}] non si hanno i permessi per l'operazione richiesta. + \item[\errcode{ESRCH}] è stato richiesto uno fra \const{Q\_GETQUOTA}, + \const{Q\_SETQUOTA}, \const{Q\_SETUSE}, \const{Q\_SETQLIM} per un + filesystem senza quote attivate. + \end{errlist} +} +\end{functions} + +La funzione richiede che il filesystem sul quale si vuole operare sia montato +con il supporto delle quote abilitato; esso deve essere specificato con il +nome del file di dispositivo nell'argomento \param{dev}. Per le operazioni che +lo richiedono inoltre si dovrà indicare con l'argomento \param{id} l'utente o +il gruppo (specificati rispettivamente per \acr{uid} e \acr{gid}) su cui si +vuole operare. Alcune operazioni usano l'argomento \param{addr} per indicare +un indirizzo ad un area di memoria il cui utilizzo dipende dall'operazione +stessa. + +Il tipo di operazione che si intende effettuare deve essere indicato tramite +il primo argomento \param{cmd}, questo in genere viene specificato con +l'ausilio della macro \macro{QCMD}: +\begin{functions} + \funcdecl{int QCMD(subcmd,type)} Imposta il comando \param{subcmd} per il + tipo di quote (utente o gruppo) \param{type}. +\end{functions} +\noindent che consente di specificare, oltre al tipo di operazione, se questa +deve applicarsi alle quote utente o alle quote gruppo, nel qual +caso \param{type} deve essere rispettivamente \const{USRQUOTA} o +\const{GRPQUOTA}. + +Le diverse operazioni supportate da \func{quotactl}, da indicare con +l'argomento \param{subcmd} di \macro{QCMD}, sono riportate in tab. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}{|l|p{10cm}|} + \hline + \textbf{Tipo} & \textbf{Descrizione} \\ + \hline + \hline + \const{Q\_QUOTAON} & attiva l'applicazione delle quote disco per il + filesystem \param{dev}, si deve passare + in \param{addr} il pathname al file che mantiene le + quote, che deve esistere; l'operazione richiede i + privilegi di amministratore,\footnotemark \param{id} + viene ignorato.\\ + \const{Q\_QUOTAOFF} & disattiva l'applicazione delle quote disco per il + filesystem \param{dev}; l'operazione richiede i + privilegi di amministratore, \param{id} + e \param{addr} vengono ignorati.\\ + \const{Q\_GETQUOTA} & legge i limiti ed i valori correnti delle quote nel + filesystem \param{dev} per l'utente o il gruppo + specificato da \param{id}; si devono avere i + privilegi di amministratore per leggere i dati + relativi ad altri utenti o a gruppi di cui non si fa + parte, il risultato viene restituito in una struttura + \struct{dqblk} all'indirizzo indicato + da \param{addr}.\\ + \const{Q\_SETQUOTA} & imposta le quote nel filesystem \param{dev} per + l'utente o il gruppo specificato da \param{id} come + ottenuti dalla struttura \struct{dqblk} puntata + da \param{addr}; l'operazione richiede i + privilegi di amministratore.\\ + \const{Q\_GETINFO} & .\\ + \const{Q\_SETINFO} & .\\ + \const{Q\_GETFMT} & .\\ + \const{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del + filesystem; in questo caso \param{dev} può anche + essere \val{NULL} nel qual caso vengono aggiornate + i dati per tutti i filesystem con quote + attive, \param{id} e \param{addr} vengono comunque + ignorati.\\ + \const{Q\_GETSTATS} & .\\ +% \const{} & .\\ + \hline + \end{tabular} + \caption{Possibili valori per l'argomento \param{subcommand} di + \macro{QCMD}.} + \label{tab:quotactl_commands} +\end{table} + +\footnotetext{per tutte le operazioni privilegiate con le quote è richiesta la + \textit{capability} \const{CAP\_SYS\_ADMIN}.} + + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/dqblk.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{dqblk} per i dati delle quote disco.} + \label{fig:dqblk_struct} +\end{figure} + + +% TODO trattare quote disco +% vedi man quotactl + \subsection{La gestione delle \textit{capabilities}} \label{sec:proc_capabilities} @@ -4187,66 +4364,179 @@ Il meccanismo completo delle \textit{capabilities}\footnote{l'implementazione si rifà ad una bozza di quello che doveva diventare lo standard POSIX.1e, poi 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 +essere utilizzate quando viene messo in esecuzione uno specifico programma +(una sorta di \acr{suid} anch'esso parcellizzato); ma il supporto per questa +funzionalità, chiamata \textit{file capabilities}, è 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 per ottenere limitazioni delle capacità dell'amministratore a +livello di sistema operativo, come \index{SELinux} SELinux. + +Con questo supporto e con le ulteriori modifiche introdotte con il kernel +2.6.25 il meccanismo delle \textit{capabilities} è stato totalmente +rivoluzionato, rendendolo più aderente alle intenzioni originali dello standard +POSIX, rimuovendo il significato che fino ad allora aveva avuto la capacità +\macro{CAP\_SETPCAP} e le modalità di funzionamento del cosiddetto +\itindex{capabilities~bounding~set} \textit{capabilities bounding + set}. Ulteriori modifiche sono state apportate con il kernel 2.6.26 per +consentire la rimozione non ripristinabile dei privilegi di +amministratore. Questo fa sì che il significato ed il comportamento del kernel +finisca per dipendere dalla versione dello stesso e dal fatto che le nuove +\textit{file capabilities} siano abilitate o meno. Per capire meglio la +situazione e cosa è cambiato conviene allora spiegare con maggiori dettagli +come funziona il meccanismo delle \textit{capabilities}. + +Il primo passo per frazionare i privilegi garantiti all'amministratore, +supportato fin dalla introduzione iniziale del kernel 2.2, è stato quello in +cui a ciascun processo sono stati associati tre distinti insiemi di +\textit{capabilities}, denominati rispettivamente \textit{permitted}, +\textit{inheritable} ed \textit{effective}. 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. + \texttt{kernel\_cap\_t}; questo era, fino al kernel 2.6.25 definito come + intero a 32 bit per un massimo di 32 \textit{capabilities} distinte, + attualmente è stato aggiornato ad un vettore in grado di mantenerne fino a + 64.} 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}} +sez.~\ref{sec:proc_setuid}; il loro significato, che è rimasto sostanzialmente +lo stesso anche dopo le modifiche seguite alla introduzione delle +\textit{file capabilities} è il seguente: +\begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}} +\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} o come + \textsl{ereditabili}. Se un processo cancella una capacità da questo insieme + non potrà più riassumerla.\footnote{questo nei casi ordinari, sono + previste però una serie di eccezioni, dipendenti anche dal tipo di + supporto, che vedremo meglio in seguito dato il notevole intreccio nella + casistica.} +\item[\textit{inheritable}] l'insieme delle \textit{capabilities} + ``\textsl{ereditabili}'', cioè di quelle che verranno trasmesse come insieme + delle \textsl{permesse} ad un nuovo programma eseguito attraverso una + chiamata ad \func{exec}. \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. +Con l'introduzione delle \textit{file capabilities} sono stati introdotti +altri tre insiemi associabili a ciascun file.\footnote{la realizzazione viene + eseguita con l'uso di uno specifico attributo esteso, + \texttt{security.capability}, la cui modifica è riservata, (come illustrato + in sez.~\ref{sec:file_xattr}) ai processi dotato della capacità + \macro{CAP\_SYS\_ADMIN}.} Le \textit{file capabilities} hanno effetto +soltanto quando il file che le porta viene eseguito come programma con una +\func{exec}, e forniscono un meccanismo che consente l'esecuzione dello stesso +con maggiori privilegi; in sostanza sono una sorta di estensione dell'uso del +\acr{suid} di root. Anche questi tre insiemi sono identificati con gli stessi +nomi, ma il loro significato è diverso: +\begin{basedescript}{\desclabelwidth{2.1cm}\desclabelstyle{\nextlinelabel}} +\item[\textit{permitted}] (chiamato originariamente \textit{forced}) l'insieme + delle capacità che con l'esecuzione del programma verranno aggiunte alle + capacità \textsl{permesse} del processo. +\item[\textit{inheritable}] (chiamato originariamente \textit{allowed}) + l'insieme delle capacità che con l'esecuzione del programma possono essere + ereditate dal processo originario (che cioè vengono tolte + dall'\textit{inheritable set} del processo originale all'esecuzione di + \func{exec}). +\item[\textit{effective}] in questo caso non si tratta di un insieme ma di un + unico valore logico; se attivo all'esecuzione del programma tutte le + capacità che risulterebbero \textsl{permesse} verranno pure attivate, + inserendole automaticamente nelle \textsl{effettive}, se disattivato nessuna + capacità verrà attivata (cioè l'\textit{effective set} resta vuoto). +\end{basedescript} + +\itindbeg{capabilities~bounding~set} + +Infine come accennato, esiste un ulteriore insieme, chiamato +\textit{capabilities bounding set}, il cui scopo è quello di costituire un +limite alle capacità che possono essere attivate per un programma. Il suo +funzionamento però è stato notevolmente modificato con l'introduzione delle +\textit{file capabilities} e si deve pertanto prendere in considerazione una +casistica assai complessa. + +Per i kernel fino al 2.6.25, o se non si attiva il supporto per le +\textit{file capabilities}, il \textit{capabilities bounding set} è un +parametro generale di sistema, il cui valore viene riportato nel file +\procfile{/proc/sys/kernel/cap-bound}. Il suo valore iniziale è definito in +sede di compilazione del kernel, e da sempre ha previsto come default la +presenza di tutte le \textit{capabilities} eccetto \const{CAP\_SETPCAP}. In +questa situazione solo il primo processo eseguito nel sistema (quello con +\textsl{pid} 1, di norma \texttt{/sbin/init}) ha la possibilità di +modificarlo, ogni processo eseguito successivamente, anche se eseguito con +privilegi di amministratore,\footnote{per essere precisi occorreva la capacità + \const{CAP\_SYS\_MODULE}.} è in grado soltanto di rimuovere una delle +\textit{capabilities} già presenti dell'insieme. + +In questo caso l'effetto del \textit{capabilities bounding set} è che solo le +capacità in esso presenti possono essere trasmesse ad un altro programma +attraverso una \func{exec}. Questo in sostanza significa che se si elimina da +esso una capacità, considerato che \texttt{init} (almeno nelle versioni +ordinarie) non supporta la reimpostazione del \textit{bounding set}, questa +non sarà più disponibile per nessun processo a meno di un riavvio, eliminando +così in forma definitiva quella capacità per tutti, compreso +l'amministratore.\footnote{la qual cosa, visto il default usato per il + \textit{capabilities bounding set}, significa anche che \const{CAP\_SETPCAP} + non è stata praticamente mai usata nella sua forma originale.} + +Con il kernel 2.6.25 e le \textit{file capabilities} il \textit{bounding set} +è diventato una proprietà di ciascun processo, che viene propagata invariata +sia attraverso una \func{fork} che una \func{exec}. In questo caso il file +\procfile{/proc/sys/kernel/cap-bound} non esiste e \texttt{init} non ha nessun +ruolo speciale, inoltre in questo caso all'avvio il valore iniziale prevede la +presenza di tutte le capacità (compresa \const{CAP\_SETPCAP}). + +Con questo nuovo meccanismo il \textit{bounding set} continua a ricoprire un +ruolo analogo al precedente nel passaggio attraverso una \func{exec}, come +limite alle capacità che possono essere aggiunte al processo in quanto +presenti nel \textit{permitted set} del programma messo in esecuzione, in +sostanza il nuovo programma eseguito potrà ricevere una capacità presente nel +suo \textit{permitted set} solo se questa è anche nel \textit{bounding + set}. In questo modo si possono rimuovere definitivamente certe capacità da +un processo, anche qualora questo dovesse eseguire un programma +privilegiato. + +Si tenga presente però che in questo caso il \textit{bounding set} blocca +esclusivamente le capacità indicate nel \textit{permitted set} del programma +che verrebbero attivate in caso di esecuzione, non quelle eventualmente già +presenti nell'\textit{inheritable set} del processo (ad esempio perché +presenti prima di averle rimosse dal \textit{bounding set}). In questo caso +eseguendo un programma che abbia anche lui dette capacità nel suo +\textit{inheritable set} queste verrebbero assegnate. + +In questa seconda versione inoltre il \textit{bounding set} costituisce anche +un limite per le capacità che possono essere aggiunte all'\textit{inheritable + set} del processo con \func{capset}, sempre nel senso che queste devono +essere presenti nel \textit{bounding set} oltre che nel \textit{permitted set} +del processo. + +\itindend{capabilities~bounding~set} + +Come si può notare per fare ricorso alle \textit{capabilities} occorre +comunque farsi carico di una notevole complessità di gestione, aggravata dalla +presenza di una radicale modifica del loro funzionamento con l'introduzione +delle \textit{file capabilities}. Considerato che il meccanismo originale era +incompleto e decisamente problematico nel caso di programmi che non ne +sappiano tener conto,\footnote{si ebbe un grosso problema di sicurezza con + \texttt{sendmail}, riuscendo a rimuovere \const{CAP\_SETGID} + dall'\textit{inheritable set} si ottenne di far fallire una \func{setuid}, + in maniera inaspettata per il programma (che aspettandosi il successo della + funzione non ne controllava lo stato di uscita) con la conseguenza di + effettuare come amministratore operazioni che altrimenti sarebbero state + eseguite, senza poter apportare danni, da utente normale.} ci soffermeremo +solo sulla implementazione completa presente a partire dal kernel 2.6.25, +tralasciando ulteriori dettagli riguardo la versione precedente. + + Quando un programma viene messo in esecuzione\footnote{cioè quando viene eseguita la \func{execve} con cui lo si lancia; in corrispondenza di una @@ -4284,10 +4574,10 @@ 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] +\begin{table}[!h!btp] \centering \footnotesize - \begin{tabular}{|l|p{11.5cm}|} + \begin{tabular}{|l|p{11.9cm}|} \hline \textbf{Capacità}&\textbf{Descrizione}\\ \hline @@ -4295,10 +4585,10 @@ che è opportuno dettagliare maggiormente. % % POSIX-draft defined capabilities. % - \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).\\ + \const{CAP\_AUDIT\_WRITE}&La capacità di scrivere dati nel giornale di + auditing del kernel (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 @@ -4325,11 +4615,11 @@ che è opportuno dettagliare maggiormente. quando questo è relativo ad un gruppo cui non si appartiene (vedi sez.~\ref{sec:file_perm_management}).\\ + \const{CAP\_KILL} & La capacità di mandare segnali a qualunque + processo (vedi sez.~\ref{sec:sig_kill_raise}).\\ \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 @@ -4377,9 +4667,8 @@ che è opportuno dettagliare maggiormente. \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\_SETPCAP} & La capacità di modifiche privilegiate alle + \textit{capabilities}.\\ \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 @@ -4388,25 +4677,25 @@ che è opportuno dettagliare maggiormente. \const{CAP\_SYS\_CHROOT}& La capacità di eseguire la funzione \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\ - \const{CAP\_MAC\_ADMIN} & La capacità amministrare 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\_MAC\_ADMIN} & La capacità amministrare il \textit{Mandatory + Access Control} di Smack (dal kernel 2.6.25).\\ + \const{CAP\_MAC\_OVERRIDE}& La capacità evitare il \textit{Mandatory + Access Control} 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. \\ + kernel.\\ + \const{CAP\_SYS\_NICE} & La capacità di modificare le varie 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\_PTRACE}& La capacità di tracciare qualunque processo con + \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 + \const{CAP\_SYS\_RAWIO} & La capacità di operare 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.\\ + \const{CAP\_SYS\_RESOURCE}& La capacità di superare le varie limitazioni + sulle 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} @@ -4416,6 +4705,10 @@ che è opportuno dettagliare maggiormente. del kernel, (vedi sez.~\ref{sec:sess_daemon}), introdotta dal kernel 2.6.38 come capacità separata da \const{CAP\_SYS\_ADMIN}.\\ + \const{CAP\_WAKE\_ALARM}& La capacità di usare i timer di tipo + \macro{CLOCK\_BOOTTIME\_ALARM} e + \macro{CLOCK\_REALTIME\_ALARM}, vedi + sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\ \hline \end{tabular} \caption{Le costanti che identificano le \textit{capabilities} presenti nel @@ -4427,12 +4720,37 @@ che è opportuno dettagliare maggiormente. 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 + +Prima di dettagliare il significato della capacità più generiche, conviene +però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è +stato completamente cambiato con l'introduzione delle \textit{file + capabilities} nel kernel 2.6.24. In precedenza questa capacità era quella +che permetteva al processo che la possedeva di impostare o rimuovere le +\textit{capabilities} che fossero presenti nel \textit{permitted set} del +chiamante di un qualunque altro processo. In realtà questo non è mai stato +l'uso inteso nelle bozze dallo standard POSIX, ed inoltre, come si è già +accennato, dato che questa capacità è assente nel \textit{capabilities + bounding set} usato di default, essa non è neanche mai stata realmente +disponibile. + +Con l'introduzione \textit{file capabilities} e il cambiamento del significato +del \textit{capabilities bounding set} la possibilità di modificare le +capacità di altri processi è stata completamente rimossa, e +\const{CAP\_SETPCAP} ha acquisito quello che avrebbe dovuto essere il suo +significato originario, e cioè la capacità del processo di poter inserire nel +suo \textit{inheritable set} qualunque capacità presente nel \textit{bounding + set}. Oltre a questo la disponibilità di \const{CAP\_SETPCAP} consente ad un +processo di eliminare una capacità dal proprio \textit{bounding set} (con la +conseguente impossibilità successiva di eseguire programmi con quella +capacità), o di impostare i \textit{securebits} delle \textit{capabilities}. + +La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare +maggiormente è \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 @@ -4484,6 +4802,10 @@ 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}). +Questo modo di intendere ... da fare ... per cui +a partire dal 2.6.24/5 è divenuta quella di impostare una capacità del +\textit{bounding set} nelle proprie \textit{inheritable} o rimuoverla dal +\textit{bounding set} stesso. Per la gestione delle \textit{capabilities} il kernel mette a disposizione due funzioni che permettono rispettivamente di leggere ed impostare i valori dei @@ -5012,15 +5334,15 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: int const char oldpath newpath errno EXDEV EPERM st Smack SysV % LocalWords: EEXIST EMLINK EACCES ENAMETOOLONG ENOTDIR EFAULT ENOMEM EROFS ls % LocalWords: ELOOP ENOSPC EIO pathname nlink stat vfat fsck EISDIR ENOENT cap -% LocalWords: POSIX socket fifo sticky root system call count crash nell' init +% LocalWords: POSIX socket fifo sticky root system call count crash init linux % LocalWords: descriptor remove rename rmdir stdio glibc libc NFS DT obj dup % LocalWords: ENOTEMPTY EBUSY mount point EINVAL soft symbolic tab symlink fig % LocalWords: dangling access chdir chmod chown creat exec lchown lstat mkdir % LocalWords: mkfifo mknod opendir pathconf readlink truncate path buff size -% LocalWords: grub bootloader grep linux MAXSYMLINKS cat VFS sys dirname fcntl +% LocalWords: grub bootloader grep MAXSYMLINKS cat VFS sys dirname fcntl % LocalWords: dev umask IFREG IFBLK IFCHR IFIFO SVr sgid BSD SVID NULL from to % LocalWords: stream dirent EMFILE ENFILE dirfd SOURCE fchdir readdir struct -% LocalWords: EBADF namlen HAVE thread entry result value argument fileno ino +% LocalWords: EBADF namlen HAVE thread entry result value argument fileno % LocalWords: name TYPE OFF RECLEN UNKNOWN REG SOCK CHR BLK type IFTODT DTTOIF % LocalWords: DTYPE off reclen seekdir telldir void rewinddir closedir select % LocalWords: namelist compar malloc qsort alphasort versionsort strcoll myls @@ -5030,21 +5352,21 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: EINTR mktemp mkstemp stlib template filename XXXXXX OpenBSD buf % LocalWords: mkdtemp fstat filedes nell'header padding ISREG ISDIR ISCHR IFMT % LocalWords: ISBLK ISFIFO ISLNK ISSOCK IFSOCK IFLNK IFDIR ISUID UID ISGID GID -% LocalWords: ISVTX IRUSR IWUSR IXUSR IRGRP IWGRP IXGRP IROTH IWOTH IXOTH du -% LocalWords: blocks blksize holes lseek TRUNC ftruncate length lenght ETXTBSY +% LocalWords: ISVTX IRUSR IWUSR IXUSR IRGRP IWGRP IXGRP IROTH IWOTH IXOTH +% LocalWords: blocks blksize holes lseek TRUNC ftruncate ETXTBSY length % LocalWords: hole atime read utime mtime write ctime modification leafnode cp % LocalWords: make fchmod fchown utimbuf times actime modtime Mac owner uid fs % LocalWords: gid Control List patch mandatory control execute group other all -% LocalWords: dell' effective passwd IGID locking swap saved text IRWXU IRWXG -% LocalWords: IRWXO ext reiser capability FSETID mask capabilities chroot jail -% LocalWords: FTP Di filter reiserfs Attributes Solaris FreeBSD libacl hash +% LocalWords: effective passwd IGID locking swap saved text IRWXU IRWXG +% LocalWords: IRWXO capability FSETID mask capabilities chroot jail +% LocalWords: FTP filter Attributes Solaris FreeBSD libacl hash at % LocalWords: XFS SELinux namespace attribute security trusted Draft Modules % LocalWords: attributes mime ADMIN FOWNER libattr lattr getxattr lgetxattr of % LocalWords: fgetxattr attr ssize ENOATTR ENOTSUP NUL setxattr lsetxattr list % LocalWords: fsetxattr flags XATTR REPLACE listxattr llistxattr flistxattr by -% LocalWords: removexattr lremovexattr fremovexattr attributename lacl acl tv +% LocalWords: removexattr lremovexattr fremovexattr attributename acl % LocalWords: OBJ setfacl len any prefix separator options NUMERIC IDS SMART -% LocalWords: INDENT major number IDE Documentation makedev proc copy +% LocalWords: INDENT major number IDE Documentation makedev proc copy LNK long % LocalWords: euidaccess eaccess delete def tag qualifier permset calendar NOW % LocalWords: mutt noatime relatime strictatime atim nsec mtim ctim atimensec % LocalWords: mtimensec utimes timeval futimes lutimes ENOSYS futimens OMIT @@ -5057,8 +5379,13 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: LEASE lease SETFCAP AUDIT permitted inherited inheritable AND % LocalWords: bounding execve fork capget capset header hdrp datap ESRCH undef % LocalWords: version libcap lcap clear ncap caps pag capgetp CapInh CapPrm -% LocalWords: fffffeff CapEff getcap dell'IPC scheduling dell'I lookup dcookie +% LocalWords: fffffeff CapEff getcap scheduling lookup % LocalWords: NEWNS unshare nice NUMA ioctl journaling close XOPEN fdopendir +% LocalWords: btrfs mkostemp extN ReiserFS JFS Posix usrquota grpquota EDQUOT +% LocalWords: aquota quotacheck limit grace period quotactl cmd caddr addr +% LocalWords: QUOTAON ENODEV ENOPKG ENOTBLK GETQUOTA SETQUOTA SETUSE SETQLIM +% LocalWords: forced allowed sendmail SYSLOG WAKE ALARM CLOCK BOOTTIME +% LocalWords: REALTIME securebits %%% Local Variables: %%% mode: latex