logo titulo
anterior indice proximo

Administrando usuários do sistema


Em um sistema multi-usuário, é necessário existir mecanismos para proteger os usuários, de forma que seus arquivos privativos fiquem seguros, inacessíveis aos outros. Outro aspecto é em relação aos recursos do sistema reservados: não deve ser possível a um usuário criar arquivos que ocupem todo o espaço do disco, por exemplo, e assim, indiretamente, proibir todos os outros usuários de salvarem seus próprios arquivos. Atingimos esse objetivo criando contas, que representam todos os recursos e informações pertencentes a um determinado usuário. A origem do nome conta, depende muito da história da computação, quando o espaço em disco e tempo de uso da máquina tinha que ser cobrado de acordo com o seu uso, de foma semelhante a uma conta telefõnica.

A cada usuário é destinado um nome de login e senha, como já vimos anteriormente, bem como um UID, GID, nome do diretório home e shell inicial (veja informação sobre o arquivo /etc/passwd). Maiores informações podem ser obtidas com o comando man 5 passwd.

Os números UID e GID não importam muito quando os usuários são todos locais, mas tornam-se restritivos quando o mesmo usuário tem contas separadas em várias máquinas interligadas via rede. Neste caso, devemos usar um sistema como o NIS [23].

Para trocar o shell de login do usuário já vimos o comando chsh. Para trocar o nome completo, e outras informações (que podem ser obtidas via rede com o finger), como o seu endereço, telefones do escritório e de casa, podemos usar o comando chfn (abreviatura de change finger), finalmente para trocar sua senha, o comando passwd.

O usuário pode pertencer a vários grupos, para isso bastando o seu nome (login) estar presente no arquivo /etc/group. Este arquivo tem o seguinte formato:

    nome_do_grupo:passwd:GID:usuário1,usuário2,...

onde o último argumento é uma lista dos nomes de login dos usuários separados por vírgulas.
Para mudar de grupo, um usuário pode executar newgrp <grupo novo> e retornar a sua situação original com exit. Para verificar o GID corrente (bem como o nome do grupo e outras informaçóes), usamos id.

Etapas na criação de um usuário
  • inclusão do nome em/etc/passwd e /etc/groups
  • atribuição de senha
  • inclusão no arquivo /etc/shadow (se em uso)
  • mkdir /home/<usuário>
  • copia dos arquivos /etc/skel -> /home/<user>
  • chown + chgrp dos arquivo do novo usuário
  • adição do diretório de mail /var/spool/mail/<usuário>
  • teste da nova conta
Existem programas que automatizam todas essas etapas, como adduser e useradd. Cada distribuição Linux tem alguns procedimentos particulares que devem ser seguidos. As etapas ao lado são apenas um guia.

Existe também um pacote chamado "shadow suite" que é um conjunto de utilitários para usar shadow passwords, que essencialmente retira as senhas (mesmo criptografadas) do arquivo /etc/passwd, e assim obtém um grau maior de segurança.

Sistemas com o shadow password instalados especificam uma data limite para as senhas, por usuário. Dessa maneira, o usuário é obrigado a mudar a sua senha ou perderá o acesso ã sua conta, como medida de segurança contra crackers.[24] O arquivo /etc/shadow tem um formato já familiar para nós, com vários campos eparados por ":", com a seguinte forma:

nome:senha criptografada:data da última mudança:mínimo dias:máximo dias:dias de aviso:dias inatividade:data limite

onde o "máximo dias" e "mínimo dias" representam quando o usuário é permitido mudar a senha; "dias de aviso" é o número de dias com antecedência ao limite final (para a conta ser desativada) que o usuário será avisado a mudar a senha. A senha nesse arquivo fica igualmente criptografada, só que neste caso, o campo de senha do arquivo /etc/passw passa a não conter esta senha.

arquivos de inicialização de login


Quando o usuário efetua o seu login, o arquivo /etc/profile é carregado. Este arquivo contém definição de variáveis para o shell, comandos para configurar aspectos da sessão do usuário, programas como o fortune, para enviar uma "frase do dia" ao usuário, etc. Se existir o arquivo ~/.bash_profile (no diretório home deste usuário), este é carregado em seguida, com as configurações preferidas deste usuários particular. Se não existir, o bash procura por ~/.bash_login e finalmente por ~/.profile, nessa ordem, carregando o primeiro encontrado. Um destes arquivos usualmente é colocado no diretório /etc/skel, para servir de modelo na abertura de conta dos usuários do sistema.

