%% filedir.tex
%%
-%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2014 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
il controllo dei contenuti, in particolar modo quelli posti su dispositivi
rimuovibili. In questo modo si evitano alla radice possibili situazioni in
cui un utente malizioso inserisce su uno di questi filesystem dei file di
- dispositivo con permessi ``opportunamente'' ampliati che gli consentano di
- accedere anche a risorse cui non dovrebbe.
+ dispositivo con permessi ``opportunamente'' ampliati che gli consentirebbero
+ di accedere anche a risorse cui non dovrebbe.
\item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem
l'aggiornamento degli \textit{access time} (vedi
{La funzione ritorna $0$ in caso di successo e $-1$ per un errore,
nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
+ \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
+ ed il filesystem non era occupato.
\item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro}
directory di lavoro di qualche processo, o contiene dei file aperti, o un
altro mount point.
- \item[\errcode{EAGAIN}] si è chiamata la funzione con \const{MNT\_EXPIRE}
- ed il filesystem non era occupato.
\item[\errcode{EINVAL}] \param{target} non è un \itindex{mount~point}
\textit{mount point} o si è usato \const{MNT\_EXPIRE} con
\const{MNT\_FORCE} o \const{MNT\_DETACH} o si è specificato un flag non
collegamento simbolico può fare riferimento anche ad un file che non esiste;
ad esempio possiamo usare il comando \cmd{ln} per creare un collegamento
simbolico nella nostra directory con:
-\begin{Command}
-$ ln -s /tmp/tmp_file symlink
-\end{Command}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ln -s /tmp/tmp_file symlink}
+\end{Console}
%$
e questo avrà successo anche se \file{/tmp/tmp\_file} non esiste:
-\begin{Command}
-$ ls symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls symlink}
symlink
-\end{Terminal}
+\end{Console}
%$
ma questo può generare confusione, perché accedendo in sola lettura a
\file{symlink}, ad esempio con \cmd{cat}, otterremmo un errore:
-\begin{Command}
-$ cat symlink
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat symlink}
cat: symlink: No such file or directory
-\end{Terminal}
+\end{Console}
%$
con un errore che può sembrare sbagliato, dato che \cmd{ls} ci ha mostrato
l'esistenza di \file{symlink}, se invece scrivessimo su \file{symlink}
parte di qualche processo (come \index{directory~di~lavoro} directory di
lavoro o come radice) o del sistema (come \itindex{mount~point}
\textit{mount point}) ed il sistema non riesce a risolvere la situazione.
+ \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
+ non è vuota (anche \errcode{ENOTEMPTY}).
\item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di
\param{oldpath} o più in generale si è cercato di creare una directory come
sotto-directory di sé stessa.
\item[\errcode{EISDIR}] \param{newpath} è una directory mentre
\param{oldpath} non è una directory.
- \item[\errcode{EEXIST}] \param{newpath} è una directory già esistente e
- non è vuota (anche \errcode{ENOTEMPTY}).
\item[\errcode{ENOTDIR}] uno dei componenti dei \textit{pathname} non è una
directory o \param{oldpath} è una directory e
\param{newpath} esiste e non è una directory.
che contiene la directory che si vuole cancellare, o non c'è il permesso
di attraversare (esecuzione) una delle directory specificate in
\param{dirname}.
- \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
- di \param{dirname}.
\item[\errcode{EBUSY}] la directory specificata è la
\index{directory~di~lavoro} directory di lavoro o la radice di qualche
processo o un \itindex{mount~point} \textit{mount point}.
+ \item[\errcode{EINVAL}] si è usato ``\texttt{.}'' come ultimo componente
+ di \param{dirname}.
\item[\errcode{EPERM}] il filesystem non supporta la cancellazione di
directory, oppure la directory che contiene \param{dirname} ha lo
\itindex{sticky~bit} \textit{sticky bit} impostato e non si è i
trovato coi sorgenti allegati alla guida nel file \file{myls.c}.
In sostanza tutto quello che fa il programma, dopo aver controllato
-(\texttt{\small 12--15}) di avere almeno un argomento, che indicherà la
+(\texttt{\small 12-15}) di avere almeno un argomento, che indicherà la
directory da esaminare, è chiamare (\texttt{\small 16}) la funzione
\myfunc{dir\_scan} per eseguire la scansione, usando la funzione \code{do\_ls}
-(\texttt{\small 22--29}) per fare tutto il lavoro.
+(\texttt{\small 22-29}) per fare tutto il lavoro.
Quest'ultima si limita (\texttt{\small 26}) a chiamare \func{stat} sul file
indicato dalla directory entry passata come argomento (il cui nome è appunto
riportata in fig.~\ref{fig:file_dirscan}. La funzione è volutamente generica e
permette di eseguire una funzione, passata come secondo argomento, su tutte le
voci di una directory. La funzione inizia con l'aprire (\texttt{\small
- 18--22}) uno \textit{stream} sulla directory passata come primo argomento,
+ 18-22}) uno \textit{stream} sulla directory passata come primo argomento,
stampando un messaggio in caso di errore.
-Il passo successivo (\texttt{\small 23--24}) è cambiare
+Il passo successivo (\texttt{\small 23-24}) è cambiare
\index{directory~di~lavoro} directory di lavoro (vedi
sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e
\func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su
\var{dirname}), in modo che durante il successivo ciclo (\texttt{\small
- 26--30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
+ 26-30}) sulle singole voci dello \textit{stream} ci si trovi all'interno
della directory.\footnote{questo è essenziale al funzionamento della funzione
\code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in
quanto i nomi dei file memorizzati all'interno di una struttura
di \param{pathname}.
\item[\errcode{ENOTDIR}] non si è specificata una directory.
\end{errlist}
- ed inoltre \errval{EFAULT}, \errval{ELOOP}, \errval{EIO},
+ ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP},
\errval{ENAMETOOLONG}, \errval{ENOENT} e \errval{ENOMEM} nel loro
significato generico.}
\end{funcproto}
errore, nel qual
caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
\item[\errcode{EEXIST}] non è riuscita a creare un file temporaneo, il
contenuto di \param{template} è indefinito.
+ \item[\errcode{EINVAL}] \param{template} non termina con \code{XXXXXX}.
\end{errlist}}
\end{funcproto}
Un classico esempio di directory che ha questo bit impostato è \file{/tmp}, i
cui permessi infatti di solito sono i seguenti:
-\begin{Command}
-$ ls -ld /tmp
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{ls -ld /tmp}
drwxrwxrwt 6 root root 1024 Aug 10 01:03 /tmp
-\end{Terminal}
+\end{Console}
%$
quindi con lo \textit{sticky bit} bit impostato. In questo modo qualunque
utente nel sistema può creare dei file in questa directory, che come
{Le funzioni ritornano un oggetto di tipo \type{acl\_t} in caso di successo e
\val{NULL} per un errore, nel qual caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{ACCESS}] non c'è accesso per una componente di
+ \item[\errcode{EACCESS}] non c'è accesso per una componente di
\param{path\_p} o si è richiesta una ACL di default per un file (solo per
\func{acl\_get\_file}).
\item[\errcode{EINVAL}] \param{type} non ha un valore valido (solo per
\val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
dei valori:
\begin{errlist}
- \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
\item[\errcode{EINVAL}] la rappresentazione testuale all'indirizzo
\param{buf\_p} non è valida.
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
\end{errlist}
}
\end{funcproto}
testuale della ACL in caso di successo e \var{NULL} per un errore, nel qual
caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
\item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
\end{errlist}
}
\end{funcproto}
testuale della ACL in caso di successo e \val{NULL} per un errore, nel qual
caso \var{errno} assumerà uno dei valori:
\begin{errlist}
- \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
\item[\errcode{EINVAL}] la ACL indicata da \param{acl} non è valida.
- \end{errlist}
+ \item[\errcode{ENOMEM}] non c'è memoria sufficiente per allocare i dati.
+ \end{errlist}
}
\end{funcproto}
La sezione principale del programma, da cui si è rimossa la sezione sulla
gestione delle opzioni, è riportata in fig.~\ref{fig:proc_mygetfacl}. Il
-programma richiede un unico argomento (\texttt{\small 16--20}) che indica il
+programma richiede un unico argomento (\texttt{\small 16-20}) che indica il
file di cui si vuole leggere la ACL. Se questo è presente si usa
(\texttt{\small 22}) la funzione \func{get\_acl\_file} per leggerne la ACL, e
-si controlla (\texttt{\small 23--26}) se l'operazione ha successo, uscendo con
+si controlla (\texttt{\small 23-26}) se l'operazione ha successo, uscendo con
un messaggio di errore in caso contrario.
Ottenuta la ACL la si converte in formato testuale (\texttt{\small 27}) con la
funzione \func{acl\_to\_text}, controllando di nuovo se l'operazione ha
-successo (\texttt{\small 28--31}) ed uscendo in caso contrario. Si provvede
+successo (\texttt{\small 28-31}) ed uscendo in caso contrario. Si provvede
infine a stampare la rappresentazione testuale (\texttt{\small 32}) e dopo
-aver liberato (\texttt{\small 33--34}) le risorse allocate automaticamente, si
+aver liberato (\texttt{\small 33-34}) le risorse allocate automaticamente, si
conclude l'esecuzione.
con \macro{QCMD} al comando \const{Q\_GETQUOTA} per ottenere i dati.
La funzione viene eseguita all'interno di un condizionale (\texttt{\small
- 5--16}) che in caso di successo provvede a costruire (\texttt{\small 6--12})
+ 5-16}) che in caso di successo provvede a costruire (\texttt{\small 6-12})
opportunamente una risposta restituendo tramite la opportuna funzione di
interfaccia un oggetto Python contenente i dati della struttura \struct{dqblk}
relativi a uso corrente e limiti sia per i blocchi che per gli \itindex{inode}
-\textit{inode}. In caso di errore (\texttt{\small 13--15}) si usa un'altra
+\textit{inode}. In caso di errore (\texttt{\small 13-15}) si usa un'altra
funzione dell'interfaccia per passare il valore di \var{errno} come eccezione.
\begin{figure}[!htbp]
della precedente, con lo stesso significato, a cui si aggiungono i valori per
il \textit{soft limit} e l'\textit{hard limit}. In questo caso occorrerà,
prima di chiamare \func{quotactl}, inizializzare opportunamente
-(\texttt{\small 5--7}) i campi della struttura \struct{dqblk} che si vogliono
+(\texttt{\small 5-7}) i campi della struttura \struct{dqblk} che si vogliono
utilizzare (quelli relativi ai limiti sui blocchi) e specificare gli stessi
con \const{QIF\_BLIMITS} in \var{dq.dqb\_valid}.
Fatto questo la chiamata a \func{quotactl}, stavolta con il comando
\const{Q\_SETQUOTA}, viene eseguita come in precedenza all'interno di un
-condizionale (\texttt{\small 9--14}). In questo caso non essendovi da
+condizionale (\texttt{\small 9-14}). In questo caso non essendovi da
restituire nessun dato in caso di successo si usa (\texttt{\small 10}) una
apposita funzione di uscita, mentre si restituisce come prima una eccezione
-con il valore di \var{errno} in caso di errore (\texttt{\small 12--13}).
+con il valore di \var{errno} in caso di errore (\texttt{\small 12-13}).
\subsection{La gestione delle \textit{capabilities}}
\itindend{file~capabilities}
-% TODO verificare per process capability bounding set, vedi:
-% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
+% NOTE per dati relativi al process capability bounding set, vedi:
+% http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3b7391de67da515c91f48aa371de77cb6cc5c07e
-% TODO capire cosa cambia con i patch vari, vedi
+% NOTE riferimenti ai vari cambiamenti vedi:
% http://lwn.net/Articles/280279/
% http://lwn.net/Articles/256519/
% http://lwn.net/Articles/211883/
in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa
tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man
capabilities}) e dalle definizioni in
- \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la
+ \texttt{include/linux/capabilities.h}, è aggiornato al kernel 3.2.} la
tabella è divisa in due parti, la prima riporta le \textit{capabilities}
previste anche nella bozza dello standard POSIX1.e, la seconda quelle
specifiche di Linux. Come si può notare dalla tabella alcune
\const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
auditing del kernel (dal kernel 2.6.11).\\
% TODO verificare questa roba dell'auditing
+ \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
+ la sospensione del sistema (dal kernel 3.5).\\
\const{CAP\_CHOWN} & Cambiare proprietario e gruppo
proprietario di un file (vedi
sez.~\ref{sec:file_ownership_management}).\\
funzioni \func{mlock}, \func{mlockall},
\func{shmctl}, \func{mmap} (vedi
sez.~\ref{sec:proc_mem_lock} e
- sez.~\ref{sec:file_memory_map}). \\
+ sez.~\ref{sec:file_memory_map}). \\
+% TODO verificare l'interazione con SHM_HUGETLB
\const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
per le operazioni sugli oggetti di
intercomunicazione fra processi (vedi
sez.~\ref{sec:file_asyncronous_lease})
pur non essendo proprietari del file (dal kernel
2.4).\\
- \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli
- attributi \textit{immutable} e
- \itindex{append~mode} \textit{append-only} (vedi
+ \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
+ \textit{immutable} e \itindex{append~mode}
+ \textit{append-only} (vedi
sez.~\ref{sec:file_perm_overview}) se
supportati.\\
- \const{CAP\_MKNOD} & Creare
- \index{file!di~dispositivo} file di dispositivo
- con \func{mknod} (vedi
+ \const{CAP\_MKNOD} & Creare \index{file!di~dispositivo} file di
+ dispositivo con \func{mknod} (vedi
sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\
\const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
privilegiate sulla rete.\\
- \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto
- su porte riservate (vedi
+ \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
sez.~\ref{sec:TCP_func_bind}).\\
\const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
\itindex{broadcast} \textit{broadcast} e
\itindex{multicast} \textit{multicast}.\\
- \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e
- \texttt{PACKET} (vedi sez.~\ref{sec:sock_type}).\\
+ \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
+ (vedi sez.~\ref{sec:sock_type}).\\
\const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle
\textit{capabilities}.\\
- \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti
- amministrativi.\\
- \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del
- sistema (vedi sez.~\ref{sec:sys_reboot}).\\
- \const{CAP\_SYS\_CHROOT}& Eseguire la funzione
- \func{chroot} (vedi sez.~\ref{sec:file_chroot}).\\
+ \const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
+ \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
+ sez.~\ref{sec:sys_reboot}).\\
+ \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
+ sez.~\ref{sec:file_chroot}).\\
\const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
Access Control} di Smack (dal kernel 2.6.25).\\
\const{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
Access Control} di Smack (dal kernel 2.6.25).\\
- \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del
- kernel.\\
- \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei
- processi (vedi sez.~\ref{sec:proc_priority}).\\
- \const{CAP\_SYS\_PACCT} & Usare le funzioni di
- \textit{accounting} dei processi (vedi
- sez.~\ref{sec:sys_bsd_accounting}).\\
+ \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
+ \const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi
+ sez.~\ref{sec:proc_priority}).\\
+ \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei
+ processi (vedi
+ sez.~\ref{sec:sys_bsd_accounting}).\\
\const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
\func{ptrace} (vedi
sez.~\ref{sec:process_ptrace}).\\
- \const{CAP\_SYS\_RAWIO} & Operare sulle porte
- di I/O con \func{ioperm} e \func{iopl} (vedi
+ \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+ \func{iopl} (vedi
sez.~\ref{sec:process_io_port}).\\
- \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni
- sulle risorse.\\
- \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema
- (vedi sez.~\ref{sec:sys_time}).\\
- \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup}
- della console, con la funzione
- \func{vhangup}.\\
+ \const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\
+ \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
+ sez.~\ref{sec:sys_time}).\\
+ \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+ con la funzione \func{vhangup}.\\
\const{CAP\_SYSLOG} & Gestire il buffer dei messaggi
del kernel, (vedi sez.~\ref{sec:sess_daemon}),
introdotta dal kernel 2.6.38 come capacità
\errval{ESRCH}. Gli stessi valori possono essere letti direttamente nel
filesystem \textit{proc}, nei file \texttt{/proc/<pid>/status}; ad esempio per
\texttt{init} si otterrà qualcosa del tipo:
-\begin{Command}
-$ cat /proc/1/status
-\end{Command}
-\begin{Terminal}
+\begin{Console}
+piccardi@hain:~/gapil$ \textbf{cat /proc/1/status}
...
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
...
-\end{Terminal}
+\end{Console}
%$
\itindend{capability~state}
l'opzione \texttt{-p} è impostata (nella sezione di gestione delle opzioni,
che si è tralasciata) al valore del \ids{PID} del processo di cui si vuole
leggere le \textit{capabilities} e nulla altrimenti. Nel primo caso
-(\texttt{\small 1--6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
+(\texttt{\small 1-6}) si utilizza (\texttt{\small 2}) \func{cap\_get\_proc}
per ottenere lo stato delle capacità del processo, nel secondo (\texttt{\small
- 7--13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
+ 7-13}) si usa invece \func{cap\_get\_pid} (\texttt{\small 8}) per leggere
il valore delle capacità del processo indicato.
Il passo successivo è utilizzare (\texttt{\small 15}) \func{cap\_to\_text} per
tradurre in una stringa lo stato, e poi (\texttt{\small 16}) stamparlo; infine
-(\texttt{\small 18--19}) si libera la memoria allocata dalle precedenti
+(\texttt{\small 18-19}) si libera la memoria allocata dalle precedenti
funzioni con \func{cap\_free} per poi ritornare dal ciclo principale della
funzione.
% cgroup o altro
% TODO: trattare la funzione setns e i namespace file descriptors (vedi
-% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0
+% http://lwn.net/Articles/407495/) introdotti con il kernel 3.0, altre
+% informazioni su setns qui: http://lwn.net/Articles/532748/
+% http://lwn.net/Articles/531498/
+
% TODO: spostare chroot e le funzioni affini relative ai container da qualche
% parte diversa se è il caso.