Aller au contenu principal

Bonnes Pratiques de Sécurité

Ce guide présente les bonnes pratiques de sécurité pour l'administration de PCH-SIG.

Authentification

Mots de passe

  • Longueur minimale : 8 caractères
  • Complexité : Majuscules, minuscules, chiffres, symboles
  • Renouvellement : Tous les 90 jours
  • Historique : Ne pas réutiliser les 5 derniers mots de passe

Gestion des comptes

ActionRecommandation
CréationUn compte par personne
PartageJamais partager les identifiants
InactivitéDésactiver après 90 jours sans connexion
DépartDésactiver immédiatement

Authentification multi-facteur

Bien que non implémenté actuellement, considérez :

  • Application TOTP (Google Authenticator, Authy)
  • SMS (moins sécurisé)
  • Clés de sécurité hardware (YubiKey)

Autorisations

Principe du moindre privilège

  • Accorder uniquement les permissions nécessaires
  • Commencer par un accès restrictif
  • Ajouter des permissions si justifié

Séparation des tâches

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Création │────▶│ Validation │────▶│ Approbation │
│ (Opérateur) │ │ (Gestionnaire) │ │ (Admin) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
  • L'utilisateur qui crée ne valide pas
  • L'utilisateur qui valide n'approuve pas
  • Les actions critiques nécessitent plusieurs personnes

Révision des accès

  • Fréquence : Trimestrielle
  • Vérifications :
    • Comptes inactifs
    • Permissions excessives
    • Rôles obsolètes

Protection des données

Classification

NiveauDescriptionExemples
PublicAccessible à tousDocumentation
InterneUtilisateurs authentifiésStatistiques agrégées
ConfidentielAccès restreintDonnées bénéficiaires
SecretTrès restreintInformations financières

Chiffrement

  • En transit : HTTPS obligatoire
  • Au repos : Chiffrement disque si données sensibles
  • Sauvegardes : Chiffrement des archives

Anonymisation

Pour les exports et rapports, anonymiser les données sensibles :

// Exemple d'anonymisation
$beneficiaire = [
'id' => hash('sha256', $original['id']),
'region' => $original['region'],
'montant' => $original['montant'],
// PAS de nom, téléphone, adresse
];

Infrastructure

Réseau

  • Pare-feu : Limiter les ports exposés
  • Segmentation : Séparer les environnements
  • VPN : Pour l'accès administratif

Ports à exposer

PortServiceAccès
443HTTPS FrontendPublic
22SSHVPN uniquement
5432PostgreSQLLocal uniquement
6379RedisLocal uniquement

Configuration Docker

# Ne pas exposer les ports sensibles
services:
postgres:
# PAS de ports: exposés
networks:
- internal

backend:
networks:
- internal
- frontend

networks:
internal:
internal: true
frontend:

Audit et Logging

Événements à logger

CatégorieÉvénements
AuthentificationConnexions réussies/échouées
AutorisationAccès refusés
DonnéesCréations, modifications, suppressions
AdminChangements de configuration

Rétention des logs

TypeDurée
Sécurité1 an minimum
Application90 jours
Debug7 jours

Ne pas logger

  • Mots de passe (même hachés)
  • Tokens d'authentification
  • Numéros de documents d'identité complets
  • Données bancaires

Sauvegardes

Stratégie 3-2-1

  • 3 copies des données
  • 2 supports différents
  • 1 copie hors site

Sécurité des sauvegardes

  • Chiffrer les sauvegardes
  • Stocker les clés séparément
  • Tester les restaurations régulièrement

Script sécurisé

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

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

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

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

# Nettoyage
rm -f /tmp/backup.sql

Développement sécurisé

Validation des entrées

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

// Utiliser les contraintes Symfony
use Symfony\Component\Validator\Constraints as Assert;

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

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

Protection contre les injections

// SQL - Utiliser les requêtes préparées
$query = $em->createQuery('SELECT m FROM Menage m WHERE m.region = :region');
$query->setParameter('region', $region);

// JAMAIS de concaténation
// $query = "SELECT * FROM menages WHERE region = '$region'"; // DANGEREUX

Protection XSS

// Échapper les sorties
{{ variable|e }} {# Twig échappe par défaut #}

// Dans React, utiliser les mécanismes natifs
<div>{variable}</div> // Échappé automatiquement

// JAMAIS
<div dangerouslySetInnerHTML={{ __html: variable }} /> // À éviter

Gestion des secrets

Ne jamais commiter

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

Variables d'environnement

# Stocker les secrets dans l'environnement, pas dans le code
export DATABASE_URL="postgresql://user:password@host:5432/db"
export JWT_PASSPHRASE="secret_passphrase"

Rotation des secrets

SecretFréquence
Mots de passe BDDAnnuelle
Clés JWTSemestrielle
Clés API externesSelon la politique

Réponse aux incidents

Plan de réponse

  1. Détection : Alertes de monitoring
  2. Analyse : Évaluer l'impact
  3. Confinement : Limiter les dégâts
  4. Éradication : Supprimer la menace
  5. Récupération : Restaurer les services
  6. Post-mortem : Analyser et améliorer

Contacts d'urgence

Maintenir une liste à jour des contacts :

  • Administrateur système
  • Responsable sécurité
  • Équipe de développement
  • Support hébergeur

Procédure de compromission

# 1. Bloquer les accès
docker stop pch_backend pch_frontend

# 2. Changer les mots de passe
docker exec pch_postgres psql -U pch_admin -c "
ALTER USER pch_admin WITH PASSWORD 'nouveau_mot_de_passe';"

# 3. Régénérer les tokens
docker exec pch_backend php bin/console lexik:jwt:generate-keypair --overwrite

# 4. Analyser les logs
docker logs pch_backend --since "2024-01-15" > incident.log

Checklist de sécurité

Quotidien

  • Vérifier les alertes de monitoring
  • Consulter les tentatives de connexion échouées

Hebdomadaire

  • Vérifier les mises à jour de sécurité
  • Analyser les logs d'accès

Mensuel

  • Réviser les accès utilisateurs
  • Tester les sauvegardes
  • Vérifier les certificats SSL

Trimestriel

  • Audit des permissions
  • Test de restauration complet
  • Revue des procédures de sécurité

Annuel

  • Rotation des mots de passe système
  • Audit de sécurité complet
  • Formation des utilisateurs

Ressources

Références

Outils

  • Analyse de vulnérabilités : Trivy, Snyk
  • Test de pénétration : OWASP ZAP
  • Audit de code : SonarQube

Prochaines étapes