cd ..
LINUX

Administrando usuários no Linux: passwd, shadow, useradd e chage

Essas são minhas anotações de caderno sobre administração de usuários no Linux, parte do curso Linux para Cloud Native da LINUXtips, dentro da trilha do PICK 2026. Passei tudo a limpo aqui porque escrever fixa o conteúdo, e porque um dia isso vira referência rápida quando eu não lembrar de uma flag.

As saídas apresentadas são exemplos. UIDs, nomes e caminhos podem variar de acordo com o sistema.

UID: a identidade real de um usuário

O Linux não enxerga usuários pelo nome. Internamente, tudo é controlado pelo UID (User Identification), um número.

O nome do usuário é apenas um rótulo amigável para nós, humanos. O sistema, os processos e as permissões de arquivo trabalham com o número.

Isso fica claro com o comando id:

id

Saída:

uid=1000(user) gid=1000(user) groups=1000(user),10(wheel),975(docker)

Comparando com o usuário root:

id root

Saída:

uid=0(root) gid=0(root) groups=0(root)

O root sempre terá UID 0. Nenhum outro usuário deveria ter esse número.

/etc/passwd: o registro de usuários do sistema

O arquivo /etc/passwd guarda a lista de todos os usuários do sistema.

cat /etc/passwd

Saída (uma linha, como exemplo):

user:x:1000:1000::/home/user:/usr/bin/zsh

Cada linha é dividida em sete campos, separados por :

nome:senha:UID:GID:GECOS:diretório home:shell
CampoSignificado
userNome do usuário
xIndica que a senha está armazenada em outro arquivo (/etc/shadow)
1000UID — identificador único do usuário
1000GID — identificador do grupo primário
userGECOS — informações quaisquer sobre o usuário (nome completo, telefone etc.)
/home/userDiretório home do usuário
/usr/bin/zshShell padrão do usuário

O x no segundo campo não significa que não existe senha. Significa que ela não está mais aqui — décadas atrás o hash ficava direto no /etc/passwd, que qualquer usuário pode ler. Hoje ele mora no /etc/shadow, legível apenas por root.

Repare também nos números de UID e GID:

/etc/group: os grupos do sistema

Da mesma forma que o /etc/passwd lista usuários, o /etc/group lista todos os grupos.

cat /etc/group

Saída (exemplo):

wheel:x:10:user
docker:x:975:user
user:x:1000:

Criando um novo usuário: adduser x useradd

Existem dois comandos para criar usuários, e a diferença entre eles importa.

Criando com adduser

sudo adduser java

O comando pergunta interativamente pelo nome completo e outras informações (o chamado campo GECOS):

Nome completo []: Java Git
Número da sala []: 900
Telefone comercial []: 987654321
Telefone residencial []: 123456789
Outro []: Corinthiano

Conferindo o resultado no /etc/passwd:

cat /etc/passwd

Saída:

java:x:1002:1002:Java Git,900,987654321,123456789,Corinthiano:/home/java:/bin/bash

O campo GECOS concatena todas as respostas em uma única string, separada por vírgulas:

Java Git,900,987654321,123456789,Corinthiano

E o adduser já cuidou de tudo: criou o diretório home, copiou o /etc/skel e configurou o shell padrão (/bin/bash), sem que eu precisasse passar nenhuma flag.

Criando com useradd

Com useradd, cada detalhe precisa ser informado manualmente:

sudo useradd -u 1234 -g 0 -d /tmp/lore -s /bin/sh lore
FlagSignificado
-u 1234UID do usuário
-g 0GID do grupo primário
-d /tmp/loreDiretório home
-s /bin/shShell padrão
loreNome do usuário

Resultado em /etc/passwd:

cat /etc/passwd

Saída:

lore:x:1234:0::/tmp/lore:/bin/sh

O campo GECOS ficou vazio, porque não passei nenhuma informação para ele.

Além disso, o diretório home não foi criado:

ls /home

Saída:

estudante  java

O lore não aparece. O useradd, sem mais nada, só escreve a linha no /etc/passwd — não cria pasta, não copia nada.

A flag -m: criando o home automaticamente

Para o useradd criar o diretório home, é preciso passar a flag -m:

sudo useradd -u 3881 -g 1000 -m -d /home/intel -s /bin/sh intel

A flag -m cria automaticamente o diretório home do usuário, copiando o conteúdo do /etc/skel para dentro dele.

ls /home

Saída:

estudante  intel  java

Agora sim, intel aparece.

Definindo a senha com passwd

Um usuário recém-criado não tem senha definida. Para configurá-la:

sudo passwd intel

Saída:

Nova senha:
Digite novamente a nova senha:
passwd: senha atualizada com sucesso

Trocando de usuário com su

O comando su (switch user, ou simplesmente “trocar de usuário”) permite assumir a sessão de outro usuário no terminal.

su - intel

Saída:

Senha:

O traço (-) depois do su inicia uma sessão completa de login — carregando as variáveis de ambiente do usuário de destino, como se ele tivesse feito login diretamente, em vez de apenas herdar o ambiente do usuário atual.

Conferindo a identidade dentro da nova sessão:

id

Saída:

uid=3881(intel) gid=1000(estudante) groups=1000(estudante)

Para voltar ao usuário anterior:

exit

Ou pressionando Ctrl + D.

/etc/adduser.conf: configurando o comportamento padrão

O adduser lê suas configurações padrão de um arquivo:

vim /etc/adduser.conf

Ele define, entre outras coisas, a faixa de UID reservada para usuários “de sistema” (contas de serviço, não humanas):

FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999

