sono stati creati, questo viene chiamato in genere \acr{ppid} (da
\textit{parent process id}). Questi due identificativi possono essere
ottenuti da programma usando le funzioni:
+
\begin{functions}
\headdecl{sys/types.h}
\headdecl{unistd.h}
\textit{sibling}, questa è una delle relazioni usate nel \textsl{controllo di
sessione}, in cui si raggruppano i processi creati su uno stesso terminale,
o relativi allo stesso login. Torneremo su questo argomento in dettaglio in
-\secref{cap:session}, dove esamineremo i vari identificativi associati ad un
-processo e le varie relazioni fra processi utilizzate per definire una
+\secref{cap:session}, dove esamineremo gli altri identificativi associati ad
+un processo e le varie relazioni fra processi utilizzate per definire una
sessione.
+Oltre al \acr{pid} e al \acr{ppid}, e a quelli usati per il controllo di
+sessione, ad ogni processo sono associati altri identificatori, usati per il
+controllo di accesso, che servono per determinare se il processo può o meno
+eseguire le operazioni richieste, a seconda dei privilegi e dell'identità di
+chi lo ha posto in esecuzione; su questi torneremo in dettaglii più avanti in
+\secref{sec:proc_perm}.
+
\subsection{La funzione \func{fork}}
\label{sec:proc_fork}
\item gli identificatori per il controllo di accesso: il \textit{real user
id}, il \textit{real group id}, l'\textit{effective user id},
l'\textit{effective group id} e i \textit{supplementary group id} (vedi
- \secref{tab:proc_uid_gid}).
+ \secref{sec:proc_user_group}).
\item gli identificatori per il controllo di sessione: il \textit{process
- group id} e il \textit{session id} e il terminale di controllo.
-\item i flag \acr{suid} e \acr{sgid} (vedi \secref{sec:file_suid_sgid}).
+ group id} e il \textit{session id} e il terminale di controllo (vedi
+ \secref{sec:sess_xxx} e \secref{sec:sess_xxx}).
+\item i flag di \acr{suid} e \acr{sgid} (vedi \secref{sec:file_suid_sgid}).
\item la directory di lavoro e la directory radice (vedi
\secref{sec:file_work_dir}).
\item la maschera dei permessi di creazione (vedi \secref{sec:file_umask}).
\textit{zombie} la tabella dei processi; le funzioni deputate a questo compito
sono sostanzialmente due, \func{wait} e \func{waitpid}. La prima, il cui
prototipo è:
+
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/wait.h}
ampie, legate anche al controllo di sessione. Dato che è possibile ottenere
lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre
questa funzione; il suo prototipo è:
+
\begin{functions}
\headdecl{sys/types.h}
\headdecl{sys/wait.h}
sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime}, \var{ru\_minflt},
\var{ru\_majflt}, e \var{ru\_nswap}.
+
\subsection{Le funzioni \texttt{exec}}
\label{sec:proc_exec}
\label{fig:proc_exec_relat}
\end{figure}
-
La terza differenza è come viene passata la lista delle variabili di ambiente.
Con lo mnemonico \func{e} vengono indicate quelle funzioni che necessitano di
un vettore di parametri \var{envp[]} analogo a quello usato per gli argomenti
\label{sec:proc_perms}
In questa sezione esamineremo le problematiche relative al controllo di
-accesso dal punto di vista del processi; gli identificativi usati, come questi
-possono essere modificati nella creazione e nel lancio di nuovi processi, le
-varie funzioni per la loro manipolazione diretta e tutte le problematiche
-connesse alla gestione accorta dei privilegi.
+accesso dal punto di vista del processi; vedremo quali sono gli identificatori
+usati, come questi possono essere modificati nella creazione e nel lancio di
+nuovi processi, e le varie funzioni per la loro manipolazione diretta e tutte
+le problematiche connesse alla gestione accorta dei privilegi.
\subsection{Utente e gruppo di un processo}
\label{sec:proc_user_group}
-Come abbiamo già accennato in \secref{sec:intro_multiuser} il modello
-base\footnote{in realtà esistono estensioni di questo modello, che lo rendono
- più flessibile e controllabile, come le \textit{capabilities}, le ACL per i
- file o il modello a ``... NdT riprendere i dati'' di SELinux} di sicurezza
-di un sistema unix è fondato sui concetti di utente e gruppo, e sulla
-separazione fra amministratore (che può fare tutto) e resto degli
-utenti.
-
-%Benché il sistema sia piuttosto semplice il sistema permette una
-%notevole fles
+Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in
+ realtà già esistono estensioni di questo modello base, che lo rendono più
+ flessibile e controllabile, come le \textit{capabilities}, le ACL per i file
+ o il \textit{Mandatory Access Control} di SELinux} di sicurezza di un
+sistema unix-like è fondato sui concetti di utente e gruppo, e sulla
+separazione fra l'amministratore (\textsl{root}, detto spesso anche
+\textit{superuser}) che non è sottoposto a restrizioni, ed il resto degli
+utenti, per i quali invece vengono effettuati i vari controlli di accesso.
+
+%Benché il sistema sia piuttosto semplice (è basato su un solo livello di
+% separazione) il sistema permette una
+%notevole flessibilità,
+
+Abbiamo già accennato come il sistema associ ad ogni utente e gruppo due
+identificatori univoci, lo \acr{uid} e il \acr{gid}; questi servono al kernel
+per identificare uno specifico utente o un gruppo di utenti, per poi poter
+controllare che essi siano autorizzati a compiere le operazioni richieste. Ad
+esempio in \secref{sec:file_access_control} vedremo come ad ogni file vengano
+associati un utente ed un gruppo (i suoi \textsl{proprietari}, indicati
+appunto tramite un \acr{uid} ed un \acr{gid}) che vengono controllati dal
+kernel nella gestione dei permessi di accesso.
+
+Dato che tutte le operazioni del sistema vengono compiute dai processi, è
+evidente che per poter implementare un controllo sulle operazioni occorre
+anche poter identificare chi è che ha lanciato un certo processo, e pertanto
+anche a ciascuno di essi è associato un utente e a un gruppo.
+
+Un semplice controllo di una corrispondenza fra identificativi però non
+garantisce però sufficiente flessibilità per tutti quei casi in cui è
+necessario poter disporre di privilegi diversi, o dover impersonare un altro
+utente per un limitato insieme di operazioni. Per questo motivo in generale
+tutti gli unix prevedono che i processi abbiano almeno due gruppi di
+identificatori, chiamati rispettivamente \textit{real} ed \textit{effective}.
+
+Al primo gruppo appartengono il \textit{real user ID} e il \textit{real group
+ ID}: questi vengono settati al login ai valori corrispondenti all'utente con
+cui si accede al sistema (e relativo gruppo di default). Servono per
+l'identificazione dell'utente e normalmente non vengono mai cambiati.
+
+Al secondo gruppo appartengono l'\textit{effective user ID} e
+l'\textit{effective group ID}: questi sono gli identificatori usati nella
+verifiche dei permessi, (ad esempio, come vedremo in
+\secref{sec:file_perm_overview}, vengono usati nel controllo di accesso ai
+file).
+
+Questi identificatori normalmente sono identici ai corrispondenti del gruppo
+\textsl{reale} tranne nel caso in cui, come visto in \secref{sec:proc_exec}, il
+programma che si è posto in esecuzione abbia i bit \acr{suid} o \acr{sgid}
+settati (il significato di questi bit è affrontato in dettaglio in
+\secref{sec:file_suid_sgid}). In questo caso essi saranno settati all'utente e
+al gruppo proprietari del file, questo consente, per programmi in cui ci sia
+necessità, di dare anche all'utente normale privilegi o permessi superiori.
+
+Come nel caso del \acr{pid} e del \acr{ppid} identificatori possono essere
+letti dal processo attraverso delle opportune funzioni, i cui prototipi sono i
+seguenti:
-Abbiamo già visto come i\l sistema associ ad ogni utente e gruppo due
-identificatori, lo \acr{uid} e il \acr{gid}, che li contraddistinguono e che
-sono questi quelli che vengono controllati dal kernel nella gestione di
-permessi e protezioni; in \secref{sec:file_access_control} si è visto come
-essi vengano utilizzati per il controllo di accesso ai file, vedremo ora come
-come sono usati nella gestione dei privilegi di accesso dei processi.
-
-In \secref{sec:file_perm_overview} abbiamo visto come ogni file appartenga ad
-un utente e ad un gruppo, e che il controllo di accesso viene eseguito sulla
-base del
+\begin{functions}
+\headdecl{unistd.h}
+\headdecl{sys/types.h}
+\funcdecl{uid\_t getuid(void)} restituisce il \textit{real user ID} pid del
+processo corrente.
+\funcdecl{uid\_t geteuid(void)} restituisce l'\textit{effective user ID} del
+processo corrente.
+\funcdecl{gid\_t getgid(void)} restituisce il \textit{real group ID} del
+processo corrente.
+\funcdecl{gid\_t getegid(void)} restituisce l'\textit{effective group ID} del
+processo corrente.
+
+Queste funzioni non riportano condizioni di errore.
+\end{functions}
-Nel caso dei processi però
+Dato che in generale l'uso di privilegi superiori deve essere limitato il più
+possibile, per evitare abusi e creare problemi di sicurezza, occorre anche un
+meccanismo che provveda a rilasciare gli eventuali maggiori privilegi una
+volta che si siano effettuate le operazioni per i quali erano richiesti, per
+poterli eventualmente recuperare all'occorrenza.
+Questo in Linux viene fatto usando altri due gruppi di identificatori, il
+\textit{saved} ed il \textit{filesystem}, analoghi ai precedenti, e riportati
+nello specchietto di tutti gli identificatori di utente e gruppo fornito in
+\ntab. Il primo gruppo è lo stesso usato in SVr4, e previsto dallo standard
+POSIX quando è definita la costante \macro{\_POSIX\_SAVED\_IDS}, il secondo
+gruppo è specifico di Linux e viene usato per migliorare la sicurezza con NFS.
-Ad ogni processo è associato un certo numero di identificatori, il cui elenco
-è riportato \ntab, in genere questi derivano direttamente dall'utente che ha
-lanciato il processo (attraverso i valori di \acr{uid} e \acr{gid}), e vengono
-usati sia per il controllo di accesso ai file che per la gestione dei
-privilegi associati ai processi stessi.
\begin{table}[htb]
\footnotesize
\centering
\begin{tabular}[c]{|c|l|p{8cm}|}
\hline
- \textbf{Sigla} & \textbf{Significato} & \textbf{Utilizzo} \\
+ \textbf{Suffisso} & \textbf{Significato} & \textbf{Utilizzo} \\
\hline
\hline
- \acr{ruid} & \textit{real user id} & indica l'utente reale che ha lanciato
+ \acr{uid} & \textit{real user id} & indica l'utente reale che ha lanciato
il programma\\
- \acr{rgid} & \textit{real group id} & indica il gruppo reale dell'utente
+ \acr{gid} & \textit{real group id} & indica il gruppo reale dell'utente
che ha lanciato il programma \\
\acr{euid} & \textit{effective user id} & indica l'utente effettivo usato
dal programma \\
dal programma \\
& \textit{supplementary group id} & indica i gruppi cui
l'utente appartiene \\
- \acr{suid} & \textit{saved user id} & indica l'utente \\
- \acr{sgid} & \textit{saved group id} & indica il gruppo \\
+ -- & \textit{saved user id} & indica l'utente \\
+ -- & \textit{saved group id} & indica il gruppo \\
\acr{fsuid} & \textit{filesystem user id} & indica l'utente effettivo per
il filesystem \\
\acr{fsgid} & \textit{filesystem group id} & indica il gruppo effettivo
per il filesystem \\
\hline
\end{tabular}
- \caption{Identificatori di utente e gruppo associati a ciascun processo.}
+ \caption{Identificatori di utente e gruppo associati a ciascun processo con
+ indicazione dei suffissi usate dalle varie funzioni di manipolazione.}
\label{tab:proc_uid_gid}
\end{table}
sincronizzazione, non è assolutamente prevedibile, queste situazioni sono
fonti di errori molto subdoli, che possono verificarsi solo in condizioni
particolari e quindi difficilmente riproducibili.
-
-