Pular para o conteúdo principal

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​

  1. Introdução
  2. A convenção dos UID no Linux
  3. Usuários de sistema (service accounts)
  4. Usuários normais (contas humanas)
  5. Criar um usuário de sistema com useradd -r
  6. Diferença entre -r e -s no useradd
  7. Exemplos concretos de contas de sistema
  8. Ligação com o Módulo 14 – As contas wikijs_*
  9. Comandos para listar e identificar usuários
  10. Boas práticas em produção
  11. Esquema resumo
  12. Exercícios práticos

Introdução​

No Linux, nem todas as contas de usuário são iguais. Existem duas grandes categorias:

CategoriaUID típicoPapelExemplo
Usuário de sistema (service account)< 1000Executar serviços/demonswww-data, mysql, nobody
Usuário normal (conta humana)≥ 1000Pessoa física que acessa o sistemaalice, bob, etudiant
Atenção

Isto não é uma regra absoluta: é uma convenção que depende da distribuição e da configuração do /etc/login.defs.

Voltar ao índice


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)

Voltar ao índice


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ísticaValor típico
UID< 1000 (geralmente entre 1 e 999)
Shell/usr/sbin/nologin ou /bin/false
HomeSem home, ou um diretório técnico (ex: /var/www)
SenhaDesativada (bloqueada)
Conexão interativaImpossível (ou não desejada)

Por que usuários de sistema?​

  1. Princípio do menor privilégio: cada serviço roda com permissões limitadas, não como root
  2. Isolamento: se um serviço for comprometido, o atacante só terá os direitos dessa conta
  3. Rastreabilidade: é possível saber qual serviço realizou qual ação nos logs
  4. 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
Nota

root (UID 0) é um caso especial: é uma conta de sistema com shell interativo e privilégios totais.

Voltar ao índice


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ísticaValor típico
UID≥ 1000
Shell/bin/bash ou /bin/sh
Home/home/<nome_usuario>
SenhaDefinida (ativa)
Conexão interativaSim

Como criar?​

sudo useradd -m -s /bin/bash alice
id alice
Dica

O -m cria o diretório home (/home/alice) e o -s /bin/bash fornece um shell interativo.

Voltar ao índice


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

Voltar ao índice


Diferença entre -r e -s no useradd​

É uma distinção fundamental:

OpçãoPapelEfeito
-rDeclara a conta como de sistemaUID na faixa de sistema
-sDefine o shell de loginPrograma 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
Resumo

-r = tipo de conta (sistema); -s = shell (login / não-login). Ambos são independentes.

Voltar ao índice


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

Voltar ao índice


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

Voltar ao índice


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

Voltar ao índice


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

Voltar ao índice


Esquema resumo​

Fluxo de decisão: como identificar uma conta?​

Voltar ao índice


Exercícios práticos​

Exercício 1: identificar tipos de contas (iniciante)​

  1. Exiba as faixas de UID:
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX)' /etc/login.defs
  1. 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
  1. 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