e-Xpert Solutions Genève

Chemin du Pont-Du-Centenaire 109
CH-1228 Plan-les-Ouates / Genève
SUISSE

Tel. : +41 22 727 05 55 Fax : +41 22 727 05 50

e-Xpert Solutions Lausanne

Avenue de Gratta-Paille 20
CH-1018 Lausanne
SUISSE

Tel. : +41 21 802 26 78 Fax : +41 22 727 05 50
Contactez notre support : +41 22 727 05 56
Envoyez votre message



Accédez au menu
Contactez-nous

Microservices et sécurité

Retour aux articles

Microservices et sécurité,

Le nouveau challenge pour la protection de vos applications !


Catégorie : Articles

Date de publication : 9 mai 2018 - Dernière mise à jour : 25 mai 2018

Rédacteur : Kevin Gillieron et Berangere Thevenet


Dans cet article nous abordons le fonctionnement des microservices et les nouveaux enjeux liés à leur sécurité. Avant cela, il est important de notifier que les microservices sont indissociables des technologies de containerisation. Ils sont les piliers indispensables à leur déploiement. Pour cette raison, nous précisons leur fonctionnement et exposons les technologies qui gravitent autour. De facto, la mise en place de ces nouveaux concepts engendre une prise en considération des questions liées à la sécurité de l’infrastructure.

Microservices pour vos applications

Une application est un ensemble de fonctionnalités liées les unes avec les autres.

Par exemple, un éditeur de texte en ligne offre plusieurs fonctionnalités au travers d’une seule interface graphique comme :
La rédaction d’un document
Le partage de ces documents,
Des recherches dans une base de données


On parle d’architecture monolithique lorsque toutes les fonctions sont assumées par une seule et unique application. Par opposition à cette dernière, une architecture dite en “microservice” consiste à décomposer chaque fonctionnalité en un service distinct assumant une seule fonction. Le schéma ci-dessous illustre ces deux cas :

Pour choisir l’architecture logicielle adaptée à votre application, il faut contextualiser vos besoins en termes de performance, de trafic et robustesse en cas d’incident.

Pour les applications à haut besoin de performance, les microservices offrent un certain nombre d’avantages. L’application est décomposée en plusieurs parties, permettant un partage des tâches plus efficaces au sein des équipes de développement. En effet, dans une telle architecture, chaque microservice est indépendant des autres et gère ses propres données (pouvant aller jusqu’à posséder sa propre instance de base de données).

Grâce à cette indépendance, les avantages sont non négligeables pour les équipes de développement qui peuvent désormais maîtriser uniquement les services qui les concernent.

Au niveau du service en lui-même, les équipes peuvent :
Déployer et redéployer un service sans impacter l’ensemble de l’application,
Effectuer des tests à leur convenance,
Écrire dans le langage de programmations (Go, Ruby, Python, Java, etc.) de leur choix car les microservices permettent une interopérabilité au travers du Protocol HTTP.

Au niveau de la scalabilité de l’application, cette isolation permet une gestion plus fine des ressources. En cas de besoin, il est facile d’allouer plus de ressources en déployant des instances supplémentaires pour une fonctionnalité de l’application (e.g. la fonction de recherche). On a alors un contrôle de la scalabilité qui est très puissant.

Au niveau de la gestion des incidents, une application en microservice est plus robuste face aux pannes. Seule l’utilisation du composant concerné sera impactée, le reste de l’application pouvant tourner de manière indépendante.

Cette architecture de part sa complexité engendre un certain nombre de difficultés notamment lors des tests sur l’ensemble de l’application en raison du déploiement distribué des services. De plus, un certain nombre de composants doivent être mis en place au niveau infrastructure : API gateway, load balancers, service discovery, etc. Tous ces composants entraînent une complexité additionnelle.

Dans ce contexte, la visibilité des applications en production est plus complexe imposant une maîtrise complète des services déployés et de leur localisation, afin de permettre une gestion fine en cas d’incidents (localisation et origine des pannes).

Cette réalité opérationnelle engendre des questionnements sur la sécurité de ces nouveaux modèles. La surface d’attaque étant plus grande pour les pirates entre la démultiplication des services qui communiquent entre eux et une architecture plus complexe, il faut impérativement contrôler les flux, chiffrer correctement les connexions et mettre en place une solution efficace de gestions d’événements adaptée aux besoins des microservices.

Dorénavant, la requête d’un utilisateur passe au travers d’un grand nombre de microservices différents imposant une réelle traçabilité dans chacun d’entre eux. Il faut pouvoir retracer tout le parcours d’une requête pour une bonne gestion des incidents. Une solution est d’assigner un UID (Unique ID) à la requête le plus tôt possible (i.e. au niveau de l’API Gateway), de l’écrire dans chaque log associé et de le passer à chaque microservice subséquent via par exemple un header HTTP.

