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
| Action | Recommandation |
|---|---|
| Création | Un compte par personne |
| Partage | Jamais partager les identifiants |
| Inactivité | Désactiver après 90 jours sans connexion |
| Départ | Dé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
| Niveau | Description | Exemples |
|---|---|---|
| Public | Accessible à tous | Documentation |
| Interne | Utilisateurs authentifiés | Statistiques agrégées |
| Confidentiel | Accès restreint | Données bénéficiaires |
| Secret | Très restreint | Informations 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
| Port | Service | Accès |
|---|---|---|
| 443 | HTTPS Frontend | Public |
| 22 | SSH | VPN uniquement |
| 5432 | PostgreSQL | Local uniquement |
| 6379 | Redis | Local 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 |
|---|---|
| Authentification | Connexions réussies/échouées |
| Autorisation | Accès refusés |
| Données | Créations, modifications, suppressions |
| Admin | Changements de configuration |
Rétention des logs
| Type | Durée |
|---|---|
| Sécurité | 1 an minimum |
| Application | 90 jours |
| Debug | 7 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
| Secret | Fréquence |
|---|---|
| Mots de passe BDD | Annuelle |
| Clés JWT | Semestrielle |
| Clés API externes | Selon la politique |
Réponse aux incidents
Plan de réponse
- Détection : Alertes de monitoring
- Analyse : Évaluer l'impact
- Confinement : Limiter les dégâts
- Éradication : Supprimer la menace
- Récupération : Restaurer les services
- 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