Bonnes pratiques pour sécuriser un site web

La sécurité des sites web (sites e-commerce, sites vitrines, plateformes SaaS et autres applications web) est un enjeu majeur pour les entreprises. Étant exposés au public, tous ces systèmes sont naturellement des cibles de choix pour des attaquants, qui profitent de nombreuses vulnérabilités au niveau des fonctionnalités et autres composantes des sites web : serveurs, données, composants tiers et autres fonctionnalités critiques tels que l’authentification, la gestion des sessions ou le contrôle d’accès.

Pourquoi est-il important de sécuriser un site web ?

Au-delà de l’aspect protection contre des intrusions malveillantes, la sécurité est également un argument commercial majeur et un aspect clé pour rassurer et donc convertir des prospects en clients. En effet, lors d’échanges avec un prospect pour la souscription à une application SaaS par exemple, il n’est pas rare que la question des démarches et actions cybersécurité réalisées par l’éditeur se pose. Ainsi, une certification (SOC ou ISO 27001), un certificat d’audit de sécurité ou un rapport de tests d’intrusion permettent de lever ce type de barrières. De la même manière, une plateforme e-commerce qui met en avant un sceau de sécurité délivré par un organisme tiers, aura plus de facilités à convertir ses visiteurs et réduire les abandons de panier.

Sécuriser un site web est donc vital et cela passe nécessairement par l’implémentation des meilleures pratiques en termes de développement, d’intégration, de suivi et de tests sécurité. Cet article ne vise pas l’exhaustivité. Il abordera la sécurité web uniquement sous l’angle des bonnes pratiques, avec quelques informations complémentaires sur les risques, les types d’attaques et les vulnérabilités qui peuvent être exploitées par des attaquants pour compromettre un site web et un système d’information pris dans son ensemble. Nous vous invitons donc à consulter notre article : Comment renforcer la sécurité des applications web pour contrer les attaques les plus courantes ? afin d’avoir une vision plus globale sur les enjeux et risques sécurité, liés aux sites web (applications web, sites e-commerce, etc.).

Maîtriser son exposition et réduire sa surface d’attaque

Entrons dans le vif du sujet avec un aspect essentiel, qui sera par ailleurs le fil conducteur et la synthèse globale de notre article : l’exposition d’une entreprise, autrement dit sa surface d’attaque.

La question de la surface d’attaque est centrale dans une démarche cybersécurité car elle est au cœur de la stratégie des attaquants. En effet, toute attaque informatique sur un site web, un réseau interne ou une infrastructure externe commence généralement par une phase de reconnaissance, permettant d’identifier les portes d’entrée potentielles. Par ailleurs, il est à noter que les pirates informatiques ne ciblent que très rarement une entreprise précise ou un site web spécifique. Ils recherchent en effet des cibles potentielles tous azimuts. Et leurs victimes favorites sont les entreprises les plus exposées publiquement, avec, de fait, la surface d’attaque la plus étendue.

La surface d’attaque peut concerner un site web, un logiciel, un réseau, elle peut être humaine ou physique.

Et la surface d’attaque d’une entreprise sera finalement composée de tous ces éléments.

  • Des services d’administration (SSH, FTP, MySQL, etc.) exposés publiquement ;
  • Des modes debug activés sur un environnement de production ;
  • Une plateforme de démo, accessible en ligne ou téléchargeable, qui serait une copie conforme de votre application web en production ;
  • Un plugin populaire utilisé sur le CMS WordPress non mis à jour avec des vulnérabilités connues sur les versions précédentes ;
  • Des documents d’architecture accessibles ;
  • Des identifiants par défaut sur un service ou une machine exposée permettant d’accéder à l’interface d’administration ;  
  • Un réseau interne non segmenté avec un WI-FI visiteur permettant d’écouter le trafic ;
  • Des fuites de données contenant des identifiants d’un ancien collaborateur non révoqués ;

Tous ces exemples sont des brèches qui, bien exploitées, peuvent permettre à des attaquants de compromettre un système d’information. Et ces scénarios sont bien réels. Il s’agit en effet de cas rencontrés durant des phases de reconnaissance – première étape de la méthodologie de tout test d’intrusion – dans le cadre de pentests de site web, de plateformes e-commerce, d’application web, de réseau interne, etc. ou lors d’audits de reconnaissance réalisés par les hackers éthiques que nous sommes.

Sécuriser un site web passe nécessairement par une maitrise de son exposition. Ainsi, cartographie et durcissement des systèmes sont les 2 étapes incontournables.

Comment cartographier sa surface d’attaque ?

Pour réduire sa surface d’attaque, il est d’abord nécessaire d’en dresser une cartographie précise et complète. Il s’agira donc de lister tous les actifs, leurs versions et imbrications dans l’ensemble de votre SI. Des outils tels que censys ou shodan facilitent cette démarche.

