Aula #33 - Gerenciamento de contas


Muitos usuários podem trabalhar simultaneamente em um sistema Linux. Cada um tem o seus próprios diretórios e arquivos, bem como scripts de login e variáveis ​​de ambiente. As senhas são escolhidos individualmente ou cedidas, e cada usuário tem um conjunto bem definido de privilégios. Sob certas circunstâncias, os usuários podem perder privilégios associados a suas contas e até ter suas contas bloqueadas. O usuário root (ou super-usuário) tem privilégios únicos que devem ser usados ​​raramente e com a máxima cautela.



Sistemas Linux proporcionam um ambiente multi-usuário que permite que pessoas e processos tenham ambientes de trabalho isolados e simultâneos.

Os propósitos de ter contas de usuários individuais incluem:

  •     Proporcionar cada usuário com seu próprio espaço privado individual.
  •     Criar contas particulares de usuário para fins específicos e dedicados.
  •     Distinguir privilégios entre usuários. 


Uma conta de usuário especial é para o usuário root, que é capaz de fazer qualquer coisa no sistema. Para evitar cometer erros caros, e por razões de segurança, a conta root deve ser usada apenas quando for absolutamente necessário.

Contas de usuários normais são para as pessoas que irão trabalhar no sistema. Existem algumas contas de usuário (como a contas para processos daemon) com a finalidade de permitir que os processos sejam executados com um usuário diferente do root.

Na próxima seção, vamos falar sobre gestão de grupos onde conjuntos de usuários podem compartilhar arquivos, privilégios, etc. de acordo com interesses comuns. 



Cada usuário do sistema tem uma linha no arquivo /etc/passwd que descreve os atributos básicos da conta. (Vamos mostrar como as senhas são salvas e falar mais deste arquivo em breve). Por exemplo:

....

beav:x:1000:1000:Theodore Cleaver:/home/beav:/bin/bash

warden:x:1001:1001:Ward Cleaver:/home/warden:/bin/bash

dobie:x:1002:1002:Dobie Gillis:/home/dobie:/bin/bash

....

Os sete elementos aqui são:

    User name
    O nome da conta de usuário que deve ser único e é associado a cada conta.

    User password
    A senha da conta do usuário.

    User identification number (UID)
    Um número que também é único para cada conta de usuário. O UID é usado pelo sistema para várias tarefas, incluindo gestão de privilégios e auditoria.

    Group identification number (GID)
    Indica o número do grupo primário, ou grupo principal, ou grupo padrão da conta do usuário.

    Comentários ou informações GECOS
    Uma forma de manter informações sobre contato (Nome completo, email, escritório, telefone). (Não se preocupe com o significado de GECOS, é terminologia pré-histórica.)

    Home directory
    Para a maioria dos usuários, isto é uma pasta pessoal para ser usada como área de trabalho. Normalmente, esse diretório é de propriedade do usuário, e com exceção da pasta para o usuário root todas as outras pastas ficam dentro do /home.

    Login shell
    Normalmente isso é o shell que o usuário vai usar como o /bin/bash ou /bin/csh. Em alguns casos um programa alternativo é referenciado para casos especiais. Em geral este campo vai aceitar qualquer executável.



Criar conta de usuário no Linux

O comando:
$ sudo useradd eslih

vai criar uma conta para o usuário eslih, usando os padrões do sistema para associar o usuário a um grupo primário, a uma pasta home, e a um shell padrão.

O comando useradd acima executa os seguintes passos:

    O próximo UID disponível e que seja maior que UID_MIN (definido em /etc/login.defs) é definido como UID do eslih.
    Um grupo chamado eslih com um GID=UID é criado e definido como grupo primário do eslih.
    O diretório home /home/eslih é criado com as permissões corretas.
    O shell padrão será /bin/bash.
    O conteúdo da pasta /etc/skel é copiado para /home/eslih. Por padrão, o /etc/skel contém arquivos de inicialização do bash e para o ambiente gráfico X Window.
    !! ou ! é colocado no campo de senha do arquivo /etc/shadow na linha do eslih, obrigando que uma senha seja atribuída a conta antes que ela possa ser utilizada.

Os padrões podem ser facilmente ignorados passando opções para o comando useradd como em:

$ sudo useradd -s /bin/csh -m -k /etc/skel -c "Bullwinkle J Moose" bmoose





