%-----------------------------------------------------------------------
\chapter{Gestire gli account degli utenti}
\label{chap:useradmin}
%-----------------------------------------------------------------------

	\begin{chapterquote}
	The similarities of sysadmins and drug dealers: \\
	both measure stuff in K's, and both have users. \\
	(Old, tired computer joke.) \\
	\end{chapterquote}

	\noindent
	Questo capitolo spiega come creare nuovi account utente, come modificare le proprietà di questi account, e come rimuoverli. Diversi sistemi Linux hanno strumenti diversi per farlo.

		
\section{Che cos'è un account?}

	Quando un computer viene usato da molte persone, è di solito necessario differenziare tra gli utenti, ad esempio in modo che i loro file privati possano essere mantenuti tali. \`E importante anche se il computer può essere usato da una sola persona alla volta, come con la maggior parte dei microcomputer.\footnote{Potrebbe essere abbastanza imbarazzante se mia sorella potesse leggere le mie lettere d'amore.} Quindi, a ciascun utente viene dato un nome univoco, e quello è il nome che viene usato per fare login.

	Un utente è più che solo un nome, comunque. Un \defin{account} è tutti i file, le risorse e le informazioni che appartengono ad un utente. Il termine ricorda le banche, e in un sistema commerciale un account di solito corrisponde a del denaro, che svanisce a velocità diverse a seconda di quanto l'utente usa il sistema. Ad esempio lo spazio disco può avere un prezzo a megabyte o a giorno, ed il tempo CPU può avere un prezzo per secondo.

	
\section{Come creare un utente}

	Il kernel di Linux tratta gli utenti come semplici numeri. Ciascun utente viene identificato da un numero intero univoco, l'\defin{uid}, o \defin{identificativo utente}, perché per un computer è più veloce e facile usare i numeri piuttosto che i nomi testuali. Un database separato fuori del kernel assegna un nome testuale, lo \defin{username}, a ciascun identificativo utente. Lo stesso database contiene anche altre informazioni.

	Per creare un utente bisogna aggiungere le informazioni su quell'utente al database e creargli una home directory. Può anche essere necessario educarlo, ed impostargli un ambiente iniziale adatto.

	La maggior parte delle distribuzioni di Linux hanno un programma per creare gli account; ce ne sono diversi disponibili. Due alternative da linea di comando sono \cmd{adduser} e \cmd{useradd}, ma ci possono essere anche degli strumenti GUI. Qualsiasi sia il programma, il risultato è che non c'è molto lavoro manuale da fare. Anche se i dettagli sono molti ed intricati, questi programmi fanno sembrare tutto triviale. Comunque, la sezione~\ref{subsec:manual-adduser} descrive come farlo a mano.

	
\subsection{\fn{/etc/passwd} ed altri file informativi}

	Il database degli utenti principale in un sistema Unix è il file di testo
 \fn{/etc/passwd} (chiamato anche il \defin{file delle password}), che elenca tutti i nomi utente validi e le informazioni ad essi associate. Il file ha una linea per nome utente, e viene diviso in sette campi delimitati da due punti:
		%
		\begin{enumerate}
		\item Username.
		\item Password, in forma criptata.
		\item ID utente numerico.
		\item ID del gruppo numerico.
		\item Nome completo o descrizione dell'account.
		\item Home directory.
		\item Shell di login (programma da avviare al login).
		\end{enumerate}
		%
	Il formato è spiegato in maggior dettaglio in \man{passwd}(5).

	
	Qualsiasi utente sul sistema può leggere il file delle password, in modo da poter, ad esempio, sapere il nome di un altro utente. Ciò significa che anche la password (il secondo campo) è disponibile per tutti. Il file delle password contiene le password in forma criptata, quindi in teoria non ci sono problemi; comunque, la criptazione può essere decodificata, specialmente se le password sono deboli (brevi o che si trovano nel dizionario); non è quindi una buona idea tenere le password nel file delle password.

	Molti sistemi Linux usano le \defin{shadow password}: un modo alternativo per tenere le password, che vengono immagazzinate criptate in un file separato, \fn{/etc/shadow}, leggibile solo da \texttt{root}. Il file \fn{/etc/passwd} contiene solo un indicatore speciale nel secondo campo. Qualsiasi programma che debba verificare un utente è setuid, e quindi può accedere al file delle shadow password. I programmi normali, che usano solo gli altri campi nel file delle password non possono arrivare a leggere le password.\footnote{Sì, vuol dire che il file delle password ha tutte le informazioni su un utente \emph{tranne} le password. Le meraviglie della tecnologia.}
	
\subsection{Gli identificativi numerici per gli utenti e i gruppi}

	Sulla maggior parte dei sistemi non importa quali sono gli ID numerici degli utenti e dei gruppi, ma se usate l'NFS (Network File System) dovete avere gli stessi UID e GID su tutti i sistemi. Questo perché anche NFS identifica gli utenti con gli UID numerici. Se non usate l'NFS potete farli scegliere automaticamente al programma che crea gli account.

	Se usate l'NFS dovrete inventare un meccanismo per sincronizzare le informazioni sugli account. Un'alternativa è usare il sistema NIS (vedere la \cite{network-admin-guide}).

	
	\meta \`E il posto sbagliato?

	Comunque, dovreste cercare di non riutilizzare le uid numeriche (e gli username testuali), perché il nuovo padrone dell'uid (o dello username) potrebbe avere accesso ai file del vecchio utente (o alle mail, o che altro).


%\subsection{Managing groups}
%
%	\meta Debian creates a new group for each user; give reason for this;
%	give reasons against.
	
\subsection{Ambiente iniziale: \fn{/etc/skel}}

	Quando viene creata la home directory di un nuovo utente, viene inizializzata con i file dalla directory \fn{/etc/skel}. L'amministratore di sistema può creare dei file in \fn{/etc/skel} che daranno un ambiente di default per gli utenti. Ad esempio può creare un file \fn{/etc/skel/.profile} che imposta la variabile d'ambiente EDITOR ad un editor facile da usare.

	Comunque di solito è meglio provare a tenere \fn{/etc/skel} il più piccolo possibile, perché sarebbe poi quasi impossibile aggiornare i file degli utenti esistenti. Ad esempio, se cambia il nome dell'editor, tutti gli utenti esistenti dovrebbero modificare il proprio \fn{.profile}. L'amministratore di sistema può provare a farlo automaticamente, con uno script, ma è quasi certo che danneggerebbe il file di qualcuno.

	Quando possibile è meglio mettere le configurazioni globali nei file globali, come \fn{/etc/profile}. In questo modo è possibile aggiornarlo senza rovinare i setup personali degli utenti.

	
\subsection{Creazione manuale di un utente}\label{subsec:manual-adduser}

	Per creare a mano un account, seguite questi passaggi:
		%
	\begin{enumerate}
	\item Modificate \fn{/etc/passwd} con \cmd{vipw}(8) e aggiungete una nuova linea per il nuovo account. Attenzione con la sintassi. \emph{Non modificatelo direttamente con un editor!} \cmd{vipw} blocca il file, in modo che altri comandi non provino a modificarlo nello stesso tempo. Il campo della password dovrebbe essere impostato a `\texttt{*}', in modo che sia impossibile collegarsi. 
	\item Nello stesso modo, modificate \fn{/etc/group} con \cmd{vigr}, se dovete anche creare un nuovo gruppo.
	\item Create la home directory dell'utente con \cmd{mkdir}.
	\item Copiate i file da \fn{/etc/skel} nella nuova home directory.
	\item Aggiustate l'owner e i permessi con \cmd{chown} e \cmd{chmod}; l'opzione \texttt{-R} è utilissima. I permessi corretti variano un po' da un sito all'altro, ma di solito questi comandi vanno bene:
			%
\begin{tscreen}
cd \textsl{/home/nuovoutente} \\
chown -R \textsl{utente.gruppo} . \\
chmod -R go=u,go-w . \\
chmod go= .
\end{tscreen}
			%
	\item Impostate la password con \cmd{passwd}(1).
	\end{enumerate}
	
	Dopo aver impostato la password nell'ultimo passaggio, l'account sarà funzionante. Non dovreste impostarla finché non avete fatto tutto il resto, altrimenti l'utente si potrebbe collegare inavvertitamente mentre state ancora copiando i file.

	Qualche volta è necessario creare degli account fittizi\footnote{Utenti surreali?} che non vengono usati da persone. Ad esempio, per creare un server FTP anonimo (in modo che chiunque possa scaricarne dei file senza dover avere un account), va creato un account \texttt{ftp}. In tali casi di solito non c'è bisogno di impostare la password (l'ultimo passo qui sopra); invece, è meglio non farlo, in modo che nessuno possa usare l'account, a meno di non diventare prima \texttt{root}, dato che \texttt{root} può diventare qualsiasi utente.

	