Ainsi, vous pouvez cartographier la surface d’attaque d’une machine ou d’une application web spécifique. Pour une application web notamment, il s’agira de lister toutes les pages web dynamiques, formulaires, ports ouverts, comptes systèmes, toutes les applications ou service en cours d’exécution (APIs par exemple), etc.

Suite à cette cartographie, qui doit être exhaustive et continuellement actualisée car les systèmes ne sont jamais figés, il s’agira de réaliser une analyse détaillée de tous les éléments identifiés. Pour un port ouvert par exemple, on pourra chercher tout ce qui pourrait être utilisé par un attaquant pour profiter de l’exposition de ce port. Sur une application, en partant d’un compte utilisateur standard, on pourra tester les possibilités d’élévation de privilèges, etc.  

Les résultats de cette analyse permettront d’identifier les points les plus critiques afin d’appliquer les mesures de durcissement nécessaires.  

Comment réduire sa surface d’attaque ? 

Ci-dessous des exemples de mesures de durcissement de systèmes qui participent à réduire votre surface d’attaque :

  • Limiter l’accès aux modules d’administration en appliquant des restrictions IP.
  • Supprimer le code de test, de débogage et le code obsolète des applications de production.
  • Si possible, utiliser du contenu statique dans les démos d’applications.
  • Retirer les échantillons de code et les programmes des serveurs de production et de vos applications.
  • Éviter ou contrôler soigneusement les composants tiers.
  • Appliquer le principe de moindre privilège dans la gestion des droits d’accès aux serveurs, applications, base de données, etc.
  • Segmenter le réseau et isoler les systèmes et applications critiques.
  • Modifier les mots de passe par défaut de tous vos services et équipements connectés.
  • Désinstaller ou supprimer les applications, services et environnements non utilisés.
  • Assurer une veille technique et technologique sur nouvelles versions et les vulnérabilités découvertes sur les composants tiers ou services utilisés.
  • Révoquer les identifiants de vos anciens collaborateurs.

Sécuriser les serveurs web  

Les serveurs web, en raison des données sensibles qu’ils hébergent sont l’un des éléments les plus ciblés par des attaquants. La sécurité des serveurs est donc tout aussi importante que la sécurité de la couche applicative. Ci-dessous les mesures de sécurité et les bonnes pratiques à implémenter pour sécuriser un serveur web. Pour les risques sécurité liés au cloud, vous pouvez consulter notre article dédié sur ce sujet : Sécurité du cloud : quels sont les risques et les bonnes pratiques ?

Supprimer les services inutiles

Dans une installation par défaut d’un système d’exploitation et d’un serveur, de nombreux services et modules inutiles sont installés. Cependant, plus il y a des services, plus y aura des ports ouverts, laissant ainsi des brèches importantes qui peuvent être exploitées par des attaquants externes ou des utilisateurs malveillants. Désactiver les services inutiles libérera non seulement des ressources matérielles mais rendra votre serveur plus performant et plus sécurisé.

En effet, il est important de configurer votre serveur en fonction des seuls services indispensables à votre activité, en partant du principe que tout ce qui n’a pas besoin d’être autorisé doit être interdit, tout ce qui est inutile doit être désactivé ou supprimé, pour éviter les points d’accès superflus et potentiellement dangereux.

Appliquer le principe de la sécurité par l’obscurité

  • Réduire au maximum les informations délivrées par les services ainsi que dans le code source de votre site web.
  • Personnaliser toutes les pages d’erreurs de telle façon à ne divulguer aucune information qui puisse aider un attaquant.
  • Supprimer les traces et configurer le serveur de manière à ne pas divulguer les technologies et les versions utilisées.
  • Réécrire des URLs pour cacher les technologies utilisées.
  • Désactiver l’affichage du contenu des répertoires.

Séparer les environnements de développement, de tests (recette) et de production

Pour des raisons de facilité, il est courant que le développement et le test d’application web s’effectuent directement sur le serveur de production. Cette pratique est à proscrire car ces applications contiennent généralement des vulnérabilités, qui peuvent facilement être découvertes et exploitées par un utilisateur malveillant.

Idéalement, le développement et le test d’applications web doivent toujours être effectués sur des serveurs isolés d’internet, et ne devraient jamais utiliser ou se connecter à des bases de données réelles pour réduire le risque d’attaque par rebond.

Sécuriser l’authentification, la gestion des sessions et le contrôle d’accès d’un site web

Les fonctionnalités les plus ciblées sur un site web par des attaquants sont sans aucun doute l’authentification, le système de gestion des sessions et le contrôle d’accès. Brute force, vols de session, élévation de privilèges, etc., les possibilités d’attaques sont nombreuses, mais les moyens des se défendre le sont tout autant.

Nous avons publié un article dédié aux bonnes pratiques permettant de sécuriser les systèmes d’authentification, de gestion de session et de contrôle d’accès des applications web.  

Protéger les données sensibles

