Pular para o conteúdo principal

Boas Práticas de Segurança

Este guia apresenta as boas práticas de segurança para a administração do PCH-SIG.

Autenticação

Senhas

  • Comprimento mínimo: 8 caracteres
  • Complexidade: Maiúsculas, minúsculas, números, símbolos
  • Renovação: A cada 90 dias
  • Histórico: Não reutilizar as últimas 5 senhas

Gestão das contas

AçãoRecomendação
CriaçãoUma conta por pessoa
CompartilhamentoNunca compartilhar credenciais
InatividadeDesativar após 90 dias sem conexão
DesligamentoDesativar imediatamente

Autenticação multi-fator

Embora não implementada atualmente, considere:

  • Aplicação TOTP (Google Authenticator, Authy)
  • SMS (menos seguro)
  • Chaves de segurança hardware (YubiKey)

Autorizações

Princípio do menor privilégio

  • Conceder apenas as permissões necessárias
  • Começar com acesso restritivo
  • Adicionar permissões se justificado

Separação de tarefas

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Criação │────▶│ Validação │────▶│ Aprovação │
│ (Operador) │ │ (Gestor) │ │ (Admin) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
  • O usuário que cria não valida
  • O usuário que valida não aprova
  • As ações críticas requerem várias pessoas

Revisão dos acessos

  • Frequência: Trimestral
  • Verificações:
    • Contas inativas
    • Permissões excessivas
    • Papéis obsoletos

Proteção dos dados

Classificação

NívelDescriçãoExemplos
PúblicoAcessível a todosDocumentação
InternoUsuários autenticadosEstatísticas agregadas
ConfidencialAcesso restritoDados de beneficiários
SecretoMuito restritoInformações financeiras

Criptografia

  • Em trânsito: HTTPS obrigatório
  • Em repouso: Criptografia de disco se dados sensíveis
  • Backups: Criptografia dos arquivos

Anonimização

Para exportações e relatórios, anonimizar os dados sensíveis:

// Exemplo de anonimização
$beneficiaire = [
'id' => hash('sha256', $original['id']),
'region' => $original['region'],
'montant' => $original['montant'],
// SEM nome, telefone, endereço
];

Infraestrutura

Rede

  • Firewall: Limitar as portas expostas
  • Segmentação: Separar os ambientes
  • VPN: Para acesso administrativo

Portas a expor

PortaServiçoAcesso
443HTTPS FrontendPúblico
22SSHApenas VPN
5432PostgreSQLApenas local
6379RedisApenas local

Configuração Docker

# Não expor as portas sensíveis
services:
postgres:
# SEM ports: expostas
networks:
- internal

backend:
networks:
- internal
- frontend

networks:
internal:
internal: true
frontend:

Auditoria e Logging

Eventos a registrar

CategoriaEventos
AutenticaçãoConexões bem-sucedidas/falhadas
AutorizaçãoAcessos negados
DadosCriações, modificações, exclusões
AdminMudanças de configuração

Retenção dos logs

TipoDuração
Segurança1 ano mínimo
Aplicação90 dias
Debug7 dias

Não registrar

  • Senhas (mesmo com hash)
  • Tokens de autenticação
  • Números completos de documentos de identidade
  • Dados bancários

Backups

Estratégia 3-2-1

  • 3 cópias dos dados
  • 2 suportes diferentes
  • 1 cópia fora do local

Segurança dos backups

  • Criptografar os backups
  • Armazenar as chaves separadamente
  • Testar as restaurações regularmente

Script seguro

#!/bin/bash
# backup-secure.sh

# Variáveis
BACKUP_DIR="/backups"
ENCRYPTION_KEY="/root/.backup-key"
DATE=$(date +%Y%m%d)

# Backup
pg_dump -U pch_admin pch_sig > /tmp/backup.sql

# Criptografia
gpg --symmetric --cipher-algo AES256 \
--passphrase-file $ENCRYPTION_KEY \
--output $BACKUP_DIR/backup_$DATE.sql.gpg \
/tmp/backup.sql

# Limpeza
rm -f /tmp/backup.sql

Desenvolvimento seguro

Validação das entradas

// Sempre validar
$email = filter_var($input['email'], FILTER_VALIDATE_EMAIL);
$id = filter_var($input['id'], FILTER_VALIDATE_INT);

// Usar as constraints Symfony
use Symfony\Component\Validator\Constraints as Assert;

class User
{
#[Assert\Email]
#[Assert\NotBlank]
private string $email;

#[Assert\Length(min: 8)]
private string $password;
}

Proteção contra injeções

// SQL - Usar consultas preparadas
$query = $em->createQuery('SELECT m FROM Menage m WHERE m.region = :region');
$query->setParameter('region', $region);

// NUNCA concatenação
// $query = "SELECT * FROM menages WHERE region = '$region'"; // PERIGOSO

Proteção XSS

// Escapar as saídas
{{ variable|e }} {# Twig escapa por padrão #}

// No React, usar os mecanismos nativos
<div>{variable}</div> // Escapado automaticamente

// NUNCA
<div dangerouslySetInnerHTML={{ __html: variable }} /> // A evitar

Gestão dos segredos

Nunca commitar

# .gitignore
.env
.env.local
config/jwt/private.pem
config/jwt/public.pem
*.key
*.pem

Variáveis de ambiente

# Armazenar os segredos no ambiente, não no código
export DATABASE_URL="postgresql://user:password@host:5432/db"
export JWT_PASSPHRASE="secret_passphrase"

Rotação dos segredos

SegredoFrequência
Senhas BDDAnual
Chaves JWTSemestral
Chaves API externasConforme a política

Resposta a incidentes

Plano de resposta

  1. Detecção: Alertas de monitoramento
  2. Análise: Avaliar o impacto
  3. Contenção: Limitar os danos
  4. Erradicação: Eliminar a ameaça
  5. Recuperação: Restaurar os serviços
  6. Pós-mortem: Analisar e melhorar

Contatos de emergência

Manter uma lista atualizada dos contatos:

  • Administrador de sistema
  • Responsável de segurança
  • Equipe de desenvolvimento
  • Suporte do hospedeiro

Procedimento de comprometimento

# 1. Bloquear os acessos
docker stop pch_backend pch_frontend

# 2. Mudar as senhas
docker exec pch_postgres psql -U pch_admin -c "
ALTER USER pch_admin WITH PASSWORD 'nova_senha';"

# 3. Regenerar os tokens
docker exec pch_backend php bin/console lexik:jwt:generate-keypair --overwrite

# 4. Analisar os logs
docker logs pch_backend --since "2024-01-15" > incident.log

Checklist de segurança

Diário

  • Verificar os alertas de monitoramento
  • Consultar as tentativas de conexão falhadas

Semanal

  • Verificar as atualizações de segurança
  • Analisar os logs de acesso

Mensal

  • Revisar os acessos dos usuários
  • Testar os backups
  • Verificar os certificados SSL

Trimestral

  • Auditoria das permissões
  • Teste de restauração completo
  • Revisão dos procedimentos de segurança

Anual

  • Rotação das senhas do sistema
  • Auditoria de segurança completa
  • Formação dos usuários

Recursos

Referências

Ferramentas

  • Análise de vulnerabilidades: Trivy, Snyk
  • Teste de penetração: OWASP ZAP
  • Auditoria de código: SonarQube

Próximos passos