From 252147ac2ed5342d06d6cb0c13d6c3f956b128f3 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 9 Mar 2009 16:09:16 +0000 Subject: [PATCH] Finito, quasi, le ACL --- errors.tex | 22 +++++---- filedir.tex | 131 +++++++++++++++++++++++++++------------------------- 2 files changed, 79 insertions(+), 74 deletions(-) diff --git a/errors.tex b/errors.tex index a887ea9..9b60a2c 100644 --- a/errors.tex +++ b/errors.tex @@ -144,7 +144,6 @@ gestione dei file. \end{description} - \section{Gli errori dei processi} \label{sec:err_proc_errors} @@ -162,10 +161,11 @@ gestione dei processi. troppa memoria, non può mai accadere in GNU/Linux. \item \errcode{ECHILD} \textit{There are no child processes}. Non esistono processi figli di cui attendere la terminazione. Viene rilevato dalle - funzioni \func{wait} e \func{waitpid}. -%\item \errcode{EPROCLIM} \textit{}. Il limite dell'utente per nuovi processi -% sarà ecceduto alla prossima \func{fork}. (non credo esista in Linux) -% TODO verificare EPROCLIM + funzioni \func{wait} e \func{waitpid} (vedi sez.~\ref{sec:proc_wait}). +\item \errcode{EPROCLIM} \textit{Too many processes}. Il limite dell'utente + per nuovi processi (vedi sez.~\ref{sec:sys_resource_limit}) sarà ecceduto + alla prossima \func{fork}; è un codice di errore di BSD, che non viene + utilizzato al momento su Linux. \end{description} @@ -372,12 +372,14 @@ messaggio. \item \errcode{ENODATA} \textit{No data available}. Viene indicato da POSIX come restituito da una \func{read} eseguita su un file descriptor in - modalità non bloccante quando non ci sono dati. In realtà in questo caso - viene utilizzato \errcode{EAGAIN}. In Linux viene utilizzato dalle funzioni - per la gestione degli attributi estesi dei file quando il nome - dell'attributo richiesto non viene trovato. + modalità non bloccante quando non ci sono dati. In realtà in questo caso su + Linux viene utilizzato \errcode{EAGAIN}. Lo stesso valore valore però viene + usato come sinonimo di \errcode{ENOATTR}. -% TODO referenziare la trattazione degli attributi estesi dei file +\item \errcode{ENOATTR} \textit{No such attribute}. È un codice di errore + specifico di Linux utilizzato dalle funzioni per la gestione degli attributi + estesi dei file (vedi sez.~\ref{sec:file_xattr}) quando il nome + dell'attributo richiesto non viene trovato. \item \errcode{ENOLINK} \textit{Link has been severed}. È un errore il cui valore è indicato come \textsl{riservato} nelle \textit{Single Unix diff --git a/filedir.tex b/filedir.tex index 69af64b..4c59dc1 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2346,7 +2346,15 @@ eseguendo un programma coi privilegi di un altro utente (ad esempio attraverso l'uso del \itindex{suid~bit} \textit{suid bit}) che vuole controllare se l'utente originale ha i permessi per accedere ad un certo file. -% TODO documentare euidaccess (e eaccess) +Del tutto analoghe a \func{access} sono le due funzioni \funcd{euidaccess} e +\funcd{eaccess} che ripetono lo stesso controllo usando però gli +identificatori del gruppo effettivo, verificando quindi le effettive capacità +di accesso ad un file. Le funzioni hanno entrambe lo stesso +prototipo\footnote{in realtà \func{eaccess} è solo un sinonimo di + \func{euidaccess} fornita per compatibilità con l'uso di questo nome in + altri sistemi.} che è del tutto identico a quello di \func{access}. Prendono +anche gli stessi valori e restituiscono gli stessi risultati e gli stessi +codici di errore. Per cambiare i permessi di un file il sistema mette ad disposizione due funzioni \funcd{chmod} e \funcd{fchmod}, che operano rispettivamente su un @@ -2784,7 +2792,7 @@ classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}. \begin{table}[htb] \centering \footnotesize - \begin{tabular}{|c|p{10cm}|} + \begin{tabular}{|l|p{10cm}|} \hline \textbf{Nome} & \textbf{Descrizione} \\ \hline @@ -2823,10 +2831,10 @@ impiega per realizzare delle estensioni (come le \itindex{Access~Control~List} ACL, \index{SELinux} SELinux, ecc.) al tradizionale meccanismo dei controlli di accesso di Unix, l'accesso ai loro valori viene regolato in maniera diversa a seconda sia della loro classe sia di quali, fra le estensioni che li -utilizzano, sono poste in uso. In particolare, per ciascuna delle classi +utilizzano, sono poste in uso. In particolare, per ciascuna delle classi riportate in tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: -\begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} +\begin{basedescript}{\desclabelwidth{1.7cm}\desclabelstyle{\nextlinelabel}} \item[\texttt{security}] L'accesso agli \textit{extended security attributes} dipende dalle politiche di sicurezza stabilite da loro stessi tramite l'utilizzo di un sistema di controllo basato sui @@ -2857,58 +2865,51 @@ casi: controllo che accedono ad informazioni non disponibili ai processi ordinari. \item[\texttt{user}] L'accesso agli \textit{extended user attributes} è - regolato dagli ordinari permessi dei file a cui essi fanno riferimento: - occorre avere il permesso di lettura per leggerli e quello di scrittura per - scriverli o modificarli. Dato l'uso di questi attributi, si è scelto cioè di - applicare per il loro accesso gli stessi criteri che si usano per l'accesso - al contenuto dei file (o delle directory) cui essi fanno riferimento. - - Questa scelta vale però soltanto per i file e le directory ordinarie, se - valesse in generale infatti si avrebbe un serio problema di sicurezza dato - che esistono diversi oggetti sul filesystem per i quali è normale avere - avere il permesso di scrittura consentito a tutti gli utenti, come i link - simbolici, o alcuni file di dispositivo come \texttt{/dev/null}. Se fosse - possibile usare su di essi gli \textit{extended user attributes} un utente - qualunque potrebbe inserirvi dati a piacere.\footnote{la cosa è stata notata - su XFS, dove questo comportamento permetteva, non essendovi limiti sullo - spazio occupabile dagli \textit{Extended Attributes}, di bloccare il - sistema riempiendo il disco.} - - La semantica del controllo di accesso che abbiamo indicato inoltre non - avrebbe alcun senso al di fuori di file e directory: i permessi di lettura e - scrittura per un file di dispositivo attengono alle capacità di accesso al - dispositivo sottostante,\footnote{motivo per cui si può formattare un disco - anche se \texttt{/dev} è su un filesystem in sola lettura.} mentre per i - link simbolici questi vengono semplicemente ignorati: in nessuno dei due - casi hanno a che fare con il contenuto del file, e nella discussione - relativa all'uso degli \textit{extended user attributes} nessuno è mai stato - capace di indicare una qualche forma sensata di utilizzo degli stessi per - link simbolici o file di dispositivo, e neanche per le fifo o i socket. - - Per questo motivo gli \textit{extended user attributes} sono stati - completamente disabilitati per tutto ciò che non sia un file regolare o una - directory.\footnote{si può verificare la semantica adottata consultando il - file \texttt{fs/xattr.c} dei sorgenti del kernel.} Inoltre per le - directory è stata introdotta una ulteriore restrizione, dovuta di nuovo alla - presenza ordinaria di permessi di scrittura completi su directory come - \texttt{/tmp}. Questo è un altro caso particolare, in cui il premesso di - scrittura viene usato, unito alla presenza dello \itindex{sticky~bit} - \textit{sticky bit}, per garantire il permesso di creazione di nuovi file. - Per questo motivo, per evitare eventuali abusi, se una directory ha lo - \itindex{sticky~bit} \textit{sticky bit} attivo sarà consentito scrivere i - suoi \textit{extended user attributes} soltanto se si è proprietari della - stessa, o si hanno i privilegi amministrativi della capability - \index{capabilities} \const{CAP\_FOWNER}. + regolato dai normali permessi dei file: occorre avere il permesso di lettura + per leggerli e quello di scrittura per scriverli o modificarli. Dato l'uso + di questi attributi si è scelto di applicare al loro accesso gli stessi + criteri che si usano per l'accesso al contenuto dei file (o delle directory) + cui essi fanno riferimento. Questa scelta vale però soltanto per i file e le + directory ordinarie, se valesse in generale infatti si avrebbe un serio + problema di sicurezza dato che esistono diversi oggetti sul filesystem per i + quali è normale avere avere il permesso di scrittura consentito a tutti gli + utenti, come i link simbolici, o alcuni file di dispositivo come + \texttt{/dev/null}. Se fosse possibile usare su di essi gli \textit{extended + user attributes} un utente qualunque potrebbe inserirvi dati a + piacere.\footnote{la cosa è stata notata su XFS, dove questo comportamento + permetteva, non essendovi limiti sullo spazio occupabile dagli + \textit{Extended Attributes}, di bloccare il sistema riempiendo il disco.} + + La semantica del controllo di accesso indicata inoltre non avrebbe alcun + senso al di fuori di file e directory: i permessi di lettura e scrittura per + un file di dispositivo attengono alle capacità di accesso al dispositivo + sottostante,\footnote{motivo per cui si può formattare un disco anche se + \texttt{/dev} è su un filesystem in sola lettura.} mentre per i link + simbolici questi vengono semplicemente ignorati: in nessuno dei due casi + hanno a che fare con il contenuto del file, e nella discussione relativa + all'uso degli \textit{extended user attributes} nessuno è mai stato capace + di indicare una qualche forma sensata di utilizzo degli stessi per link + simbolici o file di dispositivo, e neanche per le fifo o i socket. Per + questo motivo essi sono stati completamente disabilitati per tutto ciò che + non sia un file regolare o una directory.\footnote{si può verificare la + semantica adottata consultando il file \texttt{fs/xattr.c} dei sorgenti + del kernel.} Inoltre per le directory è stata introdotta una ulteriore + restrizione, dovuta di nuovo alla presenza ordinaria di permessi di + scrittura completi su directory come \texttt{/tmp}. Per questo motivo, per + evitare eventuali abusi, se una directory ha lo \itindex{sticky~bit} + \textit{sticky bit} attivo sarà consentito scrivere i suoi \textit{extended + user attributes} soltanto se si è proprietari della stessa, o si hanno i + privilegi amministrativi della capability \index{capabilities} + \const{CAP\_FOWNER}. \end{basedescript} Le funzioni per la gestione degli attributi estesi, come altre funzioni di gestione avanzate specifiche di Linux, non fanno parte delle \acr{glibc}, e sono fornite da una apposita libreria, \texttt{libattr}, che deve essere installata a parte;\footnote{la versione corrente della libreria è - \texttt{libattr1}, e nel caso si usi Debian la si può installare con il - pacchetto omonimo ed il collegato \texttt{libattr1-dev}.} pertanto se un -programma le utilizza si dovrà indicare esplicitamente l'uso della suddetta -libreria invocando il compilatore con l'opzione \texttt{-lattr}. + \texttt{libattr1}.} pertanto se un programma le utilizza si dovrà indicare +esplicitamente l'uso della suddetta libreria invocando il compilatore con +l'opzione \texttt{-lattr}. Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni, \funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono @@ -2939,9 +2940,8 @@ simbolico e ad un file descriptor; i rispettivi prototipi sono: \item[\errcode{ENOTSUP}] gli attributi estesi non sono supportati dal filesystem o sono disabilitati. \end{errlist} - Oltre a questi potranno essere restituiti tutti gli errori di \func{stat}, - ed in particolare \errcode{EPERM} se non si hanno i permessi di accesso - all'attributo. } + e tutti gli errori di \func{stat}, come \errcode{EPERM} se non si hanno i + permessi di accesso all'attributo. } \end{functions} Le funzioni \func{getxattr} e \func{lgetxattr} prendono come primo argomento @@ -3109,10 +3109,6 @@ illustrate in precedenza per le altre funzioni relative agli attributi estesi. \itindend{Extended~Attributes} -% TODO trattare gli attributi estesi e le funzioni la documentazione di -% sistema è nei pacchetti libxattr1-dev e attr - - \subsection{Le \textit{Access Control List}} \label{sec:file_ACL} @@ -3816,8 +3812,8 @@ La funzione ... %TODO: finire -La seconda funzione che consente di impostare una ACL è -\funcd{acl\_set\_fd}, il cui prototipo è: +La seconda funzione che consente di impostare una ACL è \funcd{acl\_set\_fd}, +il cui prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/acl.h} @@ -3845,8 +3841,8 @@ Le funzioni viste finora operano a livello di una intera ACL, eseguendo in una sola volta tutte le operazioni relative a tutte le voci in essa contenuta. In generale è possibile modificare un singolo valore all'interno di una singola voce direttamente con le funzioni previste dallo standardo POSIX.1e. Queste -funzioni però sono alquanto macchinose da utilizzare per cui è probabilmente -più semplice operare direttamente sulla rappresentazione testuale. Questo è il +funzioni però sono alquanto macchinose da utilizzare per cui è molto più +semplice operare direttamente sulla rappresentazione testuale. Questo è il motivo per non tratteremo nei dettagli dette funzioni, fornendone solo una descrizione sommaria; chi fosse interessato potrà ricorrere alle pagina di manuale. @@ -3857,13 +3853,20 @@ opportuni puntatori di tipo \type{acl\_entry\_t}, che possono essere ottenuti dalla funzione \funcd{acl\_get\_entry} (per una voce esistente) o dalla funzione \funcd{acl\_create\_entry} per una voce da aggiungere. Nel caso della prima funzione si potrà poi ripetere la lettura per ottenere i puntatori alle -singoli voci. +singole voci successive alla prima. Una volta ottenuti detti puntatori si porà operare sui contenuti delle singole -voci ... +voci; con le funzioni \funcd{acl\_get\_tag\_type}, \funcd{acl\_get\_qualifier}, +\funcd{acl\_get\_permset} si potranno leggere rispettivamente tipo, +qualificatore e permessi mentre con le corrispondente funzioni +\funcd{acl\_set\_tag\_type}, \funcd{acl\_set\_qualifier}, +\funcd{acl\_set\_permset} si possono impostare i valori; in entrambi i casi +vengono utilizzati tipi di dato ad hoc.\footnote{descritti nelle singole + pagine di manuale.} Si possono poi copiare i valori di una voce da una ACL +ad un altra con \funcd{acl\_copy\_entry} o eliminare una voce da una ACL con +\funcd{acl\_delete\_entry}. -%TODO: finire \itindend{Access~Control~List} -- 2.30.2