Dans beaucoup d’applications web, les données sensibles telles que les identifiants et les informations d’authentification ne sont pas correctement protégées. Ces données sensibles doivent être chiffrées lorsqu’elles sont au repos ou en transit. En général les précautions ci-après doivent être prises :

Pour protéger les données au repos

  • Stocker les données sensibles (mots de passe des utilisateurs, informations bancaires, etc.) avec une fonction de hachage robuste, itérative et salée. En effet, les mots de passe utilisateurs ne doivent jamais être stockés en clair. Ils doivent être stockés en utilisant des techniques de hachage sécurisées par dérivation de clé telles que l’algorithme bcrypt. Pour plus d’informations, nous vous renvoyons vers notre article : comment stocker les mots de passe de manière sécurisée dans une base de données ?
  • Mettre en place des processus sécurisés de gestion des secrets et des certificats.

Pour sécuriser les échanges de données

  • Utiliser le protocole TLS pour chiffrer les communications entre un client et un serveur. Cela permet de sécuriser le contenu des échanges lors d’une attaque Man in The Middle par exemple.
  • Désactiver la version non chiffrée de tous les protocoles pour toutes les ressources TLS activées.
  • Implémenter l’en-tête HSTS (HTTP Strict Transport Security) à votre serveur web pour forcer un navigateur à utiliser des connexions sécurisées HTTPS.
  • Échanger d’une manière sécurisée les clés de chiffrement.
  • Utiliser des certificats TLS validés par une autorité de certification digne de confiance et reconnue.
  • Utiliser le « certificate pinning » pour rajouter une autre couche de sécurité. Le « certificate pinning » est une méthode complémentaire de validation du certificat du serveur. En plus d’effectuer les contrôles classiques sur le certificat présenté par le serveur, comme valider la chaine de certification jusqu’à un certificat racine ou sa date de validité, l’application contrôle également certaines caractéristiques du certificat, comme son numéro de série et la clef publique qui lui est associée. Cette méthode présente l’avantage d’être plus robuste que la méthode classique, et permet de ne plus dépendre que du système ou des autorités de certification racine pour s’assurer que le certificat présenté est le bon. Pour plus d’informations sur cette méthode, vous pouvez consulter notre article dédié : Certificate et Public Key Pinning.

Sécurité des composants tiers

La plupart des sites et applications web utilisent des composants tiers : librairies, frameworks, etc. Ces composants facilitent la tâche aux développeurs car ils permettent de réduire considérablement le temps nécessaire entre la phase conception et le déploiement en production. Ils peuvent cependant représenter un risque de sécurité important, avec des possibilités de vulnérabilités diverses : injections, XSS, mauvaise configuration, etc.

Nous avons décrit les problématiques de sécurité liées à l’utilisation des composants tiers dans notre article sur les vulnérabilités et attaques courantes des applications web. Vous pouvez vous référer à cet article pour la sécurité des composants tiers, ainsi que pour d’autres aspects tels les failles logiques sur les applications web.

Réaliser un pentest pour tester la sécurité de votre site web

Les sites et applications web sont des cibles particulièrement attrayantes pour les attaquants, en raison de leur exposition et de nombreuses vulnérabilités exploitables plus ou moins facilement. C’est pourquoi il est important d’évaluer la robustesse de votre site web face à des attaques réelles. C’est l’objectif d’un pentest (test d’intrusion).

Un pentest consiste à tester un système informatique, un réseau ou une application web pour trouver des failles de sécurité qu’un attaquant pourrait exploiter et proposer des correctifs de sécurité. Lors d’un pentest de site web, il s’agit notamment de rechercher des vulnérabilités à la fois côté serveur (services ouverts et mal sécurisés, logiciels non à jour, erreurs de configuration, etc.) et sur la couche applicative (injections, XSS, violation de gestion d’authentification et de session, exposition de données sensibles, etc.), avec 3 approches possibles : des tests en boite noire, en boite grise ou en boite blanche.

  • En boite noire, les tests sont effectués sans aucune information spécifique sur le système cible. Il s’agit du scénario le plus proche d’une véritable attaque externe.
  • Lors d’un pentest en boite grise, les pentesters réalisent les tests en disposant d’informations partielles sur le système cible. Il pourra s’agir de comptes utilisateurs afin de rechercher des vulnérabilités en se mettant dans la peau d’un utilisateur authentifié.
  • Dans un scénario en boite blanche, les pentesters disposent d’un maximum d’information sur le système cible, notamment des comptes d’accès admin et le code source s’il s’agit d’une application web. De fait, il s’agit de l’approche la plus exhaustive pour identifier des failles et proposer des correctifs des sécurité.

Quels que soient l’approche retenue ou le périmètre des tests, un rapport complet est réalisé suite à tout pentest. Il inclut la méthodologie suivie, les vulnérabilités identifiées, le niveau de criticité, l’exploitation possible ainsi que des recommandations de correction. Le pentest pourra être complété par une phase de validation des corrections permettant de vérifier leur bonne implémentation et l’absence d’effets de bord.