Remover uma conta de usuário no Linux

O usuário root pode remover contas do usuário usando a ferramenta userdel:

$ sudo userdel isabelle

Todas as referências do usuário isabelle serão apagadas dos arquivos /etc/passwd, /etc/shadow, e /etc/group.

Enquanto isso remove a conta do usuário, o diretório home do usuário não é apagado, (normalmente /home/isabelle) para o caso da conta ser re-estabelecida posteriormente. Se a opção -r do userdel for usada, o diretório home também será apagado. Entretanto, todos os outros arquivos presentes no sistema que podem ter pertencido ao usuário apagado, continuarão presentes no sistema.




Alterando a conta de usuário no Linux

A ferramenta usermod pode ser usada para alterar características da conta do usuário como participação em grupos, diretório home, nome de login, shell padrão, id do usuário, etc.

O uso é bem simples. Observe que o usermod se encarregará de qualquer modificação nos arquivos presentes no diretório /etc caso
necessário.

$ sudo usermod --help

Usage: usermod [options] LOGIN

Options:
-c, --comment COMMENT        new value of the GECOS field
-d, --home HOME_DIR          new home directory for the user account
-e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, --inactive INACTIVE      set password inactive after expiration
                                                                    to INACTIVE
-g, --gid GROUP              force use GROUP as new primary group
-G, --groups GROUPS          new list of supplementary GROUPS
-a, --append                 append the user to the supplemental GROUPS
                             mentioned by the -G option without removing
                             him/her from other groups
-h, --help                   display this help message and exit
-l, --login NEW_LOGIN        new value of the login name
-L, --lock                   lock the user account
-m, --move-home              move contents of the home directory to the
                             new location (use only with -d)
-o, --non-unique             allow using duplicate (non-unique) UID
-p, --password PASSWORD      use encrypted password for the new password
-R, --root CHROOT_DIR        directory to chroot into
-s, --shell SHELL            new login shell for the user account
-u, --uid UID                new UID for the user account
-U, --unlock                 unlock the user account
-Z, --selinux-user SEUSER    new SELinux user mapping for the user account



Bloquear um usuário no Linux

O Linux vem com algumas contas do sistema que são bloqueadas, o que significa que elas podem executar programas, mas nunca podem fazer login no sistema, e não tem uma senha associada com a conta. Por exemplo o /etc/passwd tem entradas como:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

O shell nologin retorna o seguinte, se um usuário bloqueado tenta acessar o sistema:

This account is currently not available.

ou qualquer mensagem presente no arquivo /etc/nologin.txt.

Essas contas bloqueadas são criados para fins especiais, como serviços ou aplicações do sistemas; se você procurar no /etc/passwd por usuários com o shell nologin você pode ver quem eles são no seu sistema.

Também é possível bloquear a conta de um usuário em particular com:
$ sudo usermod -L eslih

o que resulta na conta continuar no sistema, mas o login é impossível. O destravamento pode ser feito com a opção -U .

É boa prática bloquear a conta de um usuário quando sair da organização ou quando estiver em ausência prolongada.

Outra maneira de bloquear uma conta é usar o chage para alterar a data de vencimento de uma conta para uma data no passado:

$ sudo chage -E 2014-09-11 isabelle

A data real é irrelevante, desde que ela esteja no passado. Vamos apresentar o chage em breve.

Outra abordagem é editar o arquivo /etc/shadow e substituir o hash de senha do usuário por !! ou por alguma string aleatória.



Os arquivos passwd e shadow

Nós já mostramos como o /etc/passwd contém um registro por usuário como em
beav:x:1000:1000:Theodore Cleaver:/home/beav:/bin/bash
rsquirrel:x:1001:1001:Rocket J Squirrel:/home/rsquirrel:/bin/bash

e já apresentamos os campos em uso, que são separados por dois pontos (:).

Caso o /etc/shadow não seja usado, o campo senha contém o hash da senha  Se ele for usado, o campo senha vai conter um marcador ("x").

A convenção da maioria das distribuições Linux é que qualquer conta de usuário com o UID inferior a 1000 é considerada especial e pertence ao sistema; contas normais de usuário começam com o UID 1000. Este valor é definido com o atributo UID_MIN no arquivo  /etc/login.defs.

