Dia 3: Gestão de Utilizadores e Grupos no Linux
No Dia 1 aprendemos a navegar no terminal; no Dia 2 dominámos o sistema de ficheiros. Hoje, Dia 3, entramos no núcleo da administração: criar, modificar e gerir contas de utilizador e grupos, configurar sudo e aplicar políticas de acesso — competências que distinguem um utilizador de um sysadmin.
A gestão de identidades em Linux assenta em quatro ficheiros de texto simples, ferramentas CLI padronizadas e o modelo de privilégios sudo. Ao fim deste artigo consegues aprovisionar um utilizador completo — conta, grupo, diretoria home, shell, palavra-passe e permissões sudo — sem recorrer a interfaces gráficas.
Neste artigo
- Ficheiros de Configuração: /etc/passwd, /etc/shadow, /etc/group
- Criar Utilizadores: useradd e adduser
- Modificar Utilizadores: usermod
- Grupos: groupadd, groupmod, groupdel
- Definir e Alterar Palavras-passe: passwd
- sudo e /etc/sudoers: Delegar Privilégios
- Políticas de Acesso: chage e Bloqueio de Contas
- Erros Comuns
- Checklist de Administração de Utilizadores
Ficheiros de Configuração: /etc/passwd, /etc/shadow, /etc/group
Tudo o que o Linux sabe sobre contas vive em ficheiros de texto sob /etc. Compreender a sua estrutura é pré-requisito para usar useradd, usermod e sudo com confiança.
/etc/passwd — a base de identidade
Apesar do nome, este ficheiro não guarda palavras-passe (são hashes em /etc/shadow). Cada linha representa uma conta, com sete campos separados por dois-pontos (man 5 passwd):
mario:x:1001:1001:Mario Silva:/home/mario:/bin/bash
^ ^ ^ ^ ^ ^ ^
| | | | | | └─ 7. Shell de login
| | | | | └─ 6. Diretoria home
| | | | └─ 5. GECOS (nome completo, contacto)
| | | └─ 4. GID (grupo primário)
| | └─ 3. UID (identificador único)
| └─ 2. Password placeholder (x = está em /etc/shadow)
└─ 1. Nome de login
x quando o sistema usa shadow passwords (padrão em todas as distribuições modernas). Se contiver * ou !, a conta está bloqueada. Um * em contas de sistema (daemon, nobody) indica login desativado.
/etc/shadow — os hashes das palavras-passe
Apenas legível por root (permissões 640 ou 000), guarda o hash criptográfico e as políticas de expiração:
mario:$y$j9T$...$/:19000:0:99999:7:::
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | └─ 9. Data de expiração da conta
| | | | | | └─ 8. Aviso prévio (dias)
| | | | | └─ 7. Período de inatividade
| | | | └─ 6. Máxima validade (dias)
| | | └─ 5. Mínima validade (dias)
| | └─ 4. Data da última alteração (dias desde 1970-01-01)
| └─ 3. Hash da palavra-passe ($y$ = yescrypt, $6$ = SHA-512)
└─ 2. Nome de login
/etc/group e /etc/gshadow
/etc/group define grupos e os seus membros. Cada linha tem quatro campos:
devops:x:1002:mario,ana,joao
^ ^ ^ ^
| | | └─ 4. Lista de membros (separados por vírgula)
| | └─ 3. GID
| └─ 2. Password de grupo (raramente usada; x = em /etc/gshadow)
└─ 1. Nome do grupo
/etc/gshadow é o equivalente ao shadow para grupos — guarda hashes de password de grupo e identifica administradores de grupo. Raramente é editado diretamente.
Criar Utilizadores: useradd e adduser
Existem duas ferramentas para criar contas. useradd é o comando POSIX de baixo nível, presente em todas as distribuições (man 8 useradd). adduser é um script Perl de alto nível, disponível em Debian/Ubuntu, que automatiza passos extra (criar home, copiar skeleton, pedir palavra-passe interactivamente).
useradd — abordagem universal
# Criar utilizador com home, shell bash e grupo primário próprio
sudo useradd -m -s /bin/bash mario
# -m cria a diretoria home (/home/mario)
# -s define o shell de login
# Por defeito, cria também um grupo primário com o mesmo nome (user private group)
# Especificar UID, GID, GECOS e grupos suplementares
sudo useradd -m -u 1500 -g developers -G docker,sudo \
-c "Mario Silva,IT,+351210000000" -s /bin/bash mario
# Usar shell nologin para contas de serviço
sudo useradd -r -s /usr/sbin/nologin -d /opt/app appsvc
useradd sem -m não cria a diretoria home. Em RHEL/CentOS o useradd sem -m cria a conta mas o utilizador fica sem home — ao fazer login aparece a mensagem “No directory, logging in with HOME=/”. Em Debian, o comportamento depende de /etc/login.defs (CREATE_HOME).
adduser — atalho interactivo (Debian/Ubuntu)
# Debian/Ubuntu: cria home, pergunta palavra-passe, copia /etc/skel
sudo adduser mario
# Fedora/RHEL não tem adduser (useradd é o único)
# Arch Linux: useradd é o padrão; adduser está no AUR
Em Debian, adduser é preferível para utilizadores interactivos porque automatiza a configuração completa. Em RHEL/Fedora, useradd -m é a única opção nativa.
Skeleton: /etc/skel
Quando usamos -m, o useradd copia o conteúdo de /etc/skel (skeleton) para a nova home. É aqui que colocamos ficheiros .bashrc, .profile, .vimrc padronizados para que cada novo utilizador herde a configuração:
# Personalizar /etc/skel antes de criar utilizadores
sudo mkdir -p /etc/skel/.config
sudo tee /etc/skel/.bashrc <<'EOF'
# Alias padrão para todos os novos utilizadores
alias ll='ls -alF'
export EDITOR=nano
EOF
Modificar Utilizadores: usermod
O usermod (man 8 usermod) altera praticamente qualquer campo de uma conta existente. As operações mais comuns:
# Adicionar a grupos suplementares (preserva os existentes)
sudo usermod -aG docker,wheel mario
# Trocar o shell de login
sudo usermod -s /bin/zsh mario
# Mudar o nome de login (cuidado: não renomeia a home)
sudo usermod -l mario_silva mario
sudo usermod -d /home/mario_silva -m mario_silva # -m move a home
# Alterar o GID primário
sudo usermod -g developers mario
# Bloquear e desbloquear conta
sudo usermod -L mario # adiciona ! ao hash → login impossível
sudo usermod -U mario # remove o !
# Definir data de expiração da conta (formato ISO)
sudo usermod -e 2026-12-31 contractor
-aG é adicionar (append). Se usares apenas -G docker,wheel sem o -a, substituis a lista de grupos suplementares — o utilizador perde todos os outros. Este é o erro mais comum na administração de utilizadores.
Aplicar alterações de grupo sem reiniciar sessão
Após usermod -aG, o utilizador precisa de iniciar nova sessão para herdar os grupos. Para aplicar imediatamente sem fechar sessão:
# Verificar grupos actuais da sessão
id
groups
# Iniciar novo shell com os grupos actualizados
newgrp docker
# Ou usar sg para executar um único comando com o novo grupo
sg docker -c "docker ps"
Grupos: groupadd, groupmod, groupdel
Grupos permitem gerir permissões colectivas. Cada utilizador tem um grupo primário (definido em /etc/passwd, campo 4) e pode pertencer a múltiplos grupos suplementares (listados em /etc/group). Em sistemas modernos, cada utilizador recebe um user private group (UPG) com o mesmo nome — simplifica a partilha de ficheiros.
# Criar grupo
sudo groupadd developers
sudo groupadd -r sysbackup # -r cria grupo de sistema (GID < 1000)
# Especificar GID manualmente
sudo groupadd -g 1050 qa
# Modificar nome ou GID
sudo groupmod -n devs developers
sudo groupmod -g 1100 devs
# Eliminar grupo (o utilizador cujo grupo primário é este
# fica órfão — corrigir antes com usermod -g)
sudo groupdel devs
# Listar membros de um grupo
getent group docker
groupmems -g docker -l # lista membros
Grupos especiais comuns
| Grupo | Distribuição | Função |
|---|---|---|
wheel |
RHEL/Fedora/Arch | Permite su - / sudo |
sudo |
Debian/Ubuntu | Permite sudo |
docker |
Todas | Acesso ao daemon Docker sem sudo |
ssh / sshusers |
Todas (configurável) | Permitido fazer login via SSH (AllowGroups em sshd_config) |
www-data / nginx / apache |
Todas | Utilizador/grupo do servidor web |
Definir e Alterar Palavras-passe: passwd
Após useradd, a conta está bloqueada até receber uma palavra-passe. O comando passwd resolve isso e faz muito mais:
# Definir palavra-passe (root pode definir para qualquer utilizador)
sudo passwd mario
# Próprio utilizador altera a sua (pede a actual primeiro)
passwd
# Bloquear / desbloquear
sudo passwd -l mario # lock (equivalente a usermod -L)
sudo passwd -u mario # unlock
# Forçar alteração no próximo login
sudo passwd -e mario # expiry imediato
# Ver status
sudo passwd -S mario
# mario P 07/21/2026 0 99999 7 -1
# ^ P=Password válida, NP=sem password, L=Locked
# Eliminar palavra-passe (login sem password — perigoso)
sudo passwd -d mario
passwd -e para forçar o utilizador a definir a sua no primeiro login, ou integra o aprovisionamento com chaves SSH e um sistema de identidade centralizado (LDAP, FreeIPA, Entra ID).
Algoritmos de hash: yescrypt, SHA-512, bcrypt
O algoritmo usado para gerar o hash é configurável em /etc/pam.d/common-password (Debian) ou /etc/security/pwquality.conf + /etc/pam.d/system-auth (RHEL). Os prefixos no /etc/shadow identificam o algoritmo:
| Prefixo | Algoritmo | Distribuição típica |
|---|---|---|
$y$ |
yescrypt | Fedora 36+, Arch, Debian 12+ (padrão atual) |
$6$ |
SHA-512 crypt | RHEL 8/9, Ubuntu 20.04/22.04 |
$2b$ |
bcrypt | Algumas distros se configurado explicitamente |
$1$ |
MD5 crypt | Obsoleto — não usar |
sudo e /etc/sudoers: Delegar Privilégios
O sudo permite executar comandos com privilégios de outro utilizador (tipicamente root) de forma controlada e auditável. É preferível a su - porque regista quem fez o quê em /var/log/auth.log (Debian) ou /var/log/secure (RHEL) e permite delegar apenas comandos específicos (Arch Wiki: Sudo, man 5 sudoers).
Instalação
# Debian/Ubuntu
sudo apt update && sudo apt install sudo
# RHEL/Fedora/Alma/Rocky
sudo dnf install sudo
# Adicionar utilizador ao grupo sudo (Debian) ou wheel (RHEL/Arch)
sudo usermod -aG sudo mario # Debian/Ubuntu
sudo usermod -aG wheel mario # RHEL/Fedora/Arch
Editar sudoers: sempre visudo
O ficheiro /etc/sudoers define as regras. Nunca o edites diretamente com vi ou nano — um erro de sintaxe pode bloquear todos os acessos root. Usa sempre visudo, que valida a sintaxe antes de gravar:
sudo visudo
# Abre /etc/sudoers num editor; ao gravar, valida sintaxe
# Se houver erro: "visudo: >> /etc/sudoers: syntax error at line X"
# e pergunta se queres reeditar (R) ou sair sem gravar (Q)
# Especificar editor
sudo EDITOR=nano visudo
Sintaxe das regras
# Formato: user host=(run_as:group) comandos
# Exemplos:
# Mario pode executar tudo como root, com password
mario ALL=(ALL:ALL) ALL
# Ana pode reiniciar o Apache sem password
ana ALL=(root) NOPASSWD: /usr/bin/systemctl restart apache2
# Grupo devops pode gerir containers Docker
%devops ALL=(root) NOPASSWD: /usr/bin/docker, /usr/bin/docker-compose
# Utilizador pode parar/iniciar/reiniciar serviços específicos
joao ALL=(root) /usr/bin/systemctl restart nginx, \
/usr/bin/systemctl restart mysql
Drop-in files em /etc/sudoers.d/
Em vez de editar /etc/sudoers, a melhor prática é criar ficheiros individuais em /etc/sudoers.d/. O /etc/sudoers inclui este diretório com a diretiva @includedir /etc/sudoers.d:
# Criar drop-in file para o utilizador mario
sudo visudo -f /etc/sudoers.d/mario
# Conteúdo do ficheiro:
mario ALL=(ALL) ALL
# Permissões devem ser 0440
sudo chmod 0440 /etc/sudoers.d/mario
# Validar tudo
sudo visudo -c
NOPASSWD: ALL em servidores de produção. Permite escalar privilégios sem qualquer barreira — se a conta do utilizador for comprometida, o atacante obtém root instantaneamente. Reserva NOPASSWD para contas de serviço em pipelines CI/CD, isoladas e sem shell de login.
Defaults importantes
# Em /etc/sudoers ou /etc/sudoers.d/00-defaults
# Exigir password (default)
Defaults:mario !authenticate # desativa password para mario (perigoso)
# Timestamp de sessão: 15 min é o default
Defaults timestamp_timeout=15 # minutos antes de pedir password novamente
# Tentativas antes de bloquear
Defaults passwd_tries=3
# Registar comandos sudo via syslog
Defaults logfile="/var/log/sudo.log"
# Mostrar sempre o comando completo no prompt
Defaults !rootpw # não permitir password de root em sudo
Políticas de Acesso: chage e Bloqueio de Contas
Para cumprir políticas de segurança (ISO 27001, NIS2, CIS Benchmarks), é preciso impor expiração de palavras-passe, bloqueio após tentativas falhadas e desativação de contas inativas. O chage (change age) gere o ciclo de vida das palavras-passe:
# Ver política actual de mario
sudo chage -l mario
# Last password change : Jul 21, 2026
# Password expires : 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
# Impor: mín 1 dia, máx 90 dias, aviso 7 dias antes
sudo chage -m 1 -M 90 -W 7 mario
# Forçar alteração no próximo login
sudo chage -d 0 mario
# Conta expira em data específica
sudo chage -E 2026-12-31 contractor
# Definir tudo de uma vez (modo interactivo)
sudo chage mario
Políticas globais em /etc/login.defs
O /etc/login.defs define valores por defeito aplicados a novos utilizadores. Alterar não afecta contas existentes — usa chage para essas:
# /etc/login.defs (extrato)
PASS_MAX_DAYS 90 # validade máxima da palavra-passe
PASS_MIN_DAYS 1 # dias mínimos antes de poder alterar
PASS_MIN_LEN 12 # comprimento mínimo
PASS_WARN_AGE 7 # aviso prévio (dias)
UID_MIN 1000 # UID mínimo para utilizadores normais
UID_MAX 60000
GID_MIN 1000
GID_MAX 60000
CREATE_HOME yes # Debian: criar home por defeito no useradd
Bloqueio por tentativas falhadas com faillock / pam_faillock
O módulo PAM pam_faillock bloqueia contas após N tentativas falhadas, substituindo o antigo pam_tally2 (removido em distribuições recentes):
# Debian/Ubuntu: /etc/pam.d/common-auth
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth required pam_faillock.so authfail deny=5 unlock_time=900
# RHEL/Fedora: /etc/security/faillock.conf
deny = 5
unlock_time = 900 # 15 minutos
fail_interval = 900
# Ver tentativas falhadas
sudo faillock --user mario
# Desbloquear
sudo faillock --user mario --reset
Qualidade de palavras-passe com pam_pwquality
# Debian/Ubuntu
sudo apt install libpam-pwquality
# RHEL/Fedora (já incluído)
# Configuração em /etc/security/pwquality.conf
minlen = 12 # comprimento mínimo
minclass = 4 # 4 classes: minúscula, maiúscula, dígito, símbolo
maxrepeat = 3 # máximo de caracteres repetidos consecutivos
difok = 5 # mínimo de caracteres diferentes da password anterior
enforce_for_root # aplicar regras também a root
Erros Comuns
Estes são os erros mais frequentes na gestão de utilizadores e grupos em Linux. A maioria tem causa trivial mas sintoma confuso.
| Problema | Causa | Solução |
|---|---|---|
useradd sem -m não cria home |
Por defeito, useradd não cria /home/user (a menos que CREATE_HOME=yes em Debian) |
Usar sempre useradd -m ou adduser (Debian). Para criar home depois: sudo mkhomedir_helper mario ou sudo cp -r /etc/skel /home/mario && sudo chown -R mario:mario /home/mario |
Utilizador não consegue fazer sudo mesmo após usermod -aG sudo |
Grupos só são aplicados em nova sessão; a sessão actual mantém os grupos antigos | Fazer logout e login, ou newgrp sudo. Verificar com groups |
user is not in the sudoers file |
O utilizador não está em sudo (Debian) / wheel (RHEL), ou o grupo não está activo no /etc/sudoers |
Confirmar %sudo ALL=(ALL:ALL) ALL descomentado em /etc/sudoers. Em RHEL, %wheel. Entrar como root: su - e corrigir |
usermod -G sem -a removeu grupos |
-G sem -a substitui a lista de grupos suplementares |
Re-adicionar com usermod -aG grupo1,grupo2 user. Sempre usar -aG para adicionar |
Erro de sintaxe no /etc/sudoers bloqueia tudo |
Edição direta do ficheiro sem validação | Entrar em modo de recuperação (single user / GRUB init=/bin/bash) e usar visudo -c para localizar o erro. No futuro, sempre visudo |
| Conta criada mas login “Permission denied” | Sem palavra-passe definida (conta bloqueada, ! no shadow) |
sudo passwd user ou sudo usermod -U user para desbloquear |
| UID duplicado ao criar utilizador | useradd -u com UID já existente |
Linux permite UIDs duplicados mas é má prática. Usar -o para forçar, ou escolher outro UID. Verificar com getent passwd | awk -F: '{print $3}' | sort -n | uniq -d |
Checklist de Administração de Utilizadores
Passos para aprovisionar e configurar um utilizador completo de forma segura, aplicável a qualquer distribuição:
- Verificar IDs disponíveis:
getent passwd | awk -F: '{print $3}' | sort -n | tail— confirmar que o próximo UID não colide - Criar a conta com home e shell:
sudo useradd -m -s /bin/bash -c "Nome Completo" mario(ouadduser marioem Debian) - Definir palavra-passe:
sudo passwd marioe forçar alteração no primeiro login comsudo passwd -e marioousudo chage -d 0 mario - Adicionar a grupos suplementares:
sudo usermod -aG sudo,docker mario(em RHEL/Arch substituirsudoporwheel) - Configurar chave SSH pública:
sudo -u mario mkdir -p ~mario/.ssh && sudo tee -a ~mario/.ssh/authorized_keys < chave.pub && sudo chmod 700 ~mario/.ssh && sudo chmod 600 ~mario/.ssh/authorized_keys - Aplicar políticas de password:
sudo chage -m 1 -M 90 -W 7 mario(mín 1 dia, máx 90, aviso 7 dias) - Delegar sudo específico (se aplicável):
sudo visudo -f /etc/sudoers.d/mariocom regras granulares — nuncaNOPASSWD: ALLem produção - Verificar:
id mario && getent passwd mario && sudo chage -l mario && sudo visudo -c
usermod -G (sem -a), userdel -r (remove home), visudo mal aplicado e groupdel de grupo primário em uso podem deixar contas inutilizáveis. Testar em VM de staging antes de aplicar em servidores de produção — configuração incorrecta de sudoers pode bloquear acesso administrativo total.
Eliminar utilizadores
# Remover conta mas manter a home
sudo userdel mario
# Remover conta e apagar a home + spool de mail
sudo userdel -r mario
# Forçar remoção mesmo com processos activos (perigoso)
sudo userdel -f mario
# Arquivar home antes de remover
sudo tar czf /archive/mario-home-$(date +%F).tar.gz /home/mario
sudo userdel -r mario
Artigos Relacionados
- Dia 1: Terminal, Shell e Comandos Essenciais — base necessária para executar todos os comandos deste artigo; rever se
sudo, redirecionamento e|ainda não são naturais - Dia 2: Sistema de Ficheiros Linux — FHS, Mounts e Links — as permissões (
chown,chmod) que vimos no Dia 2 são a contraparte directa dos grupos criados hoje: um utilizador só acede a um ficheiro se as permissões e o grupo primário/suplementar o permitirem
No Dia 4 entraremos nas permissões de ficheiros com chmod, chown, chgrp e os bits especiais (SUID, SGID, sticky bit) — onde a gestão de utilizadores e grupos de hoje encontra a estrutura de ficheiros do Dia 2.