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ção | Recomendação |
|---|---|
| Criação | Uma conta por pessoa |
| Compartilhamento | Nunca compartilhar credenciais |
| Inatividade | Desativar após 90 dias sem conexão |
| Desligamento | Desativar 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ível | Descrição | Exemplos |
|---|---|---|
| Público | Acessível a todos | Documentação |
| Interno | Usuários autenticados | Estatísticas agregadas |
| Confidencial | Acesso restrito | Dados de beneficiários |
| Secreto | Muito restrito | Informaçõ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
| Porta | Serviço | Acesso |
|---|---|---|
| 443 | HTTPS Frontend | Público |
| 22 | SSH | Apenas VPN |
| 5432 | PostgreSQL | Apenas local |
| 6379 | Redis | Apenas 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
| Categoria | Eventos |
|---|---|
| Autenticação | Conexões bem-sucedidas/falhadas |
| Autorização | Acessos negados |
| Dados | Criações, modificações, exclusões |
| Admin | Mudanças de configuração |
Retenção dos logs
| Tipo | Duração |
|---|---|
| Segurança | 1 ano mínimo |
| Aplicação | 90 dias |
| Debug | 7 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
| Segredo | Frequência |
|---|---|
| Senhas BDD | Anual |
| Chaves JWT | Semestral |
| Chaves API externas | Conforme a política |
Resposta a incidentes
Plano de resposta
- Detecção: Alertas de monitoramento
- Análise: Avaliar o impacto
- Contenção: Limitar os danos
- Erradicação: Eliminar a ameaça
- Recuperação: Restaurar os serviços
- 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