13 bonnes pratiques pour sécuriser les microservices



L’architecture basée sur les microservices procure une grande adaptabilité, une capacité d’évolution et la possibilité de modifier, d’ajouter ou de supprimer des éléments logiciels sans perturber les autres parties de l’application.

En plus de cycles de développement logiciel plus courts, d’équipes réduites et d’une souplesse dans le choix des langages de programmation, elle permet de mettre à l’échelle ou de corriger des problèmes sur des fonctions ou des services spécifiques, sans impacter les autres composants.

En règle générale, les microservices permettent de diviser les grandes applications monolithiques en services distincts, déployables de manière indépendante. Toutefois, ces petits services autonomes augmentent le nombre d’éléments, ce qui accroît la complexité et la difficulté de les sécuriser.

Comparaison entre architecture monolithique et microservices. Image Red Hat

Un déploiement de microservices typique comprend généralement des couches matérielles, de service ou d’application, de communication, de cloud, de virtualisation et d’orchestration. Chacune de ces couches présente des exigences de sécurité, des contrôles et des défis spécifiques.

Défis de sécurité liés aux microservices

Les microservices sont généralement des systèmes très distribués avec des règles d’accès complexes, un volume de trafic plus important à surveiller et une surface d’attaque plus vaste. De plus, la plupart des microservices cloud s’exécutent dans des environnements cloud, qui possèdent également des configurations et des contrôles de sécurité variables.

En raison du grand nombre d’API, de ports et de composants exposés, les pare-feu traditionnels peuvent ne pas assurer une sécurité adéquate. Ces problématiques rendent les déploiements de microservices plus vulnérables à diverses menaces informatiques, telles que les attaques de l’homme du milieu, les attaques par injection, les scripts intersites, les attaques DDoS, etc.

La sécurité du réseau représente un autre défi avec les microservices. Notamment, le contrôle d’identité et d’accès atteint un nouveau niveau de complexité. Parmi les autres vulnérabilités, on peut citer le code non sécurisé et les failles des systèmes de découverte de services.

Bien que la sécurisation des microservices soit plus ardue que celle des applications monolithiques, il est possible de les protéger efficacement en mettant en place une stratégie solide et en suivant les bonnes pratiques.

Idéalement, l’architecture nécessite une approche distribuée qui doit englober tous les différents éléments.

Les domaines typiques à traiter incluent :

  • La protection des applications, des microservices et des utilisateurs
  • La sécurisation de la gestion des identités et des accès
  • La protection des données
  • L’amélioration de la sécurité des communications entre services
  • La surveillance des microservices et des systèmes de sécurité

Bonnes pratiques pour sécuriser les microservices

L’une des meilleures stratégies consiste à utiliser un ensemble de bonnes pratiques, d’outils et de contrôles afin de protéger l’ensemble de l’écosystème. L’approche concrète peut varier en fonction du type de services, des applications, des utilisateurs, des facteurs environnementaux et d’autres éléments.

Si vous décidez d’utiliser des microservices, vous devez vous assurer de répondre à toutes les exigences de sécurité pour les services, les connexions et les données.

Examinons maintenant quelques pratiques efficaces pour la sécurité des microservices.

#1. Intégrer la sécurité dès le départ 👮

Incorporez la sécurité au cycle de développement. Idéalement, intégrez la sécurité au développement et au déploiement des microservices dès le début. Aborder la sécurité de cette manière est une approche simple, efficace et moins coûteuse que d’attendre pour l’ajouter une fois que le développement du logiciel est presque terminé.

#2. Adopter un mécanisme de défense en profondeur

La Défense en Profondeur (DiP) est une technique où vous appliquez plusieurs couches de sécurité à vos services et à vos données. Cette pratique rend plus difficile pour les attaquants de percer à travers les multiples couches, offrant ainsi une sécurité renforcée pour vos services et vos données.