Se quisermos que todos os usuários do nosso sistema usem o joe, por exemplo, colocaremos a seguinte linha no arquivo , antes de criar os usuários (depois, somente editando cada arquivo ~/.bash_profile manualmente, ou através de um script) :

     export EDITOR=joe

Outro tipo de serviço que podemos prestar aos nossos susário, é definir alguns aliases, comandos que são expandidos pelo shell, de forma a simplificar o uso do embaralhado de chaves (opções) que existem em muitos comandos. Por exemplo, o comando ls mostra somente os nomes dos arquivos, multi-colunado, preto-e-branco, se executado sem nenhuma chave. Entretanto o comando ls --8bit --color=tty -F -b -T 0, apresenta um diretório de forma bem mais agradável, colorido, também multi-colunado, com uma tabulação melhor (pelo uso de espaços), com os caracteres "invisíveis" transformados numa forma visível, com um caracter especial indicando o tipo de arquivo. Entretanto, dá para se notar que o usuário jamais desejará ficar digitando todas essas opções a cada vez que for listar um diretório. A forma usual de se fazer isto é criar uma variáel (digamos LS_OPTIONS) com o conteúdo dessas chaves, literalmente; depois criar um alias com o comando alias ls='/bin/ls $LS_OPTIONS', que é semelhante ao export de variáeis que já vimos no shell. Colocando estes dois comandos no .profile (global) ou no .bash_profile (local de cada usuário), teremos o efeito desejado. O conteúdo exato a ser adicionado é:

     export LS_OPTIONS=--8bit --color=tty -F -b -T 0
     alias ls='/bin/ls $LS_OPTIONS'

comandos comumente utilizados no arquivo /etc/profile
ulimit umask biff mesg
mais usado na forma ulimit 0 para evitar a criação de coredump files, arquivos (de nome core) que salvam uma imagem da memória quando acontece uma falha, devido a um bug no programa. umask 022 define a máscara de criação de arquivos default. O número 022 (octal) determina acesso "rx" para usuários do mesmo grupo e outros, e acesso "rwx" para o próprio usuário. biff y especifica que o usuário seja notificado quando chegar algum mail para ele. Posteriormente, esse usuário pode fazer biff n para desabilitar esse comportamento. semelhante ao biff (ao lado), controla se mensagens de outros usuários (em tempo real) podem ser recebidas. Normalmente se usa mesg y.

modificando propriedades de arquivos


Arquivos criados por um determinado usuário retêm o seu nome e grupo, e os valores dos flags (rwxrwxrwx) definidos pelo último comando umask executado antes de criar o arquivo. Tudo isso pode ser controlado com o nosso velho amigo Midnight Commander (mc), mas existem situações, como num script, por exemplo, aonde precisamos de uma maneira rápida de efetuar essas transformações.
Existem comandos para mudar cada um destes atributos dos arquivos:

chown
troca o nome do dono (owner) do arquivo
chgrp
troca o grupo do arquivo
chmod
troca os flags rwx do arquivo para o usuário, grupo e outros

Vejamos uma rápida sequêcia de comandos copiados de uma sessão (terminal):

~ # ls -l rildo.txt 
-rw-r--r--   1 root  root  6989 Jan 6 21:59 rildo.txt 
~ # chown rildo rildo.txt 
~ # ls -l rildo.txt 
-rw-r--r--   1 rildo root  6989 Jan 6 21:59 rildo.txt 
~ # chgrp users rildo.txt 
~ # ls -l rildo.txt 
-rw-r--r--   1 rildo users 6989 Jan 6 21:59 rildo.txt 
~ # chmod g+w rildo.txt 
~ # ls -l rildo.txt 
-rw-rw-r--   1 rildo users 6989 Jan 6 21:59 rildo.txt 
~ # chmod a+rwx rildo.txt 
~ # ls -l rildo.txt 
-rwxrwxrwx   1 rildo users 6989 Jan 6 21:59 rildo.txt* 
~ # 

