Segurança do Host: Desabilitando Serviços e TCP Wrappers
O Que Você Vai Conquistar
- Enumerar serviços em escuta com
ss -tulnp - Explicar com precisão a diferença entre
systemctl stop/disable/mask - Entender a ordem de avaliação do TCP Wrappers
/etc/hosts.allow->/etc/hosts.deny - Compreender o papel dos super-servidores (inetd / xinetd)
- Aplicar defesas complementares como
/etc/nologine shadow passwords (pwconv)
Este é o núcleo do objetivo 110.2 do LPIC-1 "Configuração de segurança do host". Ele se apoia em dois pilares: reduzir a superfície de ataque desabilitando serviços desnecessários, e restringir de onde as conexões podem vir.
Qual é a Política Básica de Segurança do Host?
O princípio é simples: um serviço que não está rodando não pode ser atacado. Primeiro pare o que não precisa, depois restrinja a origem do que permanece. Não inverta essa prioridade.
O hardening de um host segue esta ordem sem pular etapas.
- Descobrir o que está em escuta (
ss -tulnp) - Parar e desabilitar serviços desnecessários (
systemctl) - Restringir origens de conexão para os serviços mantidos (TCP Wrappers / firewall)
- Fortalecer login e autenticação (
/etc/nologin, shadow passwords)
O TCP Wrappers (libwrap) está sendo descontinuado em distribuições mais recentes, e Debian / Ubuntu estão removendo o suporte ao libwrap. Ele ainda faz parte dos objetivos do LPIC-1 110.2, por isso este artigo explica como funciona.
Como Verificar Quais Serviços Estão em Escuta?
Primeiro, torne visível o que está aguardando conexões externas. ss -tulnp é o comando padrão atual.
ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=712,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=901,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=980,fd=13))
As opções do ss significam o seguinte. -p mostra o nome do processo apenas com privilégios root.
| Opção | Significado |
|---|---|
-t |
Sockets TCP |
-u |
Sockets UDP |
-l |
Apenas sockets em escuta |
-n |
Mostrar portas numericamente (sem resolver) |
-p |
Mostrar o processo usando o socket |
ss faz parte do pacote iproute2 e é o sucessor do legado netstat -tulnp (net-tools). A saída é lida com praticamente o mesmo significado.
Aqui 0.0.0.0:Port significa escutando em todas as interfaces (acessível externamente), enquanto 127.0.0.1:Port significa apenas loopback (não acessível de fora). No exemplo acima, SSH (22) está exposto externamente enquanto SMTP (25) é apenas local.
Qual é a Diferença Entre stop, disable e mask?
Em resumo: stop significa "parar agora", disable significa "não iniciar no próximo boot", e mask significa "tornar impossível iniciar". Seus papéis são diferentes, e você os combina.
Passos para parar e desabilitar um serviço desnecessário
systemctl stop avahi-daemon systemctl disable avahi-daemon
Removed "/etc/systemd/system/multi-user.target.wants/avahi-daemon.service".
stop sozinho permite que o serviço retorne após um reboot. Para pará-lo permanentemente você precisa de disable. Faça ambos em uma linha com --now.
systemctl disable --now avahi-daemon
disable --now realiza uma parada imediata (como stop) e desabilita o início automático (disable) ao mesmo tempo. Esta é a forma mais usada na prática.
Bloquear um serviço com mask
systemctl mask avahi-daemon systemctl start avahi-daemon
Created symlink /etc/systemd/system/avahi-daemon.service → /dev/null. Failed to start avahi-daemon.service: Unit avahi-daemon.service is masked.
mask cria um symlink do arquivo de unit para /dev/null e recusa tanto um start manual quanto qualquer início acionado por dependências. É mais forte que disable. Reverta com unmask.
| Comando | Para agora | Início auto | Início manual | Uso |
|---|---|---|---|---|
stop |
Sim | Inalterado | Permitido | Parar temporariamente |
disable |
Não | Desligado | Permitido | Evitar início auto na próxima vez |
disable --now |
Sim | Desligado | Permitido | Forma padrão na prática |
mask |
Não | Desligado | Bloqueado | Quando nunca deve iniciar |
Verifique o estado com systemctl is-enabled svc (início automático) e systemctl is-active svc (rodando ou não).
Um serviço mascarado também pode causar falha na inicialização de outros serviços que dependem dele. Use apenas para coisas que você realmente não precisa, e na dúvida use disable.
O Que São Super-Servidores (inetd / xinetd)?
Um super-servidor escuta em nome de vários serviços pequenos e lança o daemon alvo apenas quando uma conexão chega. Isso reduz o número de processos residentes.
Historicamente existia o inetd, com o xinetd como sua versão estendida. A estrutura de configuração é a seguinte.
| Arquivo / Diretório | Função |
|---|---|
/etc/inetd.conf |
Configuração do inetd (uma linha por serviço) |
/etc/xinetd.conf |
Configuração principal do xinetd e padrões |
/etc/xinetd.d/ |
Diretório com arquivos de configuração por serviço do xinetd |
Para parar um serviço sob o xinetd, defina disable = yes em sua definição e recarregue o xinetd.
cat /etc/xinetd.d/telnet
service telnet
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/in.telnetd
disable = yes
}
disable = yes desativa esse serviço. O bloco defaults em /etc/xinetd.conf contém configurações comuns a todos os serviços (formato de log, limites de conexão, etc.).
Distribuições atuais têm a ativação por socket do systemd (units .socket) assumindo o papel do xinetd. O exame pergunta sobre o conceito do inetd / xinetd e a localização dos arquivos de configuração.
Como o TCP Wrappers Controla o Acesso?
O TCP Wrappers controla conexões a serviços vinculados ao libwrap por host. Dois arquivos governam isso: /etc/hosts.allow e /etc/hosts.deny.
Ordem de avaliação (mais importante)
De acordo com o manual hosts_access(5), a decisão é tomada na seguinte ordem, e a primeira regra correspondente vence (first match wins).
- Pesquisar
/etc/hosts.allowde cima para baixo. Se corresponder, conceder acesso e parar. - Se não corresponder, pesquisar
/etc/hosts.deny. Se corresponder, negar acesso e parar. - Se nenhum arquivo corresponder, conceder acesso (permissão padrão).
Portanto, allow sempre tem precedência sobre deny. Para uma política fechada, o padrão é "negar tudo, depois abrir brechas com allow".
cat /etc/hosts.deny
ALL: ALL
cat /etc/hosts.allow
sshd: 192.168.1.0/24 sshd: 10.0.0.5 ALL: LOCAL
Neste exemplo, hosts.deny primeiro nega todos os serviços e todos os hosts (ALL: ALL). Depois hosts.allow permite apenas 192.168.1.0/24 e 10.0.0.5 acessarem o sshd, além de conexões locais para todos os serviços. Como allow é avaliado primeiro, as conexões permitidas passam e todo o resto cai no deny.
Formato e curingas
Uma regra tem o formato daemon_list : client_list.
| Elemento | Significado |
|---|---|
| daemon_list | Nomes dos processos de serviço (sshd, vsftpd, etc.). ALL para todos |
| client_list | Host / IP / rede de origem. ALL para todos |
ALL |
Curinga que sempre corresponde |
EXCEPT |
"A EXCEPT B" = corresponde A mas exclui B |
LOCAL |
Nomes de host sem ponto (o host local) |
Aqui está um exemplo com EXCEPT.
cat /etc/hosts.allow
sshd: ALL EXCEPT 192.168.1.100
Isso significa "permitir conexões sshd de todos os hosts exceto 192.168.1.100". Clientes também podem ser especificados como .example.com (correspondência por sufixo de domínio) ou 192.168.1. (correspondência por prefixo de rede).
O TCP Wrappers afeta apenas serviços compilados com libwrap (como sshd, embora dependa da configuração de compilação) e serviços sob o xinetd. Ele não bloqueia todo o tráfego, portanto combine com um firewall como iptables / nftables para bloquear a rede como um todo.
Defesas de Login e Autenticação
Após reduzir os serviços, fortalecer login e autenticação também. /etc/nologin e shadow passwords são as medidas representativas.
Bloquear logins regulares com /etc/nologin
Quando o arquivo /etc/nologin existe, o login é recusado para usuários regulares (root está isento). O conteúdo do arquivo se torna a mensagem exibida quando o login é recusado.
echo "System under maintenance. Please try again later." > /etc/nologin
Use para bloquear temporariamente logins durante manutenção. Delete o arquivo quando o trabalho terminar e o login for restaurado.
Visão geral do shadow passwords
Shadow passwords separam a senha criptografada do /etc/passwd legível por todos para o /etc/shadow, que somente root pode ler. Isso é habilitado por padrão nos sistemas atuais.
| Comando | Ação |
|---|---|
pwconv |
Criar /etc/shadow fazendo shadow do /etc/passwd |
pwunconv |
Mover /etc/shadow de volta para /etc/passwd e remover shadow |
grpconv |
Criar /etc/gshadow a partir de /etc/group |
grpunconv |
Mover /etc/gshadow de volta para /etc/group e remover gshadow |
pwconv retira as senhas do /etc/passwd e substitui esse campo por x. pwunconv faz o inverso, retornando ao layout sem shadow.
O legado /etc/inittab definia o runlevel padrão e os processos iniciados em cada nível na era SysVinit. Ele não é usado sob o systemd, onde você gerencia o target (o equivalente ao runlevel) com systemctl get-default / set-default. O exame pede que você posicione o inittab como legado.
Erros Comuns e Correções
Erro 1: sentir-se seguro após apenas stop
systemctl stop apenas para o processo atual. Após um reboot, um serviço enabled retorna. Parada permanente precisa de disable (ou disable --now).
Erro 2: confundir mask com disable
disable ainda permite um start manual, mas mask recusa até isso. Se você queria apenas uma parada temporária mas usou mask, depois ficará preso com Unit is masked ao tentar iniciá-lo.
Erro 3: inverter a ordem de hosts.allow e hosts.deny
Allow primeiro, deny depois. Mesmo com ALL: ALL em hosts.deny, conexões permitidas por hosts.allow ainda passam. Não entre em pânico quando "fechei tudo no deny mas uma conexão entrou". A ordem está correta, e o comportamento esperado.
Erro 4: assumir "fechado" sem nenhuma regra escrita
Se ambos os arquivos estão vazios ou nenhuma regra corresponde, o padrão é permitir. A menos que você escreva uma regra de negação explícita, o TCP Wrappers não bloqueia nada.
Erro 5: pensar que o TCP Wrappers afeta todos os serviços
Eles afetam apenas serviços que usam libwrap e aqueles sob o xinetd. Serviços que não usam libwrap, como um servidor web, ignoram hosts.deny. Use um firewall para bloqueio geral.
Solução de Problemas
Sintoma: um serviço desabilitado ainda está rodando após um reboot
Causa: disable apenas desliga o início automático e não para o processo em execução. Ele também pode ser iniciado via uma unit de socket ou por dependência de outro serviço.
Verificação:
systemctl is-enabled svc systemctl status svc
Correção: Use systemctl disable --now svc para parar e desabilitar de uma vez. Se for ativado por socket, pare e desabilite também o svc.socket correspondente.
Sintoma: uma conexão é negada mesmo estando no hosts.allow
Causa: O serviço alvo não usa libwrap, ou o nome do daemon está com erro de digitação.
Verificação:
ldd $(which sshd) | grep libwrap
Correção: Se libwrap não está vinculado, o TCP Wrappers não tem efeito; controle pelo firewall. Corresponda o nome do daemon exatamente ao nome do processo (como sshd).
Sintoma: outro serviço que depende de um serviço mascarado falha ao iniciar
Causa: mask recusa todos os inicios incluindo resolução de dependências, então o serviço dependente falha em cadeia.
Verificação:
systemctl list-dependencies --reverse svc
Correção: Reconsidere se é realmente desnecessário; se houver dependência, faça unmask e mude para disable.
Checklist de Conclusão
- [ ] Enumerou serviços em escuta com
ss -tulnp - [ ] Parou e desabilitou serviços desnecessários com
disable --now - [ ] Usou
maskpara alvos que nunca devem iniciar - [ ] Entendeu a ordem
/etc/hosts.allow->/etc/hosts.deny - [ ] Combinou um firewall quando necessário
Resumo
| Objetivo | Comando / Arquivo | Ponto chave |
|---|---|---|
| Verificar escuta | ss -tulnp |
0.0.0.0 significa exposto externamente |
| Parar agora | systemctl stop |
Retorna após reboot |
| Desabilitar de vez | systemctl disable --now |
O padrão na prática |
| Bloquear início | systemctl mask |
Não inicia até unmask |
| Controle de acesso | /etc/hosts.allow / .deny |
allow depois deny, first match wins |
| Bloquear login | /etc/nologin |
Recusa todos exceto root |
A segurança do host se apoia em dois pilares: reduzir a superfície de ataque e restringir origens de conexão. Após cobrir a área de segurança 110 do LPIC-1, combine com criptografia e gerenciamento de permissões para completar seu conhecimento operacional.
Próximas Leituras
- Administração de Segurança: SUID/SGID e Permissões de Arquivos
- Criptografia de Dados: SSH e GPG
- systemd e o Processo de Boot