Qongzi https://qongzi.com Votre agence web & design Fri, 22 Dec 2023 11:42:02 +0000 en-US hourly 1 https://wordpress.org/?v=6.4.3 https://qongzi.com/wp-content/uploads/favicon-qongzi.ico Qongzi https://qongzi.com 32 32 Comprendre le modèle Zero Trust : Qu’est-ce que c’est et pourquoi est-il important ? https://qongzi.com/comprendre-le-modele-zero-trust-quest-ce-que-cest-et-pourquoi-est-il-important/ https://qongzi.com/comprendre-le-modele-zero-trust-quest-ce-que-cest-et-pourquoi-est-il-important/#respond Tue, 30 May 2023 09:50:29 +0000 https://wp.qongzi.dev/?p=1600 Dans le monde actuel de la cybersécurité, où les menaces sont de plus en plus sophistiquées et les attaquants de plus en plus audacieux, il est essentiel pour les organisations de toutes tailles de repenser leur approche de la sécurité. L’une des stratégies est le modèle Zero Trust. Mais qu’est-ce que c’est, et pourquoi est-il si important ?

Qu’est-ce que le modèle Zero Trust ?

Le modèle Zero Trust, comme son nom l’indique, est basé sur le principe de “ne faire confiance à personne”. Contrairement aux approches traditionnelles de la sécurité qui supposent que tout ce qui se trouve à l’intérieur du réseau de l’entreprise est sûr, le modèle Zero Trust considère chaque tentative d’accès comme potentiellement dangereuse, qu’elle provienne de l’intérieur ou de l’extérieur du réseau.

Le concept de Zero Trust a été introduit pour la première fois par John Kindervag, alors analyste chez Forrester Research, en 2010. Il a été conçu comme une réponse à l’évolution du paysage des menaces et à l’inefficacité des modèles de sécurité traditionnels face à ces nouvelles menaces.

Les principes fondamentaux du modèle Zero Trust sont les suivants :

  • Ne faire confiance à personne : Tous les utilisateurs et dispositifs sont considérés comme non fiables, qu’ils soient à l’intérieur ou à l’extérieur du réseau.
  • Vérifier avant d’accorder l’accès : Chaque demande d’accès est vérifiée avant d’être accordée. Cela inclut la vérification de l’identité de l’utilisateur, du dispositif utilisé, et du contexte de la demande.
  • Principe du moindre privilège : Les utilisateurs et les dispositifs ne doivent avoir accès qu’aux ressources dont ils ont besoin pour accomplir leurs tâches, et rien de plus.

Pourquoi le modèle Zero Trust est-il important ?

Le paysage des menaces a considérablement évolué au cours de la dernière décennie. Les attaquants sont devenus plus sophistiqués, utilisant des techniques avancées pour contourner les défenses de sécurité traditionnelles. De plus, avec l’augmentation du travail à distance et l’utilisation d’appareils personnels pour le travail, le périmètre de sécurité traditionnel a été rendu obsolète.

Le modèle Zero Trust répond à ces défis en supposant que chaque demande d’accès est potentiellement malveillante. En vérifiant chaque demande et en n’accordant que les privilèges nécessaires, il réduit la surface d’attaque et rend plus difficile pour les attaquants de se déplacer latéralement à travers le réseau.

Comment fonctionne le modèle Zero Trust ?

Le modèle Zero Trust fonctionne en vérifiant chaque demande d’accès à partir de plusieurs paramètres. Il prend en compte l’utilisateur qui fait la demande, le dispositif qu’il utilise, l’application ou la ressource à laquelle il tente d’accéder, et le contexte de la demande.

Les différents éléments du modèle Zero Trust sont les suivants :

  • Les utilisateurs : Le modèle Zero Trust vérifie l’identité de chaque utilisateur avant d’accorder l’accès. Cela peut inclure l’utilisation d’authentification à deux facteurs ou de biométrie. Les utilisateurs sont également soumis au principe du moindre privilège, ce qui signifie qu’ils n’ont accès qu’aux ressources dont ils ont besoin pour accomplir leurs tâches.
  • Les appareils : Les appareils utilisés pour accéder aux ressources sont également vérifiés. Cela peut inclure une vérification de l’état de sécurité de l’appareil, comme la présence d’un logiciel antivirus à jour, et la vérification que l’appareil est conforme aux politiques de sécurité de l’entreprise.
  • Les réseaux : Le modèle Zero Trust considère que tous les réseaux sont potentiellement hostiles. Par conséquent, il utilise des techniques comme la micro-segmentation pour diviser le réseau en petits segments, chacun étant protégé par ses propres contrôles de sécurité.
  • Les applications : Les applications sont également soumises à des contrôles de sécurité, comme la vérification de l’intégrité de l’application. Une limitation de l’accès à l’application en fonction du rôle de l’utilisateur est également mise en œuvre.
  • Les données : Enfin, le modèle Zero Trust protège les données elles-mêmes. Cela peut inclure l’utilisation de techniques de chiffrement pour protéger les données, et l’application de contrôles d’accès basés sur les rôles pour limiter qui peut accéder aux données.

Les avantages du modèle Zero Trust

L’adoption du modèle Zero Trust offre plusieurs avantages :

  • Il offre une meilleure protection contre les menaces internes et externes. En vérifiant chaque demande d’accès et en limitant l’accès aux ressources, il rend plus difficile les mouvements latéraux à travers le réseau et l’accès aux données sensibles pour les attaquants.
  • Le modèle Zero Trust offre une meilleure visibilité sur qui accède à quoi dans l’organisation. Cela peut aider à détecter les comportements suspects et à répondre plus rapidement aux incidents de sécurité.
  • Ce modèle aide à améliorer la conformité avec les réglementations en matière de sécurité et de protection des données. En limitant l’accès aux données sensibles et en protégeant ces données avec des techniques de chiffrement, il peut aider à répondre aux exigences de réglementations comme le RGPD.
  • Le Zero Trust peut aider à améliorer l’expérience utilisateur. En utilisant des techniques comme l’authentification unique et l’authentification adaptative, il peut rendre l’accès aux ressources plus facile et plus sûr pour les utilisateurs.

Les défis de la mise en œuvre du modèle Zero Trust

Bien que le modèle Zero Trust offre de nombreux avantages, sa mise en œuvre présente quelques défis :

1. Il nécessite un changement de mentalité. Les organisations doivent passer d’un principe de confiance à celui de méfiance par défaut. Cela peut nécessiter une formation et une sensibilisation pour aider les employés à comprendre et à adopter cette nouvelle approche.

2. La mise en œuvre du modèle Zero Trust peut être complexe. Elle nécessite une compréhension approfondie de l’infrastructure de l’organisation, de ses données et de ses utilisateurs. Elle peut également nécessiter des modifications importantes de l’infrastructure de sécurité existante.

3. La mise en œuvre du modèle Zero Trust peut nécessiter un investissement significatif en termes de temps et de ressources. Cependant, il est important de noter que le coût de la non-conformité – notamment les amendes réglementaires et les coûts associés à une violation de données – peut être bien plus élevé.

Comment commencer avec le modèle Zero Trust ?

La mise en œuvre du modèle Zero Trust est un processus qui nécessite une planification et une exécution soigneuses. Voici quelques étapes clés pour commencer :

  1. Comprendre votre environnement : Avant de pouvoir mettre en œuvre le modèle Zero Trust, vous devez avoir une compréhension claire de votre environnement. Cela inclut la connaissance de vos actifs, de vos utilisateurs et de leurs comportements, de vos données et de leur emplacement, et de votre infrastructure de sécurité existante. Cela peut impliquer un audit de cybersécurité pour identifier les vulnérabilités et les domaines qui nécessitent une amélioration.
  2. Définir une stratégie : Une fois que vous avez une compréhension claire de votre environnement, vous pouvez commencer à définir votre stratégie Zero Trust. Elle doit inclure des objectifs clairs et mesurables, ainsi qu’un plan pour atteindre ces objectifs.
  3. Mettre en œuvre la stratégie : La mise en œuvre de la stratégie Zero Trust peut nécessiter des modifications de votre infrastructure de sécurité existante, la mise en place de nouvelles technologies et processus, et la formation de vos employés. Il est important de procéder par étapes, en commençant par les secteurs ou le risque est le plus élevé, et de mesurer les progrès à chaque étape.
  4. Évaluer et ajuster : Une fois que vous avez commencé à mettre en œuvre votre stratégie Zero Trust, il est important d’évaluer régulièrement son efficacité et de faire les ajustements nécessaires. Cela peut inclure la collecte et l’analyse de données sur les tentatives d’accès, les violations de sécurité, et l’efficacité des contrôles de sécurité. Des tests d’intrusion pour vérifier la résilience de l’entreprise face aux attaques et des audits réguliers permettent de s’assurer que les mesures de sécurité sont toujours efficaces.

Conclusion

Le modèle Zero Trust représente une évolution majeure dans la façon dont les organisations abordent la sécurité. En supposant que chaque demande d’accès est potentiellement malveillante, il offre une meilleure protection contre les menaces internes et externes, une meilleure visibilité sur l’accès aux ressources, et une meilleure conformité avec les réglementations en matière de sécurité et de protection des données.

Cependant, la mise en œuvre du modèle Zero Trust peut présenter des défis et nécessite un investissement significatif en termes de temps et de ressources. Malgré ces défis, compte tenu de l’évolution du paysage des menaces et de l’inefficacité des modèles de sécurité traditionnels, l’adoption du modèle Zero Trust est une nécessité pour la sécurité des organisations.

Références

]]>
https://qongzi.com/comprendre-le-modele-zero-trust-quest-ce-que-cest-et-pourquoi-est-il-important/feed/ 0
Pourquoi la sensibilisation à la cybersécurité est-elle cruciale ? https://qongzi.com/pourquoi-la-sensibilisation-a-la-cybersecurite-est-elle-cruciale/ https://qongzi.com/pourquoi-la-sensibilisation-a-la-cybersecurite-est-elle-cruciale/#respond Thu, 25 May 2023 14:56:00 +0000 https://wp.qongzi.dev/?p=1597 La cybersécurité n’est pas seulement une question de technologie. Elle concerne aussi les personnes. En effet, selon le rapport 2019 de Verizon sur les violations de données, 33% des violations impliquaient des attaques de phishing et 28% impliquaient des employés. C’est pourquoi la sensibilisation à la cybersécurité est si importante.

La sensibilisation à la cybersécurité permet à vos employés de comprendre les risques liés à la cybersécurité et de savoir comment les éviter. Elle les aide à reconnaître les signes d’une attaque potentielle et à savoir comment réagir. En fin de compte, une bonne sensibilisation à la cybersécurité peut faire la différence entre une entreprise sécurisée et une entreprise vulnérable.

De plus, la sensibilisation à la cybersécurité n’est pas seulement bénéfique pour l’entreprise, mais aussi pour les employés eux-mêmes. En étant sensibilisés aux menaces et aux meilleures pratiques en matière de cybersécurité, ils peuvent protéger leurs données personnelles.

Les plus grandes violations de données du 21ème siècle

Violation de donnéesDateImpact
Yahoo2013-143 milliards de comptes d’utilisateurs
First American Financial Corp.Exposé en mai 2019, mais pourrait remonter à au moins 2003885 millions de dossiers d’information personnelle
Facebook2019540 millions de dossiers d’utilisateurs
Marriott Starwood Hotels2014-18500 millions de clients
Adult Friend FinderOctobre 2016Plus de 412,2 millions de comptes
MySpace2013 (mais découvert en 2016)360 millions de comptes d’utilisateurs
ExactisJuin 2018340 millions de personnes et d’entreprises
Twitter2020330 millions d’utilisateurs
NetEaseOctobre 2015234 millions d’utilisateurs
LinkedIn2012 (mais découvert en 2016)165 millions d’utilisateurs

Comment améliorer la sensibilisation à la cybersécurité dans votre organisation ?

Améliorer la sensibilisation à la cybersécurité dans votre organisation nécessite une approche multifacette. Voici quelques stratégies clés :

  1. Formation : La formation est l’un des moyens les plus efficaces pour améliorer la sensibilisation à la cybersécurité. Une formation en cybersécurité peut aider vos employés à comprendre les risques et à savoir comment les éviter. Elle doit inclure des modules sur la reconnaissance des attaques de phishing, la sécurisation des mots de passe et la protection des informations sensibles. La formation doit être régulière et actualisée pour tenir compte de l’évolution des menaces. Il est également important de s’assurer que la formation est adaptée à l’audience. Par exemple, le personnel informatique aura besoin d’une formation plus technique, tandis que le personnel non technique aura besoin d’une formation plus générale sur les meilleures pratiques en matière de cybersécurité.
  2. Conseil : Un conseil en cybersécurité peut vous aider à identifier les vulnérabilités de votre organisation et à élaborer une stratégie pour les atténuer. Il peut également vous aider à mettre en place des politiques et des procédures de sécurité efficaces. Un conseiller en cybersécurité peut également aider à instaurer une culture de la sécurité au sein de votre organisation, en soulignant l’importance de la cybersécurité à tous les niveaux de l’entreprise. Il peut également fournir des conseils sur les dernières tendances et menaces en matière de cybersécurité, afin que vous puissiez rester à jour et protéger votre organisation contre les nouvelles menaces.
  3. Audit : Un audit de cybersécurité peut vous aider à évaluer l’efficacité de vos mesures de sécurité actuelles et à identifier les domaines qui nécessitent une amélioration. Il peut également vous aider à comprendre comment vos employés interagissent avec vos systèmes et vos données, ce qui peut vous aider à améliorer votre sensibilisation à la cybersécurité. Un audit régulier peut également aider à maintenir la conformité avec les réglementations en matière de cybersécurité et à démontrer votre engagement envers la sécurité à vos clients et partenaires. L’audit doit inclure une évaluation de vos politiques et procédures de sécurité, une évaluation de votre infrastructure de sécurité et une évaluation de la sensibilisation à la cybersécurité de vos employés.
  4. Tests d’intrusion : Les tests d’intrusion peuvent vous aider à comprendre comment un attaquant pourrait pénétrer dans vos systèmes et quelles données il pourrait accéder. Ils peuvent également vous aider à identifier les vulnérabilités que vous devez corriger pour améliorer votre sécurité. Ces tests simulent des attaques réelles et fournissent des informations précieuses sur la résilience de vos systèmes face aux menaces. Les tests d’intrusion doivent être effectués régulièrement et après toute modification majeure de votre infrastructure de sécurité.

