L’architecture microservices offre la flexibilité, l’évolutivité et la possibilité de modifier, d’ajouter ou de supprimer des composants logiciels sans affecter d’autres parties de l’application.
Outre des cycles de développement de logiciels plus courts, des équipes plus réduites et des options de langages de programmation flexibles, elle vous permet d’adapter ou de dépanner certaines fonctions ou certains services sans interférer avec les autres composants.
En règle générale, les microservices permettent de diviser de grandes applications monogames en services distincts pouvant être déployés de manière indépendante. Cependant, ces services indépendants plus petits augmentent le nombre de composants, d’où la complexité et la difficulté de les sécuriser.
En général, un déploiement typique de microservices comporte des couches de matériel, de service ou d’application, de communication, de nuage, de virtualisation et d’orchestration. Chacune de ces couches présente des exigences, des contrôles et des défis spécifiques en matière de sécurité.
Défis de sécurité associés aux microservices
Les microservices sont généralement des systèmes largement distribués avec des règles d’accès complexes, un trafic plus important à surveiller et une surface d’attaque plus grande. En outre, la plupart des microservices s’exécutent dans des environnements en nuage, dont les configurations et les contrôles de sécurité varient également.
En raison du grand nombre d’API, de ports et de composants exposés, les pare-feu traditionnels peuvent ne pas fournir une sécurité adéquate. Ces problèmes rendent les déploiements de microservices plus vulnérables à diverses cybermenaces telles que l’homme du milieu, les attaques par injection, les scripts intersites, les DDoS, etc.
La sécurité du réseau est un autre défi posé par les microservices. En particulier, le contrôle de l’identité et de l’accès atteint un nouveau niveau de complexité. Parmi les autres vulnérabilités, citons les codes non sécurisés et les failles dans les systèmes de découverte des services.
Bien que la sécurisation des microservices soit plus difficile que celle des applications monolithiques, vous pouvez les protéger efficacement en établissant une bonne stratégie et en suivant les meilleures pratiques.
Idéalement, l’architecture nécessite une approche distribuée qui devrait couvrir tous les différents composants.
Les domaines typiques à prendre en compte sont les suivants
- Protection des applications, des microservices et des utilisateurs
- Sécurisation de la gestion des identités et des accès
- Protéger les données
- Améliorer la sécurité des communications entre services
- Contrôler les microservices et les systèmes de sécurité
Meilleures pratiques pour sécuriser les microservices
L’une des meilleures stratégies consiste à utiliser une combinaison de bonnes pratiques, d’outils et de contrôles pour protéger l’ensemble de l’écosystème. L’approche réelle peut varier en fonction du type de services, d’applications, d’utilisateurs, de l’environnement et d’autres facteurs.
Si vous décidez d’utiliser des microservices, vous devez vous assurer que vous répondez à toutes les exigences de sécurité pour les services, les connexions et les données.
Examinons maintenant quelques pratiques de sécurité efficaces pour les microservices.
#1. Construisez la sécurité dès le départ 👮
Intégrez la sécurité au cycle de développement. Idéalement, intégrez la sécurité dans le développement et le déploiement des microservices dès le départ. Aborder la sécurité de cette manière est une approche facile, efficace et moins coûteuse que d’attendre de l’ajouter lorsque le développement du logiciel est presque terminé.
#2. Utilisez un mécanisme de défense en profondeur
La défense en profondeur (DiP) est une technique qui consiste à appliquer plusieurs couches de sécurité à vos services et à vos données. Cette pratique rend plus difficile la pénétration des attaquants à travers les multiples couches, assurant ainsi une sécurité solide 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 repose sur une combinaison d’outils tels que l’antivirus, le pare-feu, la gestion des correctifs, le logiciel anti-spam et d’autres pour fournir plusieurs couches de sécurité réparties dans le système.
Avec cette approche, vous devez d’abord identifier les services sensibles, puis appliquer les couches de sécurité appropriées autour d’eux.
#3. Déployer la sécurité au niveau des conteneurs
Le plus souvent, les microservices s’appuient sur la technologie des conteneurs. À ce titre, sécuriser les conteneurs, en interne et en externe, 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 incluant, mais sans s’y limiter ;
- Limiter les autorisations au minimum requis
- Évitez d’exécuter des services ou toute autre chose à l’aide de
sudo
ou de comptes privilégiés. - Limiter ou contrôler l’accès et la consommation des ressources disponibles. Par exemple, limiter l’accès des conteneurs aux ressources du système d’exploitation 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 des conteneurs ne présentent pas de vulnérabilités ou de problèmes de sécurité. Une analyse régulière de la sécurité et de la vulnérabilité des conteneurs permettra d’identifier les risques.
Les outils typiques d’analyse d’images comprennent Clair, Anchore, et d’autres encore.
#4. Déployez une authentification multifactorielle 🔒
L’activation de l’authentification multifactorielle renforce la sécurité du front-end.
Les utilisateurs qui accèdent devront fournir les détails de leur nom d’utilisateur et de leur mot de passe en plus d’une autre forme de vérification, comme un code envoyé sur leur téléphone ou une adresse électronique spécifiée. Cette technique rend l’accès aux microservices plus difficile pour les attaquants, qui peuvent utiliser des informations d’identification volées ou piratées, puisqu’ils n’auront aucun moyen de fournir la deuxième authentification.
#5. Utilisez des jetons d’identité et d’accès
Dans le déploiement de microservices, un grand nombre d’applications et de services nécessiteront une autorisation et un contrôle d’accès sécurisé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 aux applications tierces d’accéder à d’autres services ou données des utilisateurs.
Dans un déploiement typique, l’application principale demandera à l’utilisateur d’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 le contrôle de l’identité et de l’accès des utilisateurs. Bien qu’il existe plusieurs autres protocoles d’autorisation, et que vous puissiez également créer le vôtre, la meilleure pratique consiste à utiliser OAuth, qui est plus standard, plus stable et plus largement accepté.
#6. Créez une passerelle API
En général, les microservices sont constitués de plusieurs composants distribués sur différents réseaux et accessibles à partir d’un large éventail de systèmes et de clients. L’exposition des microservices augmente les vulnérabilités et les risques de sécurité. L’un des moyens de les protéger consiste à créer un point d’entrée unique et sécurisé qui vous aide à centraliser tous les accès à partir de systèmes et de clients externes.
Pour ce faire, déployez une passerelle API pour examiner toutes les demandes entrantes afin de 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 alors l’exposition des microservices tout en fournissant des fonctions supplémentaires de gestion des demandes telles que l’authentification, la terminaison SSL, la traduction de protocole, la surveillance, l’acheminement des demandes, la mise en cache, etc.
Avec cette approche, la passerelle API achemine tous les services externes vers les microservices tout en soutenant le principe de sécurité de la défense en profondeur.
Les passerelles API typiques comprennent NGINX, Kong, Tyk, Ambassador, la passerelle API AWS, etc.
Pour en savoir plus sur la sécurité des API, consultez notre guide intitulé Pourquoi et comment sécuriser les points de terminaison des API.
#7. Profilez 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, le fait de limiter l’accès aux seuls utilisateurs autorisés réduit les risques. L’une des techniques permettant de 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écurisez les communications de service à service
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 Trust the network, JSON Web Token(JWT ) et Mutual Transport Layer Security(mTLS, ou Mutual TLS).
Parmi les trois, le plus populaire est le mTLS. Dans cette approche, chaque microservice doit porter 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 destinataire via le mTLS.
Lors de l’authentification, chaque microservice génère un certificat. Par la suite, chaque microservice utilisera le certificat de l’autre pour s’authentifier.
TLS assure l’intégrité et la confidentialité des données en transit, mais 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. En revanche, le mTLS permet à chaque microservice d’identifier l’autre.
#9. Limitation du débit 🚏 trafic client
La limitation du trafic externe permet d’éviter 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 permettant de surveiller et de contrôler le taux de trafic envoyé ou reçu d’un client en fonction de l’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 les taux en utilisant la passerelle API, le code ou toute autre technique. En général, la plupart des environnements SaaS disposent d’une limitation du débit de l’API afin de minimiser les abus des utilisateurs ainsi que les attaques.
#10. Utilisez des gestionnaires d’orchestration
Les gestionnaires d’orchestration vous permettent d’automatiser la configuration, la coordination et d’autres tâches de gestion des microservices, tout en renforçant la sécurité. En général, ces 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 des journaux, etc.
Certains outils d’orchestration disposent de 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 les suivantes ;
- Coder l’orchestration en tant que microservice
- Utiliser les 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 faire évoluer les services.
Les outils de gestion de l’orchestration typiques sont Kubernetes, Istio, Azure Kubernetes Service (AKS), etc.
Pour en savoir plus, explorez le site Container Orchestration for DeOps.
#11. Surveillez tous vos systèmes et services
Les microservices reposant 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 les risques de sécurité à temps. Pour ce faire, il existe un large éventail de solutions de surveillance des microservices, notamment Prometheus, Statsd, InfluxDB, Logstash, etc.
Surveillance au sein de l’architecture 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, Graphana, ELK stack et d’autres outils qui collectent les journaux au niveau de l’application, du conteneur, du réseau et de l’infrastructure.
- Surveillez les paramètres d’utilisation
- Utilisez les tendances des mesures telles que le CPU, 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.
- Auditez les journaux dans des domaines tels que les demandes des clients entrants, les enregistrements de bases de données, les conteneurs et autres pour identifier les incohérences ou les activités inhabituelles.
#12. Automatisez 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. En outre, vérifiez les mises à jour pour vous assurer qu’elles sont sûres 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 pour voir s’il n’y aurait pas eu des vulnérabilités ou des problèmes de sécurité qui se seraient produits auparavant.
#13. Protégez les données 🛡️ à tout moment
Protégez les données en transit et au repos. Idéalement, imposez l’utilisation du protocole HTTPS pour toutes les communications, afin de sécuriser les données en transit, et le chiffrement de 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 clair qui résident 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. De même, décryptez les données le plus tard possible afin de réduire l’exposition.
Conclusion
Les microservices s’appuient sur des composants distribués pour offrir des avantages tels qu’une plus grande flexibilité et des options de déploiement. Toutefois, lors de l’utilisation des microservices, les organisations doivent adapter leurs politiques et stratégies de sécurité internes à une approche plus nuagique et distribuée.
L’idéal est de réduire la surface d’attaque et de protéger l’environnement des microservices, les API, les applications et les données.