Lynis: auditoria de segurança e hardening do VPS

Lynis é um scanner de segurança open-source que avalia centenas de controles de segurança no seu sistema Linux, configurações do kernel, permissões de arquivos, serviços desnecessários, configurações de rede e muito mais. Gera um relatório com score e recomendações priorizadas, tornando o hardening sistemático em vez de ad-hoc.

Instalação e primeiro audit

Instalar Lynis e executar auditoria completa do sistema:

bash
# Instalar Lynis (repositório oficial para versão mais recente):
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C80E383C3DE9F082
echo "deb https://packages.cisofy.com/community/lynis/deb/ stable main" |   sudo tee /etc/apt/sources.list.d/cisofy-lynis.list
sudo apt update && sudo apt install lynis

# Ou instalar versão do Ubuntu (pode ser mais antiga):
sudo apt install lynis

# Executar auditoria completa do sistema:
sudo lynis audit system

# Modo não-interativo (para automação):
sudo lynis audit system --quick

# Auditoria com perfil customizado:
sudo lynis audit system --profile /etc/lynis/custom.prf

# O relatório é salvo em:
# /var/log/lynis.log         → log detalhado de cada verificação
# /var/log/lynis-report.dat  → dados do relatório em formato de chave=valor

Interpretar o relatório do Lynis

Entender o score e as recomendações:

bash
# Ao final do scan, o Lynis mostra:
# Hardening index: 67 [#############       ]
# Tests performed: 248
# Plugins enabled: 1

# Categorias de resultado:
# [OK]      → verificação passou
# [WARNING] → problema que precisa de atenção
# [SUGGEST] → melhoria recomendada mas não crítica

# Extrair warnings do log:
sudo grep "Warning" /var/log/lynis.log | head -30

# Extrair sugestões de hardening:
sudo grep "[suggestion]" /var/log/lynis-report.dat

# Extrair dados do relatório para análise:
sudo grep "hardening_index" /var/log/lynis-report.dat

# Ver o que foi verificado por categoria:
sudo grep "^[" /var/log/lynis.log | grep -c "OK"      # quantos passou
sudo grep "^[" /var/log/lynis.log | grep -c "WARNING" # quantos falhou

# Warnings típicos e o que significam:
# "SSH: PermitRootLogin is set to yes" → desabilitar root login
# "No firewall active" → ativar UFW
# "Found some information disclosure in SMTP banner" → ocultar versão do mail server
# "PHP exposing version info" → php.ini: expose_php = Off

Implementar as recomendações do Lynis

Correções para os warnings mais comuns:

bash
# Warnings comuns e como corrigir:

# 1. Parâmetros de kernel (sysctl):
sudo tee /etc/sysctl.d/99-hardening.conf << 'EOF'
# Proteção contra ataques de rede:
net.ipv4.tcp_syncookies = 1          # proteção SYN flood
net.ipv4.conf.all.rp_filter = 1      # filtro de pacotes spoofed
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0   # não aceitar redirects ICMP
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1  # ignorar broadcast ping

# Proteção de memória:
kernel.randomize_va_space = 2        # ASLR habilitado
kernel.dmesg_restrict = 1            # restringir dmesg a root
kernel.kptr_restrict = 2             # ocultar ponteiros do kernel

# Proteção IPv6:
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
EOF
sudo sysctl --system

# 2. Desabilitar serviços desnecessários:
sudo systemctl disable avahi-daemon   # mDNS — desnecessário em VPS
sudo systemctl disable cups           # sistema de impressão
sudo systemctl disable bluetooth      # Bluetooth
sudo systemctl stop avahi-daemon cups bluetooth 2>/dev/null

# 3. Configurar umask mais restritivo:
echo "umask 027" | sudo tee -a /etc/profile  # 750 por padrão (antes era 022)

# 4. Restringir compiladores (evitar compilação após comprometimento):
sudo chmod o-rx /usr/bin/gcc /usr/bin/cc /usr/bin/make 2>/dev/null || true

Perfil customizado do Lynis

Criar perfil para ignorar checks irrelevantes ao seu ambiente:

bash
# /etc/lynis/custom.prf — customizar verificações:
sudo tee /etc/lynis/custom.prf << 'EOF'
# Ignorar verificações não aplicáveis ao ambiente:

# VPS não tem impressora — desabilitar check de CUPS:
skip-test=PRNT-2307

# Ambiente de containers — pular alguns checks de kernel:
skip-test=KRNL-5820