Renforcez la sécurité de votre organisation par la formation

La sensibilisation à la cybersécurité est un élément essentiel de la protection de votre organisation contre les cyberattaques. En formant vos employés, en sollicitant des conseils d’experts, en effectuant des audits de sécurité et en réalisant des tests d’intrusion, vous pouvez améliorer la sensibilisation à la cybersécurité dans votre organisation et renforcer votre sécurité globale.

Il est important de se rappeler que la cybersécurité est un effort continu. Les menaces évoluent constamment, et votre organisation doit s’adapter pour les contrer. En investissant dans la sensibilisation à la cybersécurité, vous pouvez aider à protéger votre organisation contre les cyberattaques et assurer la sécurité de vos données et de vos systèmes.

En fin de compte, la sensibilisation à la cybersécurité est une responsabilité partagée. Chaque employé a un rôle à jouer pour assurer la sécurité de l’organisation. En investissant dans la formation et en instaurant une culture de la sécurité, vous pouvez aider vos employés à prendre cette responsabilité au sérieux.

]]>
https://qongzi.com/pourquoi-la-sensibilisation-a-la-cybersecurite-est-elle-cruciale/feed/ 0
L’IoT et la cybersécurité : les défis de la sécurisation des objets connectés https://qongzi.com/liot-et-la-cybersecurite-les-defis-de-la-securisation-des-objets-connectes/ https://qongzi.com/liot-et-la-cybersecurite-les-defis-de-la-securisation-des-objets-connectes/#respond Tue, 23 May 2023 14:55:10 +0000 https://wp.qongzi.dev/?p=1594 Bienvenue dans l’ère de l’Internet des objets (IoT) où tout, des systèmes de production aux capteurs de surveillance, est connecté et interconnecté. C’est un monde plein de possibilités pour les entreprises, mais aussi de défis majeurs en matière de cybersécurité. C’est un enjeu stratégique qui pourrait façonner l’avenir de votre entreprise dans le monde numérique.

Comprendre l’IoT (Internet des Objets)

L’IoT, ou Internet des Objets, est un réseau d’appareils physiques connectés à Internet, collectant et partageant des données en continu. Il englobe une multitude d’appareils, des capteurs de production industrielle aux équipements de suivi de santé en milieu professionnel. Comprendre l’IoT nécessite d’examiner ses composants clés.

Réseau d’objets interconnectés

Au centre de l’IoT, il y a un réseau d’objets interconnectés. Ces appareils peuvent inclure des systèmes de contrôle d’usine, des véhicules connectés, des dispositifs de suivi des employés, des drones de livraison et même des systèmes de climatisation intelligents. Chaque appareil est connecté à Internet et peut échanger des données avec d’autres appareils.

Collecte de données

Les objets connectés sont conçus pour collecter des données. Ces données peuvent varier en fonction de l’appareil. Par exemple, un système de contrôle de la qualité de l’air peut recueillir des informations sur l’environnement de travail, tandis qu’un système de suivi du parc de véhicules peut surveiller l’activité de votre flotte en temps réel.

Analyse des données

Une fois collectées, ces données peuvent être analysées pour offrir des informations précieuses. Par exemple, l’analyse des données d’un système de gestion énergétique peut aider à optimiser la consommation d’énergie de votre entreprise, tandis que l’analyse des données de suivi de la performance des employés peut vous aider à améliorer leur productivité et leur bien-être.

Automatisation et contrôle à distance

L’IoT permet l’automatisation et le contrôle à distance. Par exemple, vous pouvez utiliser une plateforme centralisée pour contrôler les systèmes d’éclairage de votre entreprise, ajuster la climatisation, ou vérifier les performances d’une ligne de production. Cette capacité à contrôler et à automatiser à distance offre un avantage concurrentiel sans précédent.

Cependant, l’IoT soulève également des défis importants en matière de cybersécurité. Avec un nombre croissant d’objets connectés, les risques de cyberintrusion augmentent, soulignant l’importance d’une compréhension profonde et d’une gestion efficace de la cybersécurité dans le contexte de l’IoT.

Comprendre la Cybersécurité en entreprise

La cybersécurité est un domaine complexe qui englobe de nombreux aspects différents. Pour comprendre pleinement ce qu’elle implique dans ce contexte, il est important de considérer ses composants clés.

Protection des informations d’entreprise

Au cœur de la cybersécurité se trouve la protection des informations d’entreprise. Cela implique de garantir l’intégrité, la confidentialité et la disponibilité des données sensibles de l’entreprise. L’intégrité assure que les données ne sont pas modifiées sans autorisation. La confidentialité signifie que les informations ne sont accessibles qu’aux parties autorisées. La disponibilité garantit que les données sont accessibles aux utilisateurs autorisés lorsqu’elles sont nécessaires.

Prévention des cyberattaques

Un autre aspect fondamental de la cybersécurité en entreprise est la prévention des cyberattaques. Cela implique la mise en place de mesures robustes pour détecter et contrer les attaques, telles que les pare-feux, les antivirus et les systèmes de détection d’intrusion.

Gestion des incidents de sécurité

Malgré les meilleures précautions, les incidents de sécurité peuvent toujours survenir. La gestion efficace des incidents de sécurité est donc un élément crucial de la cybersécurité en entreprise. Elle comprend la détection rapide des incidents, la réponse coordonnée à ces incidents et la reprise après un incident.

Respect des règlementations

Dans de nombreux secteurs, les entreprises sont soumises à des règlementations strictes qui définissent les mesures de sécurité nécessaires. La conformité à ces règlementations est un aspect crucial de la cybersécurité en entreprise.

Formation et sensibilisation du personnel

Enfin, la formation et la sensibilisation du personnel sont des éléments clés de la cybersécurité en entreprise. Les employés sont souvent le maillon faible en matière de sécurité, et la formation aide à minimiser les erreurs humaines qui peuvent conduire à des failles de sécurité.

Comprendre ces aspects de la cybersécurité est essentiel, et c’est particulièrement important dans le contexte de l’IoT, où la surface d’attaque est plus grande et les défis de sécurité plus complexes. À cet effet, les formations en cybersécurité sont cruciales pour rester à jour face à l’évolution constante des menaces.

Les défis de la sécurisation de l’IoT pour les entreprises

La sécurisation de l’IoT présente un certain nombre de défis uniques qui rendent cette tâche complexe pour les entreprises.

L’augmentation du nombre d’objets connectés

Un des défis les plus importants est l’explosion du nombre d’objets connectés. On estime que le nombre d’appareils connectés atteindra 75 milliards d’ici 2025. Cela signifie que le nombre d’appareils susceptibles d’être compromis dans une entreprise s’accroit, offrant une multitude d’opportunités pour les cybercriminels.

Le manque de standardisation

Le grand nombre de protocoles et de normes utilisés par les objets connectés complique la tâche de sécurisation au niveau de l’entreprise. Le manque de standardisation signifie qu’il n’y a pas de “solution unique” pour la sécurisation de l’IoT dans une organisation.

Les fonctionnalités de sécurité insuffisantes

De nombreux appareils et capteurs sont conçus pour être pratiques et faciles à utiliser, plutôt que sécurisés. Cela signifie qu’ils peuvent avoir des mesures de sécurité insuffisantes, mots de passe faibles ou inexistants par exemple, et ne sont pas toujours capables de recevoir des mises à jour de sécurité.

Le manque de culture de la cybersécurité au sein des entreprises

Beaucoup d’employés ne sont pas conscients des risques de cybersécurité en général et ceux associés aux objets connectés en particulier, et ne prennent donc pas les mesures appropriées pour les sécuriser. Par exemple, de nombreux employés ne changent pas les mots de passe par défaut sur leurs appareils, laissant une ouverture facile pour les cybercriminels.

L’élargissement de la surface d’attaque

En raison de leur nature interconnectée, les objets connectés augmentent la surface d’attaque pour les cybercriminels dans l’entreprise. Une fois qu’un appareil est compromis, l’attaquant peut potentiellement accéder à d’autres appareils sur le même réseau.

Face à ces défis, il est essentiel pour les entreprises d’adopter une approche proactive et intégrée de la cybersécurité. Cela implique de prendre en compte tous les aspects de la sécurité, de la conception des appareils à la formation des employés, en passant par des audits de cybersécurité réguliers pour détecter et corriger les vulnérabilités.

Techniques et Stratégies pour la Sécurisation des Systèmes IoT en Entreprise

L’instauration d’une sécurité efficace pour l’IoT nécessite une mise en œuvre de différentes techniques et stratégies, en réponse aux défis propres à ces réseaux connectés au sein des entreprises.

Authentification Forte

Le premier rempart pour la sécurité de l’IoT est une authentification robuste. Celle-ci pourrait inclure des méthodes comme l’authentification multifacteurs, qui demande à l’utilisateur de fournir plusieurs preuves d’identité pour accéder à un appareil ou un système. Cela contribue à empêcher l’accès non autorisé, même dans le cas où un mot de passe serait compromis.

Chiffrement des Données

Le chiffrement des données est essentiel pour sécuriser les données en transit entre les objets connectés et les serveurs au sein de votre entreprise. Les données chiffrées sont converties en un format lisible uniquement par ceux disposant d’une clé de déchiffrement spécifique. Cela rend l’interception et la lecture des données bien plus complexe pour un cyberattaquant.

Principe de Moindre Privilège

Le principe de moindre privilège stipule que chaque utilisateur ou système devrait seulement obtenir le minimum de privilèges nécessaires pour accomplir ses tâches, et rien de plus. Cette approche peut aider à limiter l’étendue des dommages si un appareil était compromis.

Security by Design

L’approche “Security by Design” est un principe fondamental pour la sécurité des systèmes IoT dans un contexte d’entreprise. Elle insiste sur l’intégration de mesures de sécurité dès les premières phases de conception d’un produit IoT, plutôt que comme une réflexion après-coup. Cette philosophie comprend des mesures telles que la limitation des accès inutiles par le blocage des ports non utilisés, la désactivation des services superflus et l’établissement d’une politique stricte de gestion des mots de passe, en évitant les mots de passe par défaut. Elle cherche à instaurer une sécurité intrinsèque, robuste et durable à chaque étape de la vie du produit, depuis sa conception jusqu’à son utilisation finale.

Formation en Cybersécurité

Enfin, les erreurs humaines demeurent souvent la cause principale de failles de sécurité. Des formations régulières en cybersécurité peuvent aider les utilisateurs au sein de votre entreprise à comprendre les menaces et à adopter des comportements plus sécuritaires.

En mettant en œuvre ces techniques et stratégies, nous pouvons augmenter la résilience de nos systèmes IoT face aux cybermenaces dans un contexte d’entreprise.

Risques de failles de sécurité

L’absence de mesures de sécurité adéquates pour les objets connectés au sein des entreprises peut entrainer des conséquences sévères, allant bien au-delà d’une simple perte de données.

Compromission des infrastructures vitales

L’un des risques majeurs est la compromission des infrastructures vitales. Les objets connectés sont de plus en plus intégrés dans des secteurs cruciaux comme l’énergie, les transports et la santé. Une attaque réussie sur ces systèmes pourrait perturber gravement les opérations, affectant le fonctionnement des services essentiels, et dans certains cas, mettre en danger la vie des individus.

Violations de la confidentialité des données

La négligence en matière de sécurité de l’IoT peut également compromettre la confidentialité des données d’entreprise. Beaucoup d’objets connectés collectent des informations sensibles, qui, si elles ne sont pas correctement sécurisées, peuvent être volées et utilisées de manière malveillante, entrainant des violations majeures de la confidentialité et la perte de la confiance des clients et des partenaires.

En outre, cela peut entrainer des problèmes majeurs en ce qui concerne le Règlement Général sur la Protection des Données (RGPD). Ce règlement de l’Union Européenne exige que les entreprises protègent les données personnelles et la vie privée des citoyens européens pour les transactions qui ont lieu au sein des États membres de l’UE. Par conséquent, toute violation de la sécurité des données peut entrainer des sanctions sévères pour les entreprises, y compris d’importantes amendes financières, qui peuvent s’élever jusqu’à 4% du chiffre d’affaires annuel global.

De plus, la non-conformité au RGPD peut également nuire à la réputation d’une entreprise, réduisant la confiance des clients et potentiellement impactant les relations avec les partenaires et les fournisseurs. Cela souligne l’importance d’adopter des stratégies robustes de cybersécurité pour l’IoT, tout en veillant à la conformité aux règlementations sur la protection des données comme le RGPD.

Attaques financières

Les objets connectés peuvent être exploités comme une porte d’entrée pour des attaques financières. Par exemple, un cybercriminel pourrait compromettre un objet connecté dans une entreprise, puis utiliser cet accès pour infiltrer le système financier de l’entreprise et dérober des informations financières critiques.

Attaques par déni de service

De plus, les objets connectés peuvent être utilisés pour mener des attaques par déni de service (DDoS). Dans ce type d’attaque, de nombreux appareils sont compromis et utilisés pour surcharger une cible avec un volume massif de trafic, rendant ainsi ses services inaccessibles. Les attaques DDoS peuvent causer de grandes perturbations opérationnelles et entrainer des pertes financières significatives.

Ces risques mettent en évidence la nécessité d’une formation rigoureuse en cybersécurité pour le personnel, ainsi que l’importance d’un conseil expert pour aider les entreprises à naviguer dans l’univers complexe de la cybersécurité de l’IoT.

Études de cas : succès et échecs de la sécurisation de l’IoT

La sécurisation des objets connectés est un défi complexe, comme le montrent plusieurs études de cas. L’analyse des réussites et des échecs peut nous aider à comprendre les meilleures pratiques et les pièges à éviter.

Une réussite : Apple et son HomePod

