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]
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
\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}
% 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
\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}
\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.\\
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
\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
\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
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
\begin{table}[!htb]
\centering
\footnotesize
- \begin{tabular}[c]{|l|p{10cm}|}
+ \begin{tabular}[c]{|l|p{11cm}|}
\hline
\textbf{Costante} & \textbf{Significato} \\
\hline
--- /dev/null
+/* 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 <sys/types.h> /* primitive system data types */
+#include <sys/stat.h> /* file characteristics constants and functions */
+#include <stdlib.h> /* C standard library */
+#include <stdio.h> /* standard I/O library */
+#include <unistd.h> /* 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);
+}