Historicamente, sistemas Red Hat usavam UID_MIN=500, e não 1000, mas com o RHEL 7 eles adotaram o valor mais comum de 1000.

Se o ID do usuário não é especificado ao chamar o useradd, o sistema criar UIDs incrementais começando com UID_MIN.

Além disso cada usuário recebe um ID de grupo primário que por padrão usa o mesmo número que o UID. Esses grupos podem ser chamados de User  Private Groups (grupo privado do usuário) (UPG).

É considerado má prática editar o /etc/passwd, /etc/group ou /etc/shadow diretamente; você deve usar as ferramentas usermod, ou o vipw que é um editor especial que garante que o arquivo não será corrompido por formato incorreto e por edições simultâneas.



O arquivo /etc/shadow contém um entrada (uma linha) para cada usuário como em:

daemon:*:16141:0:99999:7:::
.....
beav:$6$iCZyCnBJH9rmq7P.$RYNm10Jg3wrhAtUnahBZ/mTMg.RzQE6iBXyqaXHvxxbKTYqj.d
       9wpoQFuRp7fPEE3hMK3W2gcIYhiXa9MIA9w1:16316:0:99999:7:::

os campos separados por dois pontos são:


  •     username: nome único de usuário
  •     password: o hash (sha512) da senha
  •     lastchange: número de dias desde 1/1/1970 em que a senha foi alterada pela última vez
  •     mindays: número mínimo de dias antes que a senha possa ser alterada
  •     maxdays: número máximo de dias depois dos quais a senha deve ser alterada
  •     warn: número de dias antes da senha expirar em que o usuário é alertado
  •     grace: número de dias depois que a senha expira em que a conta é de fato desabilitada
  •     expire: data em que a conta é/será desabilitada
  •     reserved: campo reservado.


O nome de usuário em cada entrada deve ser idêntico ao encontrado no arquivo /etc/passwd, e até a ordem dos arquivos deve ser a mesma.

Todas as datas são salvas em número de dias desde 1 de Janeiro de 1970 (o tipo de data chamada epoch).

O hash da senha é a string "$6$" seguido pelo valor salt de oito caracteres, que é então seguido por um $ e o hash de senha de 88 caracteres ( hash de senha usando sha512).


O uso do /etc/shadow permite o uso de idade para as senhas. Ao mesmo tempo aumenta a segurança para os hashs de senha.

As permissões padrão do /etc/passwd são 644 (-rw-r--r--), o que mostra que qualquer um pode ler este arquivo, o que é infelizmente necessário porque os programas do sistema e aplicativos de usuário precisam ler as informações contidas neste arquivo. Estes programas do sistema não são executados como o usuário root, mesmo que apenas o root possa alterar o arquivo.

O mais preocupante é o fato dos hashs de senha estarem no /etc/passwd, já que qualquer um pode fazer cópia dos hashs e usar ferramentas como o Crack e o John the Ripper para tentar descobrir qual é a senha representada por aquele hash. Isso é um problema sério de segurança.

O /etc/shadow tem permissão 400 (-r--------), que significa que apenas o root tem acesso ao arquivo. Isso torna o acesso ao arquivo muito mais difícil.

A menos que exista um razão muito forte para o contrário, o arquivo /etc/shadow deve ser sempre usado.






Alterar as senhas do linux

Senhas podem ser alteradas com o passwd. Um usuário normal pode mudar apenas a sua própria senha, enquanto o root pode mudar qualquer senha. Quando você digita a senha, ela não é mostrada.

Por padrão, a senha que você escolhe é verificada pela biblioteca do PAM pam_cracklib.so, para verificar se a senha que você escolheu é segura.

Para mudar sua senha (do usuário atual):
$ passwd
Changing password for clyde
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

Observe que quando o root vai alterar a senha de um usuário, a senha atual não é solicitada:

$ sudo passwd kevin
New UNIX password:  
Retype new UNIX password:
passwd: all authentication tokens updated successfully

Usuários normais não serão autorizados a definir senhas fracas (123456, abcd, qwerty, ...). No entanto, o root pode tudo, até definir senhas fracas...




Usando o comando chage