Apple est un exemple de succès dans la sécurisation de l’IoT. Leur enceinte intelligente, le HomePod, est un excellent exemple de la manière dont les principes de sécurité peuvent être intégrés dans un objet connecté. Le HomePod bénéficie de mises à jour logicielles automatiques, ce qui permet de s’assurer que les derniers correctifs de sécurité sont toujours appliqués. Il utilise également le chiffrement des données pour sécuriser les communications entre l’enceinte et les appareils connectés, ce qui rend difficile pour les attaquants de les intercepter. Enfin, Apple maintient un contrôle strict sur les applications et services tiers qui peuvent interagir avec le HomePod, réduisant ainsi la surface d’attaque.

Un échec : L’attaque du botnet Mirai

Le botnet Mirai est un exemple frappant d’échec dans la sécurisation des objets connectés. En 2016, Mirai a infecté des centaines de milliers d’objets connectés, notamment des caméras de surveillance et des routeurs, en utilisant des identifiants par défaut qui n’avaient pas été changés par les utilisateurs. Les appareils infectés ont été utilisés pour lancer une attaque DDoS massive, perturbant de nombreux sites web à travers le monde. Cette attaque a mis en évidence l’importance d’un audit de cybersécurité régulier et de la modification des identifiants par défaut des objets connectés.

Ces études de cas illustrent la complexité de la sécurisation de l’IoT. Il est essentiel d’adopter une approche proactive et de tenir compte à la fois des aspects technologiques et humains de la cybersécurité.

Prévoir l’avenir de l’IoT et de la cybersécurité

L’avenir de l’IoT et de la cybersécurité est façonné par plusieurs technologies et tendances émergentes qui peuvent, à la fois, renforcer la sécurité et introduire de nouvelles failles potentielles.

L’Intelligence Artificielle (IA) est l’une de ces technologies. Les algorithmes d’IA peuvent être utilisés pour déceler les menaces à la cybersécurité de manière plus efficace et précise, en identifiant les comportements suspects au sein de grands volumes de données. Toutefois, l’IA peut également être employée par des cybercriminels pour élaborer des logiciels malveillants plus sophistiqués ou pour déceler des failles dans les systèmes de sécurité.

Le Machine Learning, une sous-discipline de l’IA, présente aussi à la fois des opportunités et des défis. Les systèmes basés sur le Machine Learning peuvent apprendre et s’adapter à de nouvelles menaces, les rendant particulièrement utiles pour la détection des cyberattaques. Cependant, ils peuvent aussi être trompés par des attaquants astucieux qui comprennent leur mode de fonctionnement.

L’adoption croissante de la technologie 5G et de ses successeurs constitue également une tendance majeure. Ces réseaux offrent des débits de transmission de données plus élevés, permettant aux dispositifs IoT de fonctionner de manière plus efficace. Cependant, ils étendent également la surface d’attaque pour les cybercriminels, en rendant davantage d’appareils accessibles et en créant de nouvelles failles potentielles.

Face à ces défis, l’importance d’une approche proactive en matière de cybersécurité ne peut être sous-estimée. Il est essentiel pour les entreprises de mettre en place des stratégies permettant de détecter et de répondre rapidement aux tentatives d’intrusion, et de rester à jour avec les dernières évolutions technologiques pour anticiper les nouvelles menaces.

Enfin, il faut reconnaître que la technologie n’est qu’un aspect de l’équation. Les facteurs humains, tels que la formation continue en cybersécurité et la sensibilisation du personnel, jouent un rôle tout aussi important pour garantir la sécurité de l’IoT dans l’écosystème des entreprises.

Conclusion

La sécurisation de l’IoT représente un défi de taille dans le paysage actuel des entreprises, mais ce défi est loin d’être insurmontable. En adoptant une stratégie de sécurité adéquate, en effectuant des audits réguliers, en assurant une formation continue et en sensibilisant l’ensemble de vos collaborateurs, votre entreprise peut naviguer en toute sécurité dans l’écosystème IoT.

Voici quelques recommandations concrètes pour relever ce défi :

  1. Adoptez une approche de sécurité intégrée : Cela signifie considérer la sécurité à chaque étape du cycle de vie de l’appareil, de la conception à son recyclage.
  2. Faites auditer régulièrement vos systèmes : Un audit de cybersécurité peut aider à identifier les vulnérabilités potentielles et à y remédier avant qu’elles ne soient exploitées.
  3. Formez vos équipes : Assurez vous que tous les membres de votre organisation comprennent les bases de la cybersécurité et sont conscients des risques associés à l’IoT. Les formations en cybersécurité sont un excellent moyen d’atteindre cet objectif.
  4. Mettez à jour vos appareils : Les appareils dépassés ou non mis à jour sont plus vulnérables aux attaques. Assurez-vous donc d’effectuer régulièrement les mises à jour de sécurité.
  5. Demandez conseil si nécessaire : Si vous n’êtes pas sûr de la manière de sécuriser au mieux vos objets connectés, il peut être judicieux de demander l’avis d’un expert en conseil en cybersécurité.

L’important est de rester informé, vigilant et prêt à faire face aux défis émergents. Bienvenue dans l’avenir de l’IoT pour les entreprises.

Sources

]]>
https://qongzi.com/liot-et-la-cybersecurite-les-defis-de-la-securisation-des-objets-connectes/feed/ 0
[ÉVÉNEMENT] Steakoverflow 2022 https://qongzi.com/evenement-steakoverflow-2022/ https://qongzi.com/evenement-steakoverflow-2022/#respond Tue, 13 Sep 2022 14:50:00 +0000 https://wp.qongzi.dev/?p=1591 📅 Le samedi 3 septembre à l’ESNA de Bretagne se tenait la deuxième édition du Steakoverflow, un évènement organisé par l’association rennaise l’Esn’Hack.

📢 Notre consultant cybersécurité Gyver Ferrand a pu présenter une plateforme d’Adversary Emulation/Red team automation, sur une base open source et compatible avec les standards du MITRE. Cet outil permettra de créer, rejouer ou découvrir des scénarios sur des périmètres larges. Une évolution vers une plateforme de recherche de vulnérabilités est envisagée afin d’améliorer ses capacités sur une cible unique. Une représentation simple d’attack path et une visualisation centralisée des résultats permettant des actions manuelles sont les axes clés de Gungnir. L’aspect semi-automatisé et le renforcement par Machine Learning sont ses forces.20220903192500 IMG 8181 1

➡️ L’occasion également d’échanger autour de la méthode Principle of Synthetic Intelligence qui donnera lieu à un article prochainement ! Nous remercions encore l’organisation de nous avoir permis de participer à cet évènement. 🙏

]]>
https://qongzi.com/evenement-steakoverflow-2022/feed/ 0
Voyager sans être en vacances https://qongzi.com/voyager-sans-etre-en-vacances/ https://qongzi.com/voyager-sans-etre-en-vacances/#respond Mon, 04 Jul 2022 11:39:00 +0000 https://wp.qongzi.dev/?p=1613 Au début de cette année, je suis rentré chez Qonfucius. Un mois plus tard, j’ai demandé si je pouvais aller voir du pays. Et on m’a dit oui.

Cet article relève de ma première expérience.

Le remote

Qonfucius et la distance

Qonfucius étant une entreprise entièrement en télétravail depuis ses débuts, et la pandémie 2019 ayant propulsé cette méthode de travail dans le monde entier, je me devais, moi, nouveau bambin de la compagnie, dev’ tout neuf, et voyageur en sac à dos à mes heures perdues de prendre l’air en dehors de nos frontières tout en travaillant.

Frontières à peine réouvertes, conditions de voyage changeantes selon les pays, barrage sanitaire et administratif, c’est ici que je prends mes marques de départ.

Digital Nomad, cocotier et travail à distance

Avant de commencer, il est bien de parler du terme qui est souvent lié à cette activité, le fameux terme de Digital Nomad :

Certains l’ont pour but de vie, certains crissent des dents juste à l’entendre. Ce terme parfois caricatural d’un blogueur professionnel ou formateur en ligne traversant la Thaïlande en tongs à travers des coworking spaces décorés de bambou, est un terme assez à la mode. Souvent associé à un métier de freelance, si être digital nomad ne signifie que voyager et travailler avec internet, il est aussi adaptable à quelqu’un sous contrat.

Entre rêve et réalité, il y a un gap, pour certains, c’est un mode de vie, pour ma part une opportunité, une opportunité de prendre l’air, de rafraichir mes journées, sans pour autant partir en vacances.pexels photo 842912

Je vais rapidement établir mon expérience du travail en remote. Je fais partie des développeurs nés sous le signe des formations rapides (O’clock). J’y ai débuté ma formation de développeur, et je n’ai, depuis, jamais travaillé dans un bureau ou un open-space.Je suis par la suite rentré chez Qonfucius qui m’a accueilli les bras ouverts (et avec des haches, mais c’est une autre histoire).Je suis donc un développeur qui n’a jamais fait autrement qu’en remote.Et j’aime beaucoup ça. Je dois dire que j’ai du mal à me voir travailler dans un autre cadre aujourd’hui.

Les avantages

– Horaires plus flexibles.– Meilleure gestion de l’équilibre vie personnelle/vie pro.– Possibilité d’éviter les heures de pointe à la poste.– J’ai un sentiment de liberté, je n’ai pas de freins pour travailler, et j’aime parfois finir les choses tard.– Pas de transport.– Je déteste les transports.

C’est aussi le meilleur moyen de s’entourer des meilleurs collaborateurs sans contrainte géographique.

(Ce n’est pas moi qui le dis, c’est sur la page de présentation de la compagnie. Je suis donc un excellent collaborateur)EVlfZaNXYAEbiCU

Inconvénient

Du côté des inconvénients, j’en vois un principal : pas de babyfoot le manque de nouveauté physique. Je suis un agité, j’aime voir de nouvelles choses, j’aime voir du pays, voir de nouveaux environnements, tester de nouvelles activités. J’aime me perdre, et forcément, vivre au même endroit, et y passer plusieurs heures par jour tous les jours de l’année peut amenuir mon excitation générale.Et je pense sincèrement être moins bon dans la vie de tous les jours quand je suis moins éveillé. Rester trop longtemps au même endroit sans changement m’endort. Mais au final, ça serait exactement pareil dans un bureau. C’est là que né l’opportunité pour moi d’arrêter de compter les tâtonnements atonals de la vie et de rester stimulé.

Il faut que je fasse varier mon environnement.

But du voyage

Loin de moi l’idée de finir assis, courbé sur un unique écran de macbook dans un café où pour ne pas me sentir coupable, je me devrais de prendre une consommation toutes les 45 min, finissant après 4 heures de travail par avoir les mains qui tremblent lié à un surplus de caféine.

Je pars avec l’idée de prendre l’air, voir la mer, profiter de la Dolce Vita, pouvoir travailler correctement, tester un setup, et que ça ne gêne pas les collègues.

Alors j’en fais part à Gaël, et il me fournit une licence ProtonVPN, me fait signer un papier et me donne le top. (merci 👋)

Préparation du voyage

Un des goals principaux est, je le répète, que ça soit aussi transparent que possible pour les gens travaillant avec moi. Alors la destination, le lieu, et le moment d’y aller sont à prendre en compte.

Destination

Parce que la Terre est ronde, et que le soleil ne peut vraisemblablement pas être partout à la fois, la destination est un sujet important.Quand on part vers l’est, on prend de l’avance, quand on part vers l’ouest, du retard.C’est là qu’imaginer se déplacer sur le continent américain est compliqué. Avec des Français, être aux USA pourrait signifier avoir entre moins six heures (Boston, New York…), et moins onze heures de décalage (Hawaï).Devoir assumer un call à 10h30 heure française deviendrait un calvaire.

L’extrême EST de l’Europe se situe à un bon UTC+3, soit deux heures maximum de décalage. Et c’est, je trouve, tout à fait jouable, voire même avantageux pour ceux qui aiment avoir un rythme un peu tardif.Et puis ça laisse tout de même un grand terrain de jeu.

Le lieu

Le lieu, parce que, si c’est pour au final, finir aussi bien installé que sur une table de jardin, assis sur un tabouret, avec les bruits de constructions ou pire d’enfant, ou pire d’enfant en construction, ce n’est pas la peine. On veut tout de même passer un bon moment.

Je me suis trouvé une maison d’hôte en Italie, dans le sud, côté est. Coup de chance, l’hôte est ingénieur en sécurité informatique, et ça me permettra d’échanger avec lui. En plus de manger plein de pizzas.Une chose importante, pour ne pas dire indispensable, est de se renseigner sur la connexion internet disponible. Il ne faut pas hésiter à communiquer avec les hôtels/Airbnb sur place.

