X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=filedir.tex;h=c3a284b976ade0fc31a5f3c9af1c8a8ede170446;hb=a26655598e1260eeb528ded46724e977f3aafee0;hp=d1ba1b048063f143d4959670b8de7575f0297d37;hpb=889a015512d1a1e864e02b14d281f213cf896914;p=gapil.git diff --git a/filedir.tex b/filedir.tex index d1ba1b0..c3a284b 100644 --- a/filedir.tex +++ b/filedir.tex @@ -4254,63 +4254,117 @@ 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} \\ + \textbf{Comando} & \textbf{Descrizione} \\ \hline \hline - \const{Q\_QUOTAON} & attiva l'applicazione delle quote disco per il - filesystem \param{dev}, si deve passare + \const{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il + filesystem indicato da \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 + quote, che deve esistere, e \param{id} deve indicare + la versione del formato con uno dei valori di + tab.~\ref{tab:quotactl_id_format}; l'operazione + richiede i privilegi di amministratore.\\ + \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il + filesystem indicato da \param{dev}, \param{id} + e \param{addr} vengono ignorati; l'operazione + richiede i privilegi di amministratore.\\ + \const{Q\_GETQUOTA} & Legge i limiti ed i valori correnti delle quote nel + filesystem indicato da \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\_SETQUOTA} & Imposta i limiti per le quote nel filesystem + indicato da \param{dev} per l'utente o il gruppo + specificato da \param{id} secondo i valori ottenuti + dalla struttura \struct{dqblk} puntata + da \param{addr}; l'operazione richiede i privilegi + di amministratore.\\ + \const{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace + time}) delle quote del filesystem indicato + da \param{dev} sulla struttura \struct{dqinfo} + puntata da \param{addr}, \param{id} viene ignorato.\\ + \const{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem + indicato da \param{dev} come ottenuti dalla + struttura \struct{dqinfo} puntata + da \param{addr}, \param{id} viene ignorato; + l'operazione richiede i privilegi di amministratore.\\ + \const{Q\_GETFMT} & Richiede il valore identificativo (quello di + tab.~\ref{tab:quotactl_id_format}) per il formato + delle quote attualmente in uso sul filesystem + indicato da \param{dev}, che sarà memorizzato + sul buffer di 4 byte puntato da \param{addr}.\\ \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} & .\\ + filesystem indicato da \param{dev}; in questo + caso \param{dev} può anche essere \val{NULL} nel + qual caso verranno aggiornati i dati per tutti i + filesystem con quote attive, \param{id} + e \param{addr} vengono comunque ignorati.\\ + \const{Q\_GETSTATS} & Ottiene statistiche ed altre informazioni generali + relative al sistema delle quote per il filesystem + indicato da \param{dev}, richiede che si + passi come argomento \param{addr} l'indirizzo di una + struttura \struct{dqstats}, mentre i valori + di \param{id} e \param{dev} vengono ignorati; + l'operazione è obsoleta e non supportata nei kernel + più recenti, che espongono la stessa informazione + nei file sotto \procfile{/proc/self/fs/quota/}.\\ % \const{} & .\\ \hline \end{tabular} - \caption{Possibili valori per l'argomento \param{subcommand} di + \caption{Possibili valori per l'argomento \param{subcmd} 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}.} +Le diverse operazioni supportate da \func{quotactl}, da indicare con +l'argomento \param{subcmd} di \macro{QCMD}, sono riportate in +tab.~\ref{tab:quotactl_commands}. In generale le operazione di attivazione, +disattivazione e di modifica dei limiti delle quote sono riservate e +richiedono i privilegi di amministratore.\footnote{per essere precisi tutte le + operazioni indicate come privilegiate in tab.~\ref{tab:quotactl_commands} + richiedono la \textit{capability} \const{CAP\_SYS\_ADMIN}.} Inoltre gli +utenti possono soltanto richiedere i dati relativi alle proprie quote, solo +l'amministratore può ottenere i dati di tutti. +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}{|l|p{10cm}|} + \hline + \textbf{Identificatore} & \textbf{Descrizione} \\ + \hline + \hline + \const{QFMT\_VFS\_OLD}& il vecchio (ed obsoleto) formato delle quote.\\ + \const{QFMT\_VFS\_V0} & la versione 0 usata dal VFS di Linux (supporta + \acr{uid} e \acr{gid} a 32 bit e limiti fino a + $2^{42}$ byte e $2^{32}$ file.\\ + \const{QFMT\_VFS\_V1} & la versione 1 usata dal VFS di Linux (supporta + \acr{uid} e \acr{GID} a 32 bit e limiti fino a + $2^{64}$ byte e $2^{64}$ file.\\ + \hline + \end{tabular} + \caption{Valori di identificazione del formato delle quote.} + \label{tab:quotactl_id_format} +\end{table} +Alcuni dei comandi di tab.~\ref{tab:quotactl_commands} sono alquanto complessi +e richiedono un approfondimento maggiore, in particolare \const{Q\_GETQUOTA} e +\const{Q\_SETQUOTA} fanno riferimento ad una specifica struttura +\struct{dqblk}, la cui definizione è riportata in +fig.~\ref{fig:dqblk_struct},\footnote{la definizione mostrata è quella usata + fino dal kernel 2.4.22, non prenderemo in considerazione le versioni + obsolete.} nella quale vengono inseriti i dati relativi alle quote di un +singolo utente. \begin{figure}[!htb] \footnotesize \centering @@ -4322,9 +4376,196 @@ l'argomento \param{subcmd} di \macro{QCMD}, sono riportate in tab. \label{fig:dqblk_struct} \end{figure} +La struttura viene usata sia con \const{Q\_GETQUOTA} per ottenere i valori +correnti dei limiti e dell'occupazione delle risorse, che con +\const{Q\_SETQUOTA} per effettuare modifiche ai limiti; come si può notare ci +sono alcuni campi (in sostanza \val{dqb\_curspace}, \val{dqb\_curinodes}, +\val{dqb\_btime}, \val{dqb\_itime}) che hanno senso solo in lettura in quanto +riportano uno stato non modificabile da \func{quotactl}, come l'uso corrente +di spazio e \textit{inode} o il tempo che resta nel caso si sia superato un +\textit{soft limit}. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}{|l|p{10cm}|} + \hline + \textbf{Costante} & \textbf{Descrizione} \\ + \hline + \hline + \const{QIF\_BLIMITS}& Limiti sui blocchi di + spazio disco (\val{dqb\_bhardlimit} e + \val{dqb\_bsoftlimit}).\\ + \const{QIF\_SPACE} & Uso corrente + dello spazio disco (\val{dqb\_curspace}).\\ + \const{QIF\_ILIMITS}& Limiti sugli \textit{inode} + (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\ + \const{QIF\_INODES} & Uso corrente + degli \textit{inode} (\val{dqb\_curinodes}).\\ + \const{QIF\_BTIME} & Tempo di + sforamento del \textit{soft limit} sul numero di + blocchi (\val{dqb\_btime}).\\ + \const{QIF\_ITIME} & Tempo di + sforamento del \textit{soft limit} sul numero di + \textit{inode} (\val{dqb\_itime}).\\ + \const{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e + \const{QIF\_ILIMITS}.\\ + \const{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e + \const{QIF\_INODES}.\\ + \const{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e + \const{QIF\_ITIME}.\\ + \const{QIF\_ALL} & Tutti i precedenti.\\ + \hline + \end{tabular} + \caption{Costanti per il campo \val{dqb\_valid} di \struct{dqblk}.} + \label{tab:quotactl_qif_const} +\end{table} + + +Inoltre in caso di modifica di un limite si può voler operare solo su una +delle risorse (blocchi o \textit{inode});\footnote{non è possibile modificare + soltanto uno dei limiti (\textit{hard} o \textit{soft}) occorre sempre + rispecificarli entrambi.} per questo la struttura prevede un campo apposito, +\val{dqb\_valid}, il cui scopo è quello di indicare quali sono gli altri campi +che devono essere considerati validi. Questo campo è una maschera binaria che +deve essere espressa nei termini di OR aritmetico delle apposite costanti di +tab.~\ref{tab:quotactl_qif_const}, dove si è riportato il significato di +ciascuna di esse ed i campi a cui fanno riferimento. + +In lettura con \const{Q\_SETQUOTA} eventuali valori presenti in \struct{dqblk} +vengono comunque ignorati, al momento la funzione sovrascrive tutti i campi e +li marca come validi in \val{dqb\_valid}. Si possono invece usare +\const{QIF\_BLIMITS} o \const{QIF\_ILIMITS} per richiedere di impostare solo +la rispettiva tipologia di limiti con \const{Q\_SETQUOTA}. Si tenga presente +che il sistema delle quote richiede che l'occupazione di spazio disco sia +indicata in termini di blocchi e non di byte; dato che questo dipende da come +si è creato il filesystem potrà essere necessario effettuare qualche +controllo.\footnote{in genere viene usato un default di 1024 byte per blocco, + ma quando si hanno file di dimensioni medie maggiori può convenire usare + valori più alti per ottenere prestazioni migliori in conseguenza di un + minore frazionamento dei dati e di indici più corti.} + +Altre due operazioni che necessitano di un approfondimento sono +\const{Q\_GETINFO} e \const{Q\_SETINFO}, che sostanzialmente consentono di +ottenere i dati relativi alle impostazioni delle altre proprietà delle quote, +che si riducono poi alla durata del \textit{grace time} per i due tipi di +limiti. In questo caso queste si proprietà generali sono identiche per tutti +gli utenti, per cui viene usata una operazione distinta dalle +precedenti. Anche in questo caso le due operazioni richiedono l'uso di una +apposita struttura \struct{dqinfo}, la cui definizione è riportata in +fig.~\ref{fig:dqinfo_struct}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15cm} + \includestruct{listati/dqinfo.h} + \end{minipage} + \normalsize + \caption{La struttura \structd{dqinfo} per i dati delle quote disco.} + \label{fig:dqinfo_struct} +\end{figure} + +Come per \struct{dqblk} anche in questo caso viene usato un campo della +struttura, \val{dqi\_valid} come maschera binaria per dichiarare quale degli +altri campi sono validi; le costanti usate per comporre questo valore sono +riportate in tab.~\ref{tab:quotactl_iif_const} dove si è riportato il +significato di ciascuna di esse ed i campi a cui fanno riferimento. + +\begin{table}[htb] + \centering + \footnotesize + \begin{tabular}{|l|l|} + \hline + \textbf{Costante} & \textbf{Descrizione} \\ + \hline + \hline + \const{IIF\_BGRACE}& Il \textit{grace period} per i blocchi + (\val{dqi\_bgrace}).\\ + \const{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode} + (\val{dqi\_igrace}).\\ + \const{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\ + \const{IIF\_ALL} & Tutti i precedenti.\\ + \hline + \end{tabular} + \caption{Costanti per il campo \val{dqi\_valid} di \struct{dqinfo}.} + \label{tab:quotactl_iif_const} +\end{table} + +Come in precedenza con \const{Q\_GETINFO} tutti i valori vengono letti +sovrascrivendo il contenuto di \struct{dqinfo} e marcati come validi in +\val{dqi\_valid}. In scrittura con \const{Q\_SETINFO} si può scegliere quali +impostare, si tenga presente che i tempi dei campi \val{dqi\_bgrace} e +\val{dqi\_igrace} devono essere specificati in secondi. + +Come esempi dell'uso di \func{quotactl} utilizzeremo estratti del codice di un +modulo Python usato per fornire una interfaccia diretta a \func{quotactl} +senza dover passare dalla scansione dei risultati di un comando. Il modulo si +trova fra i pacchetti Debian messi a disposizione da Truelite Srl, +all'indirizzo \url{http://labs.truelite.it/projects/packages}.\footnote{in + particolare il codice C del modulo è nel file \texttt{quotamodule.c} + visionabile a partire dall'indirizzo indicato nella sezione + \textit{Repository}.} + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15.6cm} + \includecodesample{listati/get_quota.c} + \end{minipage} + \caption{Esempio di codice per ottenere i dati delle quote.} + \label{fig:get_quota} +\end{figure} + +Il primo esempio, riportato in fig.~\ref{fig:get_quota}, riporta il codice +della funzione che consente di leggere le quote. La funzione fa uso +dell'interfaccia dal C verso Python, che definisce i vari simboli \texttt{Py*} +(tipi di dato e funzioni). Non staremo ad approfondire i dettagli di questa +interfaccia, per la quale esistono numerose trattazioni dettagliate, ci +interessa solo esaminare l'uso di \func{quotactl}. + +In questo caso la funzione prende come argomenti (\texttt{\small 1}) l'intero +\texttt{who} che indica se si vuole operare sulle quote utente o gruppo, +l'identificatore \texttt{id} dell'utente o del gruppo scelto, ed il nome del +file di dispositivo del filesystem su cui si sono attivate le +quote.\footnote{questi vengono passati come argomenti dalle funzioni mappate + come interfaccia pubblica del modulo (una per gruppi ed una per gli utenti) + che si incaricano di decodificare i dati passati da una chiamata nel codice + Python.} Questi argomenti vengono passati direttamente alla chiamata a +\func{quotactl} (\texttt{\small 5}), a parte \texttt{who} che viene abbinato +con \macro{QCMD} al comando \const{Q\_GETQUOTA} per ottenere i dati. + +La funzione viene eseguita all'interno di un condizionale (\texttt{\small + 5--16}) che in caso di successo provvede a costruire (\texttt{\small 6--12}) +opportunamente una risposta restituendo tramite la opportuna funzione di +interfaccia un oggetto Python contenente i dati della struttura \struct{dqblk} +relativi a uso corrente e limiti sia per i blocchi che per gli +\textit{inode}. In caso di errore (\texttt{\small 13--15}) si usa un'altra +funzione dell'interfaccia per passare il valore di \var{errno} come eccezione. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15.6cm} + \includecodesample{listati/set_block_quota.c} + \end{minipage} + \caption{Esempio di codice per impostare i limiti sullo spazio disco.} + \label{fig:set_block_quota} +\end{figure} + +Per impostare i limiti sullo spazio disco si potrà usare una seconda funzione, +riportata in fig.~\ref{fig:set_block_quota}, che prende gli stessi argomenti +della precedente, con lo stesso significato, a cui si aggiungono i valori per +il \textit{soft limit} e l'\textit{hard limit}. In questo caso occorrerà, +prima di chiamare \func{quotactl}, inizializzare opportunamente +(\texttt{\small 5--7}) i campi della struttura \struct{dqblk} che si vogliono +utilizzare (quelli relativi ai limiti sui blocchi) e specificare gli stessi +con \const{QIF\_BLIMITS} in \var{dq.dqb\_valid}. + +Fatto questo la chiamata a \func{quotactl}, stavolta con il comando +\const{Q\_SETQUOTA}, viene eseguita come in precedenza all'interno di un +condizionale (\texttt{\small 9--14}). In questo caso non essendovi da +restituire nessun dato in caso di successo si usa (\texttt{\small 10}) una +apposita funzione di uscita, mentre si restituisce come prima una eccezione +con il valore di \var{errno} in caso di errore (\texttt{\small 12--13}). -% TODO trattare quote disco -% vedi man quotactl \subsection{La gestione delle \textit{capabilities}} \label{sec:proc_capabilities} @@ -4364,21 +4605,21 @@ 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 -(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. +essere utilizzate quando viene messo in esecuzione uno specifico programma; 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 +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 cambiando 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 @@ -4436,9 +4677,10 @@ altri tre insiemi associabili a ciascun file.\footnote{la realizzazione viene \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: +con maggiori privilegi; in sostanza sono una sorta di estensione del +\acr{suid} bit limitato ai privilegi di amministratore. Anche questi tre +insiemi sono identificati con gli stessi nomi di quello dei processi, 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 @@ -4500,14 +4742,14 @@ 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. +suo \textit{permitted set} (quello del file) solo se questa è anche nel +\textit{bounding set} (del processo). In questo modo si possono rimuovere +definitivamente certe capacità da un processo, anche qualora questo dovesse +eseguire un programma privilegiato che prevede di riassegnarle. 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à +che verrebbero attivate in caso di esecuzione, e 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 @@ -4515,26 +4757,70 @@ eseguendo un programma che abbia anche lui dette capacità nel suo 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} - + set} del processo stesso con \func{capset}, sempre nel senso che queste +devono essere presenti nel \textit{bounding set} oltre che nel +\textit{permitted set} del processo. Questo limite vale anche per processi con +i privilegi di amministratore,\footnote{si tratta sempre di avere la + \textit{capability} \const{CAP\_SETPCAP}.} per i quali non vale la +condizione che le \textit{capabilities} da aggiungere nell'\textit{inheritable + set} debbano essere presenti nel proprio \textit{permitted set}.\footnote{lo + scopo anche in questo caso è ottenere una rimozione definitiva della + possibilità di passare una capacità rimossa dal \textit{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. +sappessero tener conto,\footnote{si ebbe un grosso problema di sicurezza con + \texttt{sendmail}: riuscendo a rimuovere \const{CAP\_SETGID} + dall'\textit{inheritable set} di un processo si ottenne di far fallire + \func{setuid} in maniera inaspettata per il programma (che aspettandosi + sempre 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. + +Riassumendo le regole finora illustrate tutte le \textit{capabilities} vengono +ereditate senza modifiche attraverso una \func{fork} mentre, indicati con +\texttt{orig\_*} i valori degli insiemi del processo chiamante, con +\texttt{file\_*} quelli del file eseguito e con \texttt{bound\_set} il +\textit{capabilities bounding set}, dopo l'invocazione di \func{exec} il +processo otterrà dei nuovi insiemi di capacità \texttt{new\_*} secondo la +formula (espressa in pseudocodice C) di fig.~\ref{fig:cap_across_exec}; si +noti come in particolare il \textit{capabilities bounding set} non viene +comunque modificato e resta lo stesso sia attraverso una \func{fork} che +attraverso una \func{exec}. + +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{12cm} + \includecodesnip{listati/cap-results.c} + \end{minipage} + \caption{Espressione della modifica delle \textit{capabilities} attraverso + una \func{exec}.} + \label{fig:cap_across_exec} +\end{figure} + +\itindend{capabilities~bounding~set} + +A queste regole se ne aggiungono delle altre che servono a riprodurre il +comportamento tradizionale di un sistema unix-like quando viene eseguito un +file senza \textit{capabilities}, se si applicassero sempre così infatti, non +essendo definite delle capacità né nel \textit{permitted set} né +nell'\textit{inheritable set} del file, anche l'amministratore perderebbe +tutti i privilegi eventualmente avuti dal processo. + +Per questo motivo se un programma senza \textit{capabilities} viene eseguito +da un processo con \textit{real user-ID} 0, o se ha attivo il \acr{suid} bit +ed appartiene all'amministratore, esso viene trattato come se tanto il +\textit{permitted set} che l'\textit{inheritable set} fossero con tutte le +\textit{capabilities} abilitate, e con l'\textit{effective set} attivo, col +risultato di fornire comunque al processo tutte le capacità presenti nel +proprio \textit{bounding set}. + @@ -4549,8 +4835,7 @@ 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. +\textit{inherited}. % TODO verificare per process capability bounding set, vedi: @@ -4690,10 +4975,10 @@ che è opportuno dettagliare maggiormente. sez.~\ref{sec:sys_bsd_accounting}).\\ \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con \func{ptrace} (vedi - sez.~\ref{sec:xxx_ptrace}).\\ + sez.~\ref{sec:process_ptrace}).\\ \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}).\\ + sez.~\ref{sec:process_io_port}).\\ \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 @@ -4779,9 +5064,8 @@ 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}). +sez.~\ref{sec:io_priority}), usare la funzione \func{lookup\_dcookie}, 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 @@ -5231,14 +5515,14 @@ funzione. % TODO vedi http://lwn.net/Articles/198557/ e % http://www.madore.org/~david/linux/newcaps/ -% TODO documentare prctl ... + \subsection{La funzione \func{chroot}} \label{sec:file_chroot} % TODO introdurre nuova sezione sulle funzionalità di sicurezza avanzate, con -% dentro chroot SELinux e AppArmor ??? +% dentro chroot SELinux e AppArmor, Tomoyo, Smack, cgroup o che altro ??? Benché non abbia niente a che fare con permessi, utenti e gruppi, la funzione \func{chroot} viene usata spesso per restringere le capacità di accesso di un @@ -5339,10 +5623,10 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % 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 MAXSYMLINKS cat VFS sys dirname fcntl +% LocalWords: grub bootloader grep MAXSYMLINKS cat VFS sys dirname fcntl tv Py % 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 +% LocalWords: EBADF namlen HAVE thread entry result value argument fileno ext % 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 @@ -5352,19 +5636,19 @@ 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 -% LocalWords: blocks blksize holes lseek TRUNC ftruncate ETXTBSY length +% LocalWords: ISVTX IRUSR IWUSR IXUSR IRGRP IWGRP IXGRP IROTH IWOTH IXOTH OLD +% LocalWords: blocks blksize holes lseek TRUNC ftruncate ETXTBSY length QCMD % 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: 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: effective passwd IGID locking swap saved text IRWXU IRWXG subcmd +% LocalWords: IRWXO capability FSETID mask capabilities chroot jail QUOTAOFF +% LocalWords: FTP filter Attributes Solaris FreeBSD libacl hash at dqblk SYNC % 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 acl +% LocalWords: removexattr lremovexattr fremovexattr attributename acl GETINFO % LocalWords: OBJ setfacl len any prefix separator options NUMERIC IDS SMART % LocalWords: INDENT major number IDE Documentation makedev proc copy LNK long % LocalWords: euidaccess eaccess delete def tag qualifier permset calendar NOW @@ -5375,17 +5659,20 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % LocalWords: setresuid setfsuid IMMUTABLE immutable append only BIND SERVICE % LocalWords: BROADCAST broadcast multicast multicasting RAW PACKET IPC LOCK % LocalWords: memory mlock mlockall shmctl mmap MODULE RAWIO ioperm iopl PACCT -% LocalWords: PTRACE ptrace accounting NICE RESOURCE TTY CONFIG hangup vhangup +% LocalWords: ptrace accounting NICE RESOURCE TTY CONFIG hangup vhangup % 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 scheduling lookup +% LocalWords: fffffeff CapEff getcap scheduling lookup dqinfo SETINFO GETFMT % 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: aquota quotacheck limit grace period quotactl cmd caddr addr dqb % LocalWords: QUOTAON ENODEV ENOPKG ENOTBLK GETQUOTA SETQUOTA SETUSE SETQLIM -% LocalWords: forced allowed sendmail SYSLOG WAKE ALARM CLOCK BOOTTIME -% LocalWords: REALTIME securebits +% LocalWords: forced allowed sendmail SYSLOG WAKE ALARM CLOCK BOOTTIME dqstats +% LocalWords: REALTIME securebits GETSTATS QFMT curspace curinodes btime itime +% LocalWords: QIF BLIMITS bhardlimit bsoftlimit ILIMITS ihardlimit isoftlimit +% LocalWords: INODES LIMITS USAGE valid dqi IIF BGRACE bgrace IGRACE igrace +% LocalWords: Python Truelite Srl quotamodule Repository who %%% Local Variables: %%% mode: latex