Bonnes pratiques de développement sécurisé¶
Public : dĂ©veloppeur·euses contribuant Ă
quefairedemesobjets. Objectif : rappeler les rÚgles à appliquer dans le quotidien du dev pour produire du code sûr, et garantir le respect des standards de qualité que nous suivons.
Standards de référence¶
Nous nous engageons Ă respecter et Ă faire Ă©voluer le produit en suivant les standards suivants. Toute Pull Request doit pouvoir ĂȘtre lue Ă lâaune de ces rĂ©fĂ©rentiels.
Standards de lâIncubateur ADEME : Les Standards de lâIncubateur de lâADEME (rubriques QualitĂ© logicielle et SĂ©curitĂ© notamment).
Standards beta.gouv.fr : https://standards.beta.gouv.fr/standards, en particulier :
SĂ©curitĂ© : sensibilisation aux rĂšgles dâhygiĂšne, identification et maĂźtrise des risques cyber, plan dâaction dâhomologation.
Qualité logicielle : tests, observabilité, uniformité du code, documentation, déploiement continu.
Vie privée : données de production cloisonnées à la production, documents légaux publiés.
Ces deux référentiels sont la grille de lecture utilisée en revue de code et lors des points de coordination produit.
RÚgles à appliquer au quotidien¶
1. Ne jamais committer de secret¶
Le hook
detect-secretsest configurĂ© dans.pre-commit-config.yamlet doit ĂȘtre installĂ© en local (uv run pre-commit install).En cas de faux positif, mettre Ă jour
.secrets.baseline(voir troubleshooting).GitGuardian inspecte Ă©galement les commits poussĂ©s sur GitHub : un secret leakĂ© doit immĂ©diatement ĂȘtre rĂ©voquĂ© chez le fournisseur concernĂ©, puis remplacĂ©. Le simple
git revertnâefface pas lâhistorique.Pour le stockage et le cycle de vie des secrets, suivre Gestion des secrets.
2. Suivre les hooks de qualité avant chaque commit¶
Les contrĂŽles pre-commit sont la premiĂšre barriĂšre de qualitĂ© ; ils ne doivent jamais ĂȘtre contournĂ©s (--no-verify interdit en dehors dâun cas exceptionnel justifiĂ© en PR).
Outil |
RĂŽle |
|---|---|
|
Lint Python (sécurité incluse via les rÚgles |
|
Formatage Python. |
|
Formatage des templates Django. |
|
Formatage JS/TS/CSS/MD. |
|
Détection de secrets. |
|
Validation YAML. |
|
EmpĂȘche dâajouter des fichiers > 600 KB. |
|
Formatage OpenTofu/Terragrunt. |
3. Gérer les dépendances avec précaution¶
Ajouter une dépendance Python via
uv add <package>depuiswebapp/oudata-platform/(voir Gestion de package).Pour npm, respecter le cooldown de 7 jours (
--before="$(date -v -7d +%Y-%m-%d)") pour limiter le risque de supply chain attack.Préférer des dépendances maintenues, open source, à faible empreinte.
Les mises Ă jour automatiques sont gĂ©rĂ©es par Dependabot (hebdomadaire) : les PR Dependabot doivent ĂȘtre traitĂ©es (relues, mergĂ©es ou refusĂ©es explicitement).
Avant dâintroduire une nouvelle dĂ©pendance, vĂ©rifier quâelle ne duplique pas une capacitĂ© dĂ©jĂ prĂ©sente et quâelle nâa pas de CVE ouverte sĂ©rieuse.
4. Ăcrire et exĂ©cuter les tests¶
Toute nouvelle fonctionnalitĂ© ou correction de bug est accompagnĂ©e dâau moins un test (unitaire, intĂ©gration ou E2E selon le cas).
CÎté
webapp/:make unit-test,make integration-test, et les E2E Playwright.CÎté
data-platform/:make dags-test.Les tests E2E couvrent les parcours critiques utilisateurs ; ils valident notamment les comportements anti-rĂ©gression (CSRF, contrĂŽle dâaccĂšs admin, etc.).
5. Sécuriser le code Django¶
Toujours utiliser lâORM ou des requĂȘtes paramĂ©trĂ©es : pas de SQL construit par concatĂ©nation de chaĂźnes (risque dâinjection).
Ăchapper les templates : Django Ă©chappe par dĂ©faut ; ne jamais utiliser
|safeoumark_safesur de lâentrĂ©e utilisateur non validĂ©e.CSRF activĂ© sur toutes les vues mutables (POST/PUT/DELETE). Ne dĂ©sactiver
csrf_exemptque sur les endpoints publics en lecture documentĂ©s (cf. API REST).ContrĂŽle dâaccĂšs sur les vues administratives :
LoginRequiredMixin,PermissionRequiredMixin, oucore.utils.has_explicit_perm(cf. Authentification).DEBUG = Falseobligatoire hors local ; ne jamais activerDEBUG = Trueen preprod/prod.Respecter
ALLOWED_HOSTS,CSRF_TRUSTED_ORIGINS,SECURE_REFERRER_POLICY,SECURE_PROXY_SSL_HEADERdĂ©jĂ dĂ©finis danscore/settings.py.Tout nouveau header de sĂ©curitĂ© (CSP, HSTS, etc.) ajoutĂ© ou modifiĂ© doit ĂȘtre documentĂ© dans SĂ©curitĂ© rĂ©seau.
6. Sécuriser le code TypeScript / frontend¶
Pas de
innerHTMLavec de lâentrĂ©e utilisateur ; prĂ©fĂ©rertextContentou les helpers du framework (Stimulus, Turbo).Valider toute donnĂ©e venant de
window.location,postMessageou dâun iframe parent avant utilisation.VĂ©rifier lâorigine des messages dans le contexte iframe (cf. SĂ©curitĂ© rĂ©seau â section Embeds iframe).
7. SĂ©curiser lâinfrastructure et la CI¶
Les modifications dâinfrastructure passent par OpenTofu/Terragrunt ; relire les plans avant
apply.Les variables sensibles vivent dans des
terraform.tfvarsnon versionnés (sensitive = true).Les secrets CI/CD vivent dans les GitHub Environments
preprod/prod(protection surmain).Ne jamais logguer un token, un secret ou une donnée personnelle en clair, ni dans Sentry, PostHog ou Matomo.
8. Ne pas utiliser les données de production hors production¶
En local et en preprod, utiliser les bases de donnĂ©es dĂ©diĂ©es et les jeux de fixtures (voir CrĂ©ation dâune DB dâexemple).
Les copies prod â preprod (
sync_databases.yml) sont la seule voie autorisĂ©e et sont anonymisĂ©es/restreintes.Aucune donnĂ©e personnelle de production ne doit ĂȘtre copiĂ©e sur un poste de dĂ©veloppeur en clair.
9. Revue de code (PR)¶
Chaque PR doit :
ĂȘtre petite et ciblĂ©e, lisible en quelques minutes ;
dĂ©crire lâintention (le pourquoi) et les impacts sĂ©curitĂ© Ă©ventuels ;
inclure les tests associés ;
passer toute la CI (lint, format, tests, E2E) avant merge ;
ĂȘtre relue par au moins un·e autre dĂ©veloppeur·euse, qui sâassure du respect des points ci-dessus.
10. Observabilité et réaction¶
Les erreurs runtime remontent dans Sentry â y jeter un Ćil rĂ©guliĂšrement, surtout aprĂšs un dĂ©ploiement.
Dashlord (https://dashlord.incubateur.ademe.fr/) surveille la posture sĂ©curitĂ© externe (headers, TLS, etc.) â toute rĂ©gression doit ĂȘtre corrigĂ©e rapidement.
Pour la chaĂźne dâobservabilitĂ© complĂšte : Monitoring.
Signaler ou réagir à une faille¶
Une faille dĂ©couverte dans le code ou en production se signale selon la procĂ©dure SECURITY.md (mail Ă
longuevieauxobjets@ademe.fr).En cas de doute sur un comportement potentiellement sensible (donnĂ©e exposĂ©e, contrĂŽle dâaccĂšs dĂ©faillant, dĂ©pendance vulnĂ©rable), ne pas publier de PR ouverte ; ouvrir un canal privĂ© avec lâĂ©quipe dâabord.
Pour aller plus loin¶
RĂ©fĂ©rence â SĂ©curitĂ© (politique, monitoring, authentification, secrets, rĂ©seau, sauvegardes).