É geralmente considerado importante alterar as senhas periodicamente. Isto limita a quantidade de tempo que uma senha roubada é útil para um intruso e também pode ser utilizado para bloquear as contas não utilizadas. A desvantagem é que os usuários podem se chatear com esta política e acabam anotando suas senhas, assim tornam elas mais fáceis de roubar.  

A ferramenta que controla a idade das senhas é o chage:

chage [-m mínimo_dias] [-M máximo_dias] [-d último_dia] [-I inativa] [-E data_de_expiração] [-W dias_de_aviso] conta_usuario

Exemplos:

$ sudo chage -l stephane
$ sudo chage -m 14 -M 30 kevlin
$ sudo chage -E 2012-4-1 isabelle
$ sudo chage -d 0 clyde

Apenas o root pode usar o chage. A única exceção é que todos os usuários podem rodar o chage -l para ver como anda o envelhecimento da sua senha.

Exemplos:
$ sudo chage -l coop

Last password change : Sep 03, 2014
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

Para forçar uma troca de senha no próximo login:

$ sudo chage -d 0 conta_usuario

No Linux é possível usar um shell restrito, que pode ser chamado com:

$ /bin/bash -r

(Algumas distribuições criam o atalho rbash com o mesmo efeito.)

Um shell restrito roda em um ambiente mais rigidamente controlado do que um shell padrão, mas em geral funciona da mesma forma. Em particular:

  •     Impede que o usuário mude para diretórios fora da sua pasta home.
  •     Impede que o usuário redefina as variáveis ​​de ambiente SHELL, ENV, e PATH.
  •     Não permite que o usuário especifique caminhos absolutos a partir do /.
  •     Impede o usuário de fazer redirecionamento de entrada e saída.


Existem outras restrições, e a melhor forma de ver a lista completa é man bash e procurar por RESTRICTED SHELL(ou SHELL RESTRITO).

Como o shell restrito roda o $HOME/.bash_profile sem nenhuma restrição, o usuário não deve ter permissões de gravação nem de execução na pasta /home.




Conta de usuário com acessos limitados no linux

As vezes é necessário criar uma conta de usuário com privilégios bem limitados. Configurar uma conta de usuário restrita pode ser útil neste contexto. Uma conta restrita:

  •     Usa o shell restrito.
  •     Limita quais aplicativos e utilitários a conta pode executar.
  •     Limita recursos do sistema.
  •     Limita data e hora de acesso.
  •     Limita local de acesso.


Da linha de comando ou de um script, o shell restrito deve ser chamado com /bin/bash -r.  Entretanto flags não podem ser especificadas no arquivo /etc/passwd. Uma forma simples de contornar esta limitação é mostrada abaixo:

$ cd /bin ; sudo ln -s bash rbash

$ cd /bin ; sudo ln bash rbash
$ cd /bin ; sudo cp bash rbash

e então usar /bin/rbash como o shell no /etc/passwd.

Ao configurar uma conta restrita evite colocar muitas pastas na variável de ambiente PATH porque isso pode facilitar ao dono da conta de usuário restrita burlar as restrições.






Acesso como root

A conta root somente deve ser usado para fins administrativos quando absolutamente necessário e nunca usada como uma conta regular. Os erros podem ser muito caros, para a integridade, estabilidade, e segurança do sistema.

Por padrão, o login do root através da rede são geralmente proibidos por razões de segurança. É possível permitir logins pelo Shell Seguro usando ssh, que é configurado com o /etc/ssh/sshd_config, e com o PAM (Pluggable Authentication Modules ou módulos de autenticação plug áveis), através do módulo pam_securetty.so e com o arquivo associado /etc/securetty. Login como root só é permitido a partir dos dispositivos listados em /etc/securetty.

Recomenda-se que todo o acesso como root deve ser feito através do su ou sudo (o que deixa registros auditáveis através do sudo). Algumas distribuições (como o Ubuntu), por padrão, proíbem o login diretamente como root.

O PAM também pode ser usado para restringir quais usuários estão autorizados a usar o su para o root. Também pode valer a pena configurar o auditd para registrar todos os comandos executados como root.


Acesso via SSH

Muitas vezes é necessário fazer o login através da rede, usando o mesmo nome de usuário ou um outro nome. Também pode ser necessário transferir arquivos entre dois computadores na rede. Tanto para o login remoto quanto para transferência de arquivos, o desejável é que isso seja feito de forma segura.