Pour ma part, je leur ai demandé de m’envoyer un screenshot d’un test de connexion, en leur indiquant comment procéder. Et ce, évidemment, avant de réserver le logement.Ça vous évitera des surprises. J’ai mis pas mal de logements de côté parce que la connexion n’était, soit pas suffisante, soit inexistante. (malgré ce que pouvaient afficher les hôtes)Aujourd’hui, l’application [Airbnb] (https://www.airbnb.fr/help/article/3003/vérifier-la-vitesse-de-sa-connexion-internet) est dotée d’un test de connexion permettant aux hôtes de l’afficher s’ils le désirent.Capture d e cran 2022 05 16 a 16.47.02 1

Si vous pouvez avoir un plan B, ce n’est pas une mauvaise idée. La 4G peut vous sauver. Mais avoir une vraie connexion internet, haut débit, stable, c’est important.Pour ceux qui auraient la bougeotte, il existe des modems avec abonnement que je n’ai jamais testé. (ex. : Skyroam)

Timing et itinéraire

On va éviter de partir à un moment où on a besoin de nous. Donc consentement et communication. Moi, ça sera un samedi soir. J’essaye de prévoir au maximum le trajet, il y a des outils assez chouette pour les voyageurs tel que [Rome2Rio] (https://www.rome2rio.com/fr/) pour se trouver des itinéraires adaptés même si on arrive un peu dans la campagne et que trouver la compagnie qui s’occupe des lignes de bus est compliqué.

Matériel

Bon, maintenant que nous avons notre destination de rêve, nos plans de pizza, et l’envie d’avoir envie, il faut préparer la configuration avec laquelle on va travailler.

À la maison, on a peut-être trois écrans, un fauteuil confortable, une table pour être debout, un clavier full size, un microphone standalone et un petit tapis pour les pieds, mais à moins que vous soyez en train de voyager en Van avec l’intégralité de votre setup, ça me parait peu plausible.

Alors je vais rapidement détailler mon choix de matériel afin de donner une idée. Il doit exister davantage de setup et il y a surement moyen de faire plus ou moins selon les envies et nécessités de chacun.

Moniteur

En parlant de nécessiter, pour moi, c’est un deuxième écran. Et ça tombe bien, il existe aujourd’hui des écrans fins, taille laptop, et qui font très bien l’affaire pour travailler.

Le mien se branche en USB-C, directement reconnu, alimentation par le même biais, et il fait 15’6 pouces, soit la taille du laptop. Et déjà avec ça, on est pas mal.J’y ai rajouté un trépied que j’utilise pour la photo pour avoir l’écran à la bonne hauteur.Avec ça, différents setup possibles. Écran annexe en vertical ou horizontal, positionné à droite, à gauche, ou même au-dessus de l’écran principal.

💡 – Petit tips pour les utilisateurs Apple possédant un iPad : j’ai souvent utilisé l’iPad en écran tiers avec la fonctionnalité permettant d’étendre son affichage. Ça me permettait d’y avoir un terminal ou deux.

Accessoires

Au niveau des accessoires, j’ai un dispositif en métal léger et pliable, me permettant de surélever l’ordinateur, afin d’avoir l’écran à une meilleure hauteur. Ce dispositif rend le clavier inutilisable, et m’impose donc un clavier supplémentaire. Et ce n’est pas forcément plus mal, vu la qualité des claviers butterfly 👀.Donc on partira sur un clavier Logitech MXKeys mini, parce que portable, sans fils, et de bonne qualité. J’accompagne ça de ma souris usuelle et d’un tapis de souris.

Niveau son, je suis resté sur des écouteurs sans fils à réduction de bruit, que j’utilise pour le sport, mais dans le futur je remplacerai ça par un casque à réduction de bruit. Ça offre un sacré confort et le microphone suivra. Pour le coup, j’ai utilisé celui du macbook, et ça fonctionne plutôt bien dans les espaces sans bruit. Je le déconseille dans un environnement bruyant.

Écran, ordinateur, tapis de souris, câbles, clavier, tout ça rentre dans la même pochette. Et voilà. Vous avez votre bureau avec vous, ça pèse moins de 3 kg, et ça ne prend aucune place.

Et au final, l’intégralité du setup, avec mes affaires pour voyager, tout ça, rentre dans un sac de 30 L.

RETEX

– En arrivant sur place, le fait d’avoir un hôte connaissant déjà l’endroit et me donnant des conseils sur les lieux impératifs aide beaucoup. J’ai pu installer mon bureau en 20 min, histoire d’être suffisamment à l’aise pour travailler dans de bonnes conditions.IMG 4530 1

– J’ai pu directement savoir où faire mes courses, où faire mon sport, où aller profiter des chouettes panoramas que je suis venu chercher et profiter un peu de la dolce vita.

Équilibre travail VS. temps libre

Au-delà de l’enrichissement culturel grâce à mes échanges avec le lieu et les gens : j’ai bien plus fait attention à mes temps libres qu’à la maison. Je m’organisais le matin pour aller profiter de la mer, lire et boire du café avant de commencer, je trouvais le temps de sortir souffler quand je bloquais sur le boulot et j’allais découvrir l’extérieur sur mes temps de pauses.

Au final, être dans un nouvel endroit, et avoir un bureau, ça m’a permis de valoriser mes temps off, là où peut-être, chez moi, je n’aurais juste rien fait de spécial.Cet épanouissement, cette valorisation du temps libre a clairement été bénéfique pour ce que je produisais.

Sans en faire un mode de vie, je suis largement prêt et désireux de réitérer l’expérience.

Une question pourrait se poser : est-ce que ça vaut le coup ?

N’ayant aucune obligation et étant un solitaire, voyager ne me coute pas vraiment cher. En affinant un peu ses recherches, on trouve des moyens de se déplacer et de se loger pour pas-grand-chose. J’arrive à maintenir les habitudes qui sont chères à mon quotidien en l’entourant d’environnements et d’activités différentes.

Ayant une vie quelque peu frugale sur les aspects du quotidien, et ayant déjà beaucoup voyagé, je ne ressens pas le désir ardent de tout aller voir. Au lieu de venir cocher toutes les cases des lieux touristiques d’un pays en 10 jours, on prend son temps. C’est un voyage sans doute plus immersif, plus contemplatif dans sa longueur. Comme une prise de température à un lieu et moment donné.

]]>
https://qongzi.com/voyager-sans-etre-en-vacances/feed/ 0
Publication d’un paquet NPM depuis une CI Gitlab https://qongzi.com/publication-dun-paquet-npm-depuis-une-ci-gitlab/ https://qongzi.com/publication-dun-paquet-npm-depuis-une-ci-gitlab/#respond Wed, 12 Jan 2022 14:41:37 +0000 https://wp.qongzi.dev/?p=1587 Enjeu

Publier un paquet NPM aussi bien sur NPMJS que sur les différentes échelles (projet et instance) du Gitlab registry via la CI Gitlab. Il est tout à fait possible de faire soit l’un, soit l’autre, soit les deux.

Prérequis

Le paquet en question peut-être aussi bien public que scoped pour une publication uniquement sur NPM. Il sera nécessairement scoped sur le registry Gitlab et, de ce fait, sur NPMJS.

⚠️ La publication d’un paquet scoped et privé sur NPMJS est payante, votre paquet sera donc public par défaut.

Dans notre cas, nous traiterons une double publication registry Gitlab et NPMJS, notre publication sera donc scoped et publique.

Pour cela il faut :

Je suggère d’utiliser un token de type Automation qui est dédié aux workflows automatisés.

1. Configuration

Je n’aborde pas les étapes de test mais vous recommande fortementde tester votre code ainsi que de suivre des normes de formatage et de présentation standards grâce a Eslint et Prettier. Il est aussi intéressant de développer vos librairies avec Typescript afin de fournir un typage aux futurs utilisateurs. Cela facilitera également la scalabilité de votre projet.

Une fois votre projet initialisé, créez un fichier .gitlab-ci.yml à la racine de votre projet.

1.1. Image Docker

L’image Docker n’a pas une grande incidence sur l’étape de publication, essayez toutefois d’utiliser une image LTS light dans la mesure du possible :

ymlimage: node:lts-alpine

1.2. Définition des étapes et paramétrage de la mise en cache

image: node:lts-alpine

stages:
  - test
  - build
  - deploy

# Configuration de la mise en cache des dépendances pour persister leur installation au sein des différentes étapes
cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
        - node_modules/


# Installation des dépendances avant l'exécution des jobs
before_script:
  - npm i

# Vos étapes de tests...

1.3. Build et artifacts

Peu de choses à dire niveau build, pensez simplement à bien ajouter les différents chemins de vos artifacts. À la fin le paquet correspondra a ces fichiers/dossiers, le package.json et le README.md :

# Vos étapes de tests...

build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist
    # - vos autres dossiers/fichiers a inclure
    

2. Déploiement Gitlab registry

Nous voulons déployer notre librairie sur le registry Gitlab, aux échelles du projet et de l’instance de notre organisation. Il est nécessaire de :

  • Attendre la fin du build
  • Charger les artifacts
  • Configurer l’URL du package
  • S’authentifier
  • Configurer la publication a l’échelle du projet
  • Configurer la publication a l’échelle de l’organisation
  • Publier
publish_gitlab_registry:
  stage: deploy
  needs:
    - job: build
      artifacts: true
  dependencies:
    - build
  script:
    # Configuration de l'URL du package, remplacer l'organisation par le nom de votre organisation, le CI_PROJECT_ID est fourni par la CI
    - npm config set ${ORGANIZATION}:registry https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/

    # Configuration de la publication a l'échelle du projet, le CI_JOB_TOKEN est fourni et suffit a l'authentification
    - npm config set -- '//gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken' "${CI_JOB_TOKEN}"

    # Configuration de la publication a l'échelle de l'instance, le CI_JOB_TOKEN est fourni et suffit a l'authentification
    - npm config set -- '//gitlab.com/api/v4/packages/npm/:_authToken' "${CI_JOB_TOKEN}"

    # Publication
    - npm publish

  # Nous conseillons de ne pas trigger la publication a chaque CI, ici la règle demande si le tag existe, restreignant ainsi la publication au tag  
  rules:
    - if: $CI_COMMIT_TAG

3. Déploiement sur NPMJS

Enfin pour publier sur NPMJS ce paquet scoped (suivant le nom du paquet dans le package.json), la logique est la même, seule la configuration change :

publish_npm:
  stage: deploy
  needs:
    - job: build
      artifacts: true
  dependencies:
    - build
  script:
    # Configuration pour la publication sur NPMJS, NPM_TOKEN est le token NPM de type automation généré plus tôt et ajouté aux variables d'environnement de votre CI Gitlab
    - npm config set -- '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}"

    # Etant donné que le paquet est scope, il est nécessaire de spécifier le fait qu'il est public
    - npm publish --access public
  rules:
    - if: $CI_COMMIT_TAG

Résumé .gitlab-ci.yml :

image: node:lts-alpine

stages:
  - test
  - build
  - deploy

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

before_script:
  - npm install

# Vos étapes de tests...

build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist

publish_gitlab_registry:
  stage: deploy
  needs:
    - job: build
      artifacts: true
  dependencies:
    - build
  script:
    - npm config set ${ORANIZATION}:registry https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/
    - npm config set -- '//gitlab.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken' "${CI_JOB_TOKEN}"
    - npm config set -- '//gitlab.com/api/v4/packages/npm/:_authToken' "${CI_JOB_TOKEN}"
    - npm publish
  rules:
    - if: $CI_COMMIT_TAG

publish_npm:
  stage: deploy
  needs:
    - job: build
      artifacts: true
  dependencies:
    - build
  script:
    - npm config set -- '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}"
    - npm publish --access public
  rules:
    - if: $CI_COMMIT_TAG

4. La suite

4.1. NPMJS

La publication sur NPMJS vous notifiera par mail, vous pourrez ensuite utiliser le paquet depuis n’importe quel projet en l’installant comme n’importe quelle autre dépendance :

npm install @myscope/mypackage

⚠️ Il est impossible de publier plusieurs fois le même paquet avec la même version, pensez donc à bump la version dans le package.json à chaque publication️

Vous pouvez aussi gérer votre paquet depuis votre compte NPMJS.

4.2. Gitlab registry

Vous retrouverez votre paquet dans le repository de votre projet dans Packages & Registries -> Package Registry

Il vous suffira de paramétrer votre authentification au registry selon votre préférence. J’utilise personnellement un personnal access token avec un scope api. Une fois authentifié, vous pouvez installer votre paquet comme n’importe quelle autre dépendance :

npm install @myscope/mypackage

Tout devrait fonctionner pour peu que votre paquet soit fonctionnel !

]]>
https://qongzi.com/publication-dun-paquet-npm-depuis-une-ci-gitlab/feed/ 0
Appréhender les enjeux de l’accessibilité numérique au sein des équipes de conception https://qongzi.com/apprehender-les-enjeux-de-laccessibilite-numerique-au-sein-des-equipes-de-conception/ https://qongzi.com/apprehender-les-enjeux-de-laccessibilite-numerique-au-sein-des-equipes-de-conception/#respond Tue, 30 Nov 2021 14:31:00 +0000 https://wp.qongzi.dev/?p=1584 À l’occasion des nouvelles recommandations WCAG 2.2 (encore à l’état de draft) présentées par la WC3, on revient sur la nécessité d’intégrer l’accessibilité dans sa démarche de conception et de réflexion en incluant toutes les parties prenantes dès le début des projets.

Qu’est-ce que l’accessibilité numérique ?

Tout d’abord, il convient de revenir sur certains éléments de contexte.

L’accessibilité numérique a pour objectif de rendre les outils numériques librement accessibles et perceptibles par les personnes en situation de handicap et plus généralement par tous les utilisateurs, quel que soit leur environnement (support numérique, localisation géographique, langue, culture, infrastructure réseau, etc.).

Nous pouvons distinguer plusieurs formes de handicaps :

  • Les handicaps visuels : il s’agit des personnes aveugles (ou non-voyants) et personnes malvoyantes. Ces handicaps imposent de proposer certaines solutions comme l’aide vocale, l’amélioration des contrastes ou encore la taille de la police de caractère.
  • Les handicaps auditifs : il s’agit des personnes atteintes de surdité et personnes malentendantes. Par exemple, lors de la lecture d’un contenu vidéo, il convient de proposer des sous-titrages.
  • Les handicaps moteurs : certains handicaps moteurs ne permettent pas d’utiliser un clavier ou même une souris. La navigation doit être facilitée en proposant des parcours moins complexes.
  • Les handicaps mentaux et cognitifs :ces personnes peuvent être atteintes de troubles de la mémoire ou de la concentration. L’objectif est de proposer des parcours utilisateurs là aussi moins complexes et de permettre aux utilisateurs de réaliser des actions de manière autonome (saisie de formulaire par exemple).
  • Les troubles de santé invalidants.
  • Les handicaps temporaires : chaque individu, au cours de sa vie peut se retrouver handicapé, qu’il puisse s’agir d’un bras cassé ou de lunettes égarées.
  • Les personnes âgées : avec une population de plus en plus vieillissante, il devient important de lutter contre l’isolement des seniors.

Au travers de ces différents profils de handicaps, on comprend que l’accessibilité numérique n’est pas un sujet anecdotique, mais qu’il touche un large panel d’utilisateurs. Il s’agit bien de permettre à chaque utilisateur de rester autonome et de pallier leur possible exclusion sociale que cela peut générer.

1. Les recommandations du W3C

L’organisme W3C (World Wide Web Consortium) a lancé le Web Accessibility Initiative (WAI) en 1997. Cette initiative a vu naître une série de directives et de recommandations permettant de concevoir des outils numériques plus accessibles qui correspondent, depuis le 5 juin 2018, aux WCAG 2.1 (Web Content Accessibility Guidelines).

