Slide 1

Slide 1 text

1/66 • Drupal : worst current practice • © OSInet Drupal : Best Worst current practice Par Frédéric G. Marand

Slide 2

Slide 2 text

2/66 • Drupal : worst current practice • © OSInet Drupagora Paris le 14 novembre 2014

Slide 3

Slide 3 text

3/66 • Drupal : worst current practice • © OSInet DRUPAGEDDON

Slide 4

Slide 4 text

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 a des 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

Slide 5

Slide 5 text

6/66 • Drupal : worst current practice • © OSInet OSInet, UN REGARD SPÉCIFIQUE DANS L’ÉCOSYSTÈME DRUPAL

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

8/66 • Drupal : worst current practice • © OSInet ACTIVITÉ AUDIT CONSEIL ARCHITECTURE LEAD DÉV Introduction

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

11/66 • Drupal : worst current practice • © OSInet Quand les erreurs sont-elles constaté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

Slide 10

Slide 10 text

12/66 • Drupal : worst current practice • © OSInet Quelles sont les erreurs les plus fré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

Slide 11

Slide 11 text

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’exigence qualité que Drupal core • Le donneur d’ordres : analyse insuffisante des besoins, exigences inappropriées Introduction

Slide 12

Slide 12 text

15/66 • Drupal : worst current practice • © OSInet BUY

Slide 13

Slide 13 text

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 projets Drupal • Code source PHP, JS • Assets graphiques • Contenus • Look-and-feel PS I am not a lawyer. Achat

Slide 14

Slide 14 text

17/66 • Drupal : worst current practice • © OSInet Le cas des appels d’offres publics Achat • Difficulté à déclarer un marché infructueux même quand il devrait l’être • Ne pas être à jour sur le CCAG-PI / CCAG-TIC et les circulaires associées • Définition de l’objet du marché : site vs logiciel • Procédures de recette : spécification vs agilité

Slide 15

Slide 15 text

18/66 • Drupal : worst current practice • © OSInet Choix des prestataires : principaux problèmes Agences de communication traditionnelles ➔ 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ément dans les grands comptes, pas assez de connaissances autres Achat

Slide 16

Slide 16 text

19/66 • Drupal : worst current practice • © OSInet BUILD

Slide 17

Slide 17 text

20/66 • Drupal : worst current practice • © OSInet Maîtrise d'ouvrage

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

23/66 • Drupal : worst current practice • © OSInet Ne pas savoir définir ses choix en matière de versions contrib « STABLE ONLY » : de plus en plus, dans les projets Drupal, « stable » est synonyme d'« obsolescent » ⇒ coûts de maintenance adaptative « ANYTHING GOES » : risque que les constructeurs utilisent des modules expérimentaux, sans cycle de mise à jour disponible, voire non maintenus ⇒ coûts de maintenances corrective et adaptative Build

Slide 20

Slide 20 text

24/66 • Drupal : worst current practice • © OSInet Et plus... • Ne pas réceptionner au fil de l’eau — pendant les itérations — pour intercepter rapidement les divergences (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 scratch possible, absence de doublons fonctionnels, de traces de composants abandonnés...) Build

Slide 21

Slide 21 text

25/66 • Drupal : worst current practice • © OSInet Processus de développement

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

27/66 • Drupal : worst current practice • © OSInet Créer un site par accumulation de modules contrib à portée limitée • Souci additionnel de qualité, fragilité, maintenance et MàJ • Sauf dans le cas de couverture à 100 % de la fonctionnalité, l’adaptation est à long terme plus coûteuse qu’un spécifique Build

Slide 24

Slide 24 text

28/66 • Drupal : worst current practice • © OSInet Créer un site par accumulation de changements, 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

Slide 25

Slide 25 text

29/66 • Drupal : worst current practice • © OSInet Hacker core/contrib Build • Rarement nécessaire : le plus souvent, c’est un manque de connaissances • Si nécessaire, committer les patches de façon reproductible (ex : drush makefile, répertoire patches …)

Slide 26

Slide 26 text

30/66 • Drupal : worst current practice • © OSInet Développer en PHP brut, sans passer par les API Drupal Exemples typiques, souvent sources de problèmes de 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

Slide 27

Slide 27 text

31/66 • Drupal : worst current practice • © OSInet Développer sans visibilité des erreurs au niveau maximal (error_reporting = -1) Build • Les notices et warnings s’accumulent durant le développement • En fin de projet, on constate des masses d’insertions dans dblog (2014 : 1500 insertions watchdog/seconde sur un site) et plus le temps de corriger donc on le désactive • Du coup, plus de suivi des vraies alertes