%\section{Educating a new user}
%
%	\meta
%	make sure they know how to get help
%	large sites might want to write a small booklet (or even just
%		a couple of pages) with important stuff: how to log in
%		and out, how to change password, which systems there are,
%		how to use mail, list of people that answer questions

\section{Modifica delle proprietà degli utenti}

	Ci sono alcuni comandi per modificare le varie proprietà di un account (cioè il campo rilevante in \fn{/etc/passwd}):
		%
	\begin{quote}
	\begin{dispitems}
	\item[\cmd{chfn}] Cambia il campo del nome completo.
	\item[\cmd{chsh}] Cambia la shell di login.
	\item[\cmd{passwd}] Cambia la password.
	\end{dispitems}
	\end{quote}
		%
	Il superutente può usare questi comandi per cambiare le proprietà di qualsiasi account; gli utenti normali possono modificare solo quelle del proprio. Talvolta può essere necessario disabilitare questi comandi (con \cmd{chmod}) per gli utenti normali, ad esempio in un ambiente con molti utenti principianti.

	Altri compiti vanno fatti a mano; ad esempio, per modificare il nome dell'utente va modificato \fn{/etc/passwd} direttamente (ricordatevi, con \cmd{vipw}); ugualmente, per aggiungere o togliere l'utente da altri gruppi va modificato \fn{/etc/group} (con \cmd{vigr}). Tali compiti sono però rari, e vanno fatti con cautela: ad esempio, se modificate il nome dell'utente, la posta non arriverà più all'utente, a meno che non creiate un alias di posta.\footnote{Il nome dell'utente può cambiare per un matrimonio, ad esempio, e l'utente potrebbe volere che il suo username rifletta il suo nome nuovo.}

	
