Upload
osinet
View
429
Download
14
Embed Size (px)
DESCRIPTION
En 3 ans d'audit de sites Drupal 7 pour identifier des problèmes de performance, qualité, ou sécurité OSInet a identifié les causes d'erreurs les plus fréquentes : en règle général, chaque site audit présente au moins l'une d'entre elles. Votre site est-il affecté par ces erreurs ?
Citation preview
1/66 • Drupal : worst current practice • © OSInet
Drupal : Best Worst current practice
Par Frédéric G. Marand
2/66 • Drupal : worst current practice • © OSInet
Drupagora
Paris le 14 novembre 2014
3/66 • Drupal : worst current practice • © OSInet
DRUPAGEDDON
5/66 • Drupal : worst current practice • © OSInet
CAS D'ÉCOLE : DRUPAGEDDON
LES DONNÉES
https://www.drupal.org/SA-CORE-2014-005
https://www.drupal.org/PSA-2014-003
EN PRODUCTION : un site qui ne suit pas les bonnes pratiques ades difficultés à appliquer la MàJ rapidement• Combien de minutes avant de déployer sur votre site ?• Pourquoi si longtemps ?• Comment améliorer ?• Comment gérer les suites ?
Introduction
6/66 • Drupal : worst current practice • © OSInet
OSInet,UN REGARD SPÉCIFIQUE DANS
L’ÉCOSYSTÈME DRUPAL
7/66 • Drupal : worst current practice • © OSInet
CONTRIBUTEURS AUX PROJETS LIBRES
OSInet• Contributeurs Drupal depuis
2005 • 100 % de l’effectif est
contributeur Drupal core 8 • Autres contributions depuis 94 :
Apache, Beego, Doctrine ODM,FirebirdSQL, MongoDB,Monolog, Samba, Silex…
Frédéric G. Marand• (Co-)auteur et (co-)correcteur
de plusieurs Security Advisories Drupal
• Mainteneur Drupal 7 core XML-RPC
• Mainteneur des contribs(References…)
http://www.osinet.fr
http://bit.ly/drupalosinet
@OSInet
http://drupal/u/fgm
Introduction
8/66 • Drupal : worst current practice • © OSInet
ACTIVITÉ
AUDIT CONSEIL
ARCHITECTURELEAD DÉV
Introduction
9/66 • Drupal : worst current practice • © OSInet
L’AUDIT TECHNIQUE DRUPAL
Problèmes récurrents motivant les audits :• Délais• Performance• Sécurité (réponse aux pénétrations)
Les principales erreurs se répètent par ignorance :évitez-les
Introduction
11/66 • Drupal : worst current practice • © OSInet
Quand les erreurs sont-ellesconstatées ?
• Durant l’acquisition• Durant la réalisation• Durant le fonctionnement
• Lors des visites anonymes
• Lors de l'utilisation en connecté
• Lors des opérations d'exploitation
Introduction
12/66 • Drupal : worst current practice • © OSInet
Quelles sont les erreurs les plusfréquentes ?
• Délais (coûts) excessifs de réalisation• Régressions durant le développement de code• Coûts excessifs en infrastructure• Failles XSS et autres• Performance front insuffisante• Performance back insuffisante
Introduction
13/66 • Drupal : worst current practice • © OSInet
Qui est source d’erreurs ?
• L’agence réalisatrice : mauvaises techniques de réalisation• Le studio graphique : maquettes ignorant les spécificités de
build Drupal• L’hébergeur : ignorance des contraintes spécifiques de
Drupal• La communauté Drupal et Open Source en général : peu de
modules / thèmes (aucun ?) ont le même niveau d’exigencequalité que Drupal core
• Le donneur d’ordres : analyse insuffisante des besoins,exigences inappropriées
Introduction
15/66 • Drupal : worst current practice • © OSInet
BUY
16/66 • Drupal : worst current practice • © OSInet
Propriété intellectuelle
Bloquer sur cession de propriété vs concession de licence
• Définition du besoin• Certification de conformité (compliance)
Ignorer l’impact de la viralité de la GPL sur les projetsDrupal• Code source PHP, JS• Assets graphiques• Contenus• Look-and-feel
PS I am nota lawyer.
Achat
17/66 • Drupal : worst current practice • © OSInet
Le cas des appels d’offres publics
Achat
• Difficulté à déclarer un marché infructueux mêmequand il devrait l’être
• Ne pas être à jour sur le CCAG-PI / CCAG-TIC etles circulaires associées
• Définition de l’objet du marché : site vs logiciel• Procédures de recette : spécification vs agilité
18/66 • Drupal : worst current practice • © OSInet
Choix des prestataires : principauxproblèmes
Agences de communicationtraditionnelles➔ Pas assez techniques pour
les projets importants
SSII (ESN) / SSLL (ENL)traditionnelles➔ Pas assez créatives pour
les projets importants
Spécialistes AMOA➔ Retour sur coût difficile à
évaluer avant un premieréchec
Drupalshops➔ Pas assez disponibles,
problèmes d’agrémentdans les grands comptes,pas assez deconnaissances autres
Achat
19/66 • Drupal : worst current practice • © OSInet
BUILD
20/66 • Drupal : worst current practice • © OSInet
Maîtrised'ouvrage
22/66 • Drupal : worst current practice • © OSInet
Ne pas savoir choisir sa version core : 6, 7,8 et son type de développement
— Ces temps-ci…
• Projets courts, à courte durée de vie (événementiel, one-off) :
7, build basique
• Projets plus longs, livrés début 2015, destinés à une refonte
assez rapide : 7, build best practice (cf session Best Practice)
• Projets plus longs, livrés mi-2015, destinés à un cycle de vie
plus long : 8, build best practice
• Évoluer les sites bloqués en 6 en mode découplé/composant.
• Ne plus lancer de nouveaux projets en 6
Build
23/66 • Drupal : worst current practice • © OSInet
Ne pas savoir définir ses choix en matièrede versions contrib
« STABLE ONLY » : de plus en plus, dans les projetsDrupal, « stable » est synonyme d'« obsolescent »
⇒ coûts de maintenance adaptative
« ANYTHING GOES » : risque que les constructeursutilisent des modules expérimentaux, sans cycle demise à jour disponible, voire non maintenus
⇒ coûts de maintenances corrective et adaptative
Build
24/66 • Drupal : worst current practice • © OSInet
Et plus...
• Ne pas réceptionner au fil de l’eau — pendant lesitérations — pour intercepter rapidement lesdivergences (héritage du cycle en V)
• Lors des réceptions d’itération, ne pas vérifier l’état de propreté du site (installation from scratchpossible, absence de doublons fonctionnels, detraces de composants abandonnés...)
Build
25/66 • Drupal : worst current practice • © OSInet
Processus dedéveloppement
26/66 • Drupal : worst current practice • © OSInet
Ne pas utiliser de gestionnaire de versions
...DU TOUT (dernier en date observé : ce mois-ci !)
...EFFICACEMENT :• code commenté en production au lieu d’être dans
une révision• commentaires de commit inutilisables• commits trop espacés• pas de process de branching réfléchi (eg: git flow,
github flow…)
Build
27/66 • Drupal : worst current practice • © OSInet
Créer un site par accumulation demodules contrib à portée limitée
• Souci additionnel de qualité, fragilité, maintenanceet MàJ
• Sauf dans le cas de couverture à 100 % de lafonctionnalité, l’adaptation est à long terme pluscoûteuse qu’un spécifique
Build
28/66 • Drupal : worst current practice • © OSInet
Créer un site par accumulation dechangements, sans mécanisme de
déploiement• Génération des fichiers
• Drush Makefile / Composer : – Avantages: dépôt léger, MàJ permanente
– Inconvénients : dépendance sur la disponibilité du réseau, non-compliance,MàJ permanente = risque de casse
• Vendoring : – Avantages : disponibilité, rapidité, compliance
– Inconvénients : défaut de MàJ automatique, dépôt lourd
• Profil(s) d’installation Drupal• Chargement des données par migration (Migrate API)
Build
29/66 • Drupal : worst current practice • © OSInet
Hacker core/contrib
Build
• Rarement nécessaire : le plus souvent, c’est unmanque de connaissances
• Si nécessaire, committer les patches de façonreproductible (ex : drush makefile, répertoirepatches …)
30/66 • Drupal : worst current practice • © OSInet
Développer en PHP brut, sans passer parles API Drupal
Exemples typiques, souvent sources de problèmesde sécurité :• API de bases de données natives au lieu de DB
API/Schema API (injection SQL)• Accès aux superglobals, notamment $_GET (XSS)• Stockage de données privées dans $_COOKIE au
lieu de $_SESSION (mascarade)• Actions de modification sur GET sans jeton ou
formulaire non protégé (CSRF)
Build
31/66 • Drupal : worst current practice • © OSInet
Développer sans visibilité des erreurs auniveau maximal (error_reporting = -1)
Build
• Les notices et warnings s’accumulent durant ledéveloppement
• En fin de projet, on constate des massesd’insertions dans dblog (2014 : 1500 insertionswatchdog/seconde sur un site) et plus le temps decorriger donc on le désactive
• Du coup, plus de suivi des vraies alertes
33/66 • Drupal : worst current practice • © OSInet
Tests de recette et montée en charge
Ne pas faire de TMC : toutva bien sur les postes dedéveloppement / recette
Tester sur unenvironnement non iso-prod
Tester depuis un postelocal, notamment le serveurfront
Tester uniquement enanonyme
Build
34/66 • Drupal : worst current practice • © OSInet
Négliger la prise en compte des pratiquespermettant l’internationalisation
• Formats en dur (dates, nombres, monnaies) au lieudes API Drupal
• Assemblage de chaînes traduites :exemple t($a) . t($b)
• Chaînes de texte non traduites dans les templateset modules
Build
35/66 • Drupal : worst current practice • © OSInet
OWN
36/66 • Drupal : worst current practice • © OSInet
Hébergement
37/66 • Drupal : worst current practice • © OSInet
Confondrehébergement etinfogéranceUn site de production abesoin d’un infogérant (services système) etnon simplement d’unhébergeur (location dematériel etinfrastructure pour leranger)
• Backups• Configuration, MàJ et
monitoring du serveurWeb et ses modules,PHP et ses extensions,bases de données,serveurs de cache,serveur de filed’attentes, etc
Own
38/66 • Drupal : worst current practice • © OSInet
Déployer sans cached’opcodes ou sansmonitoring
• PHP 5.3 ou 5.4 : APC,PHP 5.5 : Opcache
• Monitoring : apc.php,ocp, opcache-status, opcache-gui…
Own
39/66 • Drupal : worst current practice • © OSInet
Déployer unMemcached sanscomprendre saconfiguration
• settings.php : clusters, bins, préfixe...• extension, persistence, stratégie de
hashing, ucp/tcp, text/binaire…• slab size• Monitoring: phpmemcacheadmin,memcache.php…
• Un memcached mal réglé peut êtrebeaucoup plus lent qu’un cache en basede données
• Typique :• entrées > 1 Mo et slab size par
défaut• multisites sans préfixe,• bins saturés,• mélange chaud/froid, gaspillage
d’allocation• Documenté à partir de Drupal 7.33
Own
40/66 • Drupal : worst current practice • © OSInet
Déployer sur unsystème de fichiersinapproprié
• Écritures synchrones :NFS système sansaccélérateur
• lstat() lentsprovoqués pourinclude_once -> tunerealpath cache
Own
41/66 • Drupal : worst current practice • © OSInet
Maintenanceapplicative :corrective etadaptative
42/66 • Drupal : worst current practice • © OSInet
Own
Ne pas appliquer les MàJ de sécurité dansles délais
Pourquoi ne pas lesappliquer ?
• Rigidités entre mainteneur etinfogérant (procédures dedéploiement)
• Absence de réactivité dumainteneur
• Difficultés de MàJ :typiquement conséquencedes hacks core/contrib
43/66 • Drupal : worst current practice • © OSInet
Own
44/66 • Drupal : worst current practice • © OSInet
Travailler sanslogger
CAUSES TYPIQUES :• Désactivation de dblog
faute d’avoir codé àerror_reporting élevé, pour faire face auxmasses de notices
• Absence d’utilisation desyslog ou d’un mécanismeplus tolérant commemongodb_watchdog
Own
45/66 • Drupal : worst current practice • © OSInet
FRONT :
PERFORMANCE
46/66 • Drupal : worst current practice • © OSInet
Gestion decache
47/66 • Drupal : worst current practice • © OSInet
Cache de pagesinterne
• Cache interne désactivé(cache enabled :décoché)
• Expiration trop courte :limitation à la scalabilitéinterne (liée à l’infrapropre) et non externe(web scale)
Front
48/66 • Drupal : worst current practice • © OSInet
Pages non cachables • Écriture dans $_SESSION ou$_COOKIE pour les anonymes
• démarrage de session quimarque la page non cachable
• génération complète au hitsuivant
• grosse limite de scalabilitéramenant les anonymes à peuprès au niveau des connectés
• Utilisation de Varnish et/ou d’unCDN ou autre reverse proxy,mais émission par le code d’en-têtes de non-cachabilité
• suppression de la scalabilitéexterne
• inutilité complète de ces outils
Front
49/66 • Drupal : worst current practice • © OSInet
Désaccord sur ladurée du cache
• Technique → longéditorial → court
• En l’absence d’unestratégie claire, forteprobabilité d’uneabsence de prise encharge technique valide
Front
50/66 • Drupal : worst current practice • © OSInet
Agrégation des assets
• Désactivée pour le CSS et/ou le JS• généralement, ce n’est pas un oubli, mais le
prestataire indique que le site ne fonctionne pasavec : c’est le signe d’une erreur de réalisation, leplus souvent pour le code JS
• Simple : il y a des mécanismes d’agrégationavancée plus efficaces, comme le module advagg,notamment si on utilise un CDN avec le moduleCDN
Front
51/66 • Drupal : worst current practice • © OSInet
Domain sharding
Front
• ABSENCE :• Les cookies sont émis par les clients sur les
requêtes d’asset
• Avec Varnish ou un autre reverse proxy : nécessiteun VCL spécifique pour permettre de les ignorer etservir quand même de cache
• EXCÈS : multiplication des requêtes DNS pour lesclients
52/66 • Drupal : worst current practice • © OSInet
Et tous les problèmes du back office pour les
pages non cachées...
53/66 • Drupal : worst current practice • © OSInet
BACK
54/66 • Drupal : worst current practice • © OSInet
Requêtes sortantes durant le cycle depage
• La durée des pages devient > au temps de réponsede la ressource externe et peut bloquer
• Core:• update (uniquement pour les admins et sur
certaines pages)• aggregator, si poormanscron n’a pas été désactivé
SOLUTION Consommer dans des scripts CLI lancés parcron ou, mieux, depuis un worker de messaging externe(ex : Beanstalkd)
Back
56/66 • Drupal : worst current practice • © OSInet
Pic de charge inexpliqué après unelongue durée sans problème
TYPIQUE Utilisation d’un memcached avec l’erreur t($var) et la taille de cache_locale vient de dépasser 1Mo
VARIANTE Sur un site en évolution, une nouvelle version estbeaucoup plus lente en production qu'en développement
CONFIRMATION Déboguer l’utilisation du cache avecHeisencache ou XHprof
SOLUTION À court terme, augmenter la slab size, etrapidement corriger pour revenir à une taille normale
Back
57/66 • Drupal : worst current practice • © OSInet
Siteglobalementlent sans picspécifique
58/66 • Drupal : worst current practice • © OSInet
Cache de blocs désactivé
CAUSE Typiquement un ou plusieurs modules denode_access
CONFIRMATION Configurer stark pour n’avoir quele bloc contenu, basculer dessus momentanément, etcomparer : il devrait être considérablement plusrapide
SOLUTION 1 Repenser la logique de contrôled’accès aux données
SOLUTION 2 Introduire du cache dans chaque bloc
Back
59/66 • Drupal : worst current practice • © OSInet
Back
Cache de données
PROBLÈME 1 Cache désactivé — courant sur lessites construits sur Views et Panels
MALGRÉ le cache intégré de Views (durée) et ViewsContent Cache (invalidation)
ET MALGRÉ Panels Hash Cache
PROBLÈME 2 Utilisé à niveaux multiples
⇒ Cache de données, puis de fragments, puisd’assemblages, puis de rendu, puis de blocs … = n aller-retours vers le serveur de cache là où un seul suffirait
DIAGNOSTIC Heisencache (PerformanceSubscriber)
Too much of agood thing is
wonderful
60/66 • Drupal : worst current practice • © OSInet
Cache de variables toujours en MISS
CAUSE TYPIQUE Un variable_set dans un hook du cyclede page : hook_boot / hook_init / hook_exit, functionde shutdown, etc
ORIGINE Confusion entre settings/config/state(formalisés en D8)
DIAGNOSTIC var_dump(debug_backtrace(FALSE)) dans variable_set() et remonter la pile pour trouver lecoupable
VARIANTE Autres caches toujours en MISS
SOLUTION GÉNÉRALE Heisencache (WriteSubscriber)
Back
61/66 • Drupal : worst current practice • © OSInet
Trop grand nombre de requêtes SQL
DIAGNOSTIC devel.module ou utiliser lesfonctions de trace de l’API DB
SOLUTION Manuelle
Back
62/66 • Drupal : worst current practice • © OSInet
Trop grand nombre d’interventions dehook, notamment sur les nodes
CAUSE TYPIQUE Trop de modules
SOLUTION Réduire le nombre d’implémentationsen repensant la logique fonctionnelle
HACK hook_module_implements_alter() pour supprimer les situations connues comme nepouvant donner lieu à une modification en pratique— difficile et fragile, mais résultats rapides
Back
63/66 • Drupal : worst current practice • © OSInet
Autres problèmes courants
Opérations en boucle (node_load, node_view) aulieu d’opérations multiples(node_load_multiple)
Back
64/66 • Drupal : worst current practice • © OSInet
CONCLUSION
65/66 • Drupal : worst current practice • © OSInet
Conclusion
La clef : compétence
• Compétence du maître d'ouvrage (MOA) :déléguer n’est pas ignorer ⇒ se faire bienentourer et suivre son projet
66/66 • Drupal : worst current practice • © OSInet
Conclusion
67/66 • Drupal : worst current practice • © OSInet
Conclusion
La clef : compétence
• Compétence du maître d'ouvrage (MOA) :déléguer n’est pas ignorer ⇒ se faire bienentourer et suivre son projet
• Compétences internes ou AMOA• Compétence du maître d'œuvre (MOE)
68/66 • Drupal : worst current practice • © OSInet
Mesurer pour agir
Conclusion
• Savoir quoi mesurer• Savoir sur quoi agir
selon la mesure
69/66 • Drupal : worst current practice • © OSInet
Adapter
Adapter les pratiques à la taille du projet
En-dessous de quelques milliers de visites/jour,le stack Drupal/LAMP pardonne à peu près toutsauf l’absence de MàJ.
Conclusion
70/66 • Drupal : worst current practice • © OSInet
PASSEZ NOUS DIRE BONJOUR !
Frédéric G. Marand (fgm) Outi Munter (outi)
www.osinet.fr