Slide 28

Slide 28 text

33/66 • Drupal : worst current practice • © OSInet Tests de recette et montée en charge Ne pas faire de TMC : tout va bien sur les postes de développement / recette Tester sur un environnement non iso- prod Tester depuis un poste local, notamment le serveur front Tester uniquement en anonyme Build

Slide 29

Slide 29 text

34/66 • Drupal : worst current practice • © OSInet Négliger la prise en compte des pratiques permettant l’internationalisation • Formats en dur (dates, nombres, monnaies) au lieu des API Drupal • Assemblage de chaînes traduites : exemple t($a) . t($b) • Chaînes de texte non traduites dans les templates et modules Build

Slide 30

Slide 30 text

35/66 • Drupal : worst current practice • © OSInet OWN

Slide 31

Slide 31 text

36/66 • Drupal : worst current practice • © OSInet Hébergement

Slide 32

Slide 32 text

37/66 • Drupal : worst current practice • © OSInet Confondre hébergement et infogérance Un site de production a besoin d’un infogérant (services système) et non simplement d’un hébergeur (location de matériel et infrastructure pour le ranger) • Backups • Configuration, MàJ et monitoring du serveur Web et ses modules, PHP et ses extensions, bases de données, serveurs de cache, serveur de file d’attentes, etc Own

Slide 33

Slide 33 text

38/66 • Drupal : worst current practice • © OSInet Déployer sans cache d’opcodes ou sans monitoring • PHP 5.3 ou 5.4 : APC, PHP 5.5 : Opcache • Monitoring : apc.php, ocp, opcache- status, opcache- gui… Own

Slide 34

Slide 34 text

39/66 • Drupal : worst current practice • © OSInet Déployer un Memcached sans comprendre sa configuration • 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 être beaucoup plus lent qu’un cache en base de 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

Slide 35

Slide 35 text

40/66 • Drupal : worst current practice • © OSInet Déployer sur un système de fichiers inapproprié • Écritures synchrones : NFS système sans accélérateur • lstat() lents provoqués pour include_once -> tune realpath cache Own

Slide 36

Slide 36 text

41/66 • Drupal : worst current practice • © OSInet Maintenance applicative : corrective et adaptative

Slide 37

Slide 37 text

42/66 • Drupal : worst current practice • © OSInet Own Ne pas appliquer les MàJ de sécurité dans les délais Pourquoi ne pas les appliquer ? • Rigidités entre mainteneur et infogérant (procédures de déploiement) • Absence de réactivité du mainteneur • Difficultés de MàJ : typiquement conséquence des hacks core/contrib

Slide 38

Slide 38 text

43/66 • Drupal : worst current practice • © OSInet Own

Slide 39

Slide 39 text

44/66 • Drupal : worst current practice • © OSInet Travailler sans logger CAUSES TYPIQUES : • Désactivation de dblog faute d’avoir codé à error_reporting élevé, pour faire face aux masses de notices • Absence d’utilisation de syslog ou d’un mécanisme plus tolérant comme mongodb_watchdog Own

Slide 40

Slide 40 text

45/66 • Drupal : worst current practice • © OSInet FRONT : PERFORMANCE

Slide 41

Slide 41 text

46/66 • Drupal : worst current practice • © OSInet Gestion de cache

Slide 42

Slide 42 text

47/66 • Drupal : worst current practice • © OSInet Cache de pages interne • Cache interne désactivé (cache enabled : décoché) • Expiration trop courte : limitation à la scalabilité interne (liée à l’infra propre) et non externe (web scale) Front

Slide 43

Slide 43 text

48/66 • Drupal : worst current practice • © OSInet Pages non cachables • Écriture dans $_SESSION ou $_COOKIE pour les anonymes • démarrage de session qui marque la page non cachable • génération complète au hit suivant • grosse limite de scalabilité ramenant les anonymes à peu près au niveau des connectés • Utilisation de Varnish et/ou d’un CDN 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

Slide 44

Slide 44 text

49/66 • Drupal : worst current practice • © OSInet Désaccord sur la durée du cache • Technique → long éditorial → court • En l’absence d’une stratégie claire, forte probabilité d’une absence de prise en charge technique valide Front

Slide 45

Slide 45 text

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 pas avec : c’est le signe d’une erreur de réalisation, le plus souvent pour le code JS • Simple : il y a des mécanismes d’agrégation avancée plus efficaces, comme le module advagg, notamment si on utilise un CDN avec le module CDN Front

Slide 46