Une version des WCAG 2.2, qui actuellement sont à l’état de « working draft » succédera à la version précédente en 2021. Il est d’ores et déjà possible de parcourir les nouveaux critères de conformités. Parmi eux on retrouve l’authentification dont l’objectif est de faciliter tout le processus de connexion pour les personnes ayant des difficultés cognitives liées à la mémoire, ou encore les mouvements de glissement (dragging) qui a pour but d’offrir une nouvelle alternative au drag and drop en effectuant cette action par un simple clic (sans prendre en compte une trajectoire précise), notamment pour les utilisateurs atteints de handicaps moteurs et qui ne peuvent pas réaliser d’action ayant cette exigence de finesse de précision.

Les WCAG ont défini trois niveaux de conformité. Ainsile niveau A correspond au niveau d’accessibilité minimale, le niveau double A (AA) au niveau d’accessibilité améliorée et le niveau triple A (AAA) au niveau d’accessibilité optimisée, adapté à certains contextes particuliers.

2. Le RGAA

En France, la DINUM (Direction Interministérielle du Numérique) a mis en place le RGAA (Référentiel Général d’Amélioration de l’Accessibilité) qui découle de l’obligation d’accessibilité des outils numériques. La version actuellement en vigueur est la version 4.1 qui a été mise à jour en février 2021 et qui s’appuie sur les recommandations du WAI.

Concernant les critères d’accessibilité, le RGAA impose de respecter au minimum le niveau double A (AA).

L’objectif des recommandations d’accessibilité est de rendre les outils numériques :

  • Perceptibles : proposer un contenu visible ou audible de manière équivalente en termes de contenu et de structure d’information
  • Utilisables : faciliter la navigation au clavier, permettre de laisser du temps à l’utilisateur pour consulter les éléments textuels et ne pas concevoir d’outils susceptibles de créer des crises d’épilepsie
  • Compréhensibles : créer des parcours utilisateurs cohérents et homogènes tout en laissant la possibilité de corriger ses actions et de permettre de bien identifier les actions potentiellement irréversibles
  • Robustes : les rendre compatibles aux utilisations actuelles et futuresLe portail numerique.gouv.fr met à disposition de la documentation comprenant un kit d’audit, une méthodologie de test ainsi que le RGAA au format .pdf.

L’accessibilité numérique, un véritable enjeu social

Lorsqu’on aborde le sujet de l’accessibilité numérique, il est intéressant de le mettre en corrélation avec l’inclusive design et le care design.

En 2005, le British Standards Institute définit l’inclusive design comme étant :

‘ The design of mainstream products and/or services that are accessible to, and usable by, as many people as reasonably possible without the need for special adaptation or specialised design.’

‘La conception de produits et/ou services grand public qui sont accessibles et utilisables par autant de personnes que possible sans nécessiter d’adaptation spéciale ou de conception spécialisée.’

L’accessibilité numérique qualifie un produit/service alors que l’inclusive design se réfère plutôt à une méthodologie. L’accessibilité numérique est donc un attribut constitutif de l’inclusive design, qui lui considère les déficiences comme une opportunité de mieux concevoir et qui participe à l’amélioration des solutions numériques.

Le care design quant à lui, s’intéresse au bien-être social et environnemental des utilisateurs les plus vulnérables. Il s’applique à appréhender les individus et leur environnement avec une vision bienveillante et de prendre soin.

Les propos de Cynthia Fleury, philosophe et psychanalyste française, illustrent bien les enjeux d’inclusion par la conception.

« Il faut se soucier de rendre “capacitaires” les individus, c’est-à-dire de leur redonner aptitude et souveraineté dans ce qu’ils sont ; comprendre que la vulnérabilité est liée à l’autonomie, qu’elle la densifie, qu’elle la rend viable, humaine ; travailler à faire que cette vulnérabilité soit pour autant la moins irréversible possible. »

Cynthia Fleury. Le soin est un humanisme, 2019.

Cynthia Fleury décrit bien ce souci de redonner ses capacités à tous les individus, sans distinction pour permettre un retour à l’autonomie.

L’accessibilité numérique est un paramètre non négligeable permettant de converger vers une conception plus responsable et c’est en cela qu’elle devient un véritable enjeu sociétal.

Tim Berners-Lee, le créateur du World Wide Web Consortium (W3C), a bien compris cela et souligne le fait que le web est plus une invention sociale que technologique. Le web doit alors devenir un lieu d’échange et de construction, une sorte de tissu social où chaque individu à sa place.

‘The Web is more a social creation than a technical one. I designed it for a social effect – to help people work together – and not as a technical toy. The ultimate goal of the Web is to support and improve our weblike existence in the world. We clump into families, associations, and companies. We develop trust across the miles and distrust around the corner. What we believe, endorse, agree with, and depend on is representable and, increasingly, represented on the Web. We all have to ensure that the society we build with the Web is of the sort we intend.’

Tim Berners-Lee, Mark Fischetti. Weaving the Web: The original design and ultimate destiny of the World Wide Web by its inventor, 1999.

En plus d’être un enjeu sociétal, l’accessibilité numérique devient un enjeu stratégique majeur pour les entreprises et permet de faire évoluer leur rapport à leurs utilisateurs, mais aussi leur manière de se développer et de mieux se démarquer.

On peut identifier trois enjeux majeurs :

• La confiance

Proposer des outils plus inclusifs aux utilisateurs permet de garantir une meilleure adhésion et une meilleure visibilité de l’entreprise.

• La formation

Proposer des formations approfondies sur les enjeux de l’accessibilité est nécessaire pour tous les concepteurs : designers, chefs de projet, rédacteurs, etc. Il existe aujourd’hui divers outils et diverses ressources permettant d’appréhender l’accessibilité numérique.

• L’innovation

Les assistants vocaux ou encore la synthèse vocale intégrée par Google ou encore Apple sont directement issus de réflexions liées aux contraintes d’accessibilité.

Cette nouvelle manière de concevoir et d’appréhender ce sujet peut alors se muer en opportunité. En plus de modifier le rapport entre l’utilisateur et les outils numériques, parler d’accessibilité et des notions s’y référant modifie le rapport qu’a le concepteur à son métier.

Accompagner tous les acteurs du projet

Lors de la constitution d’une équipe projet pour la réalisation d’un outil ou d’un service, il peut être pertinent d’intégrer un référent accessibilité numérique et si les ressources ne le permettent pas, de nommer un acteur référent ayant une forte appétence sur le sujet (product owner ou encore UX designer).

Le rôle du référent est de modéliser la stratégie d’accessibilité du projet, de piloter et d’animer la politique d’accessibilité, d’acculturer les divers acteurs du projet, de proposer des outils et des ressources aux différents experts métiers et de s’assurer que les critères d’accessibilité sont bien respectés.

1. La recherche et les tests utilisateur

En premier lieu, lors de la phase de cadrage du projet, il est primordial de construire une proposition de valeur en adéquation avec les besoins et les contraintes des utilisateurs. Ici, notre objectif n’est pas de décrire la phase de recherche ou de définition du besoin ou les outils s’y référant, mais de comprendre que ceux-ci sont voués à être adaptés en fonction des typologies de handicap que l’on va intégrer dans notre panel d’utilisateurs.

Il faut alors identifier nos différents profils d’utilisateurs tout en incluant des utilisateurs ayant diverses typologies de handicap. La modélisation de personas décrivant les capacités, les aptitudes, les contraintes dues au handicap (visuel, moteur, mental, etc.) permettra de réfléchir aux solutions à mettre en place pour concevoir un produit accessible et utilisable par tous.

Le Good Design Playbook, un guide des bonnes pratiques crée par le groupe SEB et en partenariat avec APF France handicap, propose plusieurs outils et une méthode de conception de produits/services accessibles s’inscrivant dans une démarche de design inclusif. On retrouve diverses ressources, fiches pratiques, outils et conseils sur la manière de concevoir un produit. On peut citer la roue d’accessibilité qui détaille les critères d’accessibilité selon les handicaps, la fiche de conseil permettant d’animer des ateliers accessibles à tous ou encore des outils d’évaluation des scénarios d’usage adaptés.

Lors de la conception d’un produit ou d’un service, la hiérarchisation de l’information va directement influencer les parcours utilisateurs. La modélisation de ces parcours va donc être déterminante dans l’appréhension du produit numérique par l’utilisateur atteint de handicap. Au-delà de la conception des interfaces, que l’on verra plus loin, l’expérience utilisateur dépend donc directement des scénarios d’usage que l’on aura défini. Chaque action réalisée par l’utilisateur est dépendante d’un contexte et d’un environnement général et ne sont pas décorrélées les unes des autres. Il est donc nécessaire d’avoir une vision globale du handicap, de ses contraintes, de ses particularités et de son évolution avant de pouvoir créer ses parcours (par exemple un processus de paiement en ligne ou de saisie d’un formulaire pensé pour les personnes atteintes de troubles de l’attention ne sera pas construit de la même manière).

2. La conception des interfaces

Après avoir souligné l’importance de l’appréhension de l’accessibilité dès la phase de recherche et de conception de l’expérience utilisateur (UX design), il s’agira d’implémenter ces réflexions dans la phase de conception de l’interface (UI design).

Concrètement le designer dispose de plusieurs outils permettant de mettre en place les bonnes pratiques lui permettant d’optimiser ses interfaces en fonction des critères d’accessibilité relevant de son domaine d’expertise.

•   L’informationImage8

– Proposer une structure de page cohérente et utilisation cohérente des titres et sous-titres de page

– Fournir des titres de pages compréhensibles et explicites

Nous pouvons ici parler de l’importance de l’UX writting qui permet d’offrir un contenu pertinent et adapté aux besoins de tous les utilisateurs. Le choix des mots est indispensable, notamment lorsqu’il s’agit de messages d’erreurs ou encore des boutons d’action.

•   La navigation

– Proposer une alternative de navigation par le clavier, avec l’aide focus qui permet à l’utilisateur de se situer sur la page

– La navigation par le clavier ne doit pas contenir de piège avec un ordre de tabulation pertinent

– Proposer une page « Plan du site » pertinente et permettant à l’utilisateur de naviguer facilement

– Le menu, la barre de recherche et la barre de navigation doivent se situer au même endroit sur toutes les pagesImage7

•   Images, couleurs et contrastes

– Les images délivrant une information doivent avoir une alternative textuelle, et si besoin être explicitement compréhensibles,

– La couleur ne doit pas être le seul élément délivrant l’information, mais doit être enrichie par un élément graphique (pictogramme, texte, texture, etc.).Image6

– Le contraste entre une image et un élément textuel doit être suffisamment élevé pour le rendre lisible,

– Le contraste entre les différentes couleurs doit être assez élevé.

Divers outils existent sur le marché afin de pouvoir contrôler le niveau de contraste entre les couleurs et divers éléments. Nous pouvons citer Stark, un plug-in utilisable sur Adobe XD, Sketch, Figma ou même Chrome. Il permet également de simuler les différentes formes de daltonisme et propose de nouvelles teintes si celles-ci ne répondent pas aux normes.Image5gif ffdt

•   Typographie

La typographie utilisée est également un paramètre à prendre en compte dans la réalisation des interfaces, puisqu’elle est un des vecteurs principaux d’information.

Concernant la taille de police caractère, il n’existe aucun critère obligatoire, mais l’utilisateur doit pouvoir augmenter la taille du texte de 200 % sans qu’il n’y une perte de contenu. Il est tout de même important d’utiliser une taille d’écriture confortable avec un interlignage adapté.

Nous pourrons alors citer la police de caractère Accessible DfA (Design for All), créée par Denis Chêne, Ergonome et responsable de projet accessibilité chez Orange, qui a pour objectif de pallier les difficultés de lecture des dyslexiques et qui améliore la lisibilité des caractères tout en les rendant difficiles à confondre.

La police d’écriture Luciole a été créée spécialement pour les personnes malvoyantes en collaboration avec le Centre Technique Régional pour la Déficience Visuelle et le studio typographies.fr.Image3gif sncf

3. Le développement

Bien qu’étant designer UX et que le développement ne soit pas mon domaine d’expertise, il me parait tout de même essentiel d’aborder celui-ci puisqu’il joue un rôle tout aussi indispensable dans la conception du produit.

Une fois que le prototype et les interfaces ont été testés puis validés par les utilisateurs finaux, le produit rentre en phase de développement.

Plusieurs sites internet mettent à disposition des tutoriels, outils et ressources visant à respecter les bonnes pratiques dans le développement de sites web ou d’applications permettant de répondre aux normes d’accessibilité.

Les documentations mettent l’accent sur l’importance du HTML sémantique, qui permet d’obtenir un code mieux structuré, plus compréhensible et plus aisé à rendre responsive. Le SEO se voit lui aussi amélioré puisque l’utilisation des balises sémantiques (qui utilise des mots clés) permet d’obtenir un meilleur référencement par les moteurs de recherche.

Pour aborder les bases sur l’accessibilité numérique dans le développement je vous redirige vers MDN Web Docs.

En conclusion

Après être rapidement revenus sur les différentes recommandations et critères d’accessibilité formulés par le W3C, nous avons essayé de mieux comprendre les enjeux que soulève l’appréhension de l’accessibilité au sein des équipes de conception.

L’accessibilité numérique ne doit pas être un simple attribut, mais une ligne conductrice et un paramètre essentiel de la recherche utilisateur jusqu’au développement du produit. Chaque domaine œuvrant pour la conception doit donc être (re) sensibiliser et accompagner, grâce à la formation par exemple.

Proposer des outils accessibles à tous est un enjeu social important qui rentre dans une démarche de conception plus inclusive, éthique et devient même une opportunité pour l’innovation.

Sources et liens

]]>
https://qongzi.com/apprehender-les-enjeux-de-laccessibilite-numerique-au-sein-des-equipes-de-conception/feed/ 0
[Tuto] oAuth2.0 via Keycloak pour une application NuxtJS et son API https://qongzi.com/tuto-oauth2-0-via-keycloak-pour-une-application-nuxtjs-et-son-api/ https://qongzi.com/tuto-oauth2-0-via-keycloak-pour-une-application-nuxtjs-et-son-api/#respond Tue, 05 Oct 2021 14:28:00 +0000 https://wp.qongzi.dev/?p=1581 Enjeu