Arquivo /etc/adduser.conf aberto no terminal, mostrando os defaults comentados: DSHELL, DHOME, SKEL, FIRST_SYSTEM_UID, LAST_SYSTEM_UID, FIRST_UID e FIRST_GID

Ou seja: UIDs entre 100 e 999 são reservados para o sistema. Usuários humanos criados a partir daí começam em 1000, como vimos lá em cima.

/etc/skel: o molde para novos usuários

O /etc/skel é um diretório que funciona como modelo para todo novo usuário criado no Linux.

Seu conteúdo típico são os dotfiles padrão — .bashrc, .bash_profile, .profile e, em algumas distros, .bash_logout ou uma pasta .config.

Ao editar qualquer um desses arquivos dentro do /etc/skel, todo novo usuário criado a partir dali recebe esses padrões automaticamente, copiados para dentro do seu próprio diretório home.

O caminho usado como modelo é configurável através da variável SKEL, definida em:

/etc/default/useradd

Removendo um usuário: deluser / userdel

Para remover um usuário:

sudo deluser python

Isso remove o usuário, mas mantém o diretório home intacto.

Para remover também o diretório home junto:

sudo deluser -r python

Bloqueando e desbloqueando uma conta

Às vezes não queremos apagar o usuário, apenas impedir o acesso temporariamente.

sudo passwd -l java

A flag -l (lock) bloqueia a senha da conta, sem apagar o usuário nem seus dados.

Para desbloquear:

sudo passwd -u java

A flag -u (unlock) libera novamente o acesso.

/etc/shadow: onde as senhas realmente vivem

O /etc/shadow é o arquivo que armazena os hashes de senha dos usuários. Diferente do /etc/passwd, ele exige privilégios de root para ser lido:

sudo cat /etc/shadow

Saída (uma linha, como exemplo):

java:$6$4vSalt$hashaquiofuscado...:20033:0:99999:7:::

Cada linha tem nove campos, separados por :

usuário:senha:última_mudança:min:max:aviso:inatividade:expiração:reservado
#CampoSignificado
1UsuárioNome da conta
2SenhaHash da senha (! ou * = conta bloqueada, vazio = sem senha)
3Última mudançaDias desde 01/01/1970 da última alteração de senha
4MinDias mínimos que devem passar antes de poder trocar de novo
5MaxDias máximos até a senha expirar
6AvisoDias de aviso antes da senha expirar
7InatividadeDias após a expiração até a conta ser desativada
8ExpiraçãoData (em dias desde 1970) em que a conta expira
9ReservadoCampo não utilizado

Identificando o algoritmo de hash

O prefixo no campo de senha indica qual algoritmo foi usado:

PrefixoAlgoritmo
$6$SHA-512
$y$yescrypt
$2b$bcrypt

Uma conta bloqueada com passwd -l aparece com um ! no início do campo de senha, na frente do hash original — a senha continua ali, só que inutilizada para autenticação.

chage: gerenciando a política de expiração

O chage (change age) gerencia a política de expiração de senha de uma conta.

Executado sem opções, entra em modo interativo, perguntando cada valor:

sudo chage java

Consultando a política atual

sudo chage -l java

Saída:

Saída do chage -l mostrando a política de expiração de senha de um usuário

A flag -l lista as informações atuais de expiração da conta. Consultar a própria conta não exige privilégios de root.

Principais flags

FlagSignificado
-lLista as informações de expiração
-E dataData de expiração da conta (AAAA-MM-DD), ou -1 para nunca expirar
-M diasMáximo de dias de validade da senha
-m diasMínimo de dias entre trocas de senha
-W diasDias de aviso antes da senha expirar
-I diasDias de inatividade após a expiração até a conta ser desativada
-d dataData da última troca de senha (-d 0 força a troca no próximo login)

Exemplos

sudo chage -l java

Mostra a política atual do usuário java.

sudo chage -M 90 -W 7 java

Faz a senha expirar em 90 dias, avisando 7 dias antes.

sudo chage -E 2026-12-31 java

Faz a conta expirar em 31/12/2026.

sudo chage -d 0 java

Obriga a troca de senha no próximo login.

Expirando a senha diretamente

Existe também um atalho via passwd:

sudo passwd -e java

A flag -e expira a senha imediatamente, forçando a troca no próximo login — equivalente ao chage -d 0.

Resumo dos comandos

SituaçãoComando
Ver a identidade (UID/GID) de um usuárioid
Ver os usuários do sistemacat /etc/passwd
Ver os grupos do sistemacat /etc/group
Criar usuário interativamente, com homeadduser
Criar usuário com controle explícitouseradd
Criar home automaticamente com useradduseradd -m
Definir/trocar senhapasswd
Trocar de usuário (sessão completa)su - usuário
Remover usuáriodeluser / userdel
Remover usuário e seu homedeluser -r
Bloquear/desbloquear contapasswd -l / passwd -u
Ver hashes de senha (root)cat /etc/shadow
Ver/definir política de expiraçãochage
Forçar troca de senha no próximo loginpasswd -e ou chage -d 0

Conclusão

O /etc/passwd e o /etc/group respondem “quem é quem” no sistema. O /etc/shadow guarda o que realmente protege essas contas — e por isso só o root pode lê-lo.

adduser e useradd fazem, no fundo, a mesma coisa: escrever uma linha no /etc/passwd. A diferença é o quanto cada um automatiza por você. No dia a dia, adduser poupa trabalho; em scripts, useradd com flags explícitas garante previsibilidade.

E o chage fecha o ciclo: não basta criar a conta e definir uma senha, é preciso decidir por quanto tempo essa senha continua válida, e o que acontece quando ela expira.

Próximas anotações: grupos e permissões (chmod, chown, umask), sudoers e gerenciamento de pacotes.

Referências

O que achou?