Usuários e Grupos
root, sudo e arquivos de configuração, identidade e controle de acesso no sistema.
root vs usuário comum: o princípio do menor privilégio
O usuário root é como o administrador geral de um prédio corporativo — tem chave de todos os andares, pode acessar qualquer sala, modificar a estrutura elétrica e hidráulica. Usuários comuns são funcionários com crachá de acesso limitado ao próprio andar. sudo é como pedir permissão temporária ao administrador para uma tarefa específica — com registro no livro de ocorrências.
O root tem UID 0 — e é isso que importa, não o nome. O kernel verifica o UID de quem faz uma chamada de sistema: se for 0, quase todas as verificações de permissão são ignoradas. Root pode ler qualquer arquivo, matar qualquer processo, montar qualquer dispositivo.
Rodar como root o tempo todo é perigoso por uma razão simples: um typo pode destruir o sistema.
-
rm -rf /tmp/lixo— limpa um diretório temporário -
rm -rf / tmp/lixo— apaga a raiz inteira do sistema (espaço entre / e tmp)
O princípio do menor privilégio diz que cada processo e usuário deve ter apenas as permissões mínimas necessárias para sua função. Isso limita o dano quando algo dá errado — seja um erro humano, um bug ou uma invasão.
UIDs especiais:
- UID 0 = root
-
UID 1–999 = contas de sistema (
www-data,nobody,systemd-network) - UID 1000+ = usuários humanos normais
# Ver seu UID e grupos
$ id
uid=1000(joao) gid=1000(joao) grupos=1000(joao),4(adm),27(sudo),999(docker)
# O UID é o que importa, não o nome
$ id root
uid=0(root) gid=0(root) grupos=0(root)
# Ver todos os usuários com UID abaixo de 1000 (contas de sistema)
$ awk -F: '$3 < 1000 {print $1, $3}' /etc/passwd | head -10
root 0
daemon 1
bin 2
sys 3
www-data 33
nobody 65534
# Qual usuário está rodando um processo específico?
$ ps aux | grep nginx
www-data 1234 ... nginx: worker process
root 1100 ... nginx: master process
Rodar tudo como root — comum em ambientes de desenvolvimento por "praticidade". Em produção é um risco grave: qualquer vulnerabilidade em uma aplicação rodando como root compromete o sistema inteiro.
Renomear root acha que remove os poderes — o UID 0 é o que confere os poderes, não o nome "root". Renomear para "admin" mantém todos os privilégios.
- UID 0 = poderes totais — o nome "root" é convenção, o UID é o que importa
- UID 1–999 = contas de sistema; UID 1000+ = usuários humanos
- Princípio do menor privilégio: use só o que precisa — limita danos
- Um typo como root pode destruir o sistema inteiro — nunca opere como root por padrão
sudo vs su: como elevar privilégios com segurança
su (substitute user) — abre um novo shell com
outro usuário. Requer a
senha do usuário alvo (normalmente root).
su - (com o traço) faz login completo como root,
carregando o ambiente de root (PATH, variáveis, diretório home).
Sem o traço, você entra como root mas mantém o ambiente do usuário
anterior.
sudo (superuser do) — executa um único comando
com privilégios elevados. Usa a senha do usuário atual,
não de root. Configurado em /etc/sudoers (edite com
visudo para validação automática). Cada comando sudo
é registrado em /var/log/auth.log.
Por que sudo é superior ao su para administração do dia a dia:
- Auditoria — cada comando aparece no log com usuário, hora e comando completo
- Granularidade — você pode permitir apenas comandos específicos para cada usuário
- Sem senha de root — em distros como Ubuntu, o root nem tem senha definida por padrão
- Timeout — após alguns minutos sem uso, pede a senha novamente
# su — abre shell como root (requer senha do root)
$ su
Password:
root@servidor:~#
# su - (login completo como root, ambiente de root)
$ su -
Password:
root@servidor:/root#
# su - usuario (trocar para outro usuário)
$ su - deploy
# sudo — um comando como root (requer sua própria senha)
$ sudo apt update
[sudo] senha para joao:
# sudo -i — shell root interativo (equivalente a su -)
$ sudo -i
root@servidor:~#
# sudo -u usuario comando — executar como outro usuário
$ sudo -u www-data ls /var/www/html
# O atalho mais útil: esqueceu o sudo?
$ apt update
E: Não foi possível abrir o arquivo de bloqueio...
$ sudo !! # re-executa último comando com sudo
# Ver log de sudo
$ sudo grep sudo /var/log/auth.log | tail -5
May 20 10:30:15 servidor sudo: joao : TTY=pts/0 ; PWD=/home/joao ; USER=root ; COMMAND=/usr/bin/apt update
# /etc/sudoers — configuração (sempre edite com visudo)
$ sudo visudo
# joao ALL=(ALL:ALL) ALL → joao pode tudo
# deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx → sem senha para esse comando
Editar /etc/sudoers diretamente — nunca edite com
nano/vim direto. Um erro de sintaxe pode tornar o sudo
inutilizável. Sempre use visudo, que valida antes de
salvar.
NOPASSWD para tudo —
usuario ALL=(ALL) NOPASSWD: ALL elimina a proteção do
sudo. Use NOPASSWD apenas para comandos específicos e necessários.
-
su -: shell completo como root — requer senha do root -
sudo comando: um comando com privilégios — requer sua senha -
sudo é auditável: tudo vai para
/var/log/auth.log sudo !!: re-executa último comando com sudo-
Editar sudoers: sempre com
visudo, nunca diretamente
/etc/passwd e /etc/shadow: entendendo os arquivos
/etc/passwd — legível por todos os usuários.
Contém informações básicas de cada conta. Formato: 7 campos
separados por :
usuario:x:UID:GID:GECOS:home:shell
- usuario: nome de login
- x: campo de senha — o 'x' indica que a senha real está em /etc/shadow
- UID: User ID numérico
- GID: Group ID primário
- GECOS: campo informacional (nome completo, telefone). Pode estar vazio.
- home: diretório home
-
shell: shell de login.
/bin/bashpara humanos;/usr/sbin/nologinou/bin/falsepara contas de serviço.
/etc/shadow — legível apenas por root (e pelo grupo shadow). Contém os hashes de senha e políticas de expiração.
Formato:
usuario:$tipo$salt$hash:último_change:min:max:warn:inactive:expire
$6$= SHA-512 (seguro — padrão moderno)$y$= yescrypt (mais moderno que SHA-512)$1$= MD5 (obsoleto e inseguro)- Campos numéricos: dias desde epoch (01/01/1970) para última mudança, mínimo de dias entre mudanças, máximo, aviso antes de expirar, dias de graça, data de expiração.
# Ver entrada de um usuário no /etc/passwd
$ grep joao /etc/passwd
joao:x:1000:1000:João Silva,,,:/home/joao:/bin/bash
# Campos: login:senha(x):UID:GID:GECOS:home:shell
# Contas de serviço — shell nologin/false
$ grep -E "www-data|nobody|mysql" /etc/passwd
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
mysql:x:125:131:MySQL Server,,,:/var/lib/mysql:/bin/false
# /etc/shadow — apenas root pode ler
$ sudo grep joao /etc/shadow
joao:$6$salt$hashmuito longo aqui...:19500:0:99999:7:::
# Campos:
# $6$ = SHA-512
# 19500 = dias desde epoch da última mudança de senha
# 0 = mínimo 0 dias entre mudanças
# 99999 = senha válida por ~274 anos (sem expiração)
# 7 = aviso 7 dias antes de expirar
# Ver informações de expiração de senha
$ sudo chage -l joao
Last password change : Mai 20, 2026
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days : 0
Maximum number of days : 99999
Number of days of warning : 7
Por que /etc/passwd existe em dois arquivos? Historicamente, o hash da senha ficava diretamente em /etc/passwd — legível por todos. Qualquer usuário local podia fazer ataques de dicionário offline. O /etc/shadow foi criado para separar as informações públicas (UID, shell) das sensíveis (senha), com permissões mais restritivas.
- /etc/passwd: login:x:UID:GID:GECOS:home:shell — legível por todos
- O 'x' em passwd significa que o hash está em /etc/shadow
- /etc/shadow: legível só por root — contém hashes e política de senha
-
Shell
/usr/sbin/nologinou/bin/false= conta de serviço (sem login) -
$6$= SHA-512 (seguro);$1$= MD5 (inseguro, obsoleto)
/etc/group e UIDs/GIDs especiais
/etc/group — define os grupos do sistema.
Formato: nome_grupo:x:GID:membros
- nome_grupo: nome do grupo
- x: campo de senha do grupo (raramente usado)
- GID: Group ID numérico
- membros: lista de usuários separados por vírgula (membros suplementares)
Um usuário tem um grupo primário (definido em /etc/passwd, GID) e pode ter múltiplos grupos suplementares (definidos em /etc/group). Novos arquivos criados pelo usuário herdam o grupo primário.
Grupos importantes no sistema:
-
sudo/wheel: membros podem usar sudo docker: membros podem usar o Docker sem sudoadm: membros podem ler logs do sistemawww-data: grupo do servidor webshadow: acesso ao /etc/shadow
# Ver grupos do usuário atual
$ groups
joao adm cdrom sudo docker
$ id joao
uid=1000(joao) gid=1000(joao) grupos=1000(joao),4(adm),24(cdrom),27(sudo),999(docker)
# Ver membros de um grupo
$ grep docker /etc/group
docker:x:999:joao,maria,deploy
# Ver grupos de um arquivo
$ ls -la /var/log/syslog
-rw-r----- 1 syslog adm 15234 Mai 20 10:00 /var/log/syslog
# Grupo adm pode ler logs; outros usuários não
# Verificar se você tem acesso (sem tentar abrir)
$ id | grep adm # se aparecer, você tem acesso
# Grupos suplementares têm efeito imediato para acesso a arquivos,
# mas um novo grupo adicionado via usermod só tem efeito
# após logout/login (a sessão atual mantém o token antigo)
$ newgrp docker # alternativa: ativa o grupo na sessão atual
- /etc/group: nome:x:GID:membros
- Grupo primário: definido em /etc/passwd — herdado por novos arquivos
- Grupos suplementares: definem acesso adicional (docker, sudo, adm)
-
groupslista grupos do usuário atual;id usuariopara outro usuário -
Novo grupo via usermod só tem efeito após logout/login (ou
newgrp)
Criando e gerenciando usuários
Os comandos principais para gerenciar usuários no Linux são
useradd, usermod, userdel,
passwd e groupadd. Todos requerem
privilégios de root.
useradd — cria usuário. Flags importantes:
-m: cria o diretório home-s /bin/bash: define o shell-c "Nome Completo": campo GECOS-
-G grupo1,grupo2: grupos suplementares iniciais
usermod — modifica usuário existente. O flag mais importante:
-
-aG grupo: adiciona ao grupo sem remover dos grupos existentes. O-a(append) é crítico — sem ele,-Gsubstituiria todos os grupos suplementares. -s /bin/bash: muda o shell-l novo_nome: renomeia o usuário-
-L/-U: bloqueia / desbloqueia a conta
userdel — remove usuário. -r também
remove o diretório home e mail spool.
# Criar usuário completo
$ sudo useradd -m -s /bin/bash -c "João Silva" joao
$ sudo passwd joao # definir senha interativamente
# Verificar criação
$ grep joao /etc/passwd
joao:x:1000:1000:João Silva:/home/joao:/bin/bash
$ ls /home/joao # home criado com -m
# Adicionar a grupos (flag -a é obrigatório para não perder grupos)
$ sudo usermod -aG docker joao
$ sudo usermod -aG sudo joao
$ id joao
uid=1000(joao) gid=1000(joao) grupos=1000(joao),27(sudo),999(docker)
# Criar grupo e adicionar usuário
$ sudo groupadd devs
$ sudo usermod -aG devs joao
# Bloquear/desbloquear conta
$ sudo usermod -L joao # bloqueia (adiciona ! na senha no shadow)
$ sudo usermod -U joao # desbloqueia
# Logar como outro usuário
$ su - joao
$ sudo -u joao ls /home/joao # um comando como joao
# Deletar usuário (mantém home)
$ sudo userdel joao
# Deletar usuário E diretório home
$ sudo userdel -r joao
# Ver últimos logins
$ last | head -10
joao pts/0 10.0.0.5 Wed May 20 10:30 still logged in
joao pts/1 10.0.0.5 Tue May 19 15:20 - 17:45 (02:25)
$ lastlog | grep -v Never | head -10
Username Port From Latest
root tty1 Wed May 20 09:00:00
joao pts/0 10.0.0.5 Wed May 20 10:30:15
usermod -G docker joao (sem -a) — substitui TODOS
os grupos suplementares por apenas "docker". Se joao estava em
sudo, adm e docker, após o comando ele fica somente em docker —
perde acesso ao sudo. Sempre use -aG.
useradd vs adduser — em sistemas Debian/Ubuntu,
adduser (com duplo d) é um script de alto nível mais
amigável que faz as perguntas interativamente.
useradd é o comando de baixo nível, disponível em
todas as distros — use em scripts.
Novo grupo não tem efeito na sessão atual — após
usermod -aG docker joao, joao precisa fazer logout e
login novamente. Para evitar isso na sessão atual:
newgrp docker ou su - joao.
-
useradd -m -s /bin/bash -c "Nome" usuario— criação completa -
usermod -aG grupo usuario— adicionar a grupo (o -a é obrigatório) userdel -r usuario— remove usuário E homepasswd usuario— define/altera senha-
Novo grupo só tem efeito após logout/login (ou
newgrp) -
lastelastlogpara auditoria de logins