Nous avons une application web en interface avec une API. L’objectif est de mettre en place une authentification côté application web suivant le workflow oAuth2.0 de type Authorization Code tout en restreignant l’accès à l’API grâce aux jetons générés par le serveur d’authentification.

Stack

L’application web est basée sur le framework NuxtJS 2, nous utilisons le module Nuxt/auth dans sa version next pour gérer le flow d’authentification.

L’API est en NodeJS et utilise le framework KoaJS, le petit frère d’ExpressJS. Nous utilisons Typescript pour profiter un maximum des fonctionnalités de l’ORM Prisma pour l’interaction avec la base de données en PostgreSQL. Les extraits de code comprendront donc cette couche mais vous pourrez tout à fait les réutiliser sans Typescript et avec l’ORM/ODM de votre choix. Vous vous y retrouverez également facilement si votre API est basée sur ExpressJS.

Le serveur d’authentification est Keycloak, une solution open source de gestion des différents workflows de gestion d’accès.

1. Le workflow

1.1. Le standard

Nous souhaitons coller au plus proche de la RFC 6749 et du type de workflow Authorization Code. Cette méthode garantit de ne pas manipuler de données critiques au sein de nos applications via l’utilisation d’un code débloquant la génération du token.

1.2. Notre cas

Dans notre cas, il serait tout à fait possible de gérer le workflow uniquement depuis NuxtJS de façon très simple grâce au module nuxt/auth :

// nuxt.config.js

const KEYCLOAK_BASE_URL = `${VOTRE_HOST_KEYCLOAK}/auth/realms/${VOTRE_REALM_KEYCLOAK}/protocol/openid-connect`;


export default {
    // Votre config nuxt...
    
    modules: [
    	// vos modules...,
        '@nuxtjs/auth-next',
    ],
    
    auth: {
        strategies: {
            keycloak: {
                scheme: 'oauth2', 
                endpoints: {
                  authorization: `${KEYCLOACK_BASE_URL}/auth`,
                  token: `${KEYCLOACK_BASE_URL}/token`,
                  userInfo: `${KEYCLOACK_BASE_URL}/auth/me`,
                  logout: `${KEYCLOACK_BASE_URL}/logout`,
                },
                token: {
                  property: 'access_token',
                  type: 'Bearer',
                  name: 'Authorization',
                  maxAge: ACCESS_TOKEN_MAX_AGE || 15,
                },
                refreshToken: {
                  property: 'refresh_token',
                  maxAge: REFRESH_TOKEN_MAX_AGE || 60 * 60 * 24 * 30,
                },
                responseType: 'code',
                grantType: 'authorization_code',
                clientId: VOTRE_KEYCLOAK_CLIENT_ID,
                scope: ['openid', 'profile', 'email'],
                codeChallengeMethod: 'S256',
        	},
		},
  	},
}

⚠️ Pas de panique, nous reviendrons sur les différentes configurations au gré de l’article !

Toutefois, l’enjeu est de s’authentifier côté application web pour contrôler l’accès à notre API. Pour cela nous avons choisi d’utiliser la librairie openid-client qui permet d’interagir depuis le backend avec le serveur d’autorisation (Keycloak).

Ce besoin ajoute quelques contraintes :

  • La validation du token côté API se fait via la méthode introspectqui n’est pas utilisable si l’accès au client Keycloak est public, il faut que celui-ci soit confidentiel et donc accessible grâce à un secret qu’il fournit
  • L’émission du jeton n’est pas possible sans ce secret et ce n’est pas du tout une bonne pratique de le manipuler côté application web

Il est donc nécessaire de gérer l’ensemble du workflow via l’API qui va elle instancier un client openid avec le secret de façon sécurisée.

Nous nous retrouvons avec ce type de workflow :article schema 2 1

2. Configuration