Contrairement aux solutions de sécurité périmétrique telles que les pare-feu, le concept de défense en profondeur est différent. Il s’appuie sur une combinaison d’outils tels qu’un antivirus, un pare-feu, la gestion des correctifs, un logiciel anti-spam et d’autres pour fournir de multiples couches de sécurité réparties dans tout le système.

Image de la sécurité multicouche de défense en profondeur : Imperva

Avec cette approche, vous devez d’abord identifier les services sensibles, après quoi vous appliquez les couches de sécurité appropriées autour d’eux.

#3. Déployer la sécurité au niveau du conteneur 📦

Le plus souvent, les microservices reposent sur la technologie des conteneurs. Ainsi, sécuriser les conteneurs, tant à l’intérieur qu’à l’extérieur, est un moyen de réduire la surface d’attaque et les risques. Idéalement, viser le principe de sécurité du moindre privilège est une bonne pratique et nécessite une combinaison de stratégies comprenant, mais sans s’y limiter :

  • Limiter l’autorisation au minimum requis
  • Évitez d’exécuter des services et toute autre tâche en utilisant les comptes sudo ou privilégiés.
  • Limitez ou contrôlez l’accès et la consommation des ressources disponibles. Par exemple, limiter l’accès aux ressources du système d’exploitation par les conteneurs permet d’éviter le vol ou la compromission des données.
  • Ne stockez pas de secrets sur le disque du conteneur.
  • Utilisez des règles appropriées pour isoler l’accès aux ressources.

Il est également essentiel de s’assurer que les images de conteneurs ne présentent aucune vulnérabilité ou problème de sécurité. Une analyse régulière de la sécurité et des vulnérabilités des conteneurs aidera à identifier les risques.

Les outils typiques d’analyse d’images incluent Clair, Anchoreet plus encore.

#4. Mettre en place une authentification multi-facteurs 🔒

L’activation de l’authentification multifacteur améliore la sécurité du front-end.

Les utilisateurs qui accèdent au système devront fournir leur nom d’utilisateur et leur mot de passe, ainsi qu’une autre forme de vérification, comme un code envoyé sur leur téléphone ou à une adresse e-mail spécifiée. Cette technique rend plus difficile pour les attaquants, qui peuvent utiliser des informations d’identification volées ou piratées, d’accéder aux microservices, car ils n’auront aucun moyen de fournir la deuxième authentification.

#5. Utiliser les jetons d’identité et d’accès de l’utilisateur

Dans le déploiement de microservices, un grand nombre d’applications et de services nécessiteront une autorisation sécurisée et un contrôle d’accès. Un cadre d’autorisation tel que OAuth 2.0 et OpenID vous permet de traiter les jetons en toute sécurité, protégeant ainsi vos microservices. Par conséquent, cela permet à des applications tierces d’accéder à d’autres services ou données des utilisateurs.

Dans un déploiement typique, l’application principale invite l’utilisateur à autoriser le service tiers. Après acceptation, l’application génère un jeton d’accès pour la session.

En particulier, OAuth est l’une des stratégies les plus efficaces pour l’identité des utilisateurs et le contrôle d’accès. Bien qu’il existe plusieurs autres protocoles d’autorisation et que vous puissiez également créer le vôtre, il est recommandé d’utiliser le OAuth car il est plus standard, stable et largement accepté.

#6. Créer une passerelle API

En général, les microservices sont constitués de plusieurs composants répartis sur différents réseaux et accessibles depuis un large éventail de systèmes et de clients. L’exposition des microservices augmente les vulnérabilités et les risques de sécurité. Une façon de les protéger consiste à créer un point d’entrée unique et sécurisé qui vous aide à centraliser tous les accès depuis les systèmes et les clients externes.

Pour ce faire, déployez une passerelle API pour filtrer toutes les requêtes entrantes pour détecter les problèmes de sécurité avant de les acheminer vers les microservices appropriés. La passerelle API se situe entre les applications clientes et les microservices. Elle limite ensuite l’exposition des microservices tout en fournissant des fonctions supplémentaires de gestion des requêtes telles que l’authentification, la terminaison SSL, la traduction de protocole, la surveillance, le routage des requêtes, la mise en cache, etc.