O SSH (Secure SHell, ou shell seguro) exista para este propósito, e usa criptografia baseada em algorítimos seguros e confiáveis. Desde que os pacotes do ssh estejam instalados no sistema, nenhuma configuração é necessária para começar a usar o ssh.

Para fazer login em um sistema remoto:

$ whoami
aluno

$ ssh farflung.com
[email protected]'s password: (digite aqui)
$

estamos assumindo que existe a conta aluno no servidor farflung.com. Para se conectar com outro usuário:

$ ssh [email protected]
[email protected]'s password: (digite aqui)

ou

$ ssh -l root farflung.com
[email protected]'s password: (digite aqui)

Para copiar arquivos entre servidores:

$ scp arquivo.txt farflung.com:/tmp
$ scp arquivo.tex [email protected]/home/aluno
$ scp -r uma_pasta farflung.com:/tmp/uma_pasta

Omiti o pedido de uma senha para economizar espaço; se você configurar corretamente login sem senha usando chaves criptografadas, como explicaremos a seguir, você não precisará fornecer uma senha.

Para executar o mesmo comando em várias máquinas diferentes:

$ for machines in node1 node2 node3
do (ssh $machines some_command &)
done



É possível configurar o SSH para expandir seu potencial, sendo que uma das configurações mais comuns tem o objetivo de não pedir senha. Os arquivos de configuração que são específicos de cada usuário ficam na pasta home dentro do diretório .ssh:

 $ ls -l ~/.ssh
total 20
-rw-r--r-- 1 hilda hilda 1172 Sep 27  2014 authorized_keys
-rw------- 1 hilda hilda  207 Aug  9  2011 config
-rw------- 1 hilda hilda 1675 Dec  8  2010 id_rsa
-rw-r--r-- 1 hilda hilda  393 Dec  8  2010 id_rsa.pub
-rw-r--r-- 1 hilda hilda 1980 Apr 28 07:36 known_hosts 

que contém:


  •     id_rsa: a chave privada específica deste usuário.
  •    id_rsa.pub: a chave pública específica deste usuário.
  •    authorized_keys: Uma lista de chaves públicas que podem fazer login neste servidor com este usuáro.
  •    known_hosts: Uma lista de servidores com os quais já se fez login no passado.
  •    config: Arquivo de configuração que afetam apenas este usuário, que é normalmente usado para configurações avançadas.


O primeiro passo é gerar as chaves com o ssh-keygen:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hilda/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 
Your identification has been saved in /home/hilda/.ssh/id_rsa
Your public key has been saved in /home/hilda/.ssh/id_rsa.pub
The key fingerprint is:
76:da:d3:51:1e:c8:2d:3b:34:28:46:b2:2b:db:d1:c4 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|      . .        |
|       =   o o   |
|      . E . * +  |
|       = . . * . |
|    . o S . + .  |
|     + o + . o   |
|    . . . o .    |
|           .     |
|                 |
+-----------------+

O que vai gerar a chave pública: ~/.ssh/id_rsa.pub.

A chave privada, como o nome sugere, deve ser mantida com cuidado e jamais deve ser compartilhada.

Já a chave pública pode ser compartilhada sem restrições. E é o conteúdo da chave pública que deve ser adicionado no arquivo authorized_keys dos servidores remotos que você quer fazer login sem senha.

O arquivo known_hosts cresce a  medida que o usuário se conecta a outros servidores usando  ssh. Se o sistema detectar que as chaves do servidor foram alteradas, o ssh vai emitir um alerta informando que a chave foi alterada e não vai permitir que você faça login já pode se tratar de um tipo comum de ataque com o objetivo de obter a sua senha. Observe que o arquivo authorized_keys contém informação sobre usuários e servidores:

$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQ
...0000aSd...[email protected]

enquanto o known_hosts só contém informações sobre servidores:

$ cat known_hosts
192.30.252.129 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSw
....BK6Tb...==

A man page do ssh mostra quais configurações podem ser feitas no arquivo config.

Mais vistos no mês:

As melhores distribuições Linux para 2017

Teste de Performance de Rede com Iperf

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Modelo Firewall Completo em Iptables para pequena rede/office

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

DHCP - Guia Completo

OPNsense - Firewall Open Source

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?

Oracle Linux 7.0 Server com Xfce - Instalação e configurações iniciais