Pour gagner en visibilité, la solutions Splunk est particulièrement intéressante. Elle s’intègre facilement dans une architecture à base de container docker et dispose d’une intégration Kubernetes, offant en prime des dashboards lisibles pour donner du sens à tous les évènements collectés.

La containerisation pour la mise en place des microservices

La containerisation est le procédé qui consiste à exécuter un programme de manière isolée au niveau du kernel (noyau) d’un système d’exploitation. Docker est la solution de containerisation la plus répandue actuellement. Entièrement Open Source, elle a été créée en 2013.

Cette technologie apporte un nombre considérable d’avantages :
L’isolation apporte une couche supplémentaire de sécurité : si le processus est compromis, il ne pourra pas
accéder aux autres processus et ressources tels que les fichiers du système hôte,
La containerisation est peu coûteuse en ressources CPU, mémoire ou disque. Elle ne fait en effet pas tourner un
OS complet, mais chaque container partage le même kernel que le système hôte,
Le container est un format ultra portable. Il peut facilement être redéployé sur une autre machine,
La containerisation offre un environnement reproductible : si l’on exécute une application dans un container
dans un environnement de test ou dans un environnement de production, le résultat sera le même et ce, quel
que soit le système d’exploitation hôte tournant dessous ou le hardware.
La containerisation est une brique essentielle pour les architectures en microservices. En effet, tous les services
tournent de manière totalement isolée au niveau processus et peuvent communiquer qu’au travers d’API, le plus
souvent reposant sur le Protocol HTTP.

Pour satisfaire totalement le besoin des microservices, les solutions de containerisations ne peuvent pas se suffire à elles-seules. Étant finalement qu’une exécution pour l’application, il faut ajouter une solution de clustering et des processus d’automatisation de déploiement.

Docker Inc. propose Docker Swarm afin de monter un cluster de container Docker. En revanche, pour l’automatisation et des déploiements avancés, il faudra souscrire à une license Docker Enterprise Edition (Docker EE).

Un autre acteur majeur sur le marché du clustering et de l’automatisation de déploiement de container est Kubernetes. Il s’agit d’une solution entièrement Open Source développée par Google. Elle offre un grand nombre de fonctionnalités tels que :

Le placement automatique de container sur des nœuds du cluster en fonction des ressources disponibles,
Du “self-healing” permettant de s’assurer qu’une application qui crash soit
redémarrée et remplacée si nécessaire,
Du « scaling » automatique qui va déployer +/- d’instances en fonction de la
charge actuelle,
En outre, Kubernetes est extrêmement extensible : il est possible de créer
des contrôleurs personnalisés pour répondre à ses divers besoins tels que le stockage sur le cloud, l’intégration
avec des systèmes tiers, etc.

Grâce à cette flexibilité de Kubernetes, l’éditeur de solutions de sécurité F5 a développé une extension adaptée afin d’intégrer certaines fonctionnalités de son produit BIG-IP : Web Applicatif Firewall, Contrôle d’accès, …

À noter : Bien que Docker offre une sécurité “by design” en isolant les processus au niveau kernel, des questions de sécurité subsistent. En utilisant des mécanismes directement liés au kernel du système hôte, ce dernier devient une source de vulnérabilité. Ce genre de vulnérabilité peut permettre à un attaquant de “bypasser” le mécanisme d’isolation du container. Par conséquent les patchs de sécurités doivent être toujours installés au plus vite.

Pour mitiger ce risque, il faut éviter de démarrer un container Docker en mode privilégié. Heureusement des solutions existent pour vérifier les paramètres de sécurité d’une installation Docker (e.g. docker-bench-security).

Les images Docker sont aussi une source de vulnérabilités très commune. On pourrait définir une image Docker comme étant une application packagée, comme par exemple la base de données open source MariaDB. Au même titre qu’une machine virtuelle, une image Docker est généralement composée d’un système d’exploitation qui vient avec un certain nombre de paquets préinstallés. Les images qui ne sont pas régulièrement patchées sont alors vulnérables aux dernières CVE découvertes. Pour pallier ce risque, il existe des scanners d’images Docker qui vont inspecter les images à la recherche de CVE connues. Ce processus doit être automatisé afin que les images soient régulièrement vérifiées.

Pour conclure nous vous conseillons de ne pas prendre le passage d’une architecture de ce type la légère. En plus des défis techniques qu’occasionne une telle migration, il y a de nombreux points liés à la sécurité qui doivent être pris en compte lors de la planification. Il faut non seulement mettre en place une solution de gestion d’évènements efficace pour gagner en visibilité sur l’infrastructure mais aussi les solutions usuelles type WAF, firewall, etc. De plus, bien que la containerisation avec Docker offre des avantages certains tels que l’isolation des processus, il existe de nombreuses vulnérabilités qui peuvent être exploitées. Nous vous recommandons la mise en place de scans de vulnérabilités fréquents sur les images Docker utilisées, mais aussi sur les différentes installations Docker au sein du cluster.

Abonnez-vous
à nos newsletters