Módulo 15 – BÔNUS: Usuários de sistema vs usuários normais no Linux
+==============================================================================+
| MÓDULO 15 (BÔNUS): CONTAS DE SISTEMA vs CONTAS HUMANAS |
| Duração estimada: 1-2 horas | Nível: Intermediário |
+==============================================================================+
Índice
- Introdução
- A convenção dos UID no Linux
- Usuários de sistema (service accounts)
- Usuários normais (contas humanas)
- Criar um usuário de sistema com
useradd -r - Diferença entre
-re-snouseradd - Exemplos concretos de contas de sistema
- Ligação com o Módulo 14 – As contas
wikijs_* - Comandos para listar e identificar usuários
- Boas práticas em produção
- Esquema resumo
- Exercícios práticos
Introdução
No Linux, nem todas as contas de usuário são iguais. Existem duas grandes categorias:
| Categoria | UID típico | Papel | Exemplo |
|---|---|---|---|
| Usuário de sistema (service account) | < 1000 | Executar serviços/demons | www-data, mysql, nobody |
| Usuário normal (conta humana) | ≥ 1000 | Pessoa física que acessa o sistema | alice, bob, etudiant |
Isto não é uma regra absoluta: é uma convenção que depende da distribuição e da configuração do /etc/login.defs.
A convenção dos UID no Linux
O que é um UID?
O UID (User IDentifier) é um número único atribuído a cada conta de usuário. É esse número (e não o nome) que o kernel do Linux utiliza para gerenciar permissões.
Faixas de UID
┌──────────────────────────────────────────────────────────────────┐
│ FAIXAS DE UID NO LINUX │
├──────────┬───────────────────────────────────────────────────────┤
│ UID 0 │ root (superusuário) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1-999 │ Contas de SISTEMA / serviços / demons │
│ │ (www-data, mysql, sshd, daemon, nobody, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 1000+ │ Contas NORMAIS / humanas │
│ │ (alice, bob, etudiant, etc.) │
├──────────┼───────────────────────────────────────────────────────┤
│ 65534 │ nobody (usuário sem privilégios) │
└──────────┴───────────────────────────────────────────────────────┘
Onde essas faixas são definidas?
O arquivo /etc/login.defs define as faixas oficiais no seu sistema:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
Resultado típico no Ubuntu/Debian:
SYS_UID_MIN 201
SYS_UID_MAX 999
UID_MIN 1000
UID_MAX 60000
Interpretação:
- SYS_UID_MIN (201) → SYS_UID_MAX (999) : faixa reservada para contas de sistema
- UID_MIN (1000) → UID_MAX (60000) : faixa para contas humanas
- UID 0 : sempre
root - UID 1-200 : geralmente reservados para contas de sistema críticas (dependendo da distribuição)
Usuários de sistema (service accounts)
Definição
Um usuário de sistema (ou service account) é uma conta criada para executar um serviço, demon ou componente do sistema. Não é destinada a um humano.
Características típicas
| Característica | Valor típico |
|---|---|
| UID | < 1000 (geralmente entre 1 e 999) |
| Shell | /usr/sbin/nologin ou /bin/false |
| Home | Sem home, ou um diretório técnico (ex: /var/www) |
| Senha | Desativada (bloqueada) |
| Conexão interativa | Impossível (ou não desejada) |
Por que usuários de sistema?
- Princípio do menor privilégio: cada serviço roda com permissões limitadas, não como
root - Isolamento: se um serviço for comprometido, o atacante só terá os direitos dessa conta
- Rastreabilidade: é possível saber qual serviço realizou qual ação nos logs
- Segurança: evita-se conexão interativa (shell
nologin)
Exemplos comuns
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
mysql:x:114:120:MySQL Server,,,:/nonexistent:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
root (UID 0) é um caso especial: é uma conta de sistema com shell interativo e privilégios totais.
Usuários normais (contas humanas)
Definição
Um usuário normal é uma conta criada para uma pessoa física que acessa o sistema.
Características típicas
| Característica | Valor típico |
|---|---|
| UID | ≥ 1000 |
| Shell | /bin/bash ou /bin/sh |
| Home | /home/<nome_usuario> |
| Senha | Definida (ativa) |
| Conexão interativa | Sim |
Como criar?
sudo useradd -m -s /bin/bash alice
id alice
O -m cria o diretório home (/home/alice) e o -s /bin/bash fornece um shell interativo.
Criar um usuário de sistema com useradd -r
O parâmetro -r (system account)
O parâmetro -r do useradd cria uma conta de sistema:
sudo useradd -r monservice
O que faz o -r:
- Atribui um UID na faixa de sistema (conforme
/etc/login.defs) - Por padrão, não cria diretório home (a não ser que adicione
-m)
Exemplos
sudo useradd -r monservice
sudo useradd -r -m monservice
sudo useradd -r -m -s /usr/sbin/nologin monservice
sudo useradd -r -m -s /bin/bash monservice
Verificação
id monservice
getent passwd monservice
Diferença entre -r e -s no useradd
É uma distinção fundamental:
| Opção | Papel | Efeito |
|---|---|---|
-r | Declara a conta como de sistema | UID na faixa de sistema |
-s | Define o shell de login | Programa iniciado ao conectar |
-r não altera o shell
sudo useradd -r svc_web
-s não altera o tipo de conta
sudo useradd -s /usr/sbin/nologin alice
Combinação recomendada para um serviço
sudo useradd -r -m -s /usr/sbin/nologin svc_web
-r = tipo de conta (sistema); -s = shell (login / não-login). Ambos são independentes.
Exemplos concretos de contas de sistema
Apache / Nginx
id www-data
getent passwd www-data
MySQL / MariaDB
id mysql
getent passwd mysql
SSHD
id sshd
Ligação com o Módulo 14 – As contas wikijs_*
No exercício do Módulo 14, foram criados:
sudo useradd -r -m -s /bin/bash wikijs_dev
sudo useradd -r -m -s /bin/bash wikijs_test
sudo useradd -r -m -s /bin/bash wikijs_prod
Essas contas são de sistema porque foi utilizado -r.
Verificação:
id wikijs_dev
id wikijs_test
id wikijs_prod
Ligação com systemd:
[Service]
User=wikijs_dev
Comandos para listar e identificar usuários
1) Ver as faixas de UID
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
2) Listar usuários humanos (UID ≥ UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
3) Listar usuários de sistema (UID < UID_MIN)
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
4) Listar contas não-login (serviços típicos)
awk -F: '($7 ~ /(nologin|false)$/) {print $1" -> "$7}' /etc/passwd
5) Listar contas humanas prováveis (home + shell interativo)
awk -F: '($6 ~ /^\/home\//) && ($7 ~ /(bash|sh)$/) {print $1" home="$6" shell="$7}' /etc/passwd
Boas práticas em produção
1) Sempre use -r para contas de serviço
sudo useradd -r -m -s /usr/sbin/nologin mon_service
2) Evite shells interativos para serviços
sudo usermod -s /usr/sbin/nologin wikijs_dev
3) Nunca execute um serviço como root
[Service]
User=www-data
Esquema resumo
Fluxo de decisão: como identificar uma conta?
Exercícios práticos
Exercício 1: identificar tipos de contas (iniciante)
- Exiba as faixas de UID:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
- Liste as contas de sistema:
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3<m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
- Liste as contas humanas:
UID_MIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UID_MIN" '$3>=m {print $1" (uid="$3")"}' /etc/passwd | sort -t'=' -k2 -n
Exercício 2: criar e comparar contas (intermediário)
sudo useradd -m -s /bin/bash test_humain
sudo useradd -r -m -s /usr/sbin/nologin test_service
id test_humain
id test_service
TP Bônus criado em: Fevereiro de 2026