Slide 46 text

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écessite un VCL spécifique pour permettre de les ignorer et servir quand même de cache • EXCÈS : multiplication des requêtes DNS pour les clients

Slide 47

Slide 47 text

52/66 • Drupal : worst current practice • © OSInet Et tous les problèmes du back office pour les pages non cachées...

Slide 48

Slide 48 text

53/66 • Drupal : worst current practice • © OSInet BACK

Slide 49

Slide 49 text

54/66 • Drupal : worst current practice • © OSInet Requêtes sortantes durant le cycle de page • La durée des pages devient > au temps de réponse de 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 par cron ou, mieux, depuis un worker de messaging externe (ex : Beanstalkd) Back

Slide 50

Slide 50 text

56/66 • Drupal : worst current practice • © OSInet Pic de charge inexpliqué après une longue 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 1 Mo VARIANTE Sur un site en évolution, une nouvelle version est beaucoup plus lente en production qu'en développement CONFIRMATION Déboguer l’utilisation du cache avec Heisencache ou XHprof SOLUTION À court terme, augmenter la slab size, et rapidement corriger pour revenir à une taille normale Back

Slide 51

Slide 51 text

57/66 • Drupal : worst current practice • © OSInet Site globalement lent sans pic spécifique

Slide 52

Slide 52 text

58/66 • Drupal : worst current practice • © OSInet Cache de blocs désactivé CAUSE Typiquement un ou plusieurs modules de node_access CONFIRMATION Configurer stark pour n’avoir que le bloc contenu, basculer dessus momentanément, et comparer : il devrait être considérablement plus rapide SOLUTION 1 Repenser la logique de contrôle d’accès aux données SOLUTION 2 Introduire du cache dans chaque bloc Back

Slide 53

Slide 53 text

59/66 • Drupal : worst current practice • © OSInet Back Cache de données PROBLÈME 1 Cache désactivé — courant sur les sites construits sur Views et Panels MALGRÉ le cache intégré de Views (durée) et Views Content Cache (invalidation) ET MALGRÉ Panels Hash Cache PROBLÈME 2 Utilisé à niveaux multiples ⇒ Cache de données, puis de fragments, puis d’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 a good thing is wonderful

Slide 54

Slide 54 text

60/66 • Drupal : worst current practice • © OSInet Cache de variables toujours en MISS CAUSE TYPIQUE Un variable_set dans un hook du cycle de page : hook_boot / hook_init / hook_exit, function de 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 le coupable VARIANTE Autres caches toujours en MISS SOLUTION GÉNÉRALE Heisencache (WriteSubscriber) Back

Slide 55

Slide 55 text

61/66 • Drupal : worst current practice • © OSInet Trop grand nombre de requêtes SQL DIAGNOSTIC devel.module ou utiliser les fonctions de trace de l’API DB SOLUTION Manuelle Back

Slide 56

Slide 56 text

62/66 • Drupal : worst current practice • © OSInet Trop grand nombre d’interventions de hook, notamment sur les nodes CAUSE TYPIQUE Trop de modules SOLUTION Réduire le nombre d’implémentations en repensant la logique fonctionnelle HACK hook_module_implements_alter() pour supprimer les situations connues comme ne pouvant donner lieu à une modification en pratique — difficile et fragile, mais résultats rapides Back

Slide 57

Slide 57 text

63/66 • Drupal : worst current practice • © OSInet Autres problèmes courants Opérations en boucle (node_load, node_view) au lieu d’opérations multiples (node_load_multiple) Back

Slide 58

Slide 58 text

64/66 • Drupal : worst current practice • © OSInet CONCLUSION

Slide 59

Slide 59 text

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 bien entourer et suivre son projet

Slide 60

Slide 60 text

66/66 • Drupal : worst current practice • © OSInet Conclusion

Slide 61

Slide 61 text

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 bien entourer et suivre son projet • Compétences internes ou AMOA • Compétence du maître d'œuvre (MOE)

Slide 62

Slide 62 text

68/66 • Drupal : worst current practice • © OSInet Mesurer pour agir Conclusion • Savoir quoi mesurer • Savoir sur quoi agir selon la mesure

Slide 63

Slide 63 text

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 tout sauf l’absence de MàJ. Conclusion

Slide 64

Slide 64 text

70/66 • Drupal : worst current practice • © OSInet PASSEZ NOUS DIRE BONJOUR ! Frédéric G. Marand (fgm) Outi Munter (outi) www.osinet.fr

Slide 65

Slide 65 text

71/66 • Drupal : worst current practice • © OSInet OSInet www.osinet.fr [email protected]