Materiale sugli extended attributes, inizio di un esempio ed qualche
authorSimone Piccardi <piccardi@gnulinux.it>
Fri, 12 Oct 2007 22:37:59 +0000 (22:37 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Fri, 12 Oct 2007 22:37:59 +0000 (22:37 +0000)
correzione/aggiunta sulla tabella dei servizi del NSS.

filedir.tex
sockctrl.tex
sources/Makefile
sources/mygetxattr.c [new file with mode: 0644]

index ba1cd6bf7de94f43a72c2c201be9dc5cd619e75a..6ac0c4c03eadb7dc55896c0254aa44b3ea58f9cd 100644 (file)
@@ -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
index a1f5d8be3e2497085a63db0678e424691518f3b6..529d0d365b5be0b32e16891360950c075f273c99 100644 (file)
@@ -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
index b9345b3684c03967942a27c9ba4ced2a24ff08e4..38b67a41ee6261ea3f8eb652fd3ff7834777b039 100644 (file)
@@ -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 (file)
index 0000000..753319b
--- /dev/null
@@ -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 <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);
+}