Usamos o ls para mostrar como está o arquivo entre as operações. Observe que o prompt está diferente (do conhecido ~ $) porque o usuário é o root (superusuário). Nas 2 primeiras linhas, o arquivo pertence ao root, grupo root, como podemos ver com a saida do ls. Logo após trocamos o usuário dono do arquivo (chwon) para rildo. Continuando, trocamos o grupo. As últimas duas trocas, com o chmod, podem ser explicadas de maneira mais simples com uma figura:

chmod modificando arquivos com o chmod

O formato geral do comando é chmod <flags> <arquivo(s)>

onde <flags> está resumido na figura ao lado. Essencialmente, devemos fornecer:

  • "para quem", que pode ser todos, grupo, outros ou usuário (agou), somente um destes.
  • depois o sinal +/- indicando se o acesso deve ser permitido ou retirado (proibido), o que o fará aparecer como um hífen no ls.
  • finalmente uma ou mais letras informando o tipo de acesso (rwx)

poder para o usuário


Alguns usuários, quando merecem a sua confiança, podem lhe auxiliar nas tarefas administrativas. Para que um usuário tenha acesso aos arquivos protegidos, ele poderia:

  1. saber a senha do superusuário e se logar como ele (root), o que pode ser perigoso, pois voce não saberia que fez algo errado.
  2. pertencer a um ou mais grupos que tenha acesso a determinadas partes do sistema, conforme seu critério (supondo que voce seja o administrador principal do sistema).
  3. ter acesso liberado a alguns programas com o setuid bit ligado (com chmod +s <programa>). Essa alternativa apresenta brechas para crackers., e deve ser usada com cuidado. Nem todos os programas podem ter o setuid ligado, pois podem ser modificados e fazer qualquer coisa com o sistema. Por exemplo, jamais ligue o setuid de um script (shell).
  4. receber um privilégio especial de se tornar root temporariamente, através do comando sudo.

As três primeiras possibilidades foram tratadas anteriormente, restando essa última. Para um usuário executar programas privilegiados, ele pode se tornar o root, sem a necessidade de conhecer a senha do superusuário. A diferença é que todos os programas que ele executar com essa possibilidade, será comunicado ao root, na forma de um syslog (no arquivo /var/log/messages) gerado automaticamente cada vez que um comando é executado com esse procedimento.

Para executar um programa como root, o usuário iria entrar no sistema com a sua própria senha, e executar o comando privilegiado colocando sudo no início da linha de comando. Após receber uma mensagem de advertência, o usuário poderia prosseguir com o comando. A cada 5 minutos aproximadamente, ele teria que reintroduzir sua senha para executar novamente comandos prefixados com sudo.

O arquivo /etc/sudoers controla que tem acesso, e os programas que estes usuários estão permitidos de executar (ou a palavra ALL) se tudo é permitido. O formato desse arquivo é bem simples: nome_de_login hostname=comando

onde hostname é o nome da máquina aonde o usuário se encontra (pode ser que ele esteja via rede). Quando a máquina é local, usa-se o nome localhost para descrevê-la. O campo comando pode ser um ou mais comandos separados por vírgulas, com o path completo. Podem também serem descritos aliases para simplificar a gestão de uma quantidade grande de usuários e comandos. (veja man 8 sudo para maiores detalhes)

O superusuário também deverá usar o sistema com cuidado, para não cometer enganos que trariam muita dor de cabeça posteriormente. Uma sugestão é que o administrador do sistema tenha uma conta separada, como usuário normal, e que utilize-se de uma forma similar a esta para se tornar root, só nos momentos necessários (instalação de alguns programas, mas não durante a compilação; tarefas administrativas como criar usuários novos, efetuar recuperação de backups, etc). Outra alternativa é utilizar o comando su (sem argumentos) para se tornar root nos instantes desejados, executando exit para voltar a ser "um simples mortal". Nesse instante, elê entrará a senha do root e terá todo o poder de modificar o que quiser no sistema. Para simular um login completo, incluindo a leitura dos arquivos de inicialização (~/.bash_profile, etc), o comando su - é mais adequado.


rpragana
Thu Jan 7 17:51:17 EDT 1999