Intermediário Fundamental Progresso 0%

Usuários e Grupos

root, sudo e arquivos de configuração, identidade e controle de acesso no sistema.

01. Identidade

root vs usuário comum: o princípio do menor privilégio

Analogia: Prédio corporativo

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.

Explicação

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
Exemplo Concreto
# 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
Erros comuns

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.

O que você precisa guardar
  • 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
02. Privilégios

sudo vs su: como elevar privilégios com segurança

Explicação

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
Exemplo Concreto
# 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
Erros comuns

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 tudousuario ALL=(ALL) NOPASSWD: ALL elimina a proteção do sudo. Use NOPASSWD apenas para comandos específicos e necessários.

O que você precisa guardar
  • 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
03. Arquivos

/etc/passwd e /etc/shadow: entendendo os arquivos

Explicação

/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/bash para humanos; /usr/sbin/nologin ou /bin/false para 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.
Exemplo Concreto
# 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
ℹ️ Saiba mais

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.

O que você precisa guardar
  • /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/nologin ou /bin/false = conta de serviço (sem login)
  • $6$ = SHA-512 (seguro); $1$ = MD5 (inseguro, obsoleto)
04. Grupos

/etc/group e UIDs/GIDs especiais

Explicação

/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 sudo
  • adm: membros podem ler logs do sistema
  • www-data: grupo do servidor web
  • shadow: acesso ao /etc/shadow
Exemplo Concreto
# 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
O que você precisa guardar
  • /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)
  • groups lista grupos do usuário atual; id usuario para outro usuário
  • Novo grupo via usermod só tem efeito após logout/login (ou newgrp)
05. Gerência

Criando e gerenciando usuários

Explicação

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, -G substituiria 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.

Exemplo Concreto
# 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
Erros comuns

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.

O que você precisa guardar
  • 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 home
  • passwd usuario — define/altera senha
  • Novo grupo só tem efeito após logout/login (ou newgrp)
  • last e lastlog para auditoria de logins

🃏 Flashcards

📝 Quiz: Módulo 06