Nous vous présentons une configuration pour tester en local avec l’application NuxtJS et l’API tournant respectivement sur les ports 3000 et 1337 (sur http://localhost) et un conteneur Docker pour Keycloak exposé sur le port 8080.

2.1. Keycloak

Commencez par créer le conteneur Keycloak :

docker run --name keycloack -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -d quay.io/keycloak/keycloak:15.0.2\

Étant donné que nous sommes en local, nous utilisons un accès peu sécurisé avec l’utilisateur et le mot de passe admin. Pour le reste de la commande :

  • –name keycloak : Facultatif, donne un nom au conteneur
  • -p 8080:8080 : Map le port du conteneur sur le port 8080 de votre machine
  • -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin : L’utilisateur administrateur et son mot de passe
  • -d : Exécuter le conteneur en mode détaché pour qu’il tourne en tâche de fond
  • quay.io/keycloak/keycloak:15.0.2\ : L’image Docker Keycloak

Une fois le conteneur lancé, vous pouvez y accéder depuis votre navigateur : http://localhost:8080/auth/

Pour vous connecter à l’interface administrateur, cliquez sur la tuile Administration Console et rentrez vos identifiants.

Je ne vais ensuite pas détailler la configuration du realm et du client, car tout cela est déjà très bien détaillé dans la documentation officielle.

⚠️ Dans la configuration de votre client, n’oubliez pas de mettre le type d’accès en confidentiel

2.2. L’ API

Nous n’allons pas reprendre toute la configuration d’une API NodeJS/KoaJS ici, les extraits de code suivant partent du principe que :

  • Votre serveur et votre application sont initialisés avec les variables d’environnement disponible
  • Vous avez une connexion à votre base de données
  • Vous avez des routes vers vos différents contrôleurs (users, posts, …)

Pour ma part nous avons un objet config contenant toutes les variables d’environnement nécessaires au fonctionnement de l’API, sa configuration se fait dans le fichier env.ts du dossier config :

import { config as loadDotEnv } from 'dotenv';

loadDotEnv({ path: '.env' }); // A mettre à jour selon votre chemin vers le fichier .env

export interface Config {
  version: string;
  port: number;
  host: string;
  logLevel: string;
  keycloakHost: string;
  keycloakRealm: string;
  keycloakClientId: string;
  keycloakClientSecret: string;
}

const {
  VERSION,
  PORT,
  HOST,
  LOG_LEVEL,
  KEYCLOAK_HOST,
  KEYCLOAK_REALM,
  KEYCLOAK_CLIENT_ID,
  KEYCLOAK_CLIENT_SECRET,
} = process.env;

const config: Config = {
  version: VERSION || 'Dummy version',
  port: +(PORT || 1337),
  host: HOST || 'http://localhost',
  logLevel: LOG_LEVEL || 'info',
  keycloakHost: KEYCLOAK_HOST || 'http://localhost:8080',
  keycloakRealm: KEYCLOAK_REALM || 'master',
  keycloakClientId: KEYCLOAK_CLIENT_ID || 'some dummy client id',
  keycloakClientSecret: KEYCLOAK_CLIENT_SECRET || 'some dummy secret',
};

export default config;

2.2.1. Initialiser le client openid

Le client openid est configuré dans le fichier openId.ts du dossier config :

import { Client, Issuer } from 'openid-client';

// Nous utilisons des alias pour les chemins relatifs a l'API
import config from '@config/env';

// Cette constante sera réutilisée dans un contrôleur
export const OPEN_ID_REALM_URL = `${config.keycloakHost}/auth/realms/${config.keycloakRealm}`;

// On initialise la variable qui sera réassignée au lancement du serveur
let issuer: Issuer<Client>;

// Fonction qui initialise l'issuer au lancement du serveur
const initOpenIdIssuer = async (): Promise<void> => {
  issuer = await Issuer.discover(OPEN_ID_REALM_URL);
};

// Fonction qui permet de récupérer le client openid parametré avec l'id et le secret dans l'API
export const getOpenIdClient = (): Client =>
  new issuer.Client({
    client_id: config.keycloakClientId,
    client_secret: config.keycloakClientSecret,
  });

export default initOpenIdIssuer;

L’initialisation se fait au lancement du serveur, de notre côté nous le faisons dans une IIFE :

import { createServer } from 'http';

import initApp from '@config/app';
import config from '@config/env';
import initOpenIdIssuer from '@config/openId';

(async () => {
  // Initialisation de l'issuer
  await initOpenIdIssuer();

  // Initialisation de l'application KoaJS et du serveur HTTP
  const app = initApp();
  const server = createServer(app.callback());

  // Lancement du serveur
  server.listen(config.port);
})();

2.2.2. Création des routes

Vous adapterez la logique à votre architecture. Pour notre exemple nous avons les routes et les contrôleurs dans un dossier api/namespace, pour l’authentification nous travaillons dans api/auth :

src/api/auth
 ├── controllers
 │  └── index.ts
 ├── routes.ts
 └── tools
    └── index.ts

Nos routes sont simplement configurées dans le fichier routes.ts, un middleware ajoutant toutes les routes de l’API est implémenté dans le paramétrage de l’application.

Pour notre workflow d’authentification nous avons besoin de trois routes : auth (GET /auth) pour la redirection vers le formulaire du serveur Keycloak, token (POST /auth/token) pour la génération du token et son rafraichissement, me (GET /auth/me) pour récupérer les informations utilisateurs :

import { Middleware } from 'koa';

import controllers from '@api/auth/controllers';

interface Route {
  method: 'get' | 'post' | 'patch' | 'delete';
  path: string;
  handler: Middleware;
  middlewares?: Middleware[];
}

interface RouteDefinition {
  prefix: string;
  routes: Route[];
}

const authRoutes: RouteDefinition = {
  prefix: '/auth',
  routes: [
    {
      method: 'get',
      path: '/',
      handler: controllers.redirectToOpenIdAuth,
    },
    {
      method: 'post',
      path: '/token',
      handler: controllers.generateToken,
    },
    {
      method: 'get',
      path: '/me',
      handler: controllers.me,
    },
  ],
};

export default authRoutes;

Et le typage du contrôleur :

import { Middleware } from 'koa';

interface AuthController {
  redirectToOpenIdAuth: Middleware;
  generateToken: Middleware;
  me: Middleware;
}

2.2.4. Redirection vers le formulaire d’authentification

Le rôle de ce contrôleur (de la route /auth) est de réceptionner la requête provenant de l’application web au clic sur le bouton “Se connecter” pour rediriger le client vers la page d’authentification du serveur Keycloak.

La requête en GET fourni des paramètres nécessaires a la redirection :

  • L’id du client Keycloak
  • Le type de réponse attendu, dans notre cas il s’agit de code (cf. la configuration NuxtJS ci-dessous)
  • L’URI de redirection une fois l’authentification valide côté Keycloak (vers l’application web)
  • Le state est une chaine de caractères random qui sert à la vérification du call pour se protéger des attaques XSS
async redirectToOpenIdAuth(ctx) {
    const neededParams = ['client_id', 'response_type', 'state', 'redirect_uri'];

	// Reduce qui permet le formattage et le filtrage des query params
    const queryParams = Object.entries(ctx.request.query).reduce(
      (acc, [key, value]) => (neededParams.includes(key) ? `${acc}&${key}=${value}` : acc),
      ''
    );

	// URI de redirection basee sur la variable definie precedemment
    const redirectUri = `${OPEN_ID_REALM_URL}/protocol/openid-connect/auth?${queryParams}`;

	// Redirection en reponse
    ctx.redirect(redirectUri);
},

Suite à quoi le client est redirigé vers la page d’authentification Keycloak. L’étape suivante se fait donc à la validation du formulaire qui va renvoyer vers l’application web qui va elle directement requêter la route (configurée dans nuxt.config.js comme nous le verrons après) pour récupérer le jeton grâce à l’authorization code /auth/token.

2.2.5. Génération du token

Nous allons commencer par présenter le contrôleur dans sa version la plus simple, sans la gestion du refresh token. Nous avons fait le choix de séparer la logique liée au client openid dans un fichier outil pour clarifier le code dans le contrôleur.

La logique dans ce contrôleur est la suivante :

  • Vérifier le type de grant
  • Générer le token
  • Valider le token
  • Renvoyer le token en réponse

⚠️ Les nombreuses conditions font office de type guards étant donné que Typescript ne considère pas le ctx.throw comme une fin de script

  async generateToken(ctx) {
    const { body } = ctx.request;
    const { grant_type } = body;

	// Initialisation du tokenSet
    let tokenSet: TokenSet | null = null;

	// Generation du token si le grant type est bon
    if (grant_type === 'authorization_code') {
      tokenSet = await generateToken(body);
    }

	// Levee d'une exception si pas de token
    if (!tokenSet || !tokenSet.access_token) {
    
      // Revocation du token au cas ou il manque l'access token dans le set
      if (tokenSet) {
        await revokeTokenSet(tokenSet);
      }
      ctx.throw(400);
    } else {
    
      // Validation du token pour voir si l'utilisateur existe aussi dans la base de donnees metier
      const isTokenValid = await validateToken(tokenSet.access_token);


	  // Si l'utilisateur existe en base, on renvoie le token, sinon on leve une exception apres avoir revoke le set de token
      if (isTokenValid) {
        ctx.body = tokenSet;
      } else {
        await revokeTokenSet(tokenSet);
        ctx.throw(400);
      }
    }
  },

Les outils utilisés ici sont simples :

type GenerateToken = (args: {
  code: string;
  redirect_uri: string;
  grant_type: 'authorization_code';
}) => Promise<TokenSet>;

export const generateToken: GenerateToken = ({ code, redirect_uri, grant_type }) =>
  getOpenIdClient().grant({
    grant_type,
    code,
    redirect_uri,
  });
type ValidateToken = (token: string) => Promise<boolean>;

export const validateToken: ValidateToken = async (token) => {
  const decodedToken = decode(token);

  if (!decodedToken || typeof decodedToken === 'string') {
    return false;
  }

  const { email } = decodedToken;
  const user = await userService.findUnique({ where: { email } });

  return !!user;
};
type RevokeTokenSet = (tokenSet: TokenSet) => Promise<void>;

export const revokeTokenSet: RevokeTokenSet = async (tokenSet: TokenSet) => {
  const { access_token, refresh_token } = tokenSet;
  const openIdClient = getOpenIdClient();
  if (access_token) {
    await openIdClient.revoke(access_token);
  }

  if (refresh_token) {
    await openIdClient.revoke(refresh_token);
  }
};

Le set de token est renvoyé à l’application web, comprenant l’access token et le refresh token. La suite du workflow est la récupération des données utilisateurs sur la route /auth/me configurée dans le nuxt.config.js.

2.2.6. Récupération des informations utilisateurs

Cette route est protégée, nous allons voir après comment assurer la protection de l’API. L’accès est paramétré selon la présence d’un token Keycloak valide ou non sur l’ensemble des routes de l’API, excepté les routes /auth et /auth/token décrites plus haut.

Le contrôleur a pour rôle de retrouver l’utilisateur correspondant au token en base de données pour retourner le profil utilisateur qui sera stocké dans le state de notre application dans la variable $auth.user.

⚠️ On passe par le middleware openid sur cette route, son rôle est de checker la validité du token et de peupler la propriété state du context Koa avec les données utilisateurs

  async me(ctx) {
  	// On recupere l'utilisateur stocké dans le state par le middleware
    const { user } = ctx.state;

	// Si pas d'utilisateur on lève une exception
    if (!user) {
      ctx.throw(404, 'Not found');
    }

	// Sinon on renvoie l'utilisateur en réponse
    ctx.body = user;
  },

2.2.7. Le middleware openid

Il est le gardien de l’API, toutes les requêtes passent par lui. Son rôle est de :

  • Laisser passer les requêtes vers /auth et /auth/token
  • Vérifier la validité du token pour toutes les autres routes
  • Peupler le state du contexte Koa avec les données utilisateurs si le token est valide
  • Renvoyer une erreur 403 si le token est invalide
import { Middleware } from 'koa';

import { getOpenIdClient } from '@config/openId';
import userService from '@api/user/service';

const openIdMiddleware: () => Middleware = () => async (ctx, next) => {
  // On recupere le header authorization contenant le token et l'URL sans les query parametres
  const { authorization } = ctx.headers;
  const [baseUrl] = ctx.url.split('?');

  // On check si la route est whiteliste ou non
  if (!isRouteAuthorized(baseUrl)) {
  
    // Si ce n'est pas le cas et qu'il n'y a pas de token, on leve une exception 403
    if (!authorization) {
      ctx.throw(403, 'Unauthorized');
    } else {
    
      // Sinon on recupere le token, on verifie sa validite et on recupere l'email utilisateur
      const token = getToken(authorization);
      const { active, email } = await getOpenIdClient().introspect(token, 'access_token');

	  // Si le token n'est pas actif ou si le mail n'existe pas, on leve une 403      
      if (!active || !email || typeof email !== 'string') {
        ctx.throw(403, 'Unauthorized');
      } else {
      
      	// Sinon on verifie que l'utilisateur soit bien existant cote metier
        const user = await userService.findUnique({ where: { email }, include: { roles: true } });

		// Si ce n'est pas le cas, on leve une 403, sinon on complete le state du contexte avec l'utilisateur
        if (!user) {
          ctx.throw(403, 'Unauthorized');
        } else {
          ctx.state.user = user;
        }
      }
    }
  }

  // Standard pour un middleware KoaJS
  await next();
};

// Les routes whitelistees
const isRouteAuthorized = (url: string): RegExpMatchArray | null =>
  url.match(/^\/auth$/) || url.match(/^\/auth\/token$/);

const getToken = (authorizationHeader: string): string => authorizationHeader.split(' ')[1];

export default openIdMiddleware;

On va ensuite l’importer et l’initialiser dans la chaine de middleware de l’API, nous avons pour ça un fichier app.ts à la racine qui exporte la fonction initApp utilisée dans le fichier server.ts :

const initApp = (): Koa => {
  const app = new Koa();

  app.use(logger({ level: config.logLevel }));
  app.use(helmet());
  
  // Le middleware openid est apres helmet et avant les cors, cela evite d'aller trop loin dans la chaine si l'acces est refuse
  app.use(openIdMiddleware());
  
  app.use(cors());
  app.use(bodyParser());

  app.use(router.routes());
  app.use(router.allowedMethods());

  return app;
};

Pour le moment on en a terminé avec la configuration côté API, le gros morceau est passé car la configuration côté NuxtJS est très simple grâce au module nuxt/auth !

3. NuxtJS avec nuxt/auth

La première étape est d’installer le module, la documentation recommande d’utiliser une version précise pour  :

npm install --save-exact @nuxtjs/auth-next

⚠️ Il est nécessaire d’avoir installé le module @nuxtjs/axios également

Ensuite dans le fichier nuxt.config.js il faut ajouter le module à la liste de modules :

// nuxt.config.js

modules: [
	'@nuxtjs/axios',
	'@nuxtjs/auth-next',
],

Puis configurer le module via la propriété auth dans le même fichier

// nuxt.config.js

auth: {},

Cette configuration passe principalement par la définition de stratégies, nous allons définir une stratégie nommée keycloak :

auth: {
    strategies: {
      keycloak: {
        scheme: '~/config/authScheme',
      },
    },
  },

3.1. Le scheme custom

Vous avez remarqué ? Le scheme est custom :

import { Oauth2Scheme } from '@nuxtjs/auth-next/dist/runtime';

function encodeQuery(queryObject) {
  return Object.entries(queryObject)
    .reduce((acc, [key, value]) => {
      if (typeof value !== 'undefined') {
        acc.push(encodeURIComponent(key) + (value !== null ? '=' + encodeURIComponent(value) : ''));
      }

      return acc;
    }, [])
    .join('&');
}

export default class KeycloakScheme extends Oauth2Scheme {
  logout() {
    if (this.options.endpoints.logout) {
      const opts = {
        client_id: this.options.clientId + '',
        redirect_uri: this.logoutRedirectURI,
      };
      const url = this.options.endpoints.logout + '?' + encodeQuery(opts);
      window.location.replace(url);
    }

    return this.$auth.reset();
  }
}

Il s’agit d’une extension du scheme oAuth2 du module. Cette extension ne devrait pas être nécessaire mais à l’heure actuelle il existe une issue ouverte à cause d’un problème de redirection au logout. Cet override de la méthode logout est donc un fix temporaire. Rien n’entrave le flow par défaut il s’agit simplement d’un fix de la redirection. À terme, on pourra utiliser le scheme oAuth2 à la place.

3.2. Les endpoints

Les endpoints ne correspondent pas à la configuration précédemment décrite dans cet article car l’API va faire office de proxy entre notre application web et keycloak. Ainsi, les routes authorization, token et userInfo correspondent aux trois routes côté API. Le logout ne nécessite pas de proxy car une fois la session keycloak révoquée, l’utilisateur est déconnecté de l’application web et les jetons stockés sont révoqués et ne passeront donc plus le middleware openid de l’API.

auth: {
    strategies: {
      keycloak: {
        scheme: '~/config/authScheme',
      },
      endpoints: {
          authorization: `${API_URL}/auth`,
          token: `${API_URL}/auth/token`,
          userInfo: `${API_URL}/auth/me`,
          logout: `${KEYCLOACK_BASE_URL}/logout`,
      },
    },
  },

API_URL correspond à l’URL de base de l’API (e.g. http://localhost:1337).KEYCLOAK_BASE_URL prend cette structure :

const KEYCLOACK_BASE_URL = `${process.env.KEYCLOAK_REMOTE_HOST}/auth/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect`;

3.3. Les autres paramètres

Je vous laisse vous référerauxréférencesduscheme pour les autres paramètres. Il faut juste obligatoirement renseigné le clientId que vous trouverez dans Keycloak et la propriété scope qui est configuré comme cela :

scope: ['openid', 'profile', 'email'],

Il faut également paramétrer le responseType à la valeur code et,car nous utilisons un flow intégrant PKCE avec Keycloak, ajouter la propriété codeChallengeMethod a S256

3.4. Configuration complète

La configuration complète reprend des valeurs par défaut pour être explicite :

const KEYCLOACK_BASE_URL = `${process.env.KEYCLOAK_REMOTE_HOST}/auth/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect`;
const { ACCESS_TOKEN_MAX_AGE, REFRESH_TOKEN_MAX_AGE, KEYCLOAK_CLIENT_ID, API_URL } = process.env;

export default {
  telemetry: true,
    
  // Votre configuration NuxtJS...

  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/auth-next',
  ],

  router: {
    middleware: ['auth'],
  },

  axios: {
    baseURL: API_URL || 'http://localhost:1337',
  },

  auth: {
    redirect: {
      logout: '/login',
    },
    strategies: {
      keycloak: {
        scheme: '~/config/authScheme',
        endpoints: {
          authorization: `${API_URL}/auth`,
          token: `${API_URL}/auth/token`,
          userInfo: `${API_URL}/auth/me`,
          logout: `${KEYCLOACK_BASE_URL}/logout`,
        },
        token: {
          property: 'access_token',
          type: 'Bearer',
          name: 'Authorization',
          maxAge: ACCESS_TOKEN_MAX_AGE || 15,
        },
        refreshToken: {
          property: 'refresh_token',
          maxAge: REFRESH_TOKEN_MAX_AGE || 60 * 60 * 24 * 30,
        },
        responseType: 'code',
        grantType: 'authorization_code',
        clientId: KEYCLOAK_CLIENT_ID,
        scope: ['openid', 'profile', 'email'],
        codeChallengeMethod: 'S256',
      },
    },
  },
};

Le middleware auth fourni par le module est ajouté en tant que middleware global à toutes les routes, il fera ainsi son travail de redirection pour toutes les routes de notre application web. Ce fonctionnement peut être affiné en ajoutant le middleware au niveau des layouts ou au niveau des pages elles-mêmes.

Il ne manque plus que la dernière brique pour avoir un workflow complet : le refresh token !

En bonus : Le refresh token

Tout est déjà paramétré côté application web grâce au module nuxt qui utilise un scheme standard oAuth2.0. La seule chose à gérer est le double cas d’usage de la route token :

  • Dans le cas d’une première connexion suivant le type de grant Authorization code
  • Dans le cas d’un rafraichissement du token et donc du type de grant refresh token

Pour cela c’est assez simple, il suffit d’ajouter un traitement conditionnel selon le type de grant dans le contrôleur dédié :

async generateToken(ctx) {
    const { body } = ctx.request;
    const { grant_type } = body;

    let tokenSet: TokenSet | null = null;

	// On ajoute le traitement du refresh selon le type de grant
    if (grant_type === 'authorization_code') {
      tokenSet = await generateToken(body);
    } else if (grant_type === 'refresh_token') {
      tokenSet = await refreshToken(body);
    }

    if (!tokenSet || !tokenSet.access_token) {
      if (tokenSet) {
        await revokeTokenSet(tokenSet);
      }
      ctx.throw(400);
    } else {
      const isTokenValid = await validateToken(tokenSet.access_token);

      if (isTokenValid) {
        ctx.body = tokenSet;
      } else {
        await revokeTokenSet(tokenSet);
        ctx.throw(400);
      }
    }
  },

L’outil refresh token est très simple :

type RefreshToken = (args: {
  refresh_token: string;
  grant_type: 'refresh_token';
}) => Promise<TokenSet>;

export const refreshToken: RefreshToken = ({ refresh_token, grant_type }) =>
  getOpenIdClient().grant({
    grant_type,
    refresh_token,
  });

Grâce à cela, à chaque rafraichissement les deux tokens sont renouvelés, apportant ainsi un confort d’usage à l’utilisateur tout en garantissant une sécurité forte.

Le workflow oAuth2.0 de type Authorization Code est ainsi complet ! Les routes de l’API sont sécurisées grâce à son interfaçage avec Keycloak et la gestion du refresh token est automatique et transparente côté NuxtJS.

]]>
https://qongzi.com/tuto-oauth2-0-via-keycloak-pour-une-application-nuxtjs-et-son-api/feed/ 0
Affaire déclassée : une fuite mémoire dans e-Chauffeur https://qongzi.com/affaire-declassee-une-fuite-memoire-dans-e-chauffeur/ https://qongzi.com/affaire-declassee-une-fuite-memoire-dans-e-chauffeur/#respond Thu, 02 Sep 2021 14:12:09 +0000 https://wp.qongzi.dev/?p=1578 (NB : Précisons que les IP dans les screenshots ne sont plus actives… ou au moins plus chez nous, raison pour laquelle j’ai préféré l’esthétisme de screenshots non floutés)

Screenshot 2020 02 06 at 09.25.00

Qu’est-ce à dire ?

Parlons rapidement du projet : e-Chauffeur est une application de réservation de véhicule avec chauffeur, sans brique de paiement, à destination des personnels des Armées. (Plus d’informations sur sa fiche beta.gouv.fr). Son code est libre et disponible sur gitlab.com.

Pour rester très générique, une fuite mémoire résulte d’une accumulation de données dans la mémoire vive d’un ordinateur entrainant sa saturation. Je pense pouvoir affirmer que nous l’avons tous expérimenté au moins une fois sans savoir ce que c’était : Votre ordinateur se mets soudain à ralentir alors que vous l’utilisez, et relancer un logiciel ou l’ordinateur suffit à résoudre le problème… jusqu’à ce que cela recommence.

Dans le développement logiciel, un programme requête un espace mémoire auprès du système d’exploitation, afin d’y stocker une donnée. Ensuite, le programme doit libérer l’espace mémoire quand il n’en a plus besoin. A partir de là, plusieurs stratégies existent suivant les langages de programmation, citons en trois :

  • La gestion de cette mémoire est entièrement la responsabilité du développeur, à lui de savoir quand son programme n’a plus besoin de cette entrée mémoire. C’est le cas du C dit “vanilla“.
  • Le compilateur est responsable de savoir la durée de vie de ces données, et ajoute au code compilé les instructions pour nettoyer la mémoire. C’est le cas du Rust.
  • Le programme embarque un Garbage Collector (Collecteur de miettes en bon français). Son rôle est de vérifier régulièrement quelles variables ne sont plus utilisées, pour les libérer. C’est le cas d’une majeure partie des langages, dont celui qui nous intéresse ici : Javascript (via NodeJS).

Pour peu qu’on analyse son graph d’utilisation mémoire, on peut presque distinguer un programme avec un Garbage Collector : les moments où il va libérer de la mémoire sont cycliques. Par exemple, on peut imaginer que chaque seconde, le Garbage Collector va regarder les adresses mémoires réputées inaccessibles et les libérer. Cette fréquence est généralement bien plus rapide que “chaque seconde”, et est bien souvent configurable.

