From: Simone Piccardi Date: Mon, 15 Aug 2011 18:23:59 +0000 (+0000) Subject: appunti vari senza troppo significato X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=7c9875b4a227993152d4f28dd2620006a224ac5b appunti vari senza troppo significato --- diff --git a/filedir.tex b/filedir.tex index cc222cf..d9afc5c 100644 --- a/filedir.tex +++ b/filedir.tex @@ -4195,78 +4195,140 @@ presenza di meccanismi alternativi per ottenere limitazioni delle capacità dell'amministratore a livello di sistema operativo, come \index{SELinux} SELinux. -Inoltre il meccanismo delle \textit{capabilities} è stato ulteriormente -perfezionato nel kernel 2.6.25 rimovendo 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 +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 intezioni originali dello standard +POSIX, rimovendo 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 pesantemente 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 +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{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 +\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 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. + 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: +sez.~\ref{sec:proc_setuid}; il loro significato, che è rimasto sostanzialmente +lo stesso anche dopo le modifiche seguite alla instroduzione delle +\textit{file capabilities} è il seguente: \begin{basedescript}{\desclabelwidth{2.0cm}\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 è il comportamento più comune, + che prevede 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).\footnote{e neanche in questo caso se - vengono usate le estensioni introdotte con il kernel 2.6.26 che vedremo - più avanti.} -\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} +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}.} A differenza delle precedenti 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 di alcuni programmi con maggiori privilegi, in sostanza +una estensione dell'uso del \acr{suid} di root. Anche questi tre insiemi sono +identicati con gli stessi nomi, ma il loro significato è: +\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} +\item[\textit{permitted}] (chiamato originariamente \textit{forced}) l'insieme + delle capacità che con l'esecuzione del file verranno comunque aggiunte alle + capacità \textsl{permesse} del processo. +\item[\textit{inheritable}] (chiamato originariamente \textit{allowed}) + l'insieme delle capacità che con l'esecuzione del file possono essere + ereditate dal processo originario (che cioè vengono tolte dalle + \textsl{ereditabili} 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è le effettive restano vuote). +\end{basedescript} + +Infine come accennato, esiste un altro insieme, il +\itindex{capabilities~bounding~set} \textit{capabilities bounding set}, il cui +scopo è quello di costituire un limite alle capacità che possono essere +attivate per un processo, ma il suo significato è stato completamente +modificato con l'introduzione delle \textit{file capabilities}. + + +a meno che non sia dotato della capacità + \macro{CAP\_SETPCAP} nel qual caso potrà, come vedremo in seguito, + impostarne anche altre. + +che non esegua un programma che è \acr{suid} di root o + che ce l'ha nelle \textit{capabilities} presenti sul file + eseguibile.\footnote{e neanche in questo caso se vengono usate le estensioni + introdotte con il kernel 2.6.26 che vedremo più avanti.} Fino al kernel 2.6.25 oltre a questi tre insiemi, che sono relativi al singolo -processo, il kernel manteneva 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} era un parametro di sistema, accessibile -attraverso il contenuto del file \procfile{/proc/sys/kernel/cap-bound}, che -per questa sua caratteristica consentiva di impostare un limite generale alle -capacità che possono essere accordate ai vari processi. Questo valore poteva -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 poteva 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ù +processo, il kernel manteneva un ulteriore insieme unico 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} +venivano mascherati con un \textsl{AND} binario del contenuto corrente del +\textit{capabilities bounding set}, così che il nuovo processo potesse +disporre soltanto delle capacità in esso elencate. + +A lungo il \textit{capabilities bounding set} è stato un parametro generale di +sistema, accessibile attraverso il contenuto del file +\procfile{/proc/sys/kernel/cap-bound}, usato per impostare un limite +universale alle capacità che possono essere accordate ai vari processi. Il +suo valore poteva essere impostato 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, era in grado soltanto di rimuovere uno dei bit +già presenti dell'insieme: questo significava che tolta una +\textit{capability} dal \textit{capabilities bounding set} questa non era più disponibile, neanche per l'amministratore, a meno di un riavvio. +Qualora invece si sia abilitato nel kernel il supporto per le +\textit{capabilities} dei file il \textit{capabilities bounding set} mantiene +il suo significato di limite alle capacità che possono essere assegnate al +processo, ma diventa una proprietà dello stesso (un quarto insieme che il +processo si porta dietro). In questo + + + + viene a costituire un doppio limite: + + + + + + Quando un programma viene messo in esecuzione\footnote{cioè quando viene eseguita la \func{execve} con cui lo si lancia; in corrispondenza di una \func{fork} le \textit{capabilities} non vengono modificate.} esso eredita @@ -4416,7 +4478,7 @@ che è opportuno dettagliare maggiormente. 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 + \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 @@ -4427,8 +4489,8 @@ che è opportuno dettagliare maggiormente. \const{CAP\_SYS\_RAWIO} & La capacità di eseguire operazioni sulle porte di I/O con \func{ioperm} e \func{iopl} (vedi sez.~\ref{sec:file_io_port}).\\ - \const{CAP\_SYS\_RESOURCE}& La capacità di superare le limitazioni sulle - risorse.\\ + \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}