%-----------------------------------------------------------------------
%%\chapter{Managing user accounts}
\chapter{Gerenciando contas de usuários}
\label{chap:useradmin}
%-----------------------------------------------------------------------

	\begin{chapterquote}
	As semelhanças entre os administradores de sistemas \\
	e os traficantes de drogas: \\
	ambos medem as coisas em K's e ambos têm usuários. \\
	(velha e surrada piada de informática). 
	\end{chapterquote}

	\noindent
	Este capítulo explica como criar novas contas de usuários, como modificar
	suas propriedades e como removê-las. Diferentes sistemas \linux\ tem
	diferentes ferramentas para execução destas tarefas.
		
%%\section{What's an account?}
\section{O que é uma conta?}

	Quando o computador é usado por muitas pessoas é necessário
	diferenciar os usuários, para, por exemplo, permitir que os arquivos
	pessoais permaneçam pessoais! Isto é importante mesmo
	que o computador seja usado somente por um usuário por vez, o que ocorre
	em muitos microcomputadores.\footnote{Pode ser embaraçoso caso minha irmã
	possa ler minhas cartas de amor.} Além disso, cada usuário tem um nome único
	que é utilizado na sua identificação ao acessar o sistema.
	

	Há mais coisa relacionadas a um usuários do que somente seu nome. Uma
	\defin{conta} compreende todos os arquivos, recursos e informações 
	pertencentes a um usuário. O termo aproxima-se da sua utilização na área 
	bancária, e como
	em uma conta em um banco que tem alguma disponibilidade associada, uma
	conta no \linux\ tem uma série de recursos associados, que podem ser gastos
	em diferentes velocidades à medida que se utilize o sistema. Por exemplo,
	o espaço em disco pode ter uma limitação de uso em megabytes ao dia, e o
	processamento pode ter um preço por segundo.
	
%%\section{Creating a user}
\section{Criando um usuário}

	O kernel do sistema trata os usuários como meros números.  Cada usuário é
	identificado como um número inteiro único, denominado identificação do
	usuário (\defin{user id} ou \defin{uid}), porque números são mais simples e 
	rápidos de serem processados do que os nomes dos usuários. Um banco de 
	dados separado do kernel relaciona cada nome, a uma identificação do 
	usuário. O arquivo contém ainda outras informações.
	
	Para criar um usuário, é necessário algumas informações
	adicionais sobre o usuário para inclusão na base de dados e criar um
	diretório pessoal para ele. Pode ser necessário ainda auxiliar o usuário e
	configurar algum ambiente inicial para ele.
	
	Muitas distribuições do \linux\ vêm com algum programa para criação de 
	usuários. Há diversos programas disponíveis. Dois programas muito 
	utilizados são o \cmd{adduser} e \cmd{useradd}\footnote{no Conectiva 
	\linux\ os dois apontam para o mesmo programa}; existem ainda utilitários 
	gráficos como o \cmd{control-panel}. Independente do programa o resultado 
	é muito similar para todos eles. Todavia este manual descreve como fazê-
	lo manualmente. Mesmo que os detalhes possam parecer um pouco intrincados, 
	esses programas fazem tudo parecer mais trivial.
	
%%\subsection{\fn{/etc/passwd} and other informative files}
\subsection{\fn{/etc/passwd} e outros arquivos de informação}

	A base de dados de usuários em um sistema \unix\ é um arquivo texto, 
	conhecido por \fn{/etc/passwd}, o qual contém todos os nomes
	válidos de usuários e as informações associadas a estes. O arquivo contém
	um nome de usuário por linha e está dividido em sete campos delimitados
	por dois pontos:
		%
		\begin{enumerate}
		\item Nome do usuário.
		\item Senha em formato encriptado.
		\item Identificação numérica do usuário (uid).
		\item Identificação numérica do grupo (gid).
		\item Nome completo ou outra descrição da conta.
		\item Diretório pessoal.
		\item shell de login.
		\end{enumerate}
		%

	O formato é explicado em mais detalhes em \man{passwd}(5).
	
	Qualquer usuário de sistema pode ler o arquivo \fn{passwd}, podendo conhecer
	por exemplo, o nome de outros usuários do sistema. Isso significa que a
	senha (segundo campo) também está disponível para qualquer usuário. As
	senhas são encriptadas, que em teoria estarão seguras. Ainda
	assim a criptografia pode ser quebrada, especialmente se a senha for muito
	simples (por exemplo uma senha muito curta ou pertencente ao dicionário).
	Logo não é aconselhável manter as senhas no arquivo \fn{passwd}.

	Muitos sistemas \linux\ tem a opção do arquivo \fn{shadow} para senhas. 
	Este pode ser um meio alternativo de armazenamento: as senhas criptografadas
	são armazenadas
	em um arquivo em separado, o \fn{/etc/shadow}, o qual pode ser lido somente
	pelo \texttt{root}. O arquivo \fn{/etc/passwd} contém somente uma marca
	especial no campo de senha. Qualquer programa que necessite verificar a
	senha do usuário deve ser executado pelo \texttt{root} ou ter seu 
	\texttt{setuid} habilitado, podendo então acessar o \fn{shadow}. 
	Programas normais que necessitem somente usar os demais campos do arquivo 
	\fn{passwd}, não precisam ter acesso às senhas dos usuários.\footnote{
	Sim, isto quer dizer que o \fn{passwd} tem todas as informações referentes
	aos usuários, \emph{exceto} sua senha. Este é a maravilha do 
	desenvolvimento.}
	
%%\subsection{Picking numeric user and group ids}
\subsection{ Escolhendo identificações numéricas para usuário e grupo}

	Em muitos sistemas não faz diferença qual a identificação do usuário ou do
	grupo utilizadas, mas caso se esteja utilizando um sistema de arquivos em
	rede (NFS), será necessário ter o mesmo uid e gid em todos os sistemas.
	Isso deve-se ao fato do NFS identificar os usuários com uids numéricos.
	Caso não se esteja utilizando NFS, pode-se permitir que o programa de
	criação de contas escolha um número de forma automática.
	
	Caso se esteja utilizando NFS, terá que ser criado um mecanismo de
	sincronismo de informações de contas. Uma alternativa é utilizar o NIS
	(veja~\cite{network-admin-guide}).
	
%%  ???	\meta this is wrong place?
	Deve-se evitar a reutilização de uids numéricos e nomes de usuários,porque
	os novos usuários poderiam ter acesso aos arquivos dos antigos donos da
	conta.

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

	Quando um diretório pessoal é criado, ele é inicializado com arquivos
	oriundos do diretório \fn{/etc/skel}. O administrador do sistema pode criar
	arquivos no \fn{/etc/skel} que podem prover um bom ambiente para os 
	usuários. Por exemplo, pode-se criar um arquivo \fn{/etc/skel/.profile} 
	que inicializa a variável de ambiente EDITOR com algum
	editor que seja amigável para novos usuários.
	
	É importante tentar mante o \fn{/etc/skel} o menor possível, uma vez que 
	poderá ser extremamente trabalhoso ter que atualizar todos os arquivos dos
	usuários já existentes. Por exemplo, se o nome do editor mudar, todos os
	usuários com a variável inicializada em seus arquivos \fn{.profile} terão 
	que alterá-las. Pode-se tentar fazer isso automaticamente, mas a
	possibilidade de gerar algum problema para alguns usuários é muito grande.

	
	Sempre que possível, é melhor colocar alguma configuração genérica em
	arquivos de configuração global, como por exemplo o \fn{/etc/profile}. 
	Assim é possível realizar atualizações sem alterar diretamente as 
	configurações dos usuários.
	
%%\subsection{Creating a user by hand}\label{subsec:manual-adduser}
\subsection{Criando um usuário manualmente}\label{subsec:manual-adduser}

	Para criar um usuário manualmente, devem ser seguidos os seguintes passos:
		%
	\begin{enumerate}
	\item 
		Edite o arquivo \fn{/etc/passwd} com o utilitário \man{vipw}(8) e 
		adicione uma nova linha para a nova conta. Atente para a sintaxe do 
		arquivo. \emph{Não edite diretamente com outro editor}, pois o 
		\cmd{vipw} trava o arquivo, então outros programas não tentarão 
		atualizar o arquivo ao mesmo tempo. Deve-se informar `\texttt{*}' no
		campo senha, assim o acesso não será possível.

	\item 
		De formar similar, edite o arquivo \fn{/etc/group} com o utilitário 
		\cmd{vigr}, caso seja necessário criar também um novo grupo.   

	\item 
		Crie um diretório pessoal com o comando \cmd{mkdir}.

	\item 
		Copie os arquivos do diretório \fn{/etc/skel} para o novo diretório 
		pessoal criado.

	\item 
		Ajustar as propriedades e permissões através dos comandos \cmd{chown} e 
		\cmd{chmod}. A opção \texttt{-R} pode ser muito útil. As permissões 
		corretas podem variar de um local para outro, mas normalmente os 
		seguintes comandos devem atender:

			%
\begin{tscreen}
cd \textsl{/home/novousuário} \\
chown -R \textsl{novousuário.grupo} . \\
chmod -R go=u,go-w . \\
chmod go= .
\end{tscreen}
			%
	\item 
		Ajuste a senha através do comando \cmd{passwd}.
	\end{enumerate}
	
	Após a configuração da senha, a conta estará apta a funcionar. Não se deve
	altera-la até que todo os demais passos tenham sido executados. De
	outra maneira o usuário poderá ter acesso ao sistema enquanto você 
	estiver ainda copiando os arquivos.
	

	Algumas vezes pode ser necessário criar contas anônimas que não são
	utilizadas por qualquer usuário. Por exemplo para configurar um servidor
	FTP anônimo (permitindo que qualquer pessoa possa fazer a cópia de
	arquivos a partir do servidor, sem a obrigatoriedade de ter-se uma conta
	primeiro) deve-se criar uma conta chamada \texttt{ftp}. Neste casos
	não é necessário configurar uma senha (último passo acima). Ao contrário,
	é melhor não fazê-lo, pois ninguém poderá usar a conta, a menos que antes
	se torne o \texttt{superusuário}, uma vez que o \texttt{root} pode 
	transformar-sem em qualquer usuário.
	
%\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{Changing user properties}
\section{Alterando as características de um usuário}

	Há alguns comandos para alterar as várias características de uma conta (ou
	seja, os campos relevantes do arquivo \fn{/etc/passwd}):
		%
	\begin{quote}
	\begin{dispitems}
	\item[\cmd{chfn}] Altera o campo do nome do usuário.
	\item[\cmd{chsh}] Muda o shell de login.
	\item[\cmd{passwd}] Muda a senha.
	\end{dispitems}
	\end{quote}
		%

	O superusuário pode usar estes comandos para alterar as propriedades de
	qualquer conta. Usuário normais podem somente alterar as propriedades de
	sua própria conta. Algumas vezes é necessário desabilitar estes comandos
	(com \cmd{chmod}) para usuários normais, em ambientes com muitos usuários 
	iniciantes.
	
	Outras tarefas deverão ser executadas manualmente. Por exemplo
	para alterar o nome de login do usuário é necessário editar o arquivo 
	\fn{/etc/passwd} diretamente (com \cmd{vipw}, lembre-se). Da mesma forma, 
	para adicionar ou remover o usuários de grupos, é necessário editar o 
	arquivo \fn{/etc/group} (com \cmd{vigr}). Tal procedimento tende a ser raro,
	devendo porém ser realizado com extrema atenção, pois a troca do nome de 
	um usuário poderá fazer com que ele, por exemplo, não receba mais mensagens,
	a menos que você crie um \texttt{alias} para o email antigo.
	
%%\section{Removing a user}
\section{Removendo um usuário}

	Para remover um usuário, deve-se inicialmente remover todos os seus
	arquivos, caixas de correio, alias de email, trabalhos de
	impressão, trabalhos programados via \cmd{cron} e \cmd{at}, e todas as 
	referências que existirem ao usuário. Após, pode-se remover as linhas 
	relevantes dos arquivos \fn{/etc/passwd} e \fn{/etc/group} (lembre-se de
	retirar quaisquer referências ao usuário em todos os grupos que ele tenha 
	sido adicionado). É indicado antes de iniciar este processo desabilitar o 
	usuário (veja abaixo), prevenindo assim o uso da conta enquanto ela está 
	sendo removida.
	
	Lembre-se que usuários podem ter arquivos fora do diretório pessoal. O
	comando find pode encontrá-los:
		%
\begin{tscreen}
find / -user \textsl{NomeDoUsuário}
\end{tscreen}
		%
	Note que o comando acima pode levar um tempo significativo, caso seu disco
	rígido seja grande. Caso se tenha discos montados em rede, 
	(veja~\ref{sec:NFS}), tem-se que tomar certas precauções em não carregar 
	toda a rede ou o servidor.
	
	Algumas distribuições do \linux\ vêm com comandos especiais para esta
	tarefa; verifique o comando \cmd{deluser} ou \cmd{userdel}. 
	Ainda que esses comandos possam ser úteis, algumas vezes eles não fazem 
	todo o trabalho necessário e pode ser interessante fazer alguns trabalhos
	manualmente.
	
%%\section{Disabling a user temporarily}
\section{Desabilitando um usuário temporariamente}

	Algumas vezes é necessário desabilitar temporariamente uma conta, sem
	necessariamente removê-la. Por exemplo, o usuário pode não ter pago suas
	dívidas, ou o administrador do sistema pode suspeitar que a senha daquela
	conta tenha sido violada.
	

	A melhor forma de desabilitar uma conta é alterar o shell da conta para
	um programa especial que somente apresente uma mensagem. Desta forma, toda
	vez que se tente acessar o sistema utilizando esta conta, ocorrerá um
	falha, e a mensagem pode indicar, por exemplo, que o administrador do
	sistema seja contactado.
	
	Pode ainda ser possível alterar o nome do usuário ou a senha para algum
	outro valor, mas então o usuário não saberá o que está ocorrendo, podendo
	gerar uma certa confusão.

	Uma forma simples de criar estes programas especiais é criar 
	`tail scripts':
		%
\begin{quote}\begin{verbatim}
#!/usr/bin/tail +2
Esta conta foi fechada devido a questões de segurança.
Por favor chame a 555-1234 e aguarde a chegada dos homens de preto.
\end{verbatim}\end{quote}
		%
	Os primeiros dois caracteres (`\verb|#!|') dizem ao kernel que o restante 
	da linha é um comando que deve ser executado. O comando \cmd{tail}, neste 
	caso, imprime, na saída padrão, todo o arquivo, exceto a primeira linha. 
	
	Caso o usuário \texttt{billg} seja suspeito de um furo de segurança, o 
	administrador do sistema pode fazer algo como: 
		%
\begin{tscreen}
\verb|#| \textsl{chsh -s /usr/local/lib/no-login/security billg} \\
\verb|#| \textsl{su - tester} \\
\verb|Esta conta foi fechada devido a questões de segurança.| \\
\verb|Por favor chame 555-1234 e aguarde a chegada do homens de preto.| \\
\verb|#|
\end{tscreen}
		%
	O propósito do comando \cmd{su} é testar se a mudança funcionou.

	Tail scripts devem ser mantidos em diretórios separados, assim os seus 
	nomes não interferirão com os comandos normais de usuários.

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