Avec cette approche, la passerelle API achemine tous les services externes vers les microservices tout en respectant le principe de sécurité de défense en profondeur.

Image de passerelle d’API de microservices Livebook

Les passerelles API typiques incluent NGINX, Kong, Tyk, Ambassadeur, AWS API Gatewayet plus encore.

Pour en savoir plus sur la sécurité des API, consultez notre guide Pourquoi et comment sécuriser le point de terminaison de l’API.

#sept. Restreindre les API en fonction de la zone de déploiement

Mettez en œuvre des restrictions basées sur les rôles en vous assurant que les utilisateurs n’ont accès qu’aux API et aux services dont ils ont besoin. Étant donné que la plupart des logiciels malveillants exposent souvent un service à un plus grand nombre de personnes, limiter l’accès aux seuls utilisateurs autorisés réduit les risques. Une technique pour réduire l’exposition consiste à étiqueter les API en fonction des utilisateurs qui devraient y avoir accès. En général, les API peuvent être :

  • API Ethernet – Pour les services exposés au monde extérieur en dehors du centre de données.
  • API de la zone d’entreprise – Elles sont destinées au trafic privé interne.
  • API DMZ – Pour gérer le trafic provenant d’Internet.
  • API de zone hybride – Pour les déploiements de centres de données.

#8. Sécuriser les communications entre services

Les pratiques efficaces impliquent l’authentification et l’autorisation des requêtes lorsque deux microservices communiquent.

En général, il existe trois techniques principales que vous pouvez utiliser pour sécuriser les communications interservices. Il s’agit de faire confiance au réseau, des JSON Web Tokens (JWT) et de la sécurité mutuelle de la couche de transport (mTLS, ou Mutual TLS).

Image sur la sécurisation des communications interservices avec JWT Livebook

Parmi les trois, le mTLS est le plus populaire. Dans cette approche, chaque microservice doit posséder une paire de clés publique/privée. Le microservice client utilise ensuite la paire de clés pour s’authentifier auprès du microservice récepteur via mTLS.

Lors de l’authentification, chaque microservice génère un certificat. Ensuite, chaque microservice utilisera le certificat de l’autre pour s’authentifier.

Bien que TLS assure l’intégrité et la confidentialité des données en transit, il permet également au client d’identifier un microservice. Le microservice client connaît généralement l’autre microservice. Cependant, comme TLS est unidirectionnel, un microservice récepteur ne peut pas vérifier le microservice client, et les attaquants peuvent exploiter cette faille. D’autre part, mTLS fournit un moyen pour chaque microservice d’identifier l’autre.

#9. Limiter le débit 🚏 du trafic client

La limitation du trafic externe évite des problèmes tels que les attaques par déni de service (DoS), ainsi que les cas où certains clients consomment la majeure partie de la bande passante de l’application. Une approche consiste à appliquer diverses règles qui peuvent surveiller et contrôler le taux de trafic envoyé ou reçu d’un client en fonction de l’adresse IP, de l’heure, etc.

Configurez vos services pour qu’ils ralentissent s’ils détectent plusieurs tentatives de connexion infructueuses à vos API ou toute autre activité suspecte.

Un système lent découragerait les attaquants et les inciterait probablement à renoncer à leur tentative d’accès aux services. Vous pouvez limiter le débit à l’aide de la passerelle API, via le code ou toute autre technique. Généralement, la plupart des environnements SaaS ont une limitation de débit API pour minimiser les abus des utilisateurs ainsi que les attaques.

#10. Utiliser les gestionnaires d’orchestration

Les gestionnaires d’orchestration vous permettent d’automatiser la configuration, la coordination et d’autres tâches de gestion des microservices, en plus d’améliorer la sécurité. En général, les outils vous permettent de gérer plusieurs conteneurs, de limiter l’accès aux métadonnées, de séparer les charges de travail, de collecter les journaux, etc.

