X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=6beef58d08f7d02e31c9d8896ff3da33bd475a16;hp=93212327f92db341aa265bbc8164802ecd006a5c;hb=aee4a2e76ad7b0ed41eb06c4c70b8db5df9a4451;hpb=da0899b61653d07d75c8df134906261f1afd2485 diff --git a/prochand.tex b/prochand.tex index 9321232..6beef58 100644 --- a/prochand.tex +++ b/prochand.tex @@ -43,7 +43,7 @@ caratteristiche di Unix (che esamineremo in dettaglio pi qualunque processo può a sua volta generarne altri, detti processi figli (\textit{child process}). Ogni processo è identificato presso il sistema da un numero univoco, il cosiddetto \textit{process identifier} o, più brevemente, -\acr{pid}, assengnato in forma progressiva (vedi \secref{sec:proc_pid}) quando +\acr{pid}, assegnato in forma progressiva (vedi \secref{sec:proc_pid}) quando il processo viene creato. Una seconda caratteristica di un sistema Unix è che la generazione di un @@ -223,7 +223,7 @@ programmi. \label{sec:proc_pid} Come accennato nell'introduzione, ogni processo viene identificato dal sistema -da un numero identificativo univoco, il \textit{process id} o \acr{pid}; +da un numero identificativo univoco, il \textit{process ID} o \acr{pid}; quest'ultimo è un tipo di dato standard, il \type{pid\_t} che in genere è un intero con segno (nel caso di Linux e delle \acr{glibc} il tipo usato è \ctyp{int}). @@ -246,7 +246,7 @@ sempre il \acr{pid} uguale a uno. Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui sono stati creati, questo viene chiamato in genere \acr{ppid} (da -\textit{parent process id}). Questi due identificativi possono essere +\textit{parent process ID}). Questi due identificativi possono essere ottenuti usando le due funzioni \funcd{getpid} e \funcd{getppid}, i cui prototipi sono: \begin{functions} @@ -317,7 +317,7 @@ prototipo della funzione Dopo il successo dell'esecuzione di una \func{fork} sia il processo padre che il processo figlio continuano ad essere eseguiti normalmente a partire -dall'istruzione seccessiva alla \func{fork}; il processo figlio è però una +dall'istruzione successiva alla \func{fork}; il processo figlio è però una copia del padre, e riceve una copia dei segmenti di testo, stack e dati (vedi \secref{sec:proc_mem_layout}), ed esegue esattamente lo stesso codice del padre. Si tenga presente però che la memoria è copiata, non condivisa, @@ -456,13 +456,15 @@ attende il numero di secondi specificato, e procede nell'esecuzione del ciclo; alla conclusione del ciclo, prima di uscire, può essere specificato un altro periodo di attesa. -Se eseguiamo il comando senza specificare attese (come si può notare in -\texttt{\small 17--19} i valori predefiniti specificano di non attendere), -otterremo come output sul terminale: +Se eseguiamo il comando\footnote{che è preceduto dall'istruzione \code{export + LD\_LIBRARY\_PATH=./} per permettere l'uso delle librerie dinamiche.} +senza specificare attese (come si può notare in (\texttt{\small 17--19}) i +valori predefiniti specificano di non attendere), otterremo come output sul +terminale: \footnotesize \begin{verbatim} -[piccardi@selidor sources]$ ./forktest 3 +[piccardi@selidor sources]$ export LD_LIBRARY_PATH=./; ./forktest 3 Process 1963: forking 3 child Spawned 1 child, pid 1964 Child 1 successfully executing @@ -628,12 +630,12 @@ comune dopo l'esecuzione di una \func{fork} \item i file aperti e gli eventuali flag di \textit{close-on-exec}\index{close-on-exec} impostati (vedi \secref{sec:proc_exec} e \secref{sec:file_fcntl}). -\item gli identificatori per il controllo di accesso: l'\textsl{userid reale}, - il \textsl{groupid reale}, l'\textsl{userid effettivo}, il \textsl{groupid - effettivo} ed i \textit{groupid supplementari} (vedi +\item gli identificatori per il controllo di accesso: l'\textsl{user-ID + reale}, il \textsl{group-ID reale}, l'\textsl{user-ID effettivo}, il + \textsl{group-ID effettivo} ed i \textit{group-ID supplementari} (vedi \secref{sec:proc_access_id}). \item gli identificatori per il controllo di sessione: il \textit{process - groupid} e il \textit{session id} ed il terminale di controllo (vedi + group-ID} e il \textit{session id} ed il terminale di controllo (vedi \secref{sec:sess_proc_group}). \item la directory di lavoro e la directory radice (vedi \secref{sec:file_work_dir} e \secref{sec:file_chroot}). @@ -1240,9 +1242,9 @@ la lista completa \begin{itemize*} \item il \textit{process id} (\acr{pid}) ed il \textit{parent process id} (\acr{ppid}). -\item l'\textsl{userid reale}, il \textit{groupid reale} ed i \textsl{groupid - supplementari} (vedi \secref{sec:proc_access_id}). -\item il \textit{session id} (\acr{sid}) ed il \textit{process groupid} +\item l'\textsl{user-ID reale}, il \textit{group-ID reale} ed i + \textsl{group-ID supplementari} (vedi \secref{sec:proc_access_id}). +\item il \textit{session id} (\acr{sid}) ed il \textit{process group-ID} (\acr{pgid}), vedi \secref{sec:sess_proc_group}. \item il terminale di controllo (vedi \secref{sec:sess_ctrl_term}). \item il tempo restante ad un allarme (vedi \secref{sec:sig_alarm_abort}). @@ -1279,14 +1281,14 @@ attraverso una \func{exec}, in genere questo l'impostazione del flag di \textit{close-on-exec}\index{close-on-exec} sulle directory che apre, in maniera trasparente all'utente. -Abbiamo detto che l'\textsl{userid reale} ed il \textsl{groupid reale} restano -gli stessi all'esecuzione di \func{exec}; lo stesso vale per l'\textsl{userid - effettivo} ed il \textsl{groupid effettivo} (il significato di questi -identificatori è trattato in \secref{sec:proc_access_id}), tranne quando il -file che si va ad eseguire abbia o il \acr{suid} bit o lo \acr{sgid} bit -impostato, in questo caso l'\textsl{userid effettivo} ed il \textsl{groupid - effettivo} vengono impostati rispettivamente all'utente o al gruppo cui il -file appartiene (per i dettagli vedi \secref{sec:proc_perms}). +Abbiamo detto che l'\textsl{user-ID reale} ed il \textsl{group-ID reale} +restano gli stessi all'esecuzione di \func{exec}; lo stesso vale per +l'\textsl{user-ID effettivo} ed il \textsl{group-ID effettivo} (il significato +di questi identificatori è trattato in \secref{sec:proc_access_id}), tranne +quando il file che si va ad eseguire abbia o il \acr{suid} bit o lo \acr{sgid} +bit impostato, in questo caso l'\textsl{user-ID effettivo} ed il +\textsl{group-ID effettivo} vengono impostati rispettivamente all'utente o al +gruppo cui il file appartiene (per i dettagli vedi \secref{sec:proc_perms}). Se il file da eseguire è in formato \emph{a.out} e necessita di librerie condivise, viene lanciato il \textit{linker} dinamico \cmd{ld.so} prima del @@ -1329,7 +1331,7 @@ Come accennato in \secref{sec:intro_multiuser} il modello base\footnote{in o il \textit{Mandatory Access Control} di SELinux; inoltre basandosi sul lavoro effettuato con SELinux, a partire dal kernel 2.5.x, è iniziato lo sviluppo di una infrastruttura di sicurezza, il \textit{Linux Security - Modules}, ol LSM, in grado di fornire diversi agganci a livello del kernel + Modules}, o LSM, in grado di fornire diversi agganci a livello del kernel per modularizzare tutti i possibili controlli di accesso.} 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 @@ -1341,7 +1343,7 @@ utenti, per i quali invece vengono effettuati i vari controlli di accesso. %notevole flessibilità, Abbiamo già accennato come il sistema associ ad ogni utente e gruppo due -identificatori univoci, lo userid ed il groupid; questi servono al kernel per +identificatori univoci, lo user-ID ed il group-ID; 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 @@ -1373,27 +1375,27 @@ rispettivamente \textit{real} ed \textit{effective} (cio & \textbf{Significato} \\ \hline \hline - \acr{uid} & \textit{real} & \textsl{userid reale} + \acr{uid} & \textit{real} & \textsl{user-ID reale} & indica l'utente che ha lanciato il programma\\ - \acr{gid} & '' &\textsl{groupid reale} + \acr{gid} & '' &\textsl{group-ID reale} & indica il gruppo principale dell'utente che ha lanciato il programma \\ \hline - \acr{euid} & \textit{effective} &\textsl{userid effettivo} + \acr{euid} & \textit{effective} &\textsl{user-ID effettivo} & indica l'utente usato nel controllo di accesso \\ - \acr{egid} & '' & \textsl{groupid effettivo} + \acr{egid} & '' & \textsl{group-ID effettivo} & indica il gruppo usato nel controllo di accesso \\ - -- & -- & \textsl{groupid supplementari} + -- & -- & \textsl{group-ID supplementari} & indicano gli ulteriori gruppi cui l'utente appartiene \\ \hline - -- & \textit{saved} & \textsl{userid salvato} + -- & \textit{saved} & \textsl{user-ID salvato} & è una copia dell'\acr{euid} iniziale\\ - -- & '' & \textsl{groupid salvato} + -- & '' & \textsl{group-ID salvato} & è una copia dell'\acr{egid} iniziale \\ \hline - \acr{fsuid} & \textit{filesystem} &\textsl{userid di filesystem} + \acr{fsuid} & \textit{filesystem} &\textsl{user-ID di filesystem} & indica l'utente effettivo per l'accesso al filesystem \\ - \acr{fsgid} & '' & \textsl{groupid di filesystem} + \acr{fsgid} & '' & \textsl{group-ID di filesystem} & indica il gruppo effettivo per l'accesso al filesystem \\ \hline \end{tabular} @@ -1402,7 +1404,7 @@ rispettivamente \textit{real} ed \textit{effective} (cio \label{tab:proc_uid_gid} \end{table} -Al primo gruppo appartengono l'\textsl{userid reale} ed il \textsl{groupid +Al primo gruppo appartengono l'\textsl{user-ID reale} ed il \textsl{group-ID reale}: questi vengono impostati al login ai valori corrispondenti all'utente con cui si accede al sistema (e relativo gruppo principale). Servono per l'identificazione dell'utente e normalmente non vengono mai @@ -1413,8 +1415,8 @@ completata la procedura di autenticazione, lancia una shell per la quale imposta questi identificatori ai valori corrispondenti all'utente che entra nel sistema. -Al secondo gruppo appartengono lo \textsl{userid effettivo} ed il -\textsl{groupid effettivo} (a cui si aggiungono gli eventuali \textsl{groupid +Al secondo gruppo appartengono lo \textsl{user-ID effettivo} ed il +\textsl{group-ID effettivo} (a cui si aggiungono gli eventuali \textsl{group-ID supplementari} dei gruppi dei quali l'utente fa parte). Questi sono invece gli identificatori usati nella verifiche dei permessi del processo e per il controllo di accesso ai file (argomento affrontato in dettaglio in @@ -1436,16 +1438,16 @@ prototipi sono: \begin{functions} \headdecl{unistd.h} \headdecl{sys/types.h} - \funcdecl{uid\_t getuid(void)} Restituisce l'\textsl{userid reale} del + \funcdecl{uid\_t getuid(void)} Restituisce l'\textsl{user-ID reale} del processo corrente. - \funcdecl{uid\_t geteuid(void)} Restituisce l'\textsl{userid effettivo} del + \funcdecl{uid\_t geteuid(void)} Restituisce l'\textsl{user-ID effettivo} del processo corrente. - \funcdecl{gid\_t getgid(void)} Restituisce il \textsl{groupid reale} del + \funcdecl{gid\_t getgid(void)} Restituisce il \textsl{group-ID reale} del processo corrente. - \funcdecl{gid\_t getegid(void)} Restituisce il \textsl{groupid effettivo} + \funcdecl{gid\_t getegid(void)} Restituisce il \textsl{group-ID effettivo} del processo corrente. \bodydesc{Queste funzioni non riportano condizioni di errore.} @@ -1467,15 +1469,15 @@ costante \macro{\_POSIX\_SAVED\_IDS},\footnote{in caso si abbia a cuore la definita.} il secondo gruppo è specifico di Linux e viene usato per migliorare la sicurezza con NFS. -L'\textsl{userid salvato} ed il \textsl{groupid salvato} sono copie -dell'\textsl{userid effettivo} e del \textsl{groupid effettivo} del processo +L'\textsl{user-ID salvato} ed il \textsl{group-ID salvato} sono copie +dell'\textsl{user-ID effettivo} e del \textsl{group-ID effettivo} del processo padre, e vengono impostati dalla funzione \func{exec} all'avvio del processo, -come copie dell'\textsl{userid effettivo} e del \textsl{groupid effettivo} +come copie dell'\textsl{user-ID effettivo} e del \textsl{group-ID effettivo} dopo che questo sono stati impostati tenendo conto di eventuali \acr{suid} o \acr{sgid}. Essi quindi consentono di tenere traccia di quale fossero utente e gruppo effettivi all'inizio dell'esecuzione di un nuovo programma. -L'\textsl{userid di filesystem} e il \textsl{groupid di filesystem} sono +L'\textsl{user-ID di filesystem} e il \textsl{group-ID di filesystem} sono un'estensione introdotta in Linux per rendere più sicuro l'uso di NFS (torneremo sull'argomento in \secref{sec:proc_setfsuid}). Essi sono una replica dei corrispondenti identificatori del gruppo \textit{effective}, ai @@ -1492,16 +1494,16 @@ ignorarne l'esistenza, in quanto saranno del tutto equivalenti ai precedenti. Le due funzioni che vengono usate per cambiare identità (cioè utente e gruppo di appartenenza) ad un processo sono rispettivamente \funcd{setuid} e \funcd{setgid}; come accennato in \secref{sec:proc_access_id} in Linux esse -seguono la semantica POSIX che prevede l'esistenza dell'\textit{userid - salvato} e del \textit{groupid salvato}; i loro prototipi sono: +seguono la semantica POSIX che prevede l'esistenza dell'\textit{user-ID + salvato} e del \textit{group-ID salvato}; i loro prototipi sono: \begin{functions} \headdecl{unistd.h} \headdecl{sys/types.h} -\funcdecl{int setuid(uid\_t uid)} Imposta l'\textsl{userid} del processo +\funcdecl{int setuid(uid\_t uid)} Imposta l'\textsl{user-ID} del processo corrente. -\funcdecl{int setgid(gid\_t gid)} Imposta il \textsl{groupid} del processo +\funcdecl{int setgid(gid\_t gid)} Imposta il \textsl{group-ID} del processo corrente. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso @@ -1510,21 +1512,21 @@ corrente. Il funzionamento di queste due funzioni è analogo, per cui considereremo solo la prima; la seconda si comporta esattamente allo stesso modo facendo -riferimento al \textsl{groupid} invece che all'\textsl{userid}. Gli -eventuali \textsl{groupid supplementari} non vengono modificati. +riferimento al \textsl{group-ID} invece che all'\textsl{user-ID}. Gli +eventuali \textsl{group-ID supplementari} non vengono modificati. L'effetto della chiamata è diverso a seconda dei privilegi del processo; se -l'\textsl{userid effettivo} è zero (cioè è quello dell'amministratore di +l'\textsl{user-ID effettivo} è zero (cioè è quello dell'amministratore di sistema) allora tutti gli identificatori (\textit{real}, \textit{effective} e \textit{saved}) vengono impostati al valore specificato da \param{uid}, -altrimenti viene impostato solo l'\textsl{userid effettivo}, e soltanto se il -valore specificato corrisponde o all'\textsl{userid reale} o -all'\textsl{userid salvato}. Negli altri casi viene segnalato un errore (con +altrimenti viene impostato solo l'\textsl{user-ID effettivo}, e soltanto se il +valore specificato corrisponde o all'\textsl{user-ID reale} o +all'\textsl{user-ID salvato}. Negli altri casi viene segnalato un errore (con \errcode{EPERM}). Come accennato l'uso principale di queste funzioni è quello di poter consentire ad un programma con i bit \acr{suid} o \acr{sgid} impostati (vedi -\secref{sec:file_suid_sgid}) di riportare l'\textsl{userid effettivo} a quello +\secref{sec:file_suid_sgid}) di riportare l'\textsl{user-ID effettivo} a quello dell'utente che ha lanciato il programma, effettuare il lavoro che non necessita di privilegi aggiuntivi, ed eventualmente tornare indietro. @@ -1543,35 +1545,35 @@ Quando uno di questi programmi (ad esempio \cmd{xterm}) viene lanciato, la situazione degli identificatori è la seguente: \begin{eqnarray*} \label{eq:1} - \textsl{groupid reale} &=& \textrm{\acr{gid} (del chiamante)} \\ - \textsl{groupid effettivo} &=& \textrm{\acr{utmp}} \\ - \textsl{groupid salvato} &=& \textrm{\acr{utmp}} + \textsl{group-ID reale} &=& \textrm{\acr{gid} (del chiamante)} \\ + \textsl{group-ID effettivo} &=& \textrm{\acr{utmp}} \\ + \textsl{group-ID salvato} &=& \textrm{\acr{utmp}} \end{eqnarray*} -in questo modo, dato che il \textsl{groupid effettivo} è quello giusto, il +in questo modo, dato che il \textsl{group-ID effettivo} è quello giusto, il programma può accedere a \file{/var/log/utmp} in scrittura ed aggiornarlo. A questo punto il programma può eseguire una \code{setgid(getgid())} per -impostare il \textsl{groupid effettivo} a quello dell'utente (e dato che il -\textsl{groupid reale} corrisponde la funzione avrà successo), in questo modo +impostare il \textsl{group-ID effettivo} a quello dell'utente (e dato che il +\textsl{group-ID reale} corrisponde la funzione avrà successo), in questo modo non sarà possibile lanciare dal terminale programmi che modificano detto file, in tal caso infatti la situazione degli identificatori sarebbe: \begin{eqnarray*} \label{eq:2} - \textsl{groupid reale} &=& \textrm{\acr{gid} (invariato)} \\ - \textsl{groupid effettivo} &=& \textrm{\acr{gid}} \\ - \textsl{groupid salvato} &=& \textrm{\acr{utmp} (invariato)} + \textsl{group-ID reale} &=& \textrm{\acr{gid} (invariato)} \\ + \textsl{group-ID effettivo} &=& \textrm{\acr{gid}} \\ + \textsl{group-ID salvato} &=& \textrm{\acr{utmp} (invariato)} \end{eqnarray*} e ogni processo lanciato dal terminale avrebbe comunque \acr{gid} come -\textsl{groupid effettivo}. All'uscita dal terminale, per poter di nuovo +\textsl{group-ID effettivo}. All'uscita dal terminale, per poter di nuovo aggiornare lo stato di \file{/var/log/utmp} il programma eseguirà una \code{setgid(utmp)} (dove \var{utmp} è il valore numerico associato al gruppo \acr{utmp}, ottenuto ad esempio con una precedente \func{getegid}), dato che -in questo caso il valore richiesto corrisponde al \textsl{groupid salvato} la +in questo caso il valore richiesto corrisponde al \textsl{group-ID salvato} la funzione avrà successo e riporterà la situazione a: \begin{eqnarray*} \label{eq:3} - \textsl{groupid reale} &=& \textrm{\acr{gid} (invariato)} \\ - \textsl{groupid effettivo} &=& \textrm{\acr{utmp}} \\ - \textsl{groupid salvato} &=& \textrm{\acr{utmp} (invariato)} + \textsl{group-ID reale} &=& \textrm{\acr{gid} (invariato)} \\ + \textsl{group-ID effettivo} &=& \textrm{\acr{utmp}} \\ + \textsl{group-ID salvato} &=& \textrm{\acr{utmp} (invariato)} \end{eqnarray*} consentendo l'accesso a \file{/var/log/utmp}. @@ -1581,7 +1583,7 @@ comporta il cambiamento di tutti gli identificatori associati al processo, rendendo impossibile riguadagnare i privilegi di amministratore. Questo comportamento è corretto per l'uso che ne fa \cmd{login} una volta che crea una nuova shell per l'utente; ma quando si vuole cambiare soltanto -l'\textsl{userid effettivo} del processo per cedere i privilegi occorre +l'\textsl{user-ID effettivo} del processo per cedere i privilegi occorre ricorrere ad altre funzioni (si veda ad esempio \secref{sec:proc_seteuid}). @@ -1596,12 +1598,12 @@ loro \textit{effective} e \textit{real}. I loro prototipi sono: \headdecl{unistd.h} \headdecl{sys/types.h} -\funcdecl{int setreuid(uid\_t ruid, uid\_t euid)} Imposta l'\textsl{userid - reale} e l'\textsl{userid effettivo} del processo corrente ai valori +\funcdecl{int setreuid(uid\_t ruid, uid\_t euid)} Imposta l'\textsl{user-ID + reale} e l'\textsl{user-ID effettivo} del processo corrente ai valori specificati da \param{ruid} e \param{euid}. -\funcdecl{int setregid(gid\_t rgid, gid\_t egid)} Imposta il \textsl{groupid - reale} ed il \textsl{groupid effettivo} del processo corrente ai valori +\funcdecl{int setregid(gid\_t rgid, gid\_t egid)} Imposta il \textsl{group-ID + reale} ed il \textsl{group-ID effettivo} del processo corrente ai valori specificati da \param{rgid} e \param{egid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso @@ -1609,14 +1611,14 @@ specificati da \param{rgid} e \param{egid}. \end{functions} La due funzioni sono analoghe ed il loro comportamento è identico; quanto -detto per la prima prima riguardo l'userid, si applica immediatamente alla -seconda per il groupid. I processi non privilegiati possono impostare solo i -valori del loro userid effettivo o reale; valori diversi comportano il +detto per la prima prima riguardo l'user-ID, si applica immediatamente alla +seconda per il group-ID. I processi non privilegiati possono impostare solo i +valori del loro user-ID effettivo o reale; valori diversi comportano il fallimento della chiamata; l'amministratore invece può specificare un valore qualunque. Specificando un argomento di valore -1 l'identificatore corrispondente verrà lasciato inalterato. -Con queste funzioni si possono scambiare fra loro gli userid reale e +Con queste funzioni si possono scambiare fra loro gli user-ID reale e effettivo, e pertanto è possibile implementare un comportamento simile a quello visto in precedenza per \func{setgid}, cedendo i privilegi con un primo scambio, e recuperandoli, eseguito il lavoro non privilegiato, con un secondo @@ -1624,20 +1626,20 @@ scambio. In questo caso però occorre porre molta attenzione quando si creano nuovi processi nella fase intermedia in cui si sono scambiati gli identificatori, in -questo caso infatti essi avranno un userid reale privilegiato, che dovrà +questo caso infatti essi avranno un user-ID reale privilegiato, che dovrà essere esplicitamente eliminato prima di porre in esecuzione un nuovo programma (occorrerà cioè eseguire un'altra chiamata dopo la \func{fork} e -prima della \func{exec} per uniformare l'userid reale a quello effettivo) in +prima della \func{exec} per uniformare l'user-ID reale a quello effettivo) in caso contrario il nuovo programma potrebbe a sua volta effettuare uno scambio e riottenere privilegi non previsti. Lo stesso problema di propagazione dei privilegi ad eventuali processi figli -si pone per l'userid salvato: questa funzione deriva da un'implementazione che +si pone per l'user-ID salvato: questa funzione deriva da un'implementazione che non ne prevede la presenza, e quindi non è possibile usarla per correggere la situazione come nel caso precedente. Per questo motivo in Linux tutte le volte -che si imposta un qualunque valore diverso da quello dall'userid reale -corrente, l'userid salvato viene automaticamente uniformato al valore -dell'userid effettivo. +che si imposta un qualunque valore diverso da quello dall'user-ID reale +corrente, l'user-ID salvato viene automaticamente uniformato al valore +dell'user-ID effettivo. \subsection{Le funzioni \funcd{seteuid} e \funcd{setegid}} @@ -1650,10 +1652,10 @@ identificatori del gruppo \textit{effective}; i loro prototipi sono: \headdecl{unistd.h} \headdecl{sys/types.h} -\funcdecl{int seteuid(uid\_t uid)} Imposta l'userid effettivo del processo +\funcdecl{int seteuid(uid\_t uid)} Imposta l'user-ID effettivo del processo corrente a \param{uid}. -\funcdecl{int setegid(gid\_t gid)} Imposta il groupid effettivo del processo +\funcdecl{int setegid(gid\_t gid)} Imposta il group-ID effettivo del processo corrente a \param{gid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso @@ -1661,10 +1663,10 @@ corrente a \param{gid}. \end{functions} Come per le precedenti le due funzioni sono identiche, per cui tratteremo solo -la prima. Gli utenti normali possono impostare l'userid effettivo solo al -valore dell'userid reale o dell'userid salvato, l'amministratore può +la prima. Gli utenti normali possono impostare l'user-ID effettivo solo al +valore dell'user-ID reale o dell'user-ID salvato, l'amministratore può specificare qualunque valore. Queste funzioni sono usate per permettere -all'amministratore di impostare solo l'userid effettivo, dato che l'uso +all'amministratore di impostare solo l'user-ID effettivo, dato che l'uso normale di \func{setuid} comporta l'impostazione di tutti gli identificatori. @@ -1679,12 +1681,12 @@ e permettono un completo controllo su tutti gli identificatori (\textit{real}, \headdecl{sys/types.h} \funcdecl{int setresuid(uid\_t ruid, uid\_t euid, uid\_t suid)} Imposta -l'userid reale, l'userid effettivo e l'userid salvato del processo corrente ai -valori specificati rispettivamente da \param{ruid}, \param{euid} e +l'user-ID reale, l'user-ID effettivo e l'user-ID salvato del processo corrente +ai valori specificati rispettivamente da \param{ruid}, \param{euid} e \param{suid}. \funcdecl{int setresgid(gid\_t rgid, gid\_t egid, gid\_t sgid)} Imposta il -groupid reale, il groupid effettivo ed il groupid salvato del processo +group-ID reale, il group-ID effettivo ed il group-ID salvato del processo corrente ai valori specificati rispettivamente da \param{rgid}, \param{egid} e \param{sgid}. @@ -1692,10 +1694,10 @@ corrente ai valori specificati rispettivamente da \param{rgid}, \param{egid} e di fallimento: l'unico errore è \errval{EPERM}.} \end{functions} -Le due funzioni sono identiche, quanto detto per la prima riguardo gli userid -si applica alla seconda per i groupid. I processi non privilegiati possono -cambiare uno qualunque degli userid solo ad un valore corripondente o -all'userid reale, o a quello effettivo o a quello salvato, l'amministratore +Le due funzioni sono identiche, quanto detto per la prima riguardo gli user-ID +si applica alla seconda per i group-ID. I processi non privilegiati possono +cambiare uno qualunque degli user-ID solo ad un valore corrispondente o +all'user-ID reale, o a quello effettivo o a quello salvato, l'amministratore può specificare i valori che vuole; un valore di -1 per un qualunque parametro lascia inalterato l'identificatore corrispondente. @@ -1707,10 +1709,10 @@ prototipi sono: \headdecl{sys/types.h} \funcdecl{int getresuid(uid\_t *ruid, uid\_t *euid, uid\_t *suid)} Legge -l'userid reale, l'userid effettivo e l'userid salvato del processo corrente. +l'user-ID reale, l'user-ID effettivo e l'user-ID salvato del processo corrente. \funcdecl{int getresgid(gid\_t *rgid, gid\_t *egid, gid\_t *sgid)} Legge il -groupid reale, il groupid effettivo e il groupid salvato del processo +group-ID reale, il group-ID effettivo e il group-ID salvato del processo corrente. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di @@ -1740,10 +1742,10 @@ identificatori dei gruppi \textit{effective} e \textit{filesystem}, ed ovviare ad un problema di sicurezza che si presenta quando si deve implementare un server NFS. Il server NFS infatti deve poter cambiare l'identificatore con cui accede ai file per assumere l'identità del singolo -utente remoto, ma se questo viene fatto cambiando l'userid effettivo o -l'userid reale il server si espone alla ricezione di eventuali segnali ostili +utente remoto, ma se questo viene fatto cambiando l'user-ID effettivo o +l'user-ID reale il server si espone alla ricezione di eventuali segnali ostili da parte dell'utente di cui ha temporaneamente assunto l'identità. Cambiando -solo l'userid di filesystem si ottengono i privilegi necessari per accedere ai +solo l'user-ID di filesystem si ottengono i privilegi necessari per accedere ai file, mantenendo quelli originari per quanto riguarda tutti gli altri controlli di accesso, così che l'utente non possa inviare segnali al server NFS. @@ -1754,10 +1756,10 @@ usate se si intendono scrivere programmi portabili; i loro prototipi sono: \begin{functions} \headdecl{sys/fsuid.h} -\funcdecl{int setfsuid(uid\_t fsuid)} Imposta l'userid di filesystem del +\funcdecl{int setfsuid(uid\_t fsuid)} Imposta l'user-ID di filesystem del processo corrente a \param{fsuid}. -\funcdecl{int setfsgid(gid\_t fsgid)} Imposta il groupid di filesystem del +\funcdecl{int setfsgid(gid\_t fsgid)} Imposta il group-ID di filesystem del processo corrente a \param{fsgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso @@ -1800,7 +1802,7 @@ prototipo La funzione legge gli identificatori dei gruppi supplementari del processo sul vettore \param{list} di dimensione \param{size}. Non è specificato se la -funzione inserisca o meno nella lista il groupid effettivo del processo. Se si +funzione inserisca o meno nella lista il group-ID effettivo del processo. Se si specifica un valore di \param{size} uguale a 0 \param{list} non viene modificato, ma si ottiene il numero di gruppi supplementari. @@ -2151,10 +2153,10 @@ La funzione imposta la priorit tutti i processi indicati dagli argomenti \param{which} e \param{who}. La gestione dei permessi dipende dalle varie implementazioni; in Linux, secondo le specifiche dello standard SUSv3, e come avviene per tutti i sistemi che -derivano da SYSV, è richiesto che l'userid reale o effettivo del processo -chiamante corrispondano al real user id (e solo quello) del processo di cui si +derivano da SysV, è richiesto che l'user-ID reale o effettivo del processo +chiamante corrispondano al real user-ID (e solo quello) del processo di cui si vuole cambiare la priorità; per i sistemi derivati da BSD invece (SunOS, -Ultrix, *BSD) la corrispondenza può essere anche con l'userid effettivo. +Ultrix, *BSD) la corrispondenza può essere anche con l'user-ID effettivo. @@ -2464,13 +2466,13 @@ condiviso, onde evitare problemi con le ottimizzazioni del codice. \textit{deadlock}\index{deadlock}} \label{sec:proc_race_cond} -Si definiscono \textit{race condition} tutte quelle situazioni in cui processi -diversi operano su una risorsa comune, ed in cui il risultato viene a -dipendere dall'ordine in cui essi effettuano le loro operazioni. Il caso -tipico è quello di un'operazione che viene eseguita da un processo in più -passi, e può essere compromessa dall'intervento di un altro processo che -accede alla stessa risorsa quando ancora non tutti i passi sono stati -completati. +Si definiscono \textit{race condition}\index{race condition} tutte quelle +situazioni in cui processi diversi operano su una risorsa comune, ed in cui il +risultato viene a dipendere dall'ordine in cui essi effettuano le loro +operazioni. Il caso tipico è quello di un'operazione che viene eseguita da un +processo in più passi, e può essere compromessa dall'intervento di un altro +processo che accede alla stessa risorsa quando ancora non tutti i passi sono +stati completati. Dato che in un sistema multitasking ogni processo può essere interrotto in qualunque momento per farne subentrare un'altro in esecuzione, niente può @@ -2483,32 +2485,32 @@ funzioner Per questo occorre essere ben consapevoli di queste problematiche, e del fatto che l'unico modo per evitarle è quello di riconoscerle come tali e prendere gli adeguati provvedimenti per far sì che non si verifichino. Casi tipici di -\textit{race condition} si hanno quando diversi processi accedono allo stesso -file, o nell'accesso a meccanismi di intercomunicazione come la memoria -condivisa. In questi casi, se non si dispone della possibilità di eseguire -atomicamente le operazioni necessarie, occorre che quelle parti di codice in -cui si compiono le operazioni sulle risorse condivise (le cosiddette +\textit{race condition}\index{race condition} si hanno quando diversi processi +accedono allo stesso file, o nell'accesso a meccanismi di intercomunicazione +come la memoria condivisa. In questi casi, se non si dispone della possibilità +di eseguire atomicamente le operazioni necessarie, occorre che quelle parti di +codice in cui si compiono le operazioni sulle risorse condivise (le cosiddette \textsl{sezioni critiche}\index{sezioni critiche}) del programma, siano opportunamente protette da meccanismi di sincronizzazione (torneremo su queste problematiche di questo tipo in \capref{cha:IPC}). -Un caso particolare di \textit{race condition} sono poi i cosiddetti -\textit{deadlock}\index{deadlock}, particolarmente gravi in quanto comportano -spesso il blocco completo di un servizio, e non il fallimento di una singola -operazione. Per definizione un \textit{deadlock}\index{deadlock} è una -situazione in cui due o più processi non sono più in grado di proseguire -perché ciascuno aspetta il risultato di una operazione che dovrebbe essere -eseguita dall'altro. +Un caso particolare di \textit{race condition}\index{race condition} sono poi +i cosiddetti \textit{deadlock}\index{deadlock}, particolarmente gravi in +quanto comportano spesso il blocco completo di un servizio, e non il +fallimento di una singola operazione. Per definizione un +\textit{deadlock}\index{deadlock} è una situazione in cui due o più processi +non sono più in grado di proseguire perché ciascuno aspetta il risultato di +una operazione che dovrebbe essere eseguita dall'altro. L'esempio tipico di una situazione che può condurre ad un -\textit{deadlock}\index{deadlock} è quello in cui un flag di ``occupazione'' -viene rilasciato da un evento asincrono (come un segnale o un altro processo) -fra il momento in cui lo si è controllato (trovandolo occupato) e la -successiva operazione di attesa per lo sblocco. In questo caso, dato che -l'evento di sblocco del flag è avvenuto senza che ce ne accorgessimo proprio -fra il controllo e la messa in attesa, quest'ultima diventerà perpetua (da cui -il nome di \textit{deadlock}\index{deadlock}). +\textit{deadlock}\index{deadlock} è quello in cui un flag di +``\textsl{occupazione}'' viene rilasciato da un evento asincrono (come un +segnale o un altro processo) fra il momento in cui lo si è controllato +(trovandolo occupato) e la successiva operazione di attesa per lo sblocco. In +questo caso, dato che l'evento di sblocco del flag è avvenuto senza che ce ne +accorgessimo proprio fra il controllo e la messa in attesa, quest'ultima +diventerà perpetua (da cui il nome di \textit{deadlock}\index{deadlock}). In tutti questi casi è di fondamentale importanza il concetto di atomicità visto in \secref{sec:proc_atom_oper}; questi problemi infatti possono essere