Administração de Segurança: SUID, lsof, ulimit, sudo
O Que Você Vai Conquistar
- Encontrar arquivos perigosos com SUID / SGID definido usando
find - Identificar arquivos abertos e portas de rede com
lsof - Verificar e parar processos usando um arquivo ou sistema de arquivos com
fuser - Entender a diferença entre limites soft e hard e restringir recursos com
ulimit - Configurar
sudo/sudoersde forma segura comvisudo - Auditar atividade de login com
who/w/last
Este é o núcleo do objetivo 110.1 do LPIC-1 "Realizar tarefas de administração de segurança". Cobre sistematicamente auditoria de arquivos SUID (um foco de escalação de privilégios), ulimit para prevenir esgotamento de recursos, e sudo para privilégio mínimo.
Por Que Auditar Arquivos SUID é Importante
Um executável com SUID definido roda com as permissões do proprietário do arquivo (frequentemente root), não do usuário que o executa. Uma vulnerabilidade leva diretamente à escalação de privilégios, então auditoria periódica é essencial.
| Bit | Octal | Significado | Comando de busca |
|---|---|---|---|
| SUID | 4000 |
Executar com permissões do proprietário (ex. passwd) |
find / -perm -4000 |
| SGID | 2000 |
Executar com permissões do grupo / herança de diretório | find / -perm -2000 |
| Sticky | 1000 |
Impedir exclusão de arquivos alheios em /tmp etc. |
find / -perm -1000 |
O - inicial em -perm significa "todos os bits especificados estão definidos". -perm 4000 (sem menos) significa "permissões correspondem exatamente", e -perm /4000 significa "qualquer um dos bits está definido" -- os comportamentos diferem, então tenha cuidado.
Arquivos SUID inesperados (especialmente sob /tmp ou diretórios home de usuários) podem ser um ponto de entrada para escalação de privilégios. Capture um baseline com find e audite o diff periodicamente.
Passo a Passo
Passo 1: Encontrar arquivos SUID / SGID
find / -perm -4000 -type f 2>/dev/null find / -perm -2000 -type f 2>/dev/null find / -perm -u=s -o -perm -g=s -type f 2>/dev/null
/usr/bin/passwd /usr/bin/sudo /usr/bin/su /usr/bin/mount /usr/bin/chsh
-perm -4000 extrai arquivos com SUID e -perm -2000 aqueles com SGID. As formas simbólicas -perm -u=s (SUID) e -perm -g=s (SGID) fazem o mesmo. 2>/dev/null suprime erros de diretórios que você não pode ler.
Passo 2: Inspecionar arquivos abertos e portas com lsof
lsof -i :22 lsof -p 1234 lsof -u alice
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 812 root 3u IPv4 18293 0t0 TCP *:ssh (LISTEN)
lsof -i :22 lista processos usando a porta 22, -p PID lista arquivos abertos por um processo específico, e -u user lista arquivos abertos de um usuário. Você também pode filtrar por protocolo ou host como -i TCP ou -i @host.
Passo 3: Identificar e parar processos com fuser
fuser -v /var/log/syslog fuser -m /mnt/data fuser -k -m /mnt/data
USER PID ACCESS COMMAND /var/log/syslog: root 812 F.... rsyslogd
fuser -v file mostra processos que têm o arquivo aberto em um estilo semelhante ao ps. -m trata o argumento como um sistema de arquivos montado e direciona todos os processos usando arquivos naquele sistema de arquivos. -k envia SIGKILL para eles. Use para liberar "device is busy" antes de desmontar.
fuser -k -m mata forçadamente todos os processos usando o sistema de arquivos. Se você direcionar a montagem errada, processos não relacionados são pegos também. Sempre confirme os alvos executando sem -k primeiro.
Passo 4: Verificar e definir limites de recursos com ulimit
ulimit -a ulimit -Sn ulimit -Hn ulimit -n 2048
open files (-n) 1024 max user processes (-u) 7860 ...
ulimit -a lista todos os limites. -n é o número de arquivos que podem estar abertos, -u é o número de processos do usuário. -S é o limite soft (valor atual) e -H é o limite hard (teto). Um usuário comum pode alterar o limite soft até o limite hard, mas somente root pode elevar o limite hard.
Para tornar persistente, edite /etc/security/limits.conf.
# /etc/security/limits.conf # <domain> <type> <item> <value> alice soft nofile 4096 alice hard nofile 8192 @developers hard nproc 100
Especifique soft / hard para type e itens como nofile (contagem de arquivos) ou nproc (contagem de processos) para item. @groupname aplica o limite por grupo.
Passo 5: Configurar sudo com visudo
visudo
# /etc/sudoers alice ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
visudo é o comando dedicado que edita /etc/sudoers com verificação de sintaxe. %groupname concede privilégios a um grupo, e NOPASSWD: pula o prompt de senha. Após editar, verifique com sudo -l como o usuário alvo.
sudo -l
User alice may run the following commands on host:
(ALL : ALL) ALL
Editar /etc/sudoers diretamente com vi permite salvar um erro de sintaxe, o que quebra o sudo inteiramente (você não consegue nem se tornar root). Sempre use visudo. Ele valida a sintaxe ao salvar e solicita que você edite novamente se houver um erro.
su vs su -, e Auditoria de Login
A diferença entre su e su - é se variáveis de ambiente e o diretório atual são mantidos. su user (sem opção) troca mantendo muito do ambiente do usuário original, enquanto su - user (com o hífen, mesmo que su -l) inicia um shell de login e carrega totalmente o PATH, HOME e arquivos de inicialização do usuário alvo. Ao trocar para root para trabalhar, su - é mais seguro e evita executar o comando errado devido a um PATH desatualizado.
Use os seguintes comandos para auditar atividade de login.
| Comando | O que mostra | Fonte de dados |
|---|---|---|
who |
Usuários atualmente logados | /var/run/utmp |
w |
Usuários logados + seus processos e carga | /var/run/utmp |
last |
Histórico de login (incluindo reinicializações) | /var/log/wtmp |
lastlog |
Último horário de login por usuário | /var/log/lastlog |
last e lastlog são o básico para rastrear logins suspeitos. Combine com chage -l user para verificar expiração de senha e inventariar contas inativas.
chage -l alice
Last password change : May 01, 2026 Password expires : Jul 30, 2026 Account expires : never
No lado da rede, nmap pode escanear portas abertas de um host (ex. nmap localhost). Escanear hosts que você não possui sem permissão pode constituir acesso não autorizado, então use-o apenas contra alvos autorizados.
Erros Comuns e Correções
- Quebrar
sudoerseditando diretamente: Salvar sintaxe ruim comvi /etc/sudoerstorna o sudo completamente inutilizável. Sempre usevisudo. Se quebrado, repare viapkexecou modo de resgate. - Confundir limites soft e hard: Um usuário comum tentando elevar
ulimit -nalém do limite hard recebeOperation not permitted. Elevar o limite hard requer root mais/etc/security/limits.conf. - Subestimar o risco de SUID: Adicionar SUID descuidadamente ao seu próprio script cria uma brecha de escalação de privilégios. SUID em shell scripts é ignorado em muitos ambientes, mas vulnerabilidades em comandos dependentes permanecem.
- Confundir
suesu -: Tornar-se root comsusimples mantém o ambiente original, arriscando executar um comando não intencional doPATHcomo root. Usesu -para trabalho administrativo. - Confundir
find -perm 4000com-perm -4000: Sem o menos significa "correspondência exata", então um arquivo SUID real comorwsr-xr-xnão é correspondido. O menos inicial é necessário para auditoria.
Solução de Problemas
Sintoma: "device is busy" ao desmontar
Causa: Um processo ainda tem um arquivo aberto naquele sistema de arquivos
Verificação:
fuser -vm /mnt/data lsof +D /mnt/data
Solução: Identifique o processo e encerre-o graciosamente. Apenas como último recurso, mate forçadamente com fuser -k -m /mnt/data, após confirmar os alvos.
Sintoma: Uma aplicação trava com "Too many open files"
Causa: A contagem de arquivos abertos atingiu o limite soft (nofile)
Verificação:
ulimit -Sn lsof -p PID | wc -l
Solução: Eleve o limite soft para aquele shell com ulimit -n. Para uma correção persistente, adicione nofile ao /etc/security/limits.conf e faça login novamente para aplicar.
Sintoma: sudo pede senha toda vez, bloqueando automação
Causa: NOPASSWD: não está definido para o usuário/comando alvo
Verificação:
sudo -l
Solução: Use visudo para conceder NOPASSWD: limitado a comandos específicos. Evite NOPASSWD incondicional em ALL por segurança; restrinja aos comandos necessários.
Lista de Verificação de Conclusão
- [ ] Listou arquivos SUID com
find / -perm -4000 -type f - [ ] Verificou portas em escuta com
lsof -i - [ ] Confirmou que consegue identificar processos em uso com
fuser -m - [ ] Entendeu a diferença entre limite soft e hard com
ulimit -a - [ ] Confirmou o fluxo seguro de edição de sudoers com
visudo - [ ] Confirmou auditoria de login com
who/w/last
Resumo
| Cenário | Comando | Propósito |
|---|---|---|
| Auditoria SUID/SGID | find / -perm -4000 -type f |
Revelar risco de escalação de privilégios |
| Verificação de porta | lsof -i :PORT |
Identificar processos em escuta |
| Processos em uso | fuser -vm /mount |
Encontrar o que bloqueia uma desmontagem |
| Limites de recursos | ulimit -Sn / -Hn |
Verificar/definir limites soft e hard |
| Configuração sudo | visudo |
Edição de sudoers com verificação de sintaxe |
| Auditoria de login | who / w / last |
Verificar atividade e histórico de login |
Administração de segurança se baseia em dois pilares: minimizar privilégios e tornar anomalias visíveis. Após dominar auditoria SUID, sudo de privilégio mínimo e proteção de recursos com ulimit, combine-os com criptografia e fortalecimento de host para completar suas defesas.