Skip to content

Guide de développement sécurisé

Loup Theron edited this page Nov 7, 2024 · 4 revisions

1. Gestion des erreurs API

  • Messages d’erreur clairs mais génériques : Assurez-vous que les erreurs renvoyées par l’API au frontend ne contiennent pas d'informations sensibles (comme la structure de la base de données, les détails des exceptions internes ou les chemins du système de fichiers). Exemples: BackendUsageErrorDataOutput, BackendRequestErrorDataOutput, BackendInternalErrorDataOutput.
  • Logs détaillés côté serveur uniquement : Pour un dépannage efficace, enregistrez des détails spécifiques dans les journaux côté serveur. Le frontend ne doit voir qu’un message générique, par exemple : "Une erreur est survenue. Veuillez réessayer plus tard."
  • Gestion des statuts HTTP : Utilisez les statuts HTTP appropriés (400 pour les erreurs de validation, 401 pour les accès non autorisés, etc.) pour une interprétation correcte par le frontend.

2. Protection des données sensibles

  • Mots de passe et tokens : Ne stockez jamais de mots de passe ou de tokens en clair dans le code source. Utilisez des variables d’environnement.
  • Chiffrement des données sensibles : Si des informations sensibles doivent être stockées, assurez-vous qu’elles sont chiffrées au repos et en transit. Les informations de connexion ne doivent jamais être transmises sans chiffrement (utilisez HTTPS).

3. Authentification et autorisation

  • Tokens courts et contrôlés : Utilisez des tokens d’authentification (JWT) avec des durées de vie courtes et gérez le renouvellement de manière sécurisée (Nous utilisons OIDC Auth Code Flow + PKCE). Limitez les droits des utilisateurs en fonction de leurs rôles (rôles user et superUser).
  • Permissions fines : Mettez en place un contrôle d'accès basé sur les rôles (RBAC) pour limiter les actions possibles par niveau d’utilisateur et prévenir les accès non autorisés à certaines parties de l’API.

4. Validation des entrées

  • Contrôles côté serveur : Toutes les données reçues du frontend doivent être validées côté serveur, même si elles sont déjà validées côté client. Cela inclut les paramètres d'URL, le corps des requêtes, et les en-têtes.
  • Protection contre les injections : Utilisez des bibliothèques de protection contre les injections SQL, comme ORM (Data-JPA dans notre cas) pour les bases de données, et veillez à échapper correctement les entrées dans les requêtes SQL.
  • Limiter la taille des requêtes : Pour éviter les attaques par déni de service (DoS), définissez des limites de taille pour les requêtes et le nombre d’enregistrements dans les réponses.

5. Tests et assurance qualité

  • Analyse statique de code : Utilisez des outils d’analyse de code, tels que SonarQube, pour détecter des vulnérabilités et problèmes de sécurité dès l’écriture du code.

6. Bonnes pratiques de gestion des secrets

  • Fichiers .env et variables d’environnement : Ne commitez jamais de fichiers .env contenant des secrets dans le dépôt. Utilisez un fichier .gitignore pour exclure ces fichiers sensibles.
  • Rotation des secrets : Préparez un plan de rotation des secrets pour les cas où des clés API, des tokens ou d’autres secrets sont compromis.
  • Journalisation des accès : Enregistrez et surveillez les accès aux secrets pour détecter tout comportement anormal.
  • Les mot-de-passes et secrets sont disponibles dans vaultwarden.

7. Sécurisation du frontend

  • Sanitization des données : Évitez les vulnérabilités XSS en "nettoyant" toutes les données affichées dans le frontend qui proviennent de l’utilisateur.
  • Utilisation de Content Security Policy (CSP) : Définissez une politique CSP pour restreindre les sources de scripts et protéger contre les attaques XSS.

8. Mises à jour et surveillance

  • Mises à jour des dépendances : Surveillez et mettez régulièrement à jour les dépendances de votre projet pour inclure les derniers correctifs de sécurité.
  • Surveillance en temps réel : Utilisez des outils de surveillance pour détecter les comportements anormaux ou les tentatives d'intrusion et réagir rapidement aux incidents.