# Banco de dados não está neste servidor — pular checks de MySQL:
skip-test=DBS-1816
skip-test=DBS-1818

# Ajustar threshold de score:
minimum-package-manager-answer=5

# Definir perfil de compliance:
# compliance=hipaa  # ou: pci-dss, iso27001

# Notificação por email ao encontrar warnings:
# log-tests-with-wrong-phase=yes
EOF

# Executar com o perfil customizado:
sudo lynis audit system --profile /etc/lynis/custom.prf --quick

# Comparar score ao longo do tempo:
# Armazenar score diário:
sudo grep "hardening_index" /var/log/lynis-report.dat >> /var/log/lynis-scores.log
echo "$(date '+%Y-%m-%d') $(sudo grep hardening_index /var/log/lynis-report.dat | cut -d= -f2)" >> /var/log/lynis-scores.log

Integrar Lynis em pipeline CI/CD

Executar auditoria de segurança automaticamente em servidor de staging:

bash
# .github/workflows/security-audit.yml:
name: Security Audit

on:
  schedule:
    - cron: '0 2 * * 1'  # toda segunda-feira às 2h
  workflow_dispatch:

jobs:
  lynis:
    runs-on: ubuntu-latest
    steps:
      - name: Install Lynis
        run: sudo apt-get install -y lynis

      - name: Run Lynis audit
        run: |
          sudo lynis audit system --quick --no-colors 2>&1 | tee lynis-output.txt
          SCORE=$(grep "Hardening index" lynis-output.txt | grep -oP 'd+(?= [)')
          echo "LYNIS_SCORE=$SCORE" >> $GITHUB_ENV

      - name: Check minimum score
        run: |
          if [ "$LYNIS_SCORE" -lt 70 ]; then
            echo "❌ Score de hardening ($LYNIS_SCORE) abaixo do mínimo (70)"
            exit 1
          fi
          echo "✅ Score de hardening: $LYNIS_SCORE"

      - name: Upload report
        uses: actions/upload-artifact@v4
        with:
          name: lynis-report
          path: lynis-output.txt

# Script para execução no VPS de staging:
sudo lynis audit system --quick 2>/dev/null &&   sudo grep "hardening_index" /var/log/lynis-report.dat

Não quer configurar manualmente?

Implante o VPS Linux em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Score 0-49: configuração insegura, correções urgentes necessárias. Score 50-69: segurança básica, melhorias importantes pendentes. Score 70-84: bom, a maioria das boas práticas implementadas. Score 85+: excelente, hardening avançado. Para VPS de produção em produção: mire em 70+. Scores acima de 90 geralmente exigem sacrifícios de usabilidade (compiladores desabilitados, módulos kernel removidos) que podem não fazer sentido para todos os ambientes.

Lynis: mais simples de instalar e usar, recomendações em português amigável, ideal para hardening geral e melhoria contínua, sem mapeamento nativo para frameworks de compliance específicos (CIS, NIST) na versão community. OpenSCAP: padrão governamental, profiles específicos para CIS Benchmark, STIG, HIPAA, PCI-DSS, saída em XML/HTML padronizada para auditoria formal. Para compliance formal: OpenSCAP. Para hardening prático e contínuo: Lynis. Muitas organizações usam os dois.

A versão community do Lynis apenas identifica, não corrige automaticamente. A versão Enterprise (Lynis Enterprise/CISOfy) tem modo de remediação automática. Para automação community: exporte as sugestões do lynis-report.dat e crie scripts de correção específicos para o seu ambiente. Alternativamente, use Ansible com roles de hardening (como dev-sec/ansible-collection-hardening) que implementam as mesmas verificações do CIS Benchmark automaticamente.

Baseline inicial: logo após provisionar o VPS, antes de instalar a aplicação. Após mudanças: sempre que instalar novos pacotes, mudar configurações de sistema ou atualizar o SO. Rotina: scan semanal ou mensal via cron, comparando o score ao longo do tempo. Pré-deploy: em ambientes com pipeline CI/CD, rodar em staging e exigir score mínimo. O objetivo é detectar regressões, se o score cair, algo mudou no sistema.

sudo ufw enable (após configurar as regras). O Lynis verifica UFW, iptables e nftables, qualquer um ativo satisfaz o check. Se você usa regras iptables diretas sem UFW: sudo iptables -L | grep -c ACCEPT deve mostrar regras. Para nftables: sudo nft list ruleset. O check "No firewall active" é um dos mais críticos, um VPS sem firewall tem toda infraestrutura exposta para a internet.