Certains outils d’orchestration ont des fonctionnalités supplémentaires qui permettent aux développeurs de stocker et de partager des informations sensibles telles que les certificats SSL, les clés de chiffrement, les mots de passe et les jetons d’identité.

Les deux méthodes couramment utilisées pour une orchestration efficace des microservices sont :

  • Le codage de l’orchestration en tant que microservice
  • L’utilisation des passerelles API pour fournir une couche d’orchestration

L’orchestration via la passerelle API n’est pas recommandée en raison des difficultés rencontrées lorsqu’il est nécessaire de mettre à l’échelle les services.

Image de la couche d’orchestration des microservices Globallogic

Les outils typiques de gestion d’orchestration incluent Kubernetes, Istio, Azure Kubernetes Service (AKS), etc.

Pour en savoir plus, explorez l’orchestration de conteneurs pour DeOps.

#11. Surveiller tous vos systèmes et services

Étant donné que les microservices reposent sur des systèmes distribués, vous devez disposer d’une stratégie de surveillance fiable et efficace pour tous les composants individuels.

Le déploiement d’une surveillance continue vous permet de détecter et de traiter à temps les risques de sécurité. Pour cela, il existe un large éventail de solutions de surveillance des microservices, y compris Prometheus, Statsd, InfluxDB, Logstash, etc.

Surveillance à l’intérieur de l’architecture des microservices

Utilisez les outils appropriés pour surveiller les systèmes et services internes. Voici quelques bonnes pratiques :

  • Activez la journalisation au niveau de la couche d’application. Vous pouvez utiliser Splunk, Grafana, la suite ELK et d’autres outils qui collectent les journaux au niveau de l’application, du conteneur, du réseau et de l’infrastructure.
  • Surveiller les mesures d’utilisation
  • Utilisez les tendances des mesures telles que le processeur, la mémoire, les temps de réponse, les erreurs, les notifications et autres pour détecter les activités inhabituelles indiquant une attaque existante ou potentielle.
  • Vérifiez les journaux dans des domaines tels que les requêtes entrantes des clients, les enregistrements de bases de données, les conteneurs et autres pour identifier les incohérences ou les activités inhabituelles.

#12. Automatiser les activités de sécurité

Automatisez les processus de sécurité tels que le déploiement des mises à jour, l’analyse des vulnérabilités, la surveillance, l’application des politiques et d’autres activités. De plus, vérifiez les mises à jour pour vous assurer qu’elles sont sécurisées et qu’elles n’introduisent pas de nouvelles vulnérabilités.

Après les mises à jour, le logiciel de sécurité devrait idéalement effectuer des tests sur tous les conteneurs et microservices afin de vérifier si des vulnérabilités ou des problèmes de sécurité ne seraient pas apparus.

#13. Protéger les données 🛡️ à tout moment

Protégez les données en transit et au repos. Idéalement, imposez l’utilisation de HTTPS pour toutes les communications, afin de sécuriser les données en transit, et le chiffrement pour toutes les données sensibles au repos. Évitez de transmettre et de stocker des mots de passe, des clés, des informations d’identification et des données sensibles en texte brut qui se trouvent en dehors du code.

La meilleure stratégie consiste à utiliser des technologies standard pour chiffrer toutes les données sensibles le plus tôt possible. Déchiffrez également les données le plus tard possible pour réduire l’exposition.

Conclusion

Les microservices s’appuient sur des éléments distribués pour offrir des avantages tels qu’une plus grande souplesse et des options de déploiement. Cependant, lors de l’utilisation des microservices, les organisations doivent adapter les politiques et les stratégies de sécurité internes à une approche plus distribuée et native du cloud.

Idéalement, visez à réduire la surface d’attaque, en protégeant l’environnement des microservices, les API, les applications et les données.