\section{Rimozione di un utente}

	Per rimuovere un utente prima vanno rimossi tutti i suoi file, i file e gli alias della posta, i job di stampa, di \cmd{cron} e \cmd{at}, e tutti i riferimenti all'utente. Poi si rimuovono le linee rilevanti dai file \fn{/etc/passwd} e \fn{/etc/group} (ricordatevi di rimuovere l'utente da tutti i gruppi di cui faceva parte). Può essere una buona idea disabilitare prima l'account (vedi sotto), prima di cominciare a rimuovere tutto, per evitare che l'utente usi l'account mentre lo state rimuovendo.

	Ricordate che gli utenti possono avere dei file al di fuori della home directory. Li potete trovare con il comando \cmd{find}:

		%
\begin{tscreen}
find / -user \textsl{username}
\end{tscreen}
		%
	Notate comunque che il comando qui sopra prenderà \emph{molto} tempo, se avete un disco grande. Se montate dei dischi via rete (vedere la sezione~\ref{sec:NFS}) dovrete stare attenti a non bloccare la rete o il server.

	Alcune distribuzioni di Linux hanno dei comandi speciali per farlo: cercate \cmd{deluser} o \cmd{userdel}; ma è facile anche farlo a mano, e i comandi possono non fare tutto.
	
	
\section{Disabilitazione temporanea di un utente}

	Talvolta è necessario disabilitare temporaneamente un account, senza rimuoverlo. Ad esempio, l'utente può non aver pagato l'abbonamento, oppure l'amministratore di sistema può sospettare che un cracker abbia la password di quell'account. 

	Il modo migliore di disabilitare un account è cambiare la shell con un programma speciale che stampa solamente un messaggio. Così, chiunque provi a collegarsi nell'account non ci riuscirà e saprà il perché. Il messaggio può dire all'utente di contattare l'amministratore in modo da risolvere qualsiasi problema.

	Sarebbe anche possibile cambiare lo username o la password in qualcos'altro, ma allora l'utente non saprebbe cosa sta succedendo. Utenti confusi significano maggior lavoro.\footnote{Ma possono essere \emph{così} divertenti, se siete un BOFH.}

	Un modo semplice di creare il programma speciale è scrivere degli `script tail':
		%
\begin{quote}\begin{verbatim}
#!/usr/bin/tail +2
Questo account è stato chiuso per un problema di sicurezza.
Chiamate il 555-1234 ed aspettate che arrivino gli uomini in nero.
\end{verbatim}\end{quote}
		%
	I primi due caratteri (`\verb|#!|') dicono al kernel che il resto della linea è il comando che deve essere usato per interpretare il file. Il comando \cmd{tail} in questo caso manda in output tutto tranne la prima linea nell'output standard.

	Se \texttt{billg} è sospettato di un attacco alla sicurezza, l'amministratore di sistema farebbe una cosa del genere:
		%
\begin{tscreen}
\verb|#| \textsl{chsh -s /usr/local/lib/no-login/security billg} \\
\verb|#| \textsl{su - tester} \\
\verb|Questo account è stato chiuso per un problema di sicurezza.| \\
\verb|Chiamate il 555-1234 ed aspettate che arrivino gli uomini in nero.| \\
\verb|#|
\end{tscreen}
		%
	Lo scopo del comando \cmd{su} è di provare che il cambiamento ha funzionato, naturalmente.

	Questi script devono essere tenuti in una directory separata, in modo che i loro nomi non interferiscano con i normali comandi utente.


%\section{Accounting}
%
%	\meta
%	sac et al
