Applications informatiques sécuritaires à 100% : un aperçu
Le 19 février 2014, je donnais une conférence pour l’OWASP sur le sujet. Voici la suite logique et plus complète. Cet article est un aperçu d’un chapitre d'un livre à paraître...J'en publie une partie pour répondre partiellement à la question de Stéphane Garneau sur la microsegmentation de la sécurité d'une application...
De façon irréaliste, la meilleure sécurité est de déployer l'application sur un serveur qui va être coulé dans un bloc de béton conservé à Fort Knox et qui n’a jamais été branché sur un réseau. L’accès se fait en mode interactif sur place et est surveillé par une personne indépendante!
La solution réaliste réside dans une sécurité multicouche sans aucune confiance (principe de Kerckhoffs : The enemy knows the system!). Cette sécurité pourrait offrir une étanchéité de 100% avec, vraisemblablement, une confidentialité persistante (forward security) à l’exception des responsabilités propre à l’utilisateur.
Dix étapes à implanter!
Premièrement, toutes les applications doivent être découpées en micro/miniservices (12-factor app, particulièrement le #7) avec toutes les préoccupations de sécurité sorties complètement des applications, une sorte d’AOP extrême. Toutes les préoccupations horizontales suivantes sont activées systématiquement pour tous les micro/miniservices, sans aucune exception.
- authentification à plusieurs facteurs (identification par témoin et adresse IP pour les services anonymes),
- autorisations RBAC et ABAC (particulièrement sur les occurrences),
- journalisation (voir plus bas),
- passage des contextes de sécurité n-hop et n-couches de découpage qui suit le principe de Kerckhoffs (le jeton ne doit que contenir une clé non descriptive),
- sécurisation complémentaire n-hop par certificats clients/serveurs uniques sous une seule autorité de certification pour chacun des containers,
- throttling (authentification et requêtes),
- limites sur la taille des chargement (payload),
- dégradation élégante et élasticité en cas de DDOS.
Deuxièmement, il faut protéger toutes les couches ou services réseau avec plusieurs appareils de technologie différentes :
- 802.1x avec certificats pour tous les appareils et découpage des zones réseau par VLAN (couche OSI 2),
- pare-feu plein état avec whitelisting restrictifs et découpage du périmètre de sécurité par des règles de routage basées par DDNS sécuritaire des exécuteurs de containers (couches OSI 3 (IP), 4 et 5 (TCP)),
- TLS 1.3 obligatoire avec utilisation exclusive d’algorithmes offrant une confidentialité persistante (ex : ECDHE) par des serveurs mandataires inversés redondants qui redirigent dynamiquement les requêtes vers les bons micro/miniservices selon des règles de distributivité définies par le gestionnaire de containers (couche OSI 6),
- analyse complète par pattern de tous les messages (entête et chargement) par whitelisting extrêmement restrictifs pour les micro/miniservices (couche OSI 7 (ex. : WAF)).
Troisièmement, sécurisation par un dépôt approprié de tous les fichiers et données pour que leur exécution soit impossible. L’utilisation d’espace réservé en mémoire pour les données en transit est nécessaire (bit NX).
Quatrièmement, construction/déploiement du container signé par une serveur de construction à partir de code source contenu dans un gestionnaire de source dont tout le code archivé a été revu systématiquement par une autorité indépendante et incorruptible. Des essais (audits, PEN et autres) sont aussi réalisés automatiquement à chacun des déploiement dans un environnement en tout point identique à la production. Le code source comprend aussi toute la configuration des appareils qui doit passer aussi par le gestionnaire de source et les revues (infrastructure as code). Ainsi, pour configurer un appareil ou un service, il n’est jamais nécessaire pour un administrateur de détenir le mot de passe dudit appareil ou service (voir plus loin).
Cinquièmement, surveillance automatisée (IPS/IDS) de toutes les couches précédentes accompagnée d’une mise hors service (coupure du lien) en cas de pénétration et alertage en temps réel. Il est préférable de rendre une application non disponible que de la laisser à la merci d’utilisateurs malveillants.
Sixièmement, aucune utilisation d’appareils ou services qui ne sont pas à code source ouvert et qui n'ont pas fait l'objet d'une analyse/revue du code et d’audits par une tierce partie indépendante.
Septièmement, tous les mots de passe et clés des compte de services et des appareils doivent être différents en plus d’être générés de façon totalement aléatoire. La génération des clés est réalisée dans un lieu sûr par le maître des clés qui est sous surveillance. Le maître des clés doit, par la suite, utiliser ou déployer le mot de passe à l’endroit prévu, une seule fois, et détruire toute copie. Si on a besoin d'avoir accès à un service ou appareil, on le change physiquement ou virtuellement (on peut le recycler, bien sûr). Ça revient à formater le serveur ou changer physiquement un routeur pour un autre! Bien entendu, il s’agit de clés ou mots de passe servant comme comptes de service ou d’administrateur d’appareils physiques/virtuels.
Huitièmement, tous les appareils sont dans un endroit physique hautement sécurisé et sous haute surveillance en plus d'être géographiquement distribués et avec plusieurs liens réseau physiques. Dans un monde idéal, les appareils n’ont aucun ports externes sauf pour l’alimentation électrique et le réseau.
Neuvièmement, journalisation complète des accès, des erreurs et des anomalies détectée avec réplication instantanée.
Dixièmement, classification complètes des tous les actifs informationnels. Toutes les données déclarées secrètes doivent être systématiquement cryptées. Les index sur ces données sont inexistants ou désincarnés. Par ailleurs, toutes les écritures sont versionnées sur des supports WORM répliqués et distribués géographiquement. Cela remplace avantageusement toutes les copies de sécurité imaginables,
Il existe plusieurs préoccupations quant à l’implantation de toutes ces mesures. Quelques exemples :
- Les progiciels doivent suivre toutes les même règles qu’un développement maison.
- La latence sur le réseau pourrait devenir importante. Il existe plusieurs façons de s'en sortir : antémémoire, distributivité, ne pas lésiner sur la capacité des appareils.
- Le développement risque de devenir plus long. Il faut donc implanter rapidement les mécanismes d’intégration continue, le TDD/BDD, l’hébergement en mode PaaS, etc.
- Plusieurs fournisseurs d’appareils réseau et de sécurité ne se qualifient plus. De toute façon, si on suit le corollaire du principe de Kerckhoffs, pourquoi devrait-on faire confiance en des boîtes noires? Nous avons qu’à penser aux algorithmes de cryptographie.
- Les coûts pourraient être exorbitants. C’est le cas quand on tient compte des applications patrimoniales qui seraient, de toute façon, à repenser. Cependant, si la sécurité multicouche précédente est mise en application dès le début d’un développement, les coûts deviennent plus que raisonnables.
À la suite de la publication de cet article, je m’attends à beaucoup de réactions, voir de résistance de la part de mes amis en sécurité. Cependant, si vous distillez son contenu, il est facile de voir que la solution tient en quelques principes simples avec lesquels vous êtes d’accord :
- La sécurité est une préoccupation horizontale et systématique. Elle est l’affaire de tous.
- On ne doit faire confiance à personne, même à nous-même.
- Plus le secret est gros, plus il est difficile à conserver.
- L’approche par blacklisting est à bannir. Il va toujours avoir de nouveaux vecteurs d’attaque. N’en déplaise à mes amis développeur qui prennent trop souvent des raccourcis, il faut être intraitable sur la sécurité. L’utilisation du whitelisting force à faire les bonnes choses, tout le temps.
- L’utilisateur restera toujours le maillon le plus faible de la chaîne car on doit lui offrir des services sans jamais lui nuire inopinément. Des essais d’utilisabilité sont toujours nécessaire pour arriver à un niveau de sécurité juste suffisant. Mais on ne doit pas décharger pour autant l’utilisateur de son imputabilité face à la sécurité.
- La sécurité ne passe pas par la technologie mais par des pratiques.
J’attends vos commentaires!
Expert-généraliste • Formateur/professeur, coach-conseil, conférencier, chercheur • Architecture/génie logiciel, Organisation apprenante, Gestion de la connaissance • @Elapse Technologies, @Cégep Garneau, @UL, @UQAR
7 ansN’oubliez pas que si les gens en charge des serveurs mandataires inversés (équilibreurs de charge/gestionnaires de containers), ceux qui s’occupent des DNS et ceux qui segmentent les périmètres de sécurité connaissaient comment Internet (TCP/UDP-IP) et le Web (HTTP/HTTPS) fonctionnaient réellement (qui a lu et compris tous les RFC afférents?), il n’y en aurait pas de CSRF parce qu’il ne serait pas nécessaire de faire du CORS. Le top 10 d’OWASP ne met en évidence que les 10 attaques les plus fréquentes. On a de la misère à les régler. Et des vecteurs d’attaque, il y en a des milliers. Il faut donc faire autrement.
Expert-généraliste • Formateur/professeur, coach-conseil, conférencier, chercheur • Architecture/génie logiciel, Organisation apprenante, Gestion de la connaissance • @Elapse Technologies, @Cégep Garneau, @UL, @UQAR
7 ansEt ce ne sont pas des boîtes noires si tous les filtres du pipeline sont connus (on a accès au code source) et reconnus (ils ont été testés et validés). Ce ne sont pas des boîtes noires si la configuration est dévoilée. Il est vrai que les IPS/IDS sont dépassés. Ça veut dire qu’on enlève tous les pare-feu? Si les pare-feu et les IPS/IDS fonctionnent par whitelists, ils restent encore très pertinents. Les attaques deviennent de plus en plus sophistiquées. Il faut donc simplifier la sécurité. Comment? En utilisant une sécurité par couches successives. Chaque couche a ses limites mais chacune des couches n’a qu’une seule responsabilité. Elle la remplit parfaitement et pleinement. Et combinées, il n’existera plus aucun vecteur d’attaques possibles à l’exception de ceux spécifiques à l’utilisateur ou son agent (navigateur Web). Les applications seront étanches aux attaques les plus déterminées, présentes et futures. Amenez-en des attaques par injection, des Heartbleed, des attaques sur des défaillances de l’authentification, des sorties massives de données et toutes les autres attaques qui n’ont même pas encore été inventées. (suite après)
Expert-généraliste • Formateur/professeur, coach-conseil, conférencier, chercheur • Architecture/génie logiciel, Organisation apprenante, Gestion de la connaissance • @Elapse Technologies, @Cégep Garneau, @UL, @UQAR
7 ansLe secret d'une sécurité étanche pour une application basée sur des microservices doit obligatoirement passer par le pipeline d'exécution : de l'initiation de la requête jusqu'à la réception de la réponse. Et, j'espère, avoir décrit presque exhaustivement ces passages obligés (les couches) dans l'article. Par exemple, commencez à imposer des whitelists sur des URL, des entêtes HTTP et sur le format des chargements HTTP (payload/body) aux développeurs. Faites passer toutes les applications par un filtre dans le pipeline d’exécution (ex. : module Apache, WAF FOSS) pour vérifier systématiquement l'authentification (par le jeton dans l'entête HTTP) et les autorisations (RBAC sur la méthode HTTP, ABAC selon la ressource demandée par l'URL, les informations de sécurité sur cette ressource étant validée par des données du profil de l'utilisateur référé par le jeton). Le tout dans une architecture par micro/miniservices férocement RESTful. Implantez peu à peu toutes les autres couches. Vos développeurs vont se rebeller mais, un jour, ils vont accepter de changer leur pratique et les applications vont devenir sécuritaires. Une fois pour toute. C'est terriblement pratique. Il ne faut avoir que du courage de le faire. (suite après)
CISSP, CISA, CRISC, CCSK, ISO 27001 & ISO 37001, Risk Manager ISO27005, CSO @ ID-M.me, Gestion des risques, conception SMSI, architecture de sécurité de haut niveau web2: tactika.com, oth.technology, web3: tactika.eth
7 ans«Un jour j'irai vivre en Théorie, car en Théorie tout se passe bien.» Comme vous le savez, la sécurité va bien au delà de "boîtes" et de code. Nous devons composer avec des humains, l'organisation du travail, processus, compétence humaine et organisationnelle, maturité (quelquefois de moralité ), gestion du risque et surtout d'argent. C'est pourquoi les défis d'un vendeur (vous savez de qui je parle) m'indiffèrent totalement. Le réel défi est de comprendre et trouver l'équilibre entre les risques, les réels besoins, les moyens à notre disposition et la capacité des individus et l'organisation.
La seule chose qui manque dans votre article et les slides de la conférence OWASP sont les aspects pour réellement sécuriser une application, comment programmer de façon sécuritaire et tout le processus qui entoure cela, ce qui semblait être l'objectif du titre de l'article/conférence au départ. Vous couvrez seulement les concepts d'infrastructures et configuration de sécurité technologiques/réseaux dont plusieurs sont maintenant dépassés pour les architectures d'applications et de services Web. De plus, la plupart des "solutions" discutées font maintenant partie des mythes en sécurité qu'on enseigne de ne PAS croire et ne pas s'y fier pour sécuriser une application (ne pas se fier au IDS et WAF par exemple) et c'est sans compter les références douteuses à TEMPEST (Vivement les écrans LCD?!?) . Oui certaines recommendations de configuration telles que de recommander TLS1.3 (qui n'est pas réellement supporté encore, donc un peu tôt pour forcer le tout), sont OK, mais on est loin de la sécurité applicative, mais plus de la sécurité qui entoure une application.