Comment une fuite mémoire est possible avec un Garbage Collector ? Ce dernier déduit un graph d’utilisation des entrées mémoire. Quand des points du graph sont coupés de la racine, c’est qu’ils sont inaccessibles et sont à nettoyer. Tant que les variables sont accessibles, et reliées à la racine de ce graph, alors le Garbage Collector va garder les variables pour éviter une erreur du programme.

Dans notre cas, le problème était lié à la méthode utilisée pour ajouter des plugins dans le programme. Ces plugins sont prévus pour être ajoutés une fois dans la partie rendu serveur, au lancement du serveur. Dans notre cas, ils étaient ajoutés à chaque requête reçue.

Ainsi, les éléments étaient ajoutés dans un tableau de plugins, et ce tableau était utilisé régulièrement, et donc maintenu dans les variables “utiles” au programme. Ce tableau devenait de plus en plus grand, jusqu’à saturer la mémoire.

Point intéressant, plus le tableau était grand, plus la puissance de calcul nécessaire à le parcourir était grande également, ainsi le monitoring montre une augmentation similaire du processeur.Screenshot 2020 02 06 at 09.26.55

Une fuite invisible

Nous n’avons pas vu cette fuite mémoire avant un paquet de temps, faute en est à notre infrastructure, qui fonctionnait comme prévu : plusieurs conteneurs (au moins 3) fonctionnent en même temps, dans le cas où une erreur est détectée, le conteneur est redémarré (et ça va vite), dans le cas où un conteneur est indisponible, les requêtes ne lui parviennent plus (les autres prennent la charge).

Une erreur possible, c’est que la mémoire dépasse l’espace qui lui est alloué. À ce moment là, Kubernetes va relancer (détruire et recréer serait plus exacte) le conteneur.Screenshot 2020 02 06 at 09.25.12

Une fois le correctif déployé, on constate rapidement que ce motif en dents de scie cesse, et que les conteneurs ne redémarrent plus.Screenshot 2020 02 10 at 11.15.31

Peut être vous demandez vous pourquoi corriger s’il n’y a pas de problème pour l’utilisateur, étant donné que c’est compensé par l’infrastructure ? Et bien déjà, permettez moi de le mettre en premier : pour le principe ! C’est une anomalie, elle doit être corrigée. Autrement, il y a de meilleures raisons : la pollution des logs, ces derniers vont être pollués par des lignes indiquant le redémarrage des services, inutilement. Si vous avez un système automatique de détection d’erreurs dans les logs, basé sur un apprentissage, et bien il va se mettre à considérer que quand le conteneur redémarre, c’est normal. Ensuite, la pollution des évènements est également une bonne raison : on préfère avoir des évènements utiles dans les informations de Kubernetes.

Conclusion

La leçon à tirer de tout ça ? Et bien il faut regarder les graphiques de monitoring des environnements de reviews (qui sont déployés à la volée) avant de mettre en production des modifications ! Quand ça fonctionne, c’est pas nécessairement que tout fonctionne correctement.

]]>
https://qongzi.com/affaire-declassee-une-fuite-memoire-dans-e-chauffeur/feed/ 0
Les traits en Rust… https://qongzi.com/les-traits-en-rust/ https://qongzi.com/les-traits-en-rust/#respond Mon, 02 Aug 2021 13:56:00 +0000 https://wp.qongzi.dev/?p=1573 …ou comment s’affranchir les limites de la POO avec Rust.

Introduction

Le paradigme le plus courant dans le développement informatique est la Programmation Orientée Objet, ou POO. La référence étant le Java.Les divers langages qui utilisent ce paradigme permettent énormément d’outils, dont les plus communs :

Déclaration de classes, avec propriétés et méthodes

  • Héritages entre classes parent-enfant
  • Interfaces
  • Classes abstraites
  • Niveaux de protections
  • etc.

Rust de son côté n’est pas un langage orienté objet, c’est un langage itératif. Il ne permet pas de déclarer des classes ni d’avoir le moindre héritage.

Un peu comme le C finalement ?

Comme pour le langage C, Rust permet tout de même de déclarer des objets via des structures ou struct, et ainsi d’avoir le tout stocké sur la stack et non la heap.

De plus les structures de données struct et enum en Rust peuvent disposer de méthodes et de niveaux de protection, ce que le C ne permet pas.

Note : Rust et C ont beaucoup de différences, le choix de cette comparaison vient du fait que Rust est considéré comme un C modernisé. Presque aussi rapide, pas de soucis d’allocation mémoire, et de l’inspiration des langages objet et fonctionnels le rendant très appréciable. De plus, il faut considérer que le C est un langage qui évolue toujours, la norme C17 ayant été publiée en 2017, soit après la première version stable du compilateur de Rust (1.0, 2015), et une norme C2X étant en travaux.

Le Rust

Cet article n’est pas un cours sur le Rust mais un petit résumé de ses fonctionnalités et de sa philosophie est important.

Le Rust omet deux fonctionnalités fondamentales que la plupart des langages, tout paradigme confondus, proposent : null et le partage d’adresse mémoire.

Pour la valeur null ce petit extrait cité dans la documentation Rust l’explique très bien :

I call it my billion-dollar mistake… At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.– Tony Hoare, inventor of ALGOL W.

Proposition de traduction :

J’appelle cela mon erreur à un milliard de dollars… À l’époque, je concevais le premier système de typage complet pour des références dans un langage orienté objet. Mon objectif était de m’assurer que toute utilisation de références devait être absolument sécurisée, avec une vérification effectuée automatiquement par le compilateur. Mais je n’ai pas pu résister à la tentation de mettre une référence nulle, parce que c’était facile à mettre en œuvre. Cela a conduit à d’innombrables erreurs, vulnérabilités et pannes du système, qui ont probablement causé un milliard de dollars de souffrances et de dommages au cours des quarante années qui suivirent.– Tony Hoare, inventeur du ALGOL W.

Après avoir programmé un petit peu en Rust on se rend vite compte à quel point les valeurs null sont indésirables, Rust garanti l’intégrité de la totalité des opérations et des retours, vous pouvez si vous le désirez signifier une absence de donnée avec un enum (voir le très utilisé Option<T>).Fini les horribles, et si communs, NullPointerException !

Pour le partage d’adresse c’est très simple, Rust ne veut pas que le développeur utilise comme en C malloc et free, cause principale de la perte de cheveux des développeurs dans ce langage.Cependant, Rust ne veut pas non plus faire comme le reste des langages de haut-niveau et utiliser un ramasse-miettes (Garbage Collector) qui va vérifier si l’adresse mémoire allouée est utilisée ou non en arrière plan.La raison est qu’un ramasse-miettes est lourd, lent et souvent peu efficace (Oui c’est toi que je regarde Java).

Donc comment fait Rust ? Il introduit la notion de propriété et durée de vie (lifetime), empêchant qu’une donnée soit référencée par plusieurs variables.

Ce système est un peu abrupt mais pas trop difficile à comprendre, de plus le compilateur et la plupart des IDE vous préviennent lors d’une mauvaise manipulation

Avec ces deux changements radicaux on peux entrevoir cette philosophie de Rust: Cut the bullshit and go fastRust est un nouveau C, aussi rapide et performant mais infiniment plus moderne et plus sécurisant.

On veut du beau code, et que ça aille vite

Et pour cela, on innove et on est prêts à jeter à la poubelle des standards très largement implémentés.

Exemple

Voici deux déclarations de modèles avec les mêmes fonctionnalités en Rust et C#

pub struct Character {
    name: String,
    pub strength: u8,
    pub dexterity: u8,
    pub charisma: u8,
    pub intelligence: u8,
}

impl Character {
    pub fn new(name: &str) -> Self {
        Self {
            name: String::from(name),
            strength: 1,
            dexterity: 1,
            charisma: 1,
            intelligence: 1, 
        }   
    }

    pub fn name(&self) -> &String {
       &self.name
    }
}
public class Character {
    private string name;
    public uint strength;
    public uint dexterity;
    public uint charisma;
    public uint intelligence;

    public string Name => name;

    public Character(string name) {
        this.name = name;
        strength = 1;
        dexterity = 1;
        charisma = 1;
        intelligence = 1;
    }
}


Contrairement au C, le Rust peux bien déclarer des modèles avec propriétés et méthodes comme n’importe quel langage moderne.

On peux donc créer des classes en Rust ?

Non, car même si ces deux modèles sont équivalents la version Rust ne peux pas avoir de parents ou d’enfants.Cependant les deux ont des propriétés et des méthodes. Les types en Rust n’ont pas de notion de constructeur ou de getter/setter mais on obtient le même fonctionnent avec des méthodes.

Encore un exemple supplémentaire de Rust qui refuse de prendre les développeurs par la main.

Note : Comme il n’y a pas d’héritage Rust n’a pas d’équivalent à protected

Donc comment peut-on se passer d’héritage en Rust ?

“Compound over inheritance”

Si j’ai pris l’exemple du C# ce n’est pas un hasard, il s’agit de la technologie utilisée par le moteur de jeu Unity3D qui illustre le débat du compound over inheritance.Pour résumer ce débat simplement, c’est une réflexion sur l’utilité de l’héritage dans la programmation orientée objet. En effet, n’est-il pas plus utile d’écrire des petits morceaux de code indépendants plutôt que d’avoir des grands niveaux d’héritages complexes ?

Dans Unity par exemple, chaque objet présent sur la scène de jeu est un GameObject avec divers composants. Pour bien concevoir un jeu sur unity il faut faire un maximum de petits composants indépendants qui ont tous une fonction simple.

Le composant le plus connu est sans doute RigidBody, un composant natif qui permet à l’objet en question d’interagir avec la physique du jeu. Ainsi pour qu’un caillou puisse tomber ou réagir aux interactions il suffit simplement d’ajouter le composant à l’objet caillou.C’est ça le Coumpound over inheritance Si pour qu’un objet subisse la physique il fallait que son script hérite d’une classe en particulier l’architecture serait extrêmement confuse.

Donc on découpe en petits modules pour simplifier le code?

Pas seulement, cela a d’autres avantages:

  • Une arborescence d’héritage complexe ralentit la compilation et l’accès en mémoire
  • On évite de créer des couches d’abstractions inutiles avec des classes parentes fourre-tout
  • On peux toujours faire de l’héritage mais de manière beaucoup plus simple et impactante.

Alors quid du Rust?

En Rust la question ne se pose pas, on a pas d’héritage donc on code des petits modules indépendants et génériques. Cependant on a besoin d’un minimum de niveau d’abstraction, et pour cela il faut introduire les traits.

Les Traits en Rust

Les Traits ressemblent aux interfaces dans d’autres langages. C’est une couche d’abstraction qui définit un comportement précis pour un type, que ce soit un type primitif (i32, String, etc) ou une structure ou enum que vous avez déclarés.

Mais contrairement aux interfaces, pas de limitations sur les méthodes, vous pouvez définir des méthodes virtuelle pures (déclarées mais non implémentées) comme des méthodes classiques qui peuvent être surchargées.De plus, les traits en Rust sont très puissants et n’ont pas de surcoût au runtime. Les traits peuvent être génériques, avoir des implémentations multiples pour un même type, des implémentations par défaut (derive) et même laisser une grande marge de manœuvre sur des implémentations complexes mais nous ne rentrerons pas dans le détail.

En revanche, comme pour les interfaces les traits ne peuvent pas disposer de propriétés, ce ne sont pas des types mais des traits et on ne peux pas reproduire de l’héritage avec.

Pour être sûrs de bien déclarer des traits il y a une méthode simple : le nom du trait doit être un verbe (Display, Serialize, Clone, Record, etc) ou désigner une action relative (From<T>, Into<T>, AsRef<T>, etc).Et bien sûr n’importe quel type doit pouvoir l’implémenter et pas seulement un modèle spécifique.

Si vous avez un struct User et un trait User qui va avec c’est qu’il y a un soucis. Mais on se rend vite compte que Rust nous empêche de faire ce genre de bêtise.

Conclusion

Avec le compound vs inheritance et le fonctionnement des traits on commence à voir comment on peux se passer de l’héritage et profiter de l’incroyable potentiel de Rust.

  • On déclare des modèles via des struct ou des enum.
  • Au lieu d’héritage on découpe l’applicatif en blocs fonctionnels indépendants.
  • On rajoute de l’abstraction avec des traits désignant des comportements.

Également, en utilisant le plein potentiel des génériques, on arrive facilement à un code simple, lisible et rapide et sans pertes mémoire.

Exemple

En POO si on doit créer un RPG (jeu de rôle) avec des personnages ayant diverses classes et compétences, on placerait la santé, les statistiques, le déplacement et tout ce que les personnages ont en commun dans le parent le plus élevé.Le soucis ? On a mis le code pour se déplacer dans une classe parente Character.

Donc si on veux ajouter des PNJ (personnages non joueur) qui peuvent se déplacer? On doit faire une classe au dessus ou dupliquer du code.Si on veut que d’autres éléments du jeu peuvent prendre des dégâts et gagner de l’expérience? On doit dupliquer du code ou avoir encore plus de classes au dessus.

Pour coder ce modèle efficacement on ne peux pas se baser sur l’héritage, croyez moi quand j’ai commencé à programmer sur Unity3D j’ai souvent fait cette erreur.On doit donc se mettre à penser en termes de composants:

  • Un composant Damageable qui gère les points de vie et la mort,
  • Un composant Moveable qui gère des déplacements et collisions,
  • Un composant UserInput qui gère des inputs utilisateurs,
  • Un composant ExperienceManager qui permet d’avoir une gestion de niveau et experience,
  • etc.

Note : Les noms de ces composants sont pas terribles, à vous de choisir une convention de nommage qui vous plaise

Et si tous ces composants implémentent un trait Component par exemple, nos objets peuvent disposer d’une liste de ces composants sans la moindre utilité d’héritage.

Ce n’est qu’un seul exemple mais je le trouve parlant pour comprendre comment se mettre à réfléchir en Rust.

J’espère que cela vous aura plus, et à bientôt pour un prochain article sur Rust !

Félix Lescaudey de ManevilleDéveloppeur chez Qongzi

]]>
https://qongzi.com/les-traits-en-rust/feed/ 0