From ae8f6f29f938fbfbd7b3f63cf996ad7513e2a710 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 12 Oct 2007 22:37:59 +0000 Subject: [PATCH] Materiale sugli extended attributes, inizio di un esempio ed qualche correzione/aggiunta sulla tabella dei servizi del NSS. --- filedir.tex | 139 ++++++++++++++++++++++++++++++++++++------- sockctrl.tex | 32 ++++++---- sources/Makefile | 3 + sources/mygetxattr.c | 94 +++++++++++++++++++++++++++++ 4 files changed, 234 insertions(+), 34 deletions(-) create mode 100644 sources/mygetxattr.c diff --git a/filedir.tex b/filedir.tex index ba1cd6b..6ac0c4c 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2604,8 +2604,8 @@ gestione. Per questo motivo il nome di un attributo deve essere sempre specificato nella forma \texttt{namespace.attribute}, dove \texttt{namespace} fa riferimento alla classe a cui l'attributo appartiene, mentre \texttt{attribute} è il nome ad esso assegnato. In tale forma il nome di un -attributo esteso deve essere univoco. Al momento della scrittura di queste -dispense sono state definite le quattro classi di attributi riportate in +attributo esteso deve essere univoco. Al momento sono state definite le +quattro classi di attributi riportate in tab.~\ref{tab:extended_attribute_class}. \begin{table}[htb] @@ -2628,12 +2628,11 @@ tab.~\ref{tab:extended_attribute_class}. sez.~\ref{sec:file_ACL}) o le \itindex{capabilities} \textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}).\\ - \const{trusted} & I \textit{irusted extended attributes}: visibili ed - accessibili soltanto a processi privilegiati. - Vengono utilizzati per poter realizzare in user space + \const{trusted} & I \textit{trusted extended attributes}: vengono + utilizzati per poter realizzare in user space meccanismi che consentano di mantenere delle - informazioni sui file che non siano accessibili ai - processi ordinari.\\ + informazioni sui file che non devono essere accessibili + ai processi ordinari.\\ \const{user} & Gli \textit{extended user attributes}: utilizzati per mantenere informazioni aggiuntive sui file (come il \textit{mime-type}, la codifica dei caratteri o del @@ -2646,34 +2645,129 @@ tab.~\ref{tab:extended_attribute_class}. \end{table} -Come accennato gli \textit{Extended Attributes} vengono utilizzati in forme -diverse ed in particolare anche per la realizzazione di estensioni del -meccanismo tradizionale dei controlli di accesso. Per questo motivo l'accesso -agli attributi estesi è revolato in maniera diversa a seconda della loro -classe; in particolare si hanno i seguenti casi: +Dato che uno degli usi degli \textit{Extended Attributes} è quello che li +impiega per realizzare delle estensioni (come le 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 riportate in +tab.~\ref{tab:extended_attribute_class}, si hanno i seguenti casi: \begin{basedescript}{\desclabelwidth{2.0cm}\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 \itindex{Linux~Security~Modules} \textit{Linux Security Modules} (ad esempio - \index{SELinux} SELinux). Pertanto l'accesso in lettura o scruttura dipende + \index{SELinux} SELinux). Pertanto l'accesso in lettura o scrittura dipende dalle politiche di sicurezza implementate all'interno dal modulo di sicurezza che si sta utilizzando al momento (ciascuno avrà le sue). Se non è stato caricato nessun modulo di sicurezza l'accesso in lettura sarà consentito a tutti i processi, mentre quello in scrittura solo ai processi dotati della \index{capabilities} \textit{capability} \const{CAP\_SYS\_ADMIN}. -\item[\texttt{system}] \textit{extended system attributes} -\item[\texttt{trusted}] \textit{trusted extended attributes} -\item[\texttt{user}] \textit{extended user attributes} +\item[\texttt{system}] anche l'accesso agli \textit{extended system + attributes} dipende dalle politiche di accesso che il kernel realizza + anche utilizzando gli stessi valori in essi contenuti. Ad esempio nel caso + delle ACL l'accesso è consentito in lettura ai processi che hanno la + capacità di eseguire una ricerca sul file (cioè hanno il permesso di lettura + sulla directory che contiene il file) ed in scrittura al proprietario del + file o ai processi dotati della capability \index{capabilities} + \const{CAP\_FOWNER}.\footnote{vale a dire una politica di accesso analoga a + quella impiegata per gli ordinari permessi dei file.} + +\item[\texttt{trusted}] l'accesso ai \textit{trusted extended attributes}, sia + in lettura che in scrittura, è consentito soltanto ai processi dotati della + \index{capabilities} \textit{capability} \const{CAP\_SYS\_ADMIN}. In questo + modo si possono utilizzare questi attributi per realizzare in user space dei + meccanismi di 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 dato che esistono + diversi oggetti sul filesystem per i quali è normale avere avere il permesso + di scrittura aperto a tutti, 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 infatti 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 nessuno è mai stato + capace di indicare un uso sensato degli \textit{extended user attributes} + per questi oggetti, o per fifo e 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 + 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 amministratitiv della capability + \index{capabilities} \const{CAP\_FOWNER}. \end{basedescript} +Le funzioni per la gestione degli attributi estesi, come altre funzioni di +gestione avanzate, non sono 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 libreria invocando il compilatore +con attraverso l'opzione \texttt{-lattr}. + +Per poter leggere gli attributi estesi sono disponibili tre diverse funzioni, +\funcd{getxattr}, \funcd{lgetxattr} e \funcd{fgetxattr}, che consentono +rispettivamente di richiedere gli attributi relativi a un file, a un link +simbolico e ad un file descriptor, per poterle utilizzare occorre collegare il +i loro prototipi sono: +\begin{functions} + \headdecl{sys/types.h} + \headdecl{attr/xattr.h} + + \funcdecl{ssize\_t getxattr(const char *path, const char *name, void + *value, size\_t size)} - è regolato dagli ordinari permessi dei file: occorre il -permesso di lettura per leggerli e quello di scrittura per scriverli o -modificarli; il permesso di esecuzione viene invece interpretato coma la -capacità di ottenere la lista degli attributi presenti. - + \funcdecl{ssize\_t lgetxattr(const char *path, const char *name, void + *value, size\_t size)} + + \funcdecl{ssize\_t fgetxattr(int filedes, const char *name, void *value, + size\_t size)} + + Le funzioni leggono il valore di un attributo esteso. + + \bodydesc{Le funzioni restituiscono un numero positivo che indica la + dimensione dell'attributo richiesto in caso di successo, e -1 in caso di + errore, nel qual caso \var{errno} assumerà i valori: + \begin{errlist} + \item[\errcode{ENOATTR}] l'attributo richiesto non esiste. + \item[\errcode{ERANGE}] la dimensione \param{size} del buffer \param{value} + non è sufficiente per contenere il risultato. + \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. } +\end{functions} @@ -2858,7 +2952,8 @@ programmi e librerie) di cui il server potrebbe avere bisogno. % 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 Posix FreeBSD libacl -% LocalWords: XFS SELinux namespace attribute security trusted Draft +% LocalWords: XFS SELinux namespace attribute security trusted Draft Modules +% LocalWords: attributes mime ADMIN FOWNER %%% Local Variables: %%% mode: latex diff --git a/sockctrl.tex b/sockctrl.tex index a1f5d8b..529d0d3 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -50,7 +50,7 @@ necessita di compiere questa operazione. \begin{figure}[htb] \centering - \includegraphics[width=9cm]{img/resolver} + \includegraphics[width=11cm]{img/resolver} \caption{Schema di funzionamento delle funzioni del \textit{resolver}.} \label{fig:sock_resolver_schema} \end{figure} @@ -145,15 +145,17 @@ tab.~\ref{tab:sys_NSS_classes}. \textbf{Classe} & \textbf{Tipo di corrispondenza}\\ \hline \hline - \texttt{shadow} & Corrispondenze fra username e proprietà dell'utente - (\acr{uid}, ecc.).\\ + \texttt{passwd} & Corrispondenze fra nome dell'utente e relative + proprietà (\acr{uid}, gruppo principale, ecc.).\\ + \texttt{shadow} & Corrispondenze fra username e password dell'utente + (e altre informazioni relative alle password).\\ \texttt{group} & Corrispondenze fra nome del gruppo e proprietà dello stesso.\\ \texttt{aliases} & Alias per la posta elettronica.\\ \texttt{ethers} & Corrispondenze fra numero IP e MAC address della scheda di rete.\\ \texttt{hosts} & Corrispondenze fra nome a dominio e numero IP.\\ - \texttt{netgroup} & Corrispondenze gruppo di rete e macchine che lo + \texttt{netgroup} & Corrispondenze fra gruppo di rete e macchine che lo compongono.\\ \texttt{networks} & Corrispondenze fra nome di una rete e suo indirizzo IP.\\ @@ -161,6 +163,8 @@ tab.~\ref{tab:sys_NSS_classes}. numero identificativo.\\ \texttt{rpc} & Corrispondenze fra nome di un servizio RPC e relativo numero identificativo.\\ + \texttt{publickey}& Chiavi pubbliche e private usate per gli RFC sicuri, + utilizzate da NFS e NIS+. \\ \texttt{services} & Corrispondenze fra nome di un servizio e numero di porta. \\ \hline @@ -170,6 +174,8 @@ tab.~\ref{tab:sys_NSS_classes}. \label{tab:sys_NSS_classes} \end{table} +% TODO rivedere meglio la tabella + Il sistema del \textit{Name Service Switch} è controllato dal contenuto del file \conffile{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una convezione comune per i file di configurazione le righe vuote vengono @@ -323,7 +329,9 @@ comportamento del \textit{resolver}. \const{RES\_NOCHECKNAME}& Non controlla i nomi per verificarne la correttezza sintattica. \\ \const{RES\_KEEPTSIG} & Non elimina i record di tipo \texttt{TSIG}.\\ - \const{RES\_BLAST} & \\ + \const{RES\_BLAST} & Effettua un ``\textit{blast}'' inviando + simultaneamente le richieste a tutti i server; + non ancora implementata. \\ \const{RES\_DEFAULT} & Combinazione di \const{RES\_RECURSE}, \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\ \hline @@ -537,12 +545,12 @@ indicarli si ed un nome a dominio ad esso associato si utilizza questo tipo di record (il cui nome sta per \textit{pointer}). \item[\texttt{CNAME}] qualora si abbiamo più nomi che corrispondono allo - stesso indirizzo (come ad esempio \texttt{www.truelite.it}, o - \texttt{sources.truelite.it}, che fanno sempre riferimento a - \texttt{dodds.truelite.it}) si può usare questo tipo di record per creare - degli \textit{alias} in modo da associare un qualunque altro nome al - \textsl{nome canonico} della macchina (si chiama così quello associato al - record \texttt{A}). + stesso indirizzo (come ad esempio \texttt{www.truelite.it} e + \texttt{sources.truelite.it}, che fanno entrambi riferimento alla stessa + macchina (nel caso \texttt{dodds.truelite.it}) si può usare questo tipo di + record per creare degli \textit{alias} in modo da associare un qualunque + altro nome al \textsl{nome canonico} della macchina (si chiama così quello + associato al record \texttt{A}). \end{basedescript} Come accennato in caso di successo le due funzioni di richiesta restituiscono @@ -565,7 +573,7 @@ tab.~\ref{tab:h_errno_values}. \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|l|p{10cm}|} + \begin{tabular}[c]{|l|p{11cm}|} \hline \textbf{Costante} & \textbf{Significato} \\ \hline diff --git a/sources/Makefile b/sources/Makefile index b9345b3..38b67a4 100644 --- a/sources/Makefile +++ b/sources/Makefile @@ -120,6 +120,9 @@ getcap: getcap.c iflist: iflist.c $(CC) $(CFLAGS) $^ -o $@ +mygetxattr: mygetxattr.c + $(CC) $(CFLAGS) $^ -lattr -o $@ + # Macro per la generazione della tarball dei sorgenti package: clean gapil_source.tgz diff --git a/sources/mygetxattr.c b/sources/mygetxattr.c new file mode 100644 index 0000000..753319b --- /dev/null +++ b/sources/mygetxattr.c @@ -0,0 +1,94 @@ +/* mygetxattr.c + * + * Copyright (C) 2007 Simone Piccardi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/***************************************************************************** + * + * File mygetxattr.c: An example host command + * + * Author: S. Piccardi Oct. 2007 + * + *****************************************************************************/ +#include /* primitive system data types */ +#include /* file characteristics constants and functions */ +#include /* C standard library */ +#include /* standard I/O library */ +#include /* unix standard library */ + + +/* + * Program mygetxatrr + * + * Use getxattr and print results + */ +/* Help printing routine */ +void usage(void); + +int main(int argc, char *argv[]) +{ +/* + * Variables definition + */ + int i; + + /* + * Input section: decode command line parameters + * Use getopt function + */ + opterr = 0; /* don't want writing to stderr */ + while ( (i = getopt(argc, argv, "h")) != -1) { + switch (i) { + /* + * Handling options + */ + case 'h': /* help option */ + printf("Wrong -h option use\n"); + usage(); + return -1; + break; + case '?': /* unrecognized options */ + printf("Unrecognized options -%c\n",optopt); + usage(); + default: /* should not reached */ + usage(); + } + } + /* *********************************************************** + * + * Options processing completed + * + * Main code beginning + * + * ***********************************************************/ + if ((argc - optind) != 2) { + printf("Wrong number of arguments %d\n", argc - optind); + usage(); + } + + + exit(0); +} +/* + * routine to print usage info and exit + */ +void usage(void) { + printf("Program mygetxattr: get an extended attribute \n"); + printf("Usage:\n"); + printf(" mygetxattr [-h] file attribute \n"); + printf(" -h print this help\n"); + exit(1); +} -- 2.30.2