From 6e6290468c8c04054e1334db6bf37441fc95d42b Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Thu, 21 Apr 2022 21:57:41 +0200 Subject: [PATCH 001/241] Update delegation_dns.md --- "R\303\251seaux/delegation_dns.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/delegation_dns.md" "b/R\303\251seaux/delegation_dns.md" index 69752f1..76c80b8 100644 --- "a/R\303\251seaux/delegation_dns.md" +++ "b/R\303\251seaux/delegation_dns.md" @@ -42,11 +42,11 @@ ns.sousdom.mondomaine.dom IN A 1.2.3.4 ## Bibliographie * [^1]: P. Mockapetris, IETF, [RFC 1034 - DOMAIN NAMES - CONCEPTS AND FACILITIES](https://datatracker.ietf.org/doc/html/rfc1034), Internet Draft, Nov. 1987 - **Résumé** : Standard définissant les concepts du DNS - **Avis sur la ressource** : Il s'agit du texte de standardisation d'origine du DNS. Attention, il date de 1987 et possède de nombreuses mises à jour à consulter en parallèle. + **Résumé** : Standard définissant les concepts du DNS + **Avis sur la ressource** : Il s'agit du texte de standardisation d'origine du DNS. Attention, il date de 1987 et possède de nombreuses mises à jour à consulter en parallèle. * [^2]: **Slides du cours Admin I - Chapitre DNS**, V. Van den Schrieck, 2018, consulté le 10 janvier 2022 - **Résumé** : Présentation de la hiérarchie DNS et des différents rôles des serveurs DNS - **Avis sur la ressource** : C'est un slideshow présentant les bases du DNS, qui gagnerait à être plus détaillé (schémas, texte, ...) + **Résumé** : Présentation de la hiérarchie DNS et des différents rôles des serveurs DNS + **Avis sur la ressource** : C'est un slideshow présentant les bases du DNS, qui gagnerait à être plus détaillé (schémas, texte, ...) From 49bc1d7307b2effecd818cb7cb665edcd3d66111 Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Thu, 21 Apr 2022 22:00:04 +0200 Subject: [PATCH 002/241] Update delegation_dns.md --- "R\303\251seaux/delegation_dns.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/R\303\251seaux/delegation_dns.md" "b/R\303\251seaux/delegation_dns.md" index 76c80b8..55a6ba9 100644 --- "a/R\303\251seaux/delegation_dns.md" +++ "b/R\303\251seaux/delegation_dns.md" @@ -42,9 +42,12 @@ ns.sousdom.mondomaine.dom IN A 1.2.3.4 ## Bibliographie * [^1]: P. Mockapetris, IETF, [RFC 1034 - DOMAIN NAMES - CONCEPTS AND FACILITIES](https://datatracker.ietf.org/doc/html/rfc1034), Internet Draft, Nov. 1987 + **Résumé** : Standard définissant les concepts du DNS **Avis sur la ressource** : Il s'agit du texte de standardisation d'origine du DNS. Attention, il date de 1987 et possède de nombreuses mises à jour à consulter en parallèle. + * [^2]: **Slides du cours Admin I - Chapitre DNS**, V. Van den Schrieck, 2018, consulté le 10 janvier 2022 + **Résumé** : Présentation de la hiérarchie DNS et des différents rôles des serveurs DNS **Avis sur la ressource** : C'est un slideshow présentant les bases du DNS, qui gagnerait à être plus détaillé (schémas, texte, ...) From 48369776e398d9b8c10d46e483334e48241d8372 Mon Sep 17 00:00:00 2001 From: TommyRiquet Date: Tue, 26 Apr 2022 14:59:32 +0200 Subject: [PATCH 003/241] Article DNSSEC --- "R\303\251seaux/dnssec.md" | 91 ++++++++++++++++++++++++++++++++++++++ index.md | 1 + reseaux.md | 3 +- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 "R\303\251seaux/dnssec.md" diff --git "a/R\303\251seaux/dnssec.md" "b/R\303\251seaux/dnssec.md" new file mode 100644 index 0000000..9b12522 --- /dev/null +++ "b/R\303\251seaux/dnssec.md" @@ -0,0 +1,91 @@ +--- +layout: default +title: DNSSEC +parent: Réseaux +--- + +# DNSSEC ( Domain Name System Security Extensions) + +## **Qu'est-ce que le 'DNSSEC' et quelle est son histoire ?** +###### https://en.wikipedia.org/wiki/Steven_M._Bellovin +![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Steven_M_Bellovin_2016.jpg/220px-Steven_M_Bellovin_2016.jpg) +¹ Tout commence lorsque le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) a découvert des failles de sécurité dans le DNS en 1990. Il va alors publier ses découvertes en 1995, mais c'est seulement 2 ans après que le [IETF](https://www.ietf.org/), un groupe chargé d'élaborer et de promouvoir des standards Internet, va considerer ses failles de sécurité et publier la [RFC 2065](https://datatracker.ietf.org/doc/html/rfc2065) qui sera ensuite revu et corrigé pour donner la [RFC 2535](https://datatracker.ietf.org/doc/html/rfc2535) en 1999. Le DNSSec fut donc plannifier sur cette RFC +Cette dernière était censée être complêtement fonctionnel et corrigé tous les problèmes et failles de sécurité que le Docteur Steven M. Bellovin avait précédement découvert, mais le DNSSec basé sur la RFC 2535 avait trop de difficulté à gérer le système de clé, il demandait beaucoup trop de ressources pour faire de simples échanges. +C'est en 2005, soit 10 ans après que les travaux du Docteur Steven M. Bellovin soit rendu publique, que l'IETF publie le DNSSec-bis basé sur deux nouvelles RFCs, la [4033](https://datatracker.ietf.org/doc/html/rfc4033) et la [4035](https://datatracker.ietf.org/doc/html/rfc4035). Et ça fonctionne! + + +## **Petit rappel sur le fonctionnement du DNS** +###### https://kinsta.com +![](https://kinsta.com/fr/wp-content/uploads/sites/4/2019/02/que-sont-dns.png) + +⁶ Le DNS fonctione grâce à une hiérarchisation de domaine et de sous-domaines, dont le sommet est appellé la racine et est représenté par un point. +Chaque domaine et sous-domaine peut ensuite créer une délégation ([voir Délégation DNS](https://epheclln.github.io/Wiki-TI/R%C3%A9seaux/delegation_dns.html)) et ainsi de suite. + + +Nous utilisons donc un résolveur pour faire des requêtes récursives, afin d'intérroger un par un, en partant de la racine, les Name Servers jusqu'a trouver l'adresse IP correspondant à notre requête. + +``` +Example de domaine de premier niveau : com, org, net... +Example de domaine de second niveau : wikipedia, youtube, ephec... +Example de sous-domaine : www, eperso, b2b... +``` + +## **Fonctionnement du DNSSEC** +### _Chain of Trust_ +Le DNSSEC fonctione grâce à un système de chaine de confiance⁵ (en Anglais 'Chain of Trust') qui valide les Name Servers sur base d'une signature numérique basées sur la cryptographie à clé publique d'un serveur parent. Le NS pourra donc obtenir un certificat de confiance signé par le parent, et ainsi de suite jusqu'à ce que l'entièreté de la chaine soit certifié. +Le premier certificat fut approuvé par l'ICANN en 2010 pour le serveur racine. + +Tout Résolveur voulant accéder aux données d'une zone n'aura qu'a récupérer la clé publique de cette même zone afin de valider l'authenticité des données , le résolveur confirme la signature numérique des données qu'il a récupéré. Si celle-ci sont valides , les données sont légitimes et sont renvoyées au client.Dans le cas contraire, il s'agit probablement d'une attaque et les données sont écartés et une erreur est renvoyé à l'utilisateur. + + +## **Pourquoi le DNSSEC est-il important ?** +⁵ Le DNSSec est très important dans la sécurisation du service DNS en général, il permet d'éviter qu'un intru se glisse dans la chaine et renvoie une autre adresse IP pour une requête, c'est ce qu'on appele du 'DNS Cache Poisoning'. + +_Qu'est-ce que le DNS Cache poisoning ?_ +L'empoisonnement du cache DNS (ou DNS Spoofing en anglais) consiste à empoisonner le cache d'un serveur DNS pour y mettre de fausses informations, de sorte que le résolveur renvoie une adresse IP incorrecte aux clients et ainsi le rediriger au mauvais endroit . +###### https://bluecatnetworks.com/ +![](https://bluecatnetworks.com/wp-content/uploads/2020/10/DNS-Poisoning.png) + + +## **Avenir du DNSSEC ?** +Le DNSSec est très important dans la sécurisation du DNS, on a remarqué que sans celui-ci, de nombreuses fraudes et attaques pouvaient avoir lieu. +La popularité de celui-ci augmente peu à peu chaque année³ et d'après moi le DNSSec deviendra un standard de la sécurisation, tout comme HTPPS, et tout le monde l'utilisera d'ici quelques années. + + +## **Bibliographie** + +* 1 : Wikipedia, [Wikipedia - Domain Name System Security Extensions ](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions), Apr. 2022, consulté le 26 Avril 2022 + + **Résumé** : Page Wikipedia du DNSSEC + **Avis sur la ressource** : Il s'agit de la page Wikipedia concernant le DNSSEC. + Plus complète en Anglais, elle rassemble beaucoup d'informations concernant ce dernier. + +* 2 : dnssec, [ DNSSEC: DNS Security Extensions Securing the Domain Name System ](https://www.dnssec.net/), Sept. 2018, consulté le 26 Avril 2022 + + **Résumé** : Page Officiel du DNSSEC + **Avis sur la ressource** : Il s'agit de la page Officiel en anglais du DNSSEC. Même si le design n'est pas parfait, c'est toujours utile. + +* 3 : Apnic,stats.lab [ Use of DNSSEC Validation for World ](https://stats.labs.apnic.net/dnssec/XA?hc=XA&hx=1&hv=0&hp=0&hr=1&w=365), consulté le 26 Avril 2022 + + **Résumé** : Statistique sur l'utilisation du DNSSec + **Avis sur la ressource** : Il s'agit d'une page du laboratoire de statistique de Apnic sur la validation DNSSec dans le monde. + Cette ressource est utile quant à la compréhensoin de l'expansion de DNSSec. + +* 4 : ICANN,stats.research [ TLD DNSSEC Report ](https://stats.research.icann.org/dns/tld_report/), consulté le 26 Avril 2022 + + **Résumé** : Statistique sur les TLD signé + **Avis sur la ressource** : Il s'agit d'une page officiel du site de l'ICANN qui représente le nombre de TLD (top-level domain, domaine de premier niveau en français) signé par DNSSEC dans le monde.Cette ressource est utile quant à la compréhensoin de l'expansion de DNSSec + +* 5 : ICANN.org, [ DNSSEC – Qu'est-ce que c'est et pourquoi est-ce important ?](https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-fr#:~:text=Les%20DNSSEC%20renforcent%20l'authentification,par%20le%20propri%C3%A9taire%20des%20donn%C3%A9es. +), consulté le 26 Avril 2022 + + **Résumé** : Page expliquant l'importance du DNSSec + **Avis sur la ressource** : Il s'agit d'une page du site officiel de l'ICANN, cette ressource est donc cohérente. + +* 6 : Wikipedia, Domain Name System, [ Domain Name System ](https://fr.wikipedia.org/wiki/Domain_Name_System), consulté le 26 Avril 2022 + + **Résumé** : Page Wikipedia du DNS + **Avis sur la ressource** : Plus complête en Anglais, pratique pour se rappeller de petits détails. + +Tommy Riquet +Dernière modification , le 26 Avril 2022 diff --git a/index.md b/index.md index 9e8f402..d512b6d 100644 --- a/index.md +++ b/index.md @@ -23,6 +23,7 @@ Les informations sont organisées par catégorie : ### Routage et switching ### Protocoles transport et applicatifs * [Délégation DNS](Réseaux/delegation_dns.md) +* [DNSSec](Réseaux/dnssec.md) ### Administration réseaux diff --git a/reseaux.md b/reseaux.md index 4798770..9dea493 100644 --- a/reseaux.md +++ b/reseaux.md @@ -11,4 +11,5 @@ Cette section regroupe tous les articles concernant le réseau : Protocoles, con ## Articles -* [Délégation DNS](Réseaux/delegation_dns.md) +* [Délégation DNS](Réseaux/delegation_dns.md) +* [DNSSEC](Réseaux/dnssec.md) From 0c46dbfaf575f27f762d47e35ebfe93c346a8080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ne=C3=B8w?= Date: Thu, 28 Apr 2022 21:25:13 +0200 Subject: [PATCH 004/241] Ajout dinformations Ajout dinformations --- "R\303\251seaux/dnssec.md" | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/dnssec.md" "b/R\303\251seaux/dnssec.md" index 9b12522..fd62d0c 100644 --- "a/R\303\251seaux/dnssec.md" +++ "b/R\303\251seaux/dnssec.md" @@ -7,11 +7,12 @@ parent: Réseaux # DNSSEC ( Domain Name System Security Extensions) ## **Qu'est-ce que le 'DNSSEC' et quelle est son histoire ?** + +¹ Tout commence lorsque le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) a découvert des failles de sécurité dans le DNS en 1990. Il va alors publier ses découvertes en 1995, mais c'est seulement 2 ans après que le [IETF](https://www.ietf.org/), un groupe chargé d'élaborer et de promouvoir des standards Internet, va considerer ses failles de sécurité et publier la [RFC 2065](https://datatracker.ietf.org/doc/html/rfc2065) qui sera ensuite revu et corrigé pour donner la [RFC 2535](https://datatracker.ietf.org/doc/html/rfc2535) en 1999. Le DNSSec fut donc plannifier sur cette RFC ###### https://en.wikipedia.org/wiki/Steven_M._Bellovin ![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Steven_M_Bellovin_2016.jpg/220px-Steven_M_Bellovin_2016.jpg) -¹ Tout commence lorsque le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) a découvert des failles de sécurité dans le DNS en 1990. Il va alors publier ses découvertes en 1995, mais c'est seulement 2 ans après que le [IETF](https://www.ietf.org/), un groupe chargé d'élaborer et de promouvoir des standards Internet, va considerer ses failles de sécurité et publier la [RFC 2065](https://datatracker.ietf.org/doc/html/rfc2065) qui sera ensuite revu et corrigé pour donner la [RFC 2535](https://datatracker.ietf.org/doc/html/rfc2535) en 1999. Le DNSSec fut donc plannifier sur cette RFC Cette dernière était censée être complêtement fonctionnel et corrigé tous les problèmes et failles de sécurité que le Docteur Steven M. Bellovin avait précédement découvert, mais le DNSSec basé sur la RFC 2535 avait trop de difficulté à gérer le système de clé, il demandait beaucoup trop de ressources pour faire de simples échanges. -C'est en 2005, soit 10 ans après que les travaux du Docteur Steven M. Bellovin soit rendu publique, que l'IETF publie le DNSSec-bis basé sur deux nouvelles RFCs, la [4033](https://datatracker.ietf.org/doc/html/rfc4033) et la [4035](https://datatracker.ietf.org/doc/html/rfc4035). Et ça fonctionne! +C'est en 2005, soit 10 ans après que les travaux du Docteur Steven M. Bellovin soit rendu publique, que l'IETF publie le DNSSec-bis, DNSSEC de nos jours, basé sur deux nouvelles RFCs, la [4033](https://datatracker.ietf.org/doc/html/rfc4033) et la [4035](https://datatracker.ietf.org/doc/html/rfc4035). Et ça fonctionne! ## **Petit rappel sur le fonctionnement du DNS** @@ -32,16 +33,24 @@ Example de sous-domaine : www, eperso, b2b... ## **Fonctionnement du DNSSEC** ### _Chain of Trust_ -Le DNSSEC fonctione grâce à un système de chaine de confiance⁵ (en Anglais 'Chain of Trust') qui valide les Name Servers sur base d'une signature numérique basées sur la cryptographie à clé publique d'un serveur parent. Le NS pourra donc obtenir un certificat de confiance signé par le parent, et ainsi de suite jusqu'à ce que l'entièreté de la chaine soit certifié. -Le premier certificat fut approuvé par l'ICANN en 2010 pour le serveur racine. - -Tout Résolveur voulant accéder aux données d'une zone n'aura qu'a récupérer la clé publique de cette même zone afin de valider l'authenticité des données , le résolveur confirme la signature numérique des données qu'il a récupéré. Si celle-ci sont valides , les données sont légitimes et sont renvoyées au client.Dans le cas contraire, il s'agit probablement d'une attaque et les données sont écartés et une erreur est renvoyé à l'utilisateur. +Le DNSSEC fonctione à l'aide un système de chaine de confiance⁵ (en Anglais 'Chain of Trust') qui valide les Name Servers sur base d'une signature numérique basées sur la cryptographie à clé publique d'un serveur parent. Le NS pourra donc obtenir un certificat de confiance signé par le parent, et ainsi de suite jusqu'à ce que l'entièreté de la chaine soit certifié. +Le premier certificat fut approuvé par l'ICANN en 2010 pour le Root Server. +###### https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html +![](https://blog.resellerspanel.com/wp-content/uploads/2017/02/dnssec-ds-records.jpg) +Tout Résolveur récursif voulant accéder aux données d'une zone n'aura qu'a récupérer la clé publique de cette même zone afin de valider l'authenticité des données , le résolveur confirme la signature numérique des données qu'il a récupéré à l'aide de cette même clé. Si celle-ci sont valides , les données sont légitimes et sont renvoyées au client.Dans le cas contraire, il s'agit probablement d'une attaque et les données sont écartés et une erreur est renvoyé à l'utilisateur. +Mais comment être sur de ne pas avoir reçu une mauvaise clé publique ? +C'est simple, la clé publique est elle-même signé, mais pas par la clé privé de cette même zone, par la clé privé de la zone parent. + +**Exemple :** +La zone ``ephec.be`` possède donc une clé publique signée par la zone ``be``, celle-ci est donc responsable de l'authenticité de la clé publique de la zone ``ephec.be``. + +Toute zone parent est donc responsable des clés publiques de ses zones enfant.Et toute clé publique d'une zone est donc signée par la zone parent, mise à part la zone ``Root``, qui ne possède pas de zone parent. ## **Pourquoi le DNSSEC est-il important ?** ⁵ Le DNSSec est très important dans la sécurisation du service DNS en général, il permet d'éviter qu'un intru se glisse dans la chaine et renvoie une autre adresse IP pour une requête, c'est ce qu'on appele du 'DNS Cache Poisoning'. -_Qu'est-ce que le DNS Cache poisoning ?_ +**_Qu'est-ce que le DNS Cache poisoning ?_** L'empoisonnement du cache DNS (ou DNS Spoofing en anglais) consiste à empoisonner le cache d'un serveur DNS pour y mettre de fausses informations, de sorte que le résolveur renvoie une adresse IP incorrecte aux clients et ainsi le rediriger au mauvais endroit . ###### https://bluecatnetworks.com/ ![](https://bluecatnetworks.com/wp-content/uploads/2020/10/DNS-Poisoning.png) @@ -87,5 +96,10 @@ La popularité de celui-ci augmente peu à peu chaque année³ et d'après moi l **Résumé** : Page Wikipedia du DNS **Avis sur la ressource** : Plus complête en Anglais, pratique pour se rappeller de petits détails. +* 7 : ResellersPanel, DNSSec Enabled On our Platform, [ DNSSec Enabled on our platform ](https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html), consulté le 28 Avril 2022 + + **Résumé** : Page rassemblant plein d'informations sur le DNSSec + **Avis sur la ressource** : En Anglais, très complête avec beaucoup d'illustrations + Tommy Riquet Dernière modification , le 26 Avril 2022 From b1738193c41f34eb071a3129ea0cb64af5886fb0 Mon Sep 17 00:00:00 2001 From: Rachiid007 Date: Sun, 1 May 2022 18:27:51 +0200 Subject: [PATCH 005/241] intro --- "R\303\251seaux/https" | 98 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 "R\303\251seaux/https" diff --git "a/R\303\251seaux/https" "b/R\303\251seaux/https" new file mode 100644 index 0000000..51a369b --- /dev/null +++ "b/R\303\251seaux/https" @@ -0,0 +1,98 @@ +--- +layout: default +title: HTTPS +parent: Réseaux +--- + +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) + +# HTTPS + +## Qu'est-ce que HTTPS ? + +Le HTTPS est un protocole permettant de sécuriser les échanges de données entre un serveur et un client, et de valider l’identité d’un site visité. Cette double sécurisation est essentielle : elle garantit la confidentialité des données et rassure les internautes qui se connectent à votre site web. + +C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SSL ou TLS. +![image](https://user-images.githubusercontent.com/91373823/166153959-774af9a2-2344-466b-b19b-eaa308701edb.png) + +### + +## Pourquoi HTTPS ? + +Pour eviter l'interception du trafic, se proteger des FAI malveillants + +Pour bénéficier de HTTP/2.0 +La norme n'impose pas HTTPS mais les navigateurs Firefox et Chrome requiert HTTPS pour se connecter à un site en HTTP/2.0. + +J'espere qu'avec tous celà je vous est convaincu. + +## Objectifs d'HTTPS + +1. Confidentialité : + + Les données échangées sont chiffrées à l'aide d'une clé et ne peuvent être déchiffrées par les deux parties. + +2. Authentification : + + Le client vérifie que le serveur qu'il adresse est celui qu'il prétend être (ceci évite les attaques de l'homme du milieu). Au besoin, le client peut vérifier son identité auprès du serveur. + +3. Intégrité : + + Les parties s'assurent que les données reçues n'ont pas fait l'objet d'une modification. + +4. Transparence : + + Aucun changement nécessaire dans le protocole applicatif n'englobé. + +5. Spontanéité : + + Un client peut spontanément se connecter à un serveur (pas de prérequis). + +### Comprendre le SSL/TLS + +SSL signifie Secure Sockets Layer, qui est le nom du protocole lorsqu'il appartenait à Netscape. +Mais l'IETF (Internet engineering Task Force) a décidé d'en prendre le contrôle afin de le rendre plus ouvert et standardisé. +Mais pour éviter tous les problèmes légaux, il est renommé TLS pour « Transport Layer Security ». + +Aujourd'hui il n'y a plus que TLS mais on fait référence à SSL par abus de langage. + +### Versions SSL/TLS + +- SSL 1.0 (jamais publié) par Netscape, +- SSL 2.0 en 1995, déprécié en 2011 par la RFC 6176, +- SSL 3.0/RFC 6101 en 1996 (refonte), déprécié en 2015 par la RFC 7568, +- TLS 1.0 / RFC 2246 en 1999 (modifications mineures), +- TLS 1.1 / RFC 4346 en 2006 (protections contre les attaques sur CBC), +- TLS 1.2/ RFC 5246 en 2008 (chiffrement authentifié ou AEAD via GCM et CCM), +- Mise à jour sur TLS 1.2 en 2011/ RFC 6176 (compatibilité SSL), +- TLS 1.3 / RFC 8446 en 2018 (compression, renégociation, MD5, SHA1, RC4, 3DES, PFS obligatoire, optimisation réseau (0-RTT) , SHA-256, Courbe elliptique 25519 & 448). + +### Rappels cryptographiques + +Le chiffrement symétrique et asymétrique sont les deux techniques utilisées pour protéger la confidentialité de votre message sur internet. La différence fondamentale entre les deux réside dans le fait que le chiffrement symétrique permet de chiffrer et de déchiffrer le message à l'aide de la même clé. En revanche, le chiffrement asymétrique utilise la clé publique pour le chiffrement et une clé privée pour le déchiffrage. + +| | Chiffrement symétrique | Chiffrement asymétrique | +| :---------: | :----------------------------------------------------: | :---------------------------------------------------------: | +| Définition | Une seule clé pour le chiffrement et le déchiffrement. | Une clé différente pour le chiffrement et le déchiffrement. | +| Performance | Rapide en exécution. | Lent à l’exécution en raison de la charge de calcul élevée. | +| Algorithmes | AES, DES, 3DES et RC4. | Diffie-Hellman, RSA. | +| Objectif | Utilisé pour la transmission massive des données. | Souvent utilisé pour l'échange des clés secrètes. | + +## Authentification + +Un certificat c'est comme la carte d'identité d'un serveur, il permet d'assurer que vos etes bien la personne qui prétender l'être. Pour cela, il faudrait passer par une autorité de certificat (autorité reconnu, validé, sure et peut délivrer des certificats). Il faudrait donc prouver que nous sommes le propriétaire du site à l'autorité de certification et, si tel est le cas, nous recevons ce certificat. + +Il existe 3 types de certificats. + +1. Validation de domaine
+ Simple vérification sur l’appartenance du domaine. +2. Validation d’organisation
+ Vérification de l’identité du propriétaire (carte d’identité, SIRET, etc). +3. Validation étendue
+ Enquête sur le propriétaire (vérification d’une présence physique, opérationnelle et juridique), permet l’affichage du propriétaire dans la barre d’adresse). + +## Bibliographie + +- [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... From 22c3d26b2498386d50732c76c1f9b962f1beaea9 Mon Sep 17 00:00:00 2001 From: Rachiid007 Date: Sun, 1 May 2022 20:31:53 +0200 Subject: [PATCH 006/241] Let's Encrypt and add link to my page --- "R\303\251seaux/https" | 6 ++++++ index.md | 30 ++++++++++++++---------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git "a/R\303\251seaux/https" "b/R\303\251seaux/https" index 51a369b..2ce0bf7 100644 --- "a/R\303\251seaux/https" +++ "b/R\303\251seaux/https" @@ -91,6 +91,12 @@ Il existe 3 types de certificats. 3. Validation étendue
Enquête sur le propriétaire (vérification d’une présence physique, opérationnelle et juridique), permet l’affichage du propriétaire dans la barre d’adresse). +### Let's Encrypt + +L'idée est d'installer un programme et que notre site passe en HTTPS sans rien faire et il est GRATUIT. + +C'est un ensemble de choses, tous d'abord c'est une autorité de certification qui est bien connue par les navigateurs. C'est également un protocole qui s'appelle ACME et enfin c'est un agent Open Source qui va négocier avec les serveurs de Le't Encrypt pour prouver que vous êtes bien le propriétaire du site afin de nous installer un certificat de type Domaine Validation et il va le maintenir toujours à jour. + ## Bibliographie - [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) diff --git a/index.md b/index.md index 9e8f402..0d13874 100644 --- a/index.md +++ b/index.md @@ -6,49 +6,47 @@ nav_order: 1 # Page d'accueil -Bienvenue sur le Wiki TI. Vous y trouverez une série de ressources et de synthèses liées au cursus TI. +Bienvenue sur le Wiki TI. Vous y trouverez une série de ressources et de synthèses liées au cursus TI. -Les informations sont organisées par catégorie : +Les informations sont organisées par catégorie : ## Electronique et traitement du signal ### Bases d'électricité -### Electronique -### Traitement du signal +### Electronique +### Traitement du signal ## Réseaux ### Routage et switching -### Protocoles transport et applicatifs -* [Délégation DNS](Réseaux/delegation_dns.md) - -### Administration réseaux +### Protocoles transport et applicatifs +- [Délégation DNS](Réseaux/delegation_dns.md) +- [HTTPS](Réseaux/https.md) +### Administration réseaux ## Développement - ### JS et développement Web + ### Python + ### Autres langages ## Systèmes ### Concepts d'OS + ### Linux + ### Windows + ### Virtualisation + ### Conteneurs ## Sécurité - - - - - - - From 7c0158fb54bd5dd1adfe983ebeb483307f61b806 Mon Sep 17 00:00:00 2001 From: Rachiid007 Date: Sun, 1 May 2022 20:56:31 +0200 Subject: [PATCH 007/241] [ADD] step configuration --- "R\303\251seaux/https" | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git "a/R\303\251seaux/https" "b/R\303\251seaux/https" index 2ce0bf7..70e1255 100644 --- "a/R\303\251seaux/https" +++ "b/R\303\251seaux/https" @@ -97,6 +97,46 @@ L'idée est d'installer un programme et que notre site passe en HTTPS sans rien C'est un ensemble de choses, tous d'abord c'est une autorité de certification qui est bien connue par les navigateurs. C'est également un protocole qui s'appelle ACME et enfin c'est un agent Open Source qui va négocier avec les serveurs de Le't Encrypt pour prouver que vous êtes bien le propriétaire du site afin de nous installer un certificat de type Domaine Validation et il va le maintenir toujours à jour. +## Pratique + +Si vous avez un site HTTP en production sous apache et que vous souhaiatez le mettre en HTTPS, la solution la plus simple consiste à utiliser l'outil [Certbot](https://doc.ubuntu-fr.org/apache2#activation_du_module_ssl) de [Let's Encrypt](https://letsencrypt.org/fr/). + +Voici les étapes à suivre : + +Pour que le protocole TLS fonctionne sous Apache2, vous devez activer le module ssl à l'aide de la commande : + +``` +sudo a2enmod ssl +``` + +puis recharger la configuration d'Apache 2 : + +``` +sudo systemctl reload apache2 +``` + +Mise en place de HTTPS avec Certbot, pour celà il faut que votre service web Apache soit déjà configuré, fonctionnel et accessible au public. + +Installation de Certbot + +``` +sudo apt install python3-certbot-apache +``` + +Certbot permet ensuite de générer tous les certificats et d'adapter les configurations d'Apache pour tous les noms de domaine associés aux hôtes virtuels au moyen d'une seule commande : + +``` +sudo certbot --apache +``` + +À l'aide de l'option `–apache`, Certbot crée et active automatiquement les fichiers de configuration pour les serveurs virtuels HTTPS sur le port 443. + +Au cours de l'opération, le script nous demande de vérifier les domaines pour lesquels nous voulons obtenir les certificats et de choisir d'utiliser HTTPS ou non. Acceptés tous et forcer le HTTPS. + +Après cette opération les sites devraient être accessibles en HTTPS de manière sécurisée. + +Voilà, nous avons terminé ! Nous avons appris ce qu'est le HTTPS et comment le mettre en place. + ## Bibliographie - [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) From c9caaf34e8e8cbbb41a647ad9498105fcbbe36e3 Mon Sep 17 00:00:00 2001 From: Rachiid007 Date: Sun, 1 May 2022 23:38:32 +0200 Subject: [PATCH 008/241] [ADD] Biblio + check orthographe --- "R\303\251seaux/https" | 48 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git "a/R\303\251seaux/https" "b/R\303\251seaux/https" index 70e1255..25b473d 100644 --- "a/R\303\251seaux/https" +++ "b/R\303\251seaux/https" @@ -13,18 +13,20 @@ parent: Réseaux Le HTTPS est un protocole permettant de sécuriser les échanges de données entre un serveur et un client, et de valider l’identité d’un site visité. Cette double sécurisation est essentielle : elle garantit la confidentialité des données et rassure les internautes qui se connectent à votre site web. C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SSL ou TLS. -![image](https://user-images.githubusercontent.com/91373823/166153959-774af9a2-2344-466b-b19b-eaa308701edb.png) + +![image](https://user-images.githubusercontent.com/91373823/166163525-721fb773-5093-4672-8812-efc90ac67c41.png) ### ## Pourquoi HTTPS ? -Pour eviter l'interception du trafic, se proteger des FAI malveillants +- Meilleur référencement et positionnement par l'algorithme de Google. + +- Protéger les informations des internautes et de vos clients en évitant les attaques de l'homme du milieu ( l'interception du trafic). -Pour bénéficier de HTTP/2.0 -La norme n'impose pas HTTPS mais les navigateurs Firefox et Chrome requiert HTTPS pour se connecter à un site en HTTP/2.0. +- Éviter d’avoir le label “Non sécurisé” à l’affichage de votre site internet. -J'espere qu'avec tous celà je vous est convaincu. +- Pour bénéficier de HTTP/2.0
La norme n'impose pas HTTPS mais les navigateurs Firefox et Chrome requiert HTTPS pour se connecter à un site en HTTP/2.0. ## Objectifs d'HTTPS @@ -97,7 +99,7 @@ L'idée est d'installer un programme et que notre site passe en HTTPS sans rien C'est un ensemble de choses, tous d'abord c'est une autorité de certification qui est bien connue par les navigateurs. C'est également un protocole qui s'appelle ACME et enfin c'est un agent Open Source qui va négocier avec les serveurs de Le't Encrypt pour prouver que vous êtes bien le propriétaire du site afin de nous installer un certificat de type Domaine Validation et il va le maintenir toujours à jour. -## Pratique +## Mise en pratique Si vous avez un site HTTP en production sous apache et que vous souhaiatez le mettre en HTTPS, la solution la plus simple consiste à utiliser l'outil [Certbot](https://doc.ubuntu-fr.org/apache2#activation_du_module_ssl) de [Let's Encrypt](https://letsencrypt.org/fr/). @@ -135,10 +137,38 @@ Au cours de l'opération, le script nous demande de vérifier les domaines pour Après cette opération les sites devraient être accessibles en HTTPS de manière sécurisée. +Vous trouverez une documentation plus détaillée à ce sujet sur [cette page](https://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl) de la documentation. + Voilà, nous avons terminé ! Nous avons appris ce qu'est le HTTPS et comment le mettre en place. ## Bibliographie -- [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... +- [Qu’est ce que SSL/TLS et HTTPS ?](https://www.hostinger.fr/tutoriels/quest-ce-que-ssl-tls-et-https), Bernadeta Kairyte, 08 mars 2022, consulté le 1er mai 2022. + + - Résumé : Présentation des protocoles de chiffrement et de sécurité. + - Avis sur la ressource : Très bon résumé concernant le protocole SSL/TLS et HTTPS. + +- [Différence entre le cryptage symétrique et asymétrique](https://waytolearnx.com/2018/07/difference-entre-le-cryptage-symetrique-et-asymetrique.html#comment-2889), Anonyme, 23 juillet 2022, consulté le 30 avril 2022 + + - Résumé : Explication de la différence entre le cryptage symétrique et asymétrique. + - Avis sur la ressource : Resumé assez court mais très pertinent. + +- [Types de certificats SSL : Lequel convient le mieux à votre site ?](https://kinsta.com/fr/blog/types-de-certificats-ssl/), Salman Ravoof, 28 juillet 2021, consulté le 01 mai 2022 + + - Résumé : Les différents types de certificats SSL. + - Avis sur la ressource : Explication dans les grandes lignes. + +- [SSL/TLS and PKI History](https://www.feistyduck.com/ssl-tls-and-pki-history/), Ivan Ristić, février 2022, consulté le 27 avril 2022 + + - Résumé : L'histoire du protocole SSL/TLS et de la PKI. + - Avis sur la ressource : Résume assez long mais très pertinent. + +- [Utiliser HTTPS avec Apache2](https://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl), Gabriel Theuws, 16 mars 2021, consulté le 25 avril 2022 + + - Résumé : Mise en place de certbot dans un ser apache. + - Avis sur la ressource : Les etapes de configuration sont très bien expliquées. + +- [Mettre son site en ligne (4/4) : Comprends le SSL / HTTPS](https://www.youtube.com/watch?v=_UpuZ0Y3k-c), Jonathan Boyer, 24 février 2016, consulté le 26 avril 2022 + + - Résumé : Vidéo expliquant le fonctionnement des protocoles SSL/TLS et HTTPS. + - Avis sur la ressource : Video de qualité et les démonstantions sont bien illustrées. From 666e9c85cce1b5ce5f64505b473d3500ecbcf2bd Mon Sep 17 00:00:00 2001 From: Abderrachid BELLAALI <91373823+Rachiid007@users.noreply.github.com> Date: Mon, 2 May 2022 11:14:45 +0200 Subject: [PATCH 009/241] Rename https to https.md --- "R\303\251seaux/https" => "R\303\251seaux/https.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "R\303\251seaux/https" => "R\303\251seaux/https.md" (100%) diff --git "a/R\303\251seaux/https" "b/R\303\251seaux/https.md" similarity index 100% rename from "R\303\251seaux/https" rename to "R\303\251seaux/https.md" From ecfc577831f5966582a411b2e34979956c627baa Mon Sep 17 00:00:00 2001 From: Abderrachid BELLAALI Date: Mon, 2 May 2022 18:23:09 +0200 Subject: [PATCH 010/241] correction faute orthographe ;( --- "R\303\251seaux/https.md" | 4 ++-- reseaux.md | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/https.md" "b/R\303\251seaux/https.md" index 25b473d..b85188c 100644 --- "a/R\303\251seaux/https.md" +++ "b/R\303\251seaux/https.md" @@ -44,7 +44,7 @@ C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SS 4. Transparence : - Aucun changement nécessaire dans le protocole applicatif n'englobé. + Aucun changement nécessaire dans le protocole applicatif englobé. 5. Spontanéité : @@ -82,7 +82,7 @@ Le chiffrement symétrique et asymétrique sont les deux techniques utilisées p ## Authentification -Un certificat c'est comme la carte d'identité d'un serveur, il permet d'assurer que vos etes bien la personne qui prétender l'être. Pour cela, il faudrait passer par une autorité de certificat (autorité reconnu, validé, sure et peut délivrer des certificats). Il faudrait donc prouver que nous sommes le propriétaire du site à l'autorité de certification et, si tel est le cas, nous recevons ce certificat. +Un certificat c'est comme la carte d'identité d'un serveur, il permet d'assurer que vous êtes bien la personne que vous prétendez être. Pour cela, il faudrait passer par une autorité de certification (autorité reconnue, validée, sûre, qui peut délivrer des certificats). Il faudrait donc prouver que nous sommes le propriétaire du site à l'autorité de certification et, si tel est le cas, nous recevons ce certificat. Il existe 3 types de certificats. diff --git a/reseaux.md b/reseaux.md index 4798770..472afb1 100644 --- a/reseaux.md +++ b/reseaux.md @@ -7,8 +7,9 @@ has_children: true # Réseaux -Cette section regroupe tous les articles concernant le réseau : Protocoles, configuration, outils, bonnes pratiques... +Cette section regroupe tous les articles concernant le réseau : Protocoles, configuration, outils, bonnes pratiques... -## Articles +## Articles -* [Délégation DNS](Réseaux/delegation_dns.md) +- [Délégation DNS](Réseaux/delegation_dns.md) +- [HTTPS](Réseaux/https.md) From 21ff46450cc3835c0a6960d27df416b3c6051db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Mon, 2 May 2022 18:59:58 +0200 Subject: [PATCH 011/241] [Add] Adding the main artcile about IAX --- "R\303\251seaux/IAX.md" | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 "R\303\251seaux/IAX.md" diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" new file mode 100644 index 0000000..56a51c3 --- /dev/null +++ "b/R\303\251seaux/IAX.md" @@ -0,0 +1,45 @@ +# Inter-Asterisk eXchange + +IAX est un protocole VoIp produit et créé à la base pour le logiciel PBX « Asterisk ». + +## VoIp et Asterisk : + +IAX fait donc partie intégrante du système VoIp mis en place par le PBX Asterisk, mais qu’est-ce qu’Asterisk et la VoIp ? + +### >Qu’est-ce qu’Asterisk ?: + +Asterisk est un logiciel PABX (Autocommutateur téléphonique privé) créé en 1999 par Mark Spencer. Ce logiciel est très utilisé dans les entreprises ou les call-centers et est à la base de nombreux autres logiciels de communication. Du à sa popularité, il possède une grosse communauté . Il utilise la VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc). + +### >Qu’est-ce que la VoIp ?: + +VoIp sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix ) en utilisant le protocole IP et donc via internet . +La VoIp offre de nombreux avantages comparé à la téléphonie classique. En effet, le fait de ne plus avoir une ligne pour les données et une ligne pour la transmission des appels est assez révolutionnaire. Cette technologie permet donc de centraliser le tous en utilisant le protocole IP . La VoIp devient également un standard dans les entreprises dû à son cout réduit en installation et en entretient. +Principales caractéristiques d’IAX : +IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiques et en quoi est-t-il différent des autres protocoles VoIp ? + +## Avantages comparé à la VoIp classique : + +- **Ports** : En VoIp classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569, à la fois pour la signalisation et le flux de données. Le fait d’exposé une seul port présentes divers avantages. En effet, la configuration du firewall est plus simple et car moins de ports sont exposés la NAT est donc également rendue plus simple à configurée. Cette caractéristique apporte donc une certaine « légèreté » en terme de configuration pour ce protocole. +- **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. Effectivement, cela inclus une réduction de la bande passante utilisée + +- **Diminution de la latence** : Le faite que un seul port soit utilisé au lieux d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyé en même temps et sur le même ports, on a une réduction de la latence +- **Rapidité** :Ces trois premiers avantages apportes une vitesse pour la communication qui est plus importante qu’avec SIP. + +## Défauts de IAX : + +Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le protocole de base de la VoIp . Nous allons donc voir quels sont les défauts d’IAX et qui seraient la raison pour laquelle SIP est toujours une base solide pour faire de la VoIp. + +- **Pas de 3-way-handshake** , c’est-à-dire qu’il n’y pas d’établissement de la connexion par les 3 étapes classiques. Cette caractéristique rend le système sensible au DOS. En effet,si on ne dispose pas d’établissement de connexion via 3-way handshake il y a possibilité d’attaque Dos sur des ressources publiques (attaque par dénis de service). La meilleur façon de contrer ce problème est de créer une « white-list » avec toutes les adresses de confiance. +- **Construit sur base d’un système Asterisk** : Bien qu’une portabilité est envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX est été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans ce but-là. + +**Bibliographie:** + +https://speetis.fei.tuke.sk/KomunikacnaTechnika1/prednasky/26_9_2016/ST_ASTERISK_3_12_2013/Asterisk/Inter-Asterisk%20Exchange%20(IAX).pdf + +https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange + +https://www.techtarget.com/searchunifiedcommunications/definition/IAX-Inter-Asterisk-Exchange-Protocol#:~:text=IAX%20is%20well%20suited%20for,of%20multiplexing%20and%20trunking. + +https://askanydifference.com/difference-between-sip-and-iax/ + +https://www.voip-info.org/iax-versus-sip/#:~:text=1) From 5ecdf0b6f294d43633444260b5ea2cbf7258f198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Mon, 2 May 2022 19:04:55 +0200 Subject: [PATCH 012/241] [ADD] Rearenging some things --- "R\303\251seaux/IAX.md" | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 56a51c3..8e1a768 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -6,18 +6,23 @@ IAX est un protocole VoIp produit et créé à la base pour le logiciel PBX « A IAX fait donc partie intégrante du système VoIp mis en place par le PBX Asterisk, mais qu’est-ce qu’Asterisk et la VoIp ? -### >Qu’est-ce qu’Asterisk ?: +### > Qu’est-ce qu’Asterisk ?: -Asterisk est un logiciel PABX (Autocommutateur téléphonique privé) créé en 1999 par Mark Spencer. Ce logiciel est très utilisé dans les entreprises ou les call-centers et est à la base de nombreux autres logiciels de communication. Du à sa popularité, il possède une grosse communauté . Il utilise la VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc). +Asterisk est un logiciel PABX (Autocommutateur téléphonique privé) créé en 1999 par Mark Spencer. -### >Qu’est-ce que la VoIp ?: +Ce logiciel est très utilisé dans les entreprises ou les call-centers et est à la base de nombreux autres logiciels de communication. Du à sa popularité, il possède une grosse communauté . Il utilise le système VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc). + +### > Qu’est-ce que la VoIp ?: + +VoIp sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix ) en utilisant le protocole IP et donc via internet. -VoIp sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix ) en utilisant le protocole IP et donc via internet . La VoIp offre de nombreux avantages comparé à la téléphonie classique. En effet, le fait de ne plus avoir une ligne pour les données et une ligne pour la transmission des appels est assez révolutionnaire. Cette technologie permet donc de centraliser le tous en utilisant le protocole IP . La VoIp devient également un standard dans les entreprises dû à son cout réduit en installation et en entretient. -Principales caractéristiques d’IAX : + +## Principales caractéristiques d’IAX : + IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiques et en quoi est-t-il différent des autres protocoles VoIp ? -## Avantages comparé à la VoIp classique : +### > Avantages comparé à la VoIp classique : - **Ports** : En VoIp classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569, à la fois pour la signalisation et le flux de données. Le fait d’exposé une seul port présentes divers avantages. En effet, la configuration du firewall est plus simple et car moins de ports sont exposés la NAT est donc également rendue plus simple à configurée. Cette caractéristique apporte donc une certaine « légèreté » en terme de configuration pour ce protocole. - **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. Effectivement, cela inclus une réduction de la bande passante utilisée @@ -25,11 +30,14 @@ IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiq - **Diminution de la latence** : Le faite que un seul port soit utilisé au lieux d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyé en même temps et sur le même ports, on a une réduction de la latence - **Rapidité** :Ces trois premiers avantages apportes une vitesse pour la communication qui est plus importante qu’avec SIP. -## Défauts de IAX : +## > Défauts de IAX : + +Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le protocole le plus utilisé pour la VoIp. -Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le protocole de base de la VoIp . Nous allons donc voir quels sont les défauts d’IAX et qui seraient la raison pour laquelle SIP est toujours une base solide pour faire de la VoIp. +Nous allons donc voir quels sont les défauts d’IAX qui seraient la raison pour laquelle SIP est toujours une base solide pour faire de la VoIp. -- **Pas de 3-way-handshake** , c’est-à-dire qu’il n’y pas d’établissement de la connexion par les 3 étapes classiques. Cette caractéristique rend le système sensible au DOS. En effet,si on ne dispose pas d’établissement de connexion via 3-way handshake il y a possibilité d’attaque Dos sur des ressources publiques (attaque par dénis de service). La meilleur façon de contrer ce problème est de créer une « white-list » avec toutes les adresses de confiance. +- **Pas de 3-way-handshake** , c’est-à-dire qu’il n’y pas d’établissement de la connexion par les 3 étapes classiques. + Cette caractéristique rend le système sensible au DOS. En effet,si on ne dispose pas d’établissement de connexion via 3-way handshake il y a possibilité d’attaque Dos sur des ressources publiques (attaque par dénis de service). La meilleur façon de contrer ce problème est de créer une « white-list » avec toutes les adresses de confiance. - **Construit sur base d’un système Asterisk** : Bien qu’une portabilité est envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX est été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans ce but-là. **Bibliographie:** From c65c17cc43b4d430b49c528254dd8ebf5ef9255a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Tue, 3 May 2022 09:12:23 +0200 Subject: [PATCH 013/241] [FIX] Fixing one bad title level --- "R\303\251seaux/IAX.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 8e1a768..7370f75 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -30,7 +30,7 @@ IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiq - **Diminution de la latence** : Le faite que un seul port soit utilisé au lieux d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyé en même temps et sur le même ports, on a une réduction de la latence - **Rapidité** :Ces trois premiers avantages apportes une vitesse pour la communication qui est plus importante qu’avec SIP. -## > Défauts de IAX : +### > Défauts de IAX : Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le protocole le plus utilisé pour la VoIp. From d89b9d623c4dd33a63a180d0d05386c0c152ab73 Mon Sep 17 00:00:00 2001 From: Kevin Keurvels Date: Tue, 3 May 2022 22:36:38 +0200 Subject: [PATCH 014/241] debut de la redaction de l'article et recherche de sources --- reverse_proxy.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 reverse_proxy.md diff --git a/reverse_proxy.md b/reverse_proxy.md new file mode 100644 index 0000000..c2b484b --- /dev/null +++ b/reverse_proxy.md @@ -0,0 +1,55 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Le Reverse Proxy +Dans cet article, nous allons essayer de répondre à la question +**"Qu'est-ce qu'un reverse proxy et pourquoi en utiliser un ?"** +## Tout d'abord, qu'est-ce qu'un proxy ? +En résumé un proxy est un logiciel ou une machine qui permet de sécuriser une infrastructure réseau via différents points. Il existe différent types de Proxy: +- **Proxy DNS**: sert pour un "accés à la résolution DNS Internet via le résolveur externe[3]" +- **Proxy Web**: permet d'accélérer la navigation en gérant la mémoire cache et en assurant la compression des données. Il sécurise aussi la navigation en bloquant certains sites ou publicités[1]. On peut aussi faire de mettre un système d'authentification pour atteindre des ressources extérieures. + +**Exemple d'utilisation d'un proxy:** +Une entreprise utilisant un proxy pour bloquer des ressources jugées inutiles pour l'entreprise (ex: réseaux sociaux, pornographie, ...).[2] + +## Mais du coup, qu'est-ce qu'un reverse proxy ? + +Texte + + + + + + + +## Bibliographie +* [Proxy - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy&oldid=193004402), La communauté mais validé par des administrateurs, 20 avril 2022, consulté le 03 mai 2022 + - Résumé : Page expliquant ce qu'est un proxy dans toutes ses utilisations + - Avis sur la ressource : Ressource assez compléte et qui à l'air sérieuse + +* [Qu'est ce qu'un proxy ?](https://www.commentcamarche.net/faq/17453-qu-est-ce-qu-un-proxy), Jean-François Pillou, 28 février 2018, consulté le 03 mai 2022 + - Résumé : Ressource assez basique expliquant ce qu'est un proxy et son principe de fonctionnement + - Avis sur la ressource : La ressource explique bien les principes fondamentals d'un proxy +* [Slides : DNS avancé](https://moodle.ephec.be/pluginfile.php/369478/mod_resource/content/0/Admin-Res-Sys-II_4_DNS.pdf), Virginie Van den Schrieck, date de création inconnue, consulté le 3 mai 2022 + - Résumé : Powerpoint expliquant plein de concepts avancés sur le DNS dont le proxy dans l'aspect sécurité + - Avis sur la ressource : Ressource très intéréssante et assez compléte +* [Le serveur reverse-proxy : Eléments principaux](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/), l'auteur est inconnu, 17 mars 2020, consulté le 3 mai 2022 + - Résumé : Article expliquant les principes du reverse proxy et qui dit comment en configurer un + - Avis sur la ressource : Ressource assez sérieuse, profesionnelle et trés détailée +* [Proxy inverse - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy_inverse&oldid=186198908e), La communauté mais validé par des administrateurs, 9 septembre 2021, consulté le 3 mai 2022 + - Résumé : Page expliquant de manière assez bréve ce qu'est un reverse proxy tout en détaillant ses applications + - Avis sur la ressource : Ressource utile pour avoir une idée générale sur le sujet sans trop rentrer dans les détails. +* [Improve Your Application Security Using a Reverse Proxy](https://traefik.io/blog/improve-application-security-using-a-reverse-proxy/), Manuel Zapf, 13 janvier 2022, consulté le 3 mai 2022 +- Résumé : Article en anglais centré sur les aspects sécurités qui justifient l'utilisation d'un reverse proxy + - Avis sur la ressource : Article très complet et rempli d'information utiles +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... + + + + From a8ea30fdc5150ecc929e1b3de1834125c70f209e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Wed, 4 May 2022 18:38:46 +0200 Subject: [PATCH 015/241] [Fix & Add] Rearenging text and adding concepts part --- "R\303\251seaux/IAX.md" | 121 ++++++++++++++++++++++++++++++++++------ 1 file changed, 104 insertions(+), 17 deletions(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 7370f75..7866fee 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -10,25 +10,30 @@ IAX fait donc partie intégrante du système VoIp mis en place par le PBX Asteri Asterisk est un logiciel PABX (Autocommutateur téléphonique privé) créé en 1999 par Mark Spencer. -Ce logiciel est très utilisé dans les entreprises ou les call-centers et est à la base de nombreux autres logiciels de communication. Du à sa popularité, il possède une grosse communauté . Il utilise le système VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc). +Ce logiciel est très utilisé dans les entreprises ou les calls-centers et est à la base de nombreux autres logiciels de communication. Dû à sa popularité, il possède une grosse communauté. Il utilise le système VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc) [[8](https://en.wikipedia.org/wiki/Asterisk)]. ### > Qu’est-ce que la VoIp ?: -VoIp sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix ) en utilisant le protocole IP et donc via internet. +VoIp sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix) en utilisant le protocole IP et donc via internet. -La VoIp offre de nombreux avantages comparé à la téléphonie classique. En effet, le fait de ne plus avoir une ligne pour les données et une ligne pour la transmission des appels est assez révolutionnaire. Cette technologie permet donc de centraliser le tous en utilisant le protocole IP . La VoIp devient également un standard dans les entreprises dû à son cout réduit en installation et en entretient. +La VoIp offre de nombreux avantages comparés à la téléphonie classique. En effet, le fait de ne plus avoir une ligne pour les données et une ligne pour la transmission des appels est assez révolutionnaire. Cette technologie permet donc de transmettre le tous (voix et données) sur le même type de support. La VoIp devient également un standard dans les entreprises dû à son cout réduit pour son installation et son entretient. ## Principales caractéristiques d’IAX : -IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiques et en quoi est-t-il différent des autres protocoles VoIp ? +IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiques et en quoi est-il différent des autres protocoles VoIp ? ### > Avantages comparé à la VoIp classique : -- **Ports** : En VoIp classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569, à la fois pour la signalisation et le flux de données. Le fait d’exposé une seul port présentes divers avantages. En effet, la configuration du firewall est plus simple et car moins de ports sont exposés la NAT est donc également rendue plus simple à configurée. Cette caractéristique apporte donc une certaine « légèreté » en terme de configuration pour ce protocole. -- **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. Effectivement, cela inclus une réduction de la bande passante utilisée +- **Ports** : En VoIp classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. -- **Diminution de la latence** : Le faite que un seul port soit utilisé au lieux d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyé en même temps et sur le même ports, on a une réduction de la latence -- **Rapidité** :Ces trois premiers avantages apportes une vitesse pour la communication qui est plus importante qu’avec SIP. +- **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. Effectivement, cela inclut une réduction de la bande passante utilisée////////////////////////////////////////////////////////////////// + +- **Diminution de la latence** : Le fait qu'un seul port soit utilisé au lieu d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyés en même temps et sur le même port, on a une réduction de la latence + +- **Rapidité** : Ces trois premiers avantages apportent donc une vitesse pour la communication qui est plus importante qu’avec d'autres protocoles comme SIP par exemple. + +- **Protocole binaire** : + Le fait que AIX soit un [protocole binaire]() apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. ### > Défauts de IAX : @@ -36,18 +41,100 @@ Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le proto Nous allons donc voir quels sont les défauts d’IAX qui seraient la raison pour laquelle SIP est toujours une base solide pour faire de la VoIp. -- **Pas de 3-way-handshake** , c’est-à-dire qu’il n’y pas d’établissement de la connexion par les 3 étapes classiques. - Cette caractéristique rend le système sensible au DOS. En effet,si on ne dispose pas d’établissement de connexion via 3-way handshake il y a possibilité d’attaque Dos sur des ressources publiques (attaque par dénis de service). La meilleur façon de contrer ce problème est de créer une « white-list » avec toutes les adresses de confiance. -- **Construit sur base d’un système Asterisk** : Bien qu’une portabilité est envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX est été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans ce but-là. +- **Construit sur base d’un système Asterisk** : Bien qu’une portabilité soit envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX a été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans le même but. + +- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [attaques par déni de service](). + +- *** + +## **Concepts**: + +### C01 - Attaque par déni de service: + +Une attaque par déni de service (appellé DOS en anglais) consiste à rendre indisponible un service et donc d'empêcher les utilisateurs de l'utiliser. De manière générale, cette attaque consiste à surcharger un réseau ou un serveur en s'y connectant et en envoyant des requêtes avec une quantité importante d'appareils.[[7](https://fr.wikipedia.org/wiki/Attaque_par_déni_de_service)] + +### C02 - Protocoles binaires: + +Il existe deux types de protocoles; des protocoles binaires où les informations sont transmises sous une forme où le protocole utilise toutes les valeurs d'un octet. Et d'un autre coté, les protocoles dit basé sur du texte, transmettent eux des valeurs qui correspondent à des caractères lisibles par l'être humain (par exemple de l'ASCII) [[6](https://en.wikipedia.org/wiki/Communication_protocol#:~:text=A%20binary%20protocol%20utilizes%20all,rather%20than%20a%20human%20being)]. + +## **Bibliographie:** + +### - 1 https://speetis.fei.tuke.sk/KomunikacnaTechnika1/prednasky/26_9_2016/ST_ASTERISK_3_12_2013/Asterisk/Inter-Asterisk%20Exchange%20(IAX).pdf + +Titre: Inter-Asterisk eXchange: Deployement scenariosin SIP-enabled nteworks + +Auteur: WILEY, John Wiley & Sons + +Date de parution: 2009 + +Date de visite: 29/04/2022 + +### - 2 https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange + +Titre: Inter-Asterisk eXchange + +Auteur: ? + +Date de parution: 7 Novembre 2021 + +Date de visite: 27/04/2022 + +### - 3 https://www.voip-info.org/iax-versus-sip/. + +Titre: IAX (Inter-Asterisk Exchange Protocol) + +Auteur: Mark Spencer + +Date de parution: 1 Juin 2005 + +Date de visite: 23/04/2022 + +### -4 https://askanydifference.com/difference-between-sip-and-iax/ + +Titre: Difference Between SIP and IAX (With Table) + +Auteur: askanydifference + +Date de parution: ? + +Date de visite: 28/04/2022 + +### - 5 https://www.voip-info.org/iax-versus-sip/#:~:text=1) + +Titre: IAX versus SIP + +Auteur: VoIP Info + +Date de parution: 1 juin 2005 + +Date de visite: 23/04/2022 + +### - 6 https://en.wikipedia.org/wiki/Communication_protocol#:~:text=A%20binary%20protocol%20utilizes%20all,rather%20than%20a%20human%20being. + +Titre: Communication protocol + +Auteur: Wikipedia + +Date de parution: 26 Avril 202 + +Date de visite: 1/05/2022 + +### - 7 https://fr.wikipedia.org/wiki/Attaque_par_déni_de_service + +Titre: Attaque par déni de service + +Auteur: Wikipedia + +Date de parution: 1 avril 2022 -**Bibliographie:** +Date de visite: 1/05/2022 -https://speetis.fei.tuke.sk/KomunikacnaTechnika1/prednasky/26_9_2016/ST_ASTERISK_3_12_2013/Asterisk/Inter-Asterisk%20Exchange%20(IAX).pdf +### - 8 https://en.wikipedia.org/wiki/Asterisk -https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange +Titre: Asterisk -https://www.techtarget.com/searchunifiedcommunications/definition/IAX-Inter-Asterisk-Exchange-Protocol#:~:text=IAX%20is%20well%20suited%20for,of%20multiplexing%20and%20trunking. +Auteur: Wikipedia -https://askanydifference.com/difference-between-sip-and-iax/ +Date de parution: 4 mai 2022 -https://www.voip-info.org/iax-versus-sip/#:~:text=1) +Date de visite: 25/04/2022 From 9926497cddb40480c65fe09e49bbca3303973dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Wed, 4 May 2022 18:42:08 +0200 Subject: [PATCH 016/241] [Add] Adding a bit more in the description part --- "R\303\251seaux/IAX.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 7866fee..a849dff 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -1,6 +1,6 @@ # Inter-Asterisk eXchange -IAX est un protocole VoIp produit et créé à la base pour le logiciel PBX « Asterisk ». +IAX est un protocole VoIp produit et créé à la base pour le logiciel PBX « Asterisk ». Il est utilisé pour transmettre des sessions VoIp entre les serveurs et les machines des clients. ## VoIp et Asterisk : From 9b83520e662048dd643556940611556526575682 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Wed, 4 May 2022 18:44:08 +0200 Subject: [PATCH 017/241] [ADD] Adding links --- "R\303\251seaux/IAX.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index a849dff..28d5c96 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -33,7 +33,7 @@ IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiq - **Rapidité** : Ces trois premiers avantages apportent donc une vitesse pour la communication qui est plus importante qu’avec d'autres protocoles comme SIP par exemple. - **Protocole binaire** : - Le fait que AIX soit un [protocole binaire]() apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. + Le fait que AIX soit un [protocole binaire](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#c02---protocoles-binaires) apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. ### > Défauts de IAX : @@ -43,7 +43,7 @@ Nous allons donc voir quels sont les défauts d’IAX qui seraient la raison pou - **Construit sur base d’un système Asterisk** : Bien qu’une portabilité soit envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX a été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans le même but. -- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [attaques par déni de service](). +- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [attaques par déni de service](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#c01---attaque-par-d%C3%A9ni-de-service). - *** From 00d6a4ce41e181744e3ce65d881c2e657cff4c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Wed, 4 May 2022 18:54:19 +0200 Subject: [PATCH 018/241] [END] finilizing the article --- "R\303\251seaux/IAX.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 28d5c96..5fddcb4 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -26,14 +26,14 @@ IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiq - **Ports** : En VoIp classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. -- **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. Effectivement, cela inclut une réduction de la bande passante utilisée////////////////////////////////////////////////////////////////// +- **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. De fil en aiguille, cela inclut une réduction de la bande passante utilisée. - **Diminution de la latence** : Le fait qu'un seul port soit utilisé au lieu d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyés en même temps et sur le même port, on a une réduction de la latence - **Rapidité** : Ces trois premiers avantages apportent donc une vitesse pour la communication qui est plus importante qu’avec d'autres protocoles comme SIP par exemple. - **Protocole binaire** : - Le fait que AIX soit un [protocole binaire](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#c02---protocoles-binaires) apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. + Le fait que AIX soit un [protocole binaire](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts) apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. ### > Défauts de IAX : @@ -43,9 +43,7 @@ Nous allons donc voir quels sont les défauts d’IAX qui seraient la raison pou - **Construit sur base d’un système Asterisk** : Bien qu’une portabilité soit envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX a été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans le même but. -- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [attaques par déni de service](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#c01---attaque-par-d%C3%A9ni-de-service). - -- *** +- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [attaques par déni de service](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts). ## **Concepts**: From 7d201beaadfacad2dbd9934b18127f6c57c243fa Mon Sep 17 00:00:00 2001 From: Pourbaix <71372371+Pourbaix@users.noreply.github.com> Date: Wed, 4 May 2022 18:56:19 +0200 Subject: [PATCH 019/241] Update IAX.md --- "R\303\251seaux/IAX.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 5fddcb4..53c6a7b 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -8,6 +8,8 @@ IAX fait donc partie intégrante du système VoIp mis en place par le PBX Asteri ### > Qu’est-ce qu’Asterisk ?: +![image](https://user-images.githubusercontent.com/71372371/166737739-e9360031-97ac-4d70-8657-8113ab4634f0.png) + Asterisk est un logiciel PABX (Autocommutateur téléphonique privé) créé en 1999 par Mark Spencer. Ce logiciel est très utilisé dans les entreprises ou les calls-centers et est à la base de nombreux autres logiciels de communication. Dû à sa popularité, il possède une grosse communauté. Il utilise le système VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc) [[8](https://en.wikipedia.org/wiki/Asterisk)]. From 18b47d18e71b4da93c958bab9eff149c6881ed2a Mon Sep 17 00:00:00 2001 From: Kevin Keurvels Date: Thu, 5 May 2022 22:50:27 +0200 Subject: [PATCH 020/241] mise a jour de la version 1.0 --- reverse_proxy.md | 107 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 85 insertions(+), 22 deletions(-) diff --git a/reverse_proxy.md b/reverse_proxy.md index c2b484b..46154e9 100644 --- a/reverse_proxy.md +++ b/reverse_proxy.md @@ -3,52 +3,115 @@ Dans cet article, nous allons essayer de répondre à la question **"Qu'est-ce qu'un reverse proxy et pourquoi en utiliser un ?"** ## Tout d'abord, qu'est-ce qu'un proxy ? -En résumé un proxy est un logiciel ou une machine qui permet de sécuriser une infrastructure réseau via différents points. Il existe différent types de Proxy: -- **Proxy DNS**: sert pour un "accés à la résolution DNS Internet via le résolveur externe[3]" -- **Proxy Web**: permet d'accélérer la navigation en gérant la mémoire cache et en assurant la compression des données. Il sécurise aussi la navigation en bloquant certains sites ou publicités[1]. On peut aussi faire de mettre un système d'authentification pour atteindre des ressources extérieures. +En résumé, un proxy (aussi appélé "*forward proxy*" en anglais [4]) est un logiciel ou une machine permettant de sécuriser une infrastructure réseau via différents points. Il se place juste après les clients de sorte à recevoir leurs requêtes avant qu'elles ne sortent du réseau et qu'elles n'atteignent Internet. + +![proxy](https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Forward_Proxy.png) +*Représentation schématique d’un proxy [4] +https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Forward_Proxy.png* + +Il existe différent types de Proxy: +- **Proxy DNS**: sert pour un "accès à la résolution DNS Internet via le résolveur externe[3]" +- **Proxy Web**: permet d'accélérer la navigation en gérant la mémoire cache et en assurant la compression des données. Il sécurise aussi la navigation en bloquant certains sites ou publicités[1]. On peut aussi mettre un système d'authentification pour atteindre des ressources extérieures. **Exemple d'utilisation d'un proxy:** Une entreprise utilisant un proxy pour bloquer des ressources jugées inutiles pour l'entreprise (ex: réseaux sociaux, pornographie, ...).[2] + + ## Mais du coup, qu'est-ce qu'un reverse proxy ? -Texte +Un reverse proxy (ou en français un proxy inverse [5]) est un logiciel ou une machine qui se place du côté opposé à celui du proxy ce qui veut dire qu'il se place à l'entrée d'un réseau, juste avant de joindre un serveur (Web par exemple). + +![proxy](https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Reverse_Proxy.png) +*Représentation schématique d’un reverse proxy [4] +https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Reverse_Proxy.pngg* + +Un utilisateur passera par le reverse proxy pour accéder aux services internes. De cette façon, il permet de rajouter une sécurité supplémentaire et protége les serveurs des attaques potentielles venant de l'exterieur. + +Quand le proxy reçoit une requête venant d'Internet, il regarde d'abord si cette dernière est conforme aux règles de sécurité présentent dans la configuration du reverse proxy. + +Finalement, le reverse proxy permet aussi d'optimiser le trafic des données d'un réseau via différentes manières. + +## Quelles sont les applications que peut avoir un reverse proxy ? +Le reverse proxy est utilisé dans plusieurs buts bien distincts. +### Le reverse proxy permet le caching d'information +Le reverse proxy peut stocker en mémoire une ou plusieurs pages HTML statiques (uniquement avec un contenu qui ne change pas en fonction de l'utilisateur qui l'utilise). + +Quand une requête pour une page statique, qu'il avait précédement stockée en mémoire, arrive, le reverse proxy lui fournit la page sans même faire une seule requête au serveur Web. + +De cette façon, la charge des serveurs Web est globalement diminuée. Cette utilisation-ci s'appelle « accélérateur web » ou « accélérateur HTTP »[5] ou encore le caching[4]. + +De temps en temps, le reverse proxy ira demander au serveur si les données qu'il a stocké son toujours à jour ou si le contenu des pages ont changés. Si ce n'est plus le cas, il demande les nouvelles pages au serveur Web et il remplace les données dans sa mémoire cache. + +De cette façon, le reverse proxy est sûr de rester à jour. + +### Le reverse proxy permet l'anonymisation des serveurs +Vu que toutes les requêtes passent par le reverse proxy qui transfère la demande au service demandé, les serveurs restent anonymes ce qui rajoute une sécurité non négligable. + +### Le reverse proxy permet la répartition de charge +La répartition de charge ou "*load-balancing*" en anglais. On entend beaucoup ce terme dans les manuels d'école ou dans le milieu de l'informatique mais qu'est-ce que ça veut vraiment dire ? + +Il n'est pas rare dans une entreprise d'avoir plusieurs serveurs (Web par exemple) de telle façon que si un serveur devient inaccessible pour une raison ou une autre (panne, surcharge,...), le service n'est pas interrompu car un autre serveur prend la relève. Ce système est appelé "**répartition de charge**". + +Oui mais le reverse proxy dans tout ça ? Il permet tout simplement de pouvoir, quand il reçoit une requête, choisir vers quel serveur la diriger et donc de répartir la charge de travail sur plusieurs serveurs pour les surcharger le moins possible. + +Oui mais comment peut-il faire cela ? Tout simplement en liant une URL pour différents serveurs[4]. + +### Le reverse proxy permet la compression des données +Pour un échange plus rapide, le reverse proxy peut compresser les données avant de les envoyer au client. + +Pour faire cela, le reverse proxy va avoir besoin d'un logiciel supplémentaire. Le plus connu pour compresser les sites Web est Gzip lequel est souvent utilisé avec Apache ou nginx [4]. + +### Le reverse proxy permet l'encodage et le contrôle des données +On peut installer, sur un reverse proxy, des antivirus ou des filtres de paquet pour analyser plus en profondeur les paquets reçus, ce qui permet de sécuriser les paquets qui atteignent les serveurs. + +L'encodage des données est aussi possible grâce à des outils externes. + +### Le reverse proxy permet de surveiller l'envoi des paquets +Si un serveur ne traite pas bien une demande à cause d'une erreur quelconque, une erreur est renvoyée. Sauf que certaines erreurs ne doivent pas être visibles par le client. + +Le reverse proxy se charge donc de filtrer les paquets sortant du réseau (typiquement des réponses des différents serveurs) et d'arrêter certains paquets contenant, justement, ces fameuses erreurs. Il peut aussi stopper l'envoi d'information considéré comme désirée comme les tokens ou autres [6]. + +### Le reverse proxy permet une surveillance facilitée pour l'administrateur +Vu que toutes les requêtes passent par le reverse proxy, en consultant ses logs l'administrateur système peut voir les requêtes qui ont été bloqués et voir si elles sont justifiées. +Si elles ne le sont pas, il peut très facilement changer les règles de filtrage directement sur la même machine. +## Donc l'implémentation d'un reverse proxy résout tout les problèmes de sécurité ? +Pas tout à fait ! Tout d'abord, pour qu'un reverse proxy soit utilisé comme il faut, il doit disposer de WAF ([Web Application Firewalls](https://www.vaadata.com/blog/fr/les-3-configurations-des-waf-pour-se-proteger-des-cyber-attaques/)). +Ensuite, une mise à jour des listes noires (contenu bloqué) et des listes blanches (contenu autorisé) doit être faite assez fréquement pour éviter que des demandes valides ne soient bloquées et donc, que cela gache l'expérience utilisateur. +Pour finir, la mise à jour des listes noires est impérative pour garantir d'être à jour pour contrer les nouvelles menaces, auquel cas, le reverse proxy deviendra de plus en plus obsolète et deviendra inutile. +## En conclusion +Un reverse proxy est très intéressant pour protéger les serveurs et pour filtrer les requêtes les atteignant. Toutefois, une mauvaise configuration ou une mauvaise mise à jour des données pourrait le rendre inutile ou pire, pourrait gâcher l'expérience utilisateur et être négatif pour l'entreprise. +***Article écrit par Kevin Keurvels HE201913.*** ## Bibliographie * [Proxy - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy&oldid=193004402), La communauté mais validé par des administrateurs, 20 avril 2022, consulté le 03 mai 2022 - Résumé : Page expliquant ce qu'est un proxy dans toutes ses utilisations - - Avis sur la ressource : Ressource assez compléte et qui à l'air sérieuse + - Avis sur la ressource : Ressource assez complète et qui à l'air sérieuse * [Qu'est ce qu'un proxy ?](https://www.commentcamarche.net/faq/17453-qu-est-ce-qu-un-proxy), Jean-François Pillou, 28 février 2018, consulté le 03 mai 2022 - Résumé : Ressource assez basique expliquant ce qu'est un proxy et son principe de fonctionnement - - Avis sur la ressource : La ressource explique bien les principes fondamentals d'un proxy + - Avis sur la ressource : La ressource explique bien les principes fondamentaux d'un proxy * [Slides : DNS avancé](https://moodle.ephec.be/pluginfile.php/369478/mod_resource/content/0/Admin-Res-Sys-II_4_DNS.pdf), Virginie Van den Schrieck, date de création inconnue, consulté le 3 mai 2022 - Résumé : Powerpoint expliquant plein de concepts avancés sur le DNS dont le proxy dans l'aspect sécurité - - Avis sur la ressource : Ressource très intéréssante et assez compléte -* [Le serveur reverse-proxy : Eléments principaux](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/), l'auteur est inconnu, 17 mars 2020, consulté le 3 mai 2022 + - Avis sur la ressource : Ressource très intéréssante et assez complète +* [Le serveur reverse-proxy : Eléments principaux](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/), l'auteur est inconnu, 17 mars 2020, consulté le 4 mai 2022 - Résumé : Article expliquant les principes du reverse proxy et qui dit comment en configurer un - - Avis sur la ressource : Ressource assez sérieuse, profesionnelle et trés détailée -* [Proxy inverse - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy_inverse&oldid=186198908e), La communauté mais validé par des administrateurs, 9 septembre 2021, consulté le 3 mai 2022 - - Résumé : Page expliquant de manière assez bréve ce qu'est un reverse proxy tout en détaillant ses applications + - Avis sur la ressource : Ressource assez sérieuse, professionnelle et trés détailée +* [Proxy inverse - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy_inverse&oldid=186198908e), La communauté mais validé par des administrateurs, 9 septembre 2021, consulté le 4 mai 2022 + - Résumé : Page expliquant de manière assez brève ce qu'est un reverse proxy tout en détaillant ses applications - Avis sur la ressource : Ressource utile pour avoir une idée générale sur le sujet sans trop rentrer dans les détails. -* [Improve Your Application Security Using a Reverse Proxy](https://traefik.io/blog/improve-application-security-using-a-reverse-proxy/), Manuel Zapf, 13 janvier 2022, consulté le 3 mai 2022 +* [Improve Your Application Security Using a Reverse Proxy](https://traefik.io/blog/improve-application-security-using-a-reverse-proxy/), Manuel Zapf, 13 janvier 2022, consulté le 4 mai 2022 - Résumé : Article en anglais centré sur les aspects sécurités qui justifient l'utilisation d'un reverse proxy - - Avis sur la ressource : Article très complet et rempli d'information utiles -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... + - Avis sur la ressource : Article très complet et rempli d'informations utiles +* [Les 3 configurations des WAF pour se protéger des cyber-attaques](https://www.vaadata.com/blog/fr/les-3-configurations-des-waf-pour-se-proteger-des-cyber-attaques/), Auteur inconnu, 11 mars 2015, consulté le 5 mai 2022 + - Résumé : Article expliquant ce qu'est un WAF et comment en utiliser un. + - Avis sur la ressource : Ressource utile et compréhensible pour tout un chacun. Il informe bien sur les WAF. From 138f3f0d42be23c5d880ba2c6535514cadce81bd Mon Sep 17 00:00:00 2001 From: Kevin Keurvels Date: Sat, 7 May 2022 15:07:44 +0200 Subject: [PATCH 021/241] Changements apportes en fonction des remarques --- reverse_proxy.md | 50 +++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/reverse_proxy.md b/reverse_proxy.md index 46154e9..c53b7fe 100644 --- a/reverse_proxy.md +++ b/reverse_proxy.md @@ -3,13 +3,15 @@ Dans cet article, nous allons essayer de répondre à la question **"Qu'est-ce qu'un reverse proxy et pourquoi en utiliser un ?"** ## Tout d'abord, qu'est-ce qu'un proxy ? -En résumé, un proxy (aussi appélé "*forward proxy*" en anglais [4]) est un logiciel ou une machine permettant de sécuriser une infrastructure réseau via différents points. Il se place juste après les clients de sorte à recevoir leurs requêtes avant qu'elles ne sortent du réseau et qu'elles n'atteignent Internet. +En résumé, un proxy (aussi appélé "*forward proxy*" en anglais [4]) est un logiciel ou une machine permettant de sécuriser une infrastructure réseau via différents points. Il se place juste après les clients de sorte à recevoir leurs requêtes avant qu'elles ne sortent du réseau et qu'elles n'atteignent Internet. + +Le proxy intervient le plus souvent, au niveau de la couche applicative et, plus précisément, au niveau des échanges protocolaires. Il existe plein de sortes de proxy en fonction des protocoles avec lesquels ils vont travailler (un proxy HTTP s'occupera donc des échange HTTP). Certains proxies travaillent même au niveau de la **de la couche transport** (voir [HAProxy](https://en.wikipedia.org/w/index.php?title=HAProxy&oldid=1085855827)). ![proxy](https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Forward_Proxy.png) *Représentation schématique d’un proxy [4] https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Forward_Proxy.png* -Il existe différent types de Proxy: +Il existe différent types de Proxy. Penchons-nous sur 2 d'entre eux: - **Proxy DNS**: sert pour un "accès à la résolution DNS Internet via le résolveur externe[3]" - **Proxy Web**: permet d'accélérer la navigation en gérant la mémoire cache et en assurant la compression des données. Il sécurise aussi la navigation en bloquant certains sites ou publicités[1]. On peut aussi mettre un système d'authentification pour atteindre des ressources extérieures. @@ -26,7 +28,7 @@ Un reverse proxy (ou en français un proxy inverse [5]) est un logiciel ou une m *Représentation schématique d’un reverse proxy [4] https://www.ionos.fr/digitalguide/fileadmin/DigitalGuide/Schaubilder/Reverse_Proxy.pngg* -Un utilisateur passera par le reverse proxy pour accéder aux services internes. De cette façon, il permet de rajouter une sécurité supplémentaire et protége les serveurs des attaques potentielles venant de l'exterieur. +Un utilisateur passera par le reverse proxy pour accéder aux services. De cette façon, il permet de rajouter une sécurité supplémentaire et protége les serveurs des attaques potentielles venant de l'exterieur. Quand le proxy reçoit une requête venant d'Internet, il regarde d'abord si cette dernière est conforme aux règles de sécurité présentent dans la configuration du reverse proxy. @@ -41,7 +43,7 @@ Quand une requête pour une page statique, qu'il avait précédement stockée en De cette façon, la charge des serveurs Web est globalement diminuée. Cette utilisation-ci s'appelle « accélérateur web » ou « accélérateur HTTP »[5] ou encore le caching[4]. -De temps en temps, le reverse proxy ira demander au serveur si les données qu'il a stocké son toujours à jour ou si le contenu des pages ont changés. Si ce n'est plus le cas, il demande les nouvelles pages au serveur Web et il remplace les données dans sa mémoire cache. +De temps en temps, le reverse proxy ira demander au serveur si les données qu'il a stocké sont toujours à jour ou si le contenu des pages a changé. Si ce n'est plus le cas, il demande les nouvelles pages au serveur Web et il remplace les données dans sa mémoire cache. De cette façon, le reverse proxy est sûr de rester à jour. @@ -51,11 +53,11 @@ Vu que toutes les requêtes passent par le reverse proxy qui transfère la deman ### Le reverse proxy permet la répartition de charge La répartition de charge ou "*load-balancing*" en anglais. On entend beaucoup ce terme dans les manuels d'école ou dans le milieu de l'informatique mais qu'est-ce que ça veut vraiment dire ? -Il n'est pas rare dans une entreprise d'avoir plusieurs serveurs (Web par exemple) de telle façon que si un serveur devient inaccessible pour une raison ou une autre (panne, surcharge,...), le service n'est pas interrompu car un autre serveur prend la relève. Ce système est appelé "**répartition de charge**". +Il n'est pas rare dans une entreprise d'avoir plusieurs serveurs (Web par exemple) et de répartir le traffic des différentes requêtes entre les différents serveurs. Grâce à ce système, le charge pour chaque serveur est diminué. Ce système est appelé "**répartition de charge**". -Oui mais le reverse proxy dans tout ça ? Il permet tout simplement de pouvoir, quand il reçoit une requête, choisir vers quel serveur la diriger et donc de répartir la charge de travail sur plusieurs serveurs pour les surcharger le moins possible. +Et le reverse proxy dans tout ça ? Il permet tout simplement de pouvoir, quand il reçoit une requête, choisir vers quel serveur la diriger et donc de répartir la charge de travail sur plusieurs serveurs pour les surcharger le moins possible. -Oui mais comment peut-il faire cela ? Tout simplement en liant une URL pour différents serveurs[4]. +Mais comment peut-il faire cela ? Tout simplement en liant une URL à différents serveurs[4]. ### Le reverse proxy permet la compression des données Pour un échange plus rapide, le reverse proxy peut compresser les données avant de les envoyer au client. @@ -63,14 +65,17 @@ Pour un échange plus rapide, le reverse proxy peut compresser les données avan Pour faire cela, le reverse proxy va avoir besoin d'un logiciel supplémentaire. Le plus connu pour compresser les sites Web est Gzip lequel est souvent utilisé avec Apache ou nginx [4]. ### Le reverse proxy permet l'encodage et le contrôle des données -On peut installer, sur un reverse proxy, des antivirus ou des filtres de paquet pour analyser plus en profondeur les paquets reçus, ce qui permet de sécuriser les paquets qui atteignent les serveurs. +On peut installer, sur un reverse proxy, des antivirus ou des filtres de paquets pour analyser plus en profondeur les paquets reçus, ce qui permet de sécuriser les paquets qui atteignent les serveurs. L'encodage des données est aussi possible grâce à des outils externes. ### Le reverse proxy permet de surveiller l'envoi des paquets Si un serveur ne traite pas bien une demande à cause d'une erreur quelconque, une erreur est renvoyée. Sauf que certaines erreurs ne doivent pas être visibles par le client. -Le reverse proxy se charge donc de filtrer les paquets sortant du réseau (typiquement des réponses des différents serveurs) et d'arrêter certains paquets contenant, justement, ces fameuses erreurs. Il peut aussi stopper l'envoi d'information considéré comme désirée comme les tokens ou autres [6]. +Le reverse proxy se charge donc de filtrer les paquets sortant du réseau (typiquement des réponses des différents serveurs) et d'arrêter certains paquets contenant, justement, ces fameuses erreurs. Il peut aussi stopper l'envoi d'information considérée comme non désirée comme les tokens ou autres [6]. + +### Le reverse proxy comme terminateur SSL +Le reverse proxy peut gérer le protocole SSL ([Secure Sockets Layer](https://fr.wikipedia.org/w/index.php?title=Transport_Layer_Security&oldid=191806531)). Grâce à cela, il peut sécuriser les paquets qu'il envoit ce qui rajoute une sécurité supplémentaire dans l'échange des paquets. ### Le reverse proxy permet une surveillance facilitée pour l'administrateur Vu que toutes les requêtes passent par le reverse proxy, en consultant ses logs l'administrateur système peut voir les requêtes qui ont été bloqués et voir si elles sont justifiées. @@ -78,7 +83,7 @@ Vu que toutes les requêtes passent par le reverse proxy, en consultant ses logs Si elles ne le sont pas, il peut très facilement changer les règles de filtrage directement sur la même machine. ## Donc l'implémentation d'un reverse proxy résout tout les problèmes de sécurité ? -Pas tout à fait ! Tout d'abord, pour qu'un reverse proxy soit utilisé comme il faut, il doit disposer de WAF ([Web Application Firewalls](https://www.vaadata.com/blog/fr/les-3-configurations-des-waf-pour-se-proteger-des-cyber-attaques/)). +Pas tout à fait ! Tout d'abord, pour qu'un reverse proxy soit utilisé comme il faut, il doit disposer de WAF ([Web Application Firewalls](https://www.vaadata.com/blog/fr/les-3-configurations-des-waf-pour-se-proteger-des-cyber-attaques/)) qui sont des firewalls qui analysent le flux entrant et sortant vers les serveurs Web et qui bloquent les requêtes qui semblent suspect. Ils permettent de protéger contre les attaques de types phishing, ransomware, attaque DDOS, malware [8]. Ensuite, une mise à jour des listes noires (contenu bloqué) et des listes blanches (contenu autorisé) doit être faite assez fréquement pour éviter que des demandes valides ne soient bloquées et donc, que cela gache l'expérience utilisateur. @@ -90,28 +95,37 @@ Un reverse proxy est très intéressant pour protéger les serveurs et pour filt ***Article écrit par Kevin Keurvels HE201913.*** ## Bibliographie -* [Proxy - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy&oldid=193004402), La communauté mais validé par des administrateurs, 20 avril 2022, consulté le 03 mai 2022 +1) [Proxy - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy&oldid=193004402), La communauté mais validé par des administrateurs, 20 avril 2022, consulté le 03 mai 2022 - Résumé : Page expliquant ce qu'est un proxy dans toutes ses utilisations - Avis sur la ressource : Ressource assez complète et qui à l'air sérieuse -* [Qu'est ce qu'un proxy ?](https://www.commentcamarche.net/faq/17453-qu-est-ce-qu-un-proxy), Jean-François Pillou, 28 février 2018, consulté le 03 mai 2022 +1) [Qu'est ce qu'un proxy ?](https://www.commentcamarche.net/faq/17453-qu-est-ce-qu-un-proxy), Jean-François Pillou, 28 février 2018, consulté le 03 mai 2022 - Résumé : Ressource assez basique expliquant ce qu'est un proxy et son principe de fonctionnement - Avis sur la ressource : La ressource explique bien les principes fondamentaux d'un proxy -* [Slides : DNS avancé](https://moodle.ephec.be/pluginfile.php/369478/mod_resource/content/0/Admin-Res-Sys-II_4_DNS.pdf), Virginie Van den Schrieck, date de création inconnue, consulté le 3 mai 2022 +1) [Slides : DNS avancé](https://moodle.ephec.be/pluginfile.php/369478/mod_resource/content/0/Admin-Res-Sys-II_4_DNS.pdf), Virginie Van den Schrieck, date de création inconnue, consulté le 3 mai 2022 - Résumé : Powerpoint expliquant plein de concepts avancés sur le DNS dont le proxy dans l'aspect sécurité - Avis sur la ressource : Ressource très intéréssante et assez complète -* [Le serveur reverse-proxy : Eléments principaux](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/), l'auteur est inconnu, 17 mars 2020, consulté le 4 mai 2022 +1) [Le serveur reverse-proxy : Eléments principaux](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/), l'auteur est inconnu, 17 mars 2020, consulté le 4 mai 2022 - Résumé : Article expliquant les principes du reverse proxy et qui dit comment en configurer un - Avis sur la ressource : Ressource assez sérieuse, professionnelle et trés détailée -* [Proxy inverse - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy_inverse&oldid=186198908e), La communauté mais validé par des administrateurs, 9 septembre 2021, consulté le 4 mai 2022 +1) [Proxy inverse - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Proxy_inverse&oldid=186198908e), La communauté mais validé par des administrateurs, 9 septembre 2021, consulté le 4 mai 2022 - Résumé : Page expliquant de manière assez brève ce qu'est un reverse proxy tout en détaillant ses applications - Avis sur la ressource : Ressource utile pour avoir une idée générale sur le sujet sans trop rentrer dans les détails. -* [Improve Your Application Security Using a Reverse Proxy](https://traefik.io/blog/improve-application-security-using-a-reverse-proxy/), Manuel Zapf, 13 janvier 2022, consulté le 4 mai 2022 -- Résumé : Article en anglais centré sur les aspects sécurités qui justifient l'utilisation d'un reverse proxy +1) [Improve Your Application Security Using a Reverse Proxy](https://traefik.io/blog/improve-application-security-using-a-reverse-proxy/), Manuel Zapf, 13 janvier 2022, consulté le 4 mai 2022 + - Résumé : Article en anglais centré sur les aspects sécurités qui justifient l'utilisation d'un reverse proxy - Avis sur la ressource : Article très complet et rempli d'informations utiles -* [Les 3 configurations des WAF pour se protéger des cyber-attaques](https://www.vaadata.com/blog/fr/les-3-configurations-des-waf-pour-se-proteger-des-cyber-attaques/), Auteur inconnu, 11 mars 2015, consulté le 5 mai 2022 +1) [Les 3 configurations des WAF pour se protéger des cyber-attaques](https://www.vaadata.com/blog/fr/les-3-configurations-des-waf-pour-se-proteger-des-cyber-attaques/), Auteur inconnu, 11 mars 2015, consulté le 5 mai 2022 - Résumé : Article expliquant ce qu'est un WAF et comment en utiliser un. - Avis sur la ressource : Ressource utile et compréhensible pour tout un chacun. Il informe bien sur les WAF. +1) [Quels sont les atouts d’un WAF ?](https://www.oracle.com/fr/security/waf-definition-pare-feu.html), Auteur inconnu et date de création inconnus, consulté le 7 mai 2022 + - Résumé : Article expliquant ce qu'est un WAF et ce qu'est Oracle Dyn WAF + - Avis sur la ressource : Ressource utile quoique assez courte mais il permet d'en savoir plus sur les WAF. +1) [HAProxy - Wikipédia](https://en.wikipedia.org/w/index.php?title=HAProxy&oldid=1085855827), La communauté mais validé par des administrateurs, 2 mai 2022, consulté le 7 mai 2022 + - Résumé : Article expliquant ce qu'est HAProxy et ses différentes caractéristiques. + - Avis sur la ressource : Ressource utile pour avoir un aperçu de ce qu'est HAProxy mais ne conviendrait pas dans le but de tout connaître sur le sujet. +1) [Transport Layer Security - Wikipédia](https://fr.wikipedia.org/w/index.php?title=Transport_Layer_Security&oldid=191806531), La communauté mais validé par des administrateurs, 11 mars 2022, consulté le 7 mai 2022 + - Résumé : Article très fourni expliquant les protocoles SSL et TLS. + - Avis sur la ressource : Ressource utile et très complète permettant d'avoir énormément d'informations sur TLS et SSL. From c71cb6c1408c5c2ca4b9b9da9fbdbdab31af2e55 Mon Sep 17 00:00:00 2001 From: Debongnie Nathan Date: Sat, 7 May 2022 15:28:44 +0200 Subject: [PATCH 022/241] Create kubernetes.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Création de l'article Wiki sur Kubernetes dans le cadre du cours d'Administration Réseaux II --- "R\303\251seaux/kubernetes.md" | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 "R\303\251seaux/kubernetes.md" diff --git "a/R\303\251seaux/kubernetes.md" "b/R\303\251seaux/kubernetes.md" new file mode 100644 index 0000000..f21e229 --- /dev/null +++ "b/R\303\251seaux/kubernetes.md" @@ -0,0 +1,51 @@ +--- +layout: default +title: Kubernetes +parent: Réseaux +--- + +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) + +# Kubernetes + +## Historique [1] + +La méthode de déploiement de plusieurs applications à énormément évolué. Originellement, les applications étaient déployées sur le serveur physique. Cette solution a vite montré des limites de performances. Pour répondre à cette problématique, la virtualisation est apparue. Elle consiste à exécuter des applications dans des machines virtuelles (VMs) avec un système d'exploitation propre par-dessus l'OS hôte. Cela permet une structure évolutive et une sécurité plus importante par l'isolation des applications. Les VMs ont cependant encore un problème de ressource, chaque application nécessitant un Kernel. La conteneurisation est ensuite arrivée pour pallier à cela. Un conteneur est similaire à une VM dans son fonctionnement logique. la différence majeure est que les conteneurs sont exécutés sur l'OS hôte et non sur son propre OS. Cette avancée permet d'avoir des applications légères, une meilleure portabilité et une uniformité pour tous les environnements. + +## Qu'est ce que Kubernetes ? [1] [2] + +Kubernetes est un outil permettant la gestion de conteneurs. Il permet le déploiement et la restauration automatique de plusieurs applications sur plusieurs machines physiques disponibles dans le réseau Kubernetes. Il permet également la mise à l'échelle et facilite la mise à jour de ces applications. Toutes ses fonctionnalités ont pour objectif principal d'assurer une haute disponibilité et une gestion des ressources évolutive. + +Un environement Kubernetes, appelé Cluster, est composé de 1 ou plusieurs Node(s) ou nœud(s). Un nœud représente une machine physique du Cluster. Parmi les Nodes, au moins 1 doit servir de Master Node. Celui- où ceux-ci s'occupent, en plus des ressources applicatives déployées par le client, de gérer les composants nécessaires au fonctionnement du Cluster. Kubernetes propose un ensemble de ressources permettant la gestion des applications. L'unité de base de Kubernetes est un Pod. Il contient le ou les conteneurs nécessaires au fonctionnement de l'application, et se voit attribuer une adresse IP interne au Cluster. + +## Quelques concepts Kubernetes [1] [2] + +Comme expliqué ci-dessus, Kubernetes propose une multitude de concepts pour organiser une infrastructure d'applications. En voici une liste non exhaustive : + +1. Deployments + +Les Deployments, où déploiements, sont des ressources permettant de contrôler un Replication Set. Ce dernier est une couche supplémentaire permettant la gestion plusieurs Pods basés sur une même image. Alors que les ReplicaSet s'occupent d'assurer la disponibilité d'un certain nombre de répliques d'une application, un déploiement permet de gérer la mise à jour des Pods en garantissant la disponibilité de l'application. Il permet aussi de garder un historique des versions de l'application et d'y revenir au cas où une mise à jour s'avère non fonctionnelle. + +2. Stateful Sets + +Un Stateful Set est un contrôleur permettant d'assurer la persistance des données. Les Pods étant des unités non persistantes, et pouvant disparaitre à tout moment, il est parfois nécessaire de garder un certain nombre de données sur les serveurs. C'est notamment le cas pour des bases de données dont les données sont partagées sur un même volume. + +3. Service + +Un Service Kubernetes et une ressource permettant de faire le lien entre les différents Pods et l'extérieur. Il existe plusieurs types de services remplissant plusieurs objectifs différents. Les services de type NodePort ouvrent un port sur chaque Node du Cluster hébergeant l'application à laquelle le service est lié. Des services LoadBalancer vont eux utiliser un balanceur de charge externe pour rendre l'application disponible depuis l'extérieur. + +4. Volumes et Persistent Volumes + +Les Volumes permettent de créer des ressources partagées pour tous les conteneurs dans un pod. La durée de vie d'un Volume est liée à celle du Pod. Les Persistent Volumes ont eu un cycle de vie indépendant du pod auquel il est lié. Cela permet d'assurer une persistance des données même si un pod vient à disparaitre. + +## Bibliographie + +1. **Documentation Officielle Kubernetes**, Kubernetes, [What is Kubernetes?](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/), Dernière mise à jour le 4 avril 2022, consulté dernièrement le 7 mai 2022 + + **Résumé** : Présentation officielle de Kubernetes + **Avis sur la ressource** : Cette présentation explique clairement l'utilité de Kubernetes avec l'arrivée de la virtualisation ainsi que le fonctionnement de base de la technologie. + +2. **Introduction aux concepts de Kubernetes**, Digital Ocean, [An introduction to Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes), Justin Ellingwood, 1 octobre 2014 (dernière mise à jour le 2 mai 2018), consulté dernièrement le 7 mai 2022 + + **Résumé** : Explication d'un bon nombre des concepts et composants de Kubernetes + **Avis sur la ressource** : Ce site reprends beaucoup des concepts de Kubernetes avec une explication claire de chacun d'entre eux. From 061fd9453d229fb7ae833ada1147612ce4df4039 Mon Sep 17 00:00:00 2001 From: CastermaneRobin <55954496+CastermaneRobin@users.noreply.github.com> Date: Sun, 8 May 2022 10:47:25 +0200 Subject: [PATCH 023/241] Create Comparatif entre SIP et h323.md --- Comparatif entre SIP et h323.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Comparatif entre SIP et h323.md diff --git a/Comparatif entre SIP et h323.md b/Comparatif entre SIP et h323.md new file mode 100644 index 0000000..515ff05 --- /dev/null +++ b/Comparatif entre SIP et h323.md @@ -0,0 +1,26 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Titre + +## Sous-titre 1 + +Texte + + + +## Sous-titre 2 + +Texte + + + + + + +## Bibliographie + +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... + + + From 1074b893594dbd68241fe7faf02663ca38623434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Sun, 8 May 2022 12:35:17 +0200 Subject: [PATCH 024/241] [ADD] Adding corrections --- "R\303\251seaux/IAX.md" | 94 +++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 23 deletions(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 5fddcb4..c7fb69e 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -1,30 +1,30 @@ # Inter-Asterisk eXchange -IAX est un protocole VoIp produit et créé à la base pour le logiciel PBX « Asterisk ». Il est utilisé pour transmettre des sessions VoIp entre les serveurs et les machines des clients. +IAX est un protocole VoIP produit et créé à la base pour le logiciel PBX « Asterisk ». Il est utilisé pour transmettre des sessions VoIP entre les serveurs et les machines des clients. -## VoIp et Asterisk : +## VoIP et Asterisk : -IAX fait donc partie intégrante du système VoIp mis en place par le PBX Asterisk, mais qu’est-ce qu’Asterisk et la VoIp ? +IAX fait donc partie intégrante du système VoIP mis en place par le PBX Asterisk, mais qu’est-ce qu’Asterisk et la VoIP ? ### > Qu’est-ce qu’Asterisk ?: Asterisk est un logiciel PABX (Autocommutateur téléphonique privé) créé en 1999 par Mark Spencer. -Ce logiciel est très utilisé dans les entreprises ou les calls-centers et est à la base de nombreux autres logiciels de communication. Dû à sa popularité, il possède une grosse communauté. Il utilise le système VoIp pour transmettre toutes sortes de médias (voix, vidéo, images, etc) [[8](https://en.wikipedia.org/wiki/Asterisk)]. +Ce logiciel est très utilisé dans les entreprises ou les calls-centers et est à la base de nombreux autres logiciels de communication. Dû à sa popularité, il possède une grosse communauté. Il utilise le système VoIP pour transmettre toutes sortes de médias (voix, vidéo, images, etc) [[8](https://en.wikipedia.org/wiki/Asterisk)]. -### > Qu’est-ce que la VoIp ?: +### > Qu’est-ce que la VoIP ?: -VoIp sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix) en utilisant le protocole IP et donc via internet. +VoIP sont les initiales de « Voice over IP », et comme son nom l’indique, c’est de la téléphonie (transmission de voix) en utilisant le protocole IP et donc via internet. -La VoIp offre de nombreux avantages comparés à la téléphonie classique. En effet, le fait de ne plus avoir une ligne pour les données et une ligne pour la transmission des appels est assez révolutionnaire. Cette technologie permet donc de transmettre le tous (voix et données) sur le même type de support. La VoIp devient également un standard dans les entreprises dû à son cout réduit pour son installation et son entretient. +La VoIP offre de nombreux avantages comparés à la téléphonie classique. En effet, le fait de ne plus avoir une ligne pour les données et une ligne pour la transmission des appels est assez révolutionnaire. Cette technologie permet donc de transmettre le tout (voix et données) sur le même type de support. La VoIP devient également un standard dans les entreprises dû à son cout réduit pour son installation et son entretien. ## Principales caractéristiques d’IAX : -IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiques et en quoi est-il différent des autres protocoles VoIp ? +IAX est utilisé en téléphonie sur IP, mais quelles sont ses caractéristiques et en quoi est-il différent des autres protocoles VoIP ? -### > Avantages comparé à la VoIp classique : +### > Avantages comparé à la VoIP classique : -- **Ports** : En VoIp classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. +- **Ports** : En VoIP classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. - **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. De fil en aiguille, cela inclut une réduction de la bande passante utilisée. @@ -33,31 +33,69 @@ IAX est utilisé en téléphonie sur IP, mais qu’elles sont ses caractéristiq - **Rapidité** : Ces trois premiers avantages apportent donc une vitesse pour la communication qui est plus importante qu’avec d'autres protocoles comme SIP par exemple. - **Protocole binaire** : - Le fait que AIX soit un [protocole binaire](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts) apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. + Le fait que AIX soit un [**protocole binaire**](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts) apporte un grand plus point de vue sécurité, en effet il est plus difficile de trouver des failles. SIP est quant à lui un exemple de protocole basé sur du texte [[5](https://www.voip-info.org/iax-versus-sip/#:~:text=1)]. ### > Défauts de IAX : -Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le protocole le plus utilisé pour la VoIp. +Malgré ces avantages, IAX n’est pas autant utilisé que SIP, qui est le protocole le plus utilisé pour la VoIP. -Nous allons donc voir quels sont les défauts d’IAX qui seraient la raison pour laquelle SIP est toujours une base solide pour faire de la VoIp. +Nous allons donc voir quels sont les défauts d’IAX qui seraient la raison pour laquelle SIP est toujours une base solide pour faire de la VoIP. - **Construit sur base d’un système Asterisk** : Bien qu’une portabilité soit envisageable vers d’autres systèmes que celui d’Asterisk, le fait que IAX a été créé à la base pour ce dernier apporte un problème. En fait, il est impossible d’utiliser IAX sans un router typé Asterisk . Cela pointe l’un des plus gros défauts de IAX, il n’est pas très polyvalent et adaptatif, là où des protocoles comme SIP le sont beaucoup plus. La dépendance à Asterisk est aussi ce qui rend ce protocole moins flexible que SIP ou MGCP, car le protocole n’a pas été conçu dans le même but. -- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [attaques par déni de service](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts). +- **Sensible au déni de service** : L'une des forces d'IAX est aussi une de ses faiblesses. En effet, comme ce protocole n'utilise qu'un port qui est bien connu, il est sensible aux [**attaques par déni de service**](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts). + +## Caractéristiques techniques: + +### > Protocoles: + +Au lieux d'utiliser RTP, IAX utilise UDP sur un seul port (le 4569) comme précisé précédemment. +Toute la partie signalisation est gérée en couche 2 (Liaison de données). + +### > Structure des données: + +IAX envoit des paquets avec la structure suivante: + +- 20 octets pour l'entête IP (**=** autres protocoles), +- 8 octets pour l'entête UDP (**=** autres protocoles), +- 4 octets pour le "**_mini-entête_**" de IAX ( au lieux de 12 octets pour les autres protocoles), +- Le payload dont la taille varie selon le [**codec**](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts). + +C'est cette structure qui diminue l'utilisation de la bande passante. Cette "mini-entête" IAX apporte un gros plus car moins de données sont échangées et donc moins de bande passante est utilisée. ## **Concepts**: ### C01 - Attaque par déni de service: -Une attaque par déni de service (appellé DOS en anglais) consiste à rendre indisponible un service et donc d'empêcher les utilisateurs de l'utiliser. De manière générale, cette attaque consiste à surcharger un réseau ou un serveur en s'y connectant et en envoyant des requêtes avec une quantité importante d'appareils.[[7](https://fr.wikipedia.org/wiki/Attaque_par_déni_de_service)] +Une attaque par déni de service (appellé DoS en anglais) consiste à rendre indisponible un service et donc d'empêcher les utilisateurs de l'utiliser. De manière générale, cette attaque consiste à surcharger un réseau ou un serveur en s'y connectant et en envoyant des requêtes avec une quantité importante d'appareils.[[7](https://fr.wikipedia.org/wiki/Attaque_par_déni_de_service)] ### C02 - Protocoles binaires: Il existe deux types de protocoles; des protocoles binaires où les informations sont transmises sous une forme où le protocole utilise toutes les valeurs d'un octet. Et d'un autre coté, les protocoles dit basé sur du texte, transmettent eux des valeurs qui correspondent à des caractères lisibles par l'être humain (par exemple de l'ASCII) [[6](https://en.wikipedia.org/wiki/Communication_protocol#:~:text=A%20binary%20protocol%20utilizes%20all,rather%20than%20a%20human%20being)]. +### C03 - Codecs: + +Les codecs sont des manières d'encoder l'information transmise qui détermines la qualité audio, la bande-passante, la compression de la voix, etc. + +Il sont généralement caractérisé par 3 choses: + +- Le taux d'échantillonnage +- Le débit binaire +- La bande-passante utilisée + +En VoIP il en existe plusieurs, les 3 plus connus sont: + +1. **G.711**, inventé en 1972, il propose une qualité sonore élevée mais requière une assez grosse bande-passante. + +2. **G.722HD**, c'est un codec dit Haute-Définition (HD) qui fut créé en 1988. + +3. **G.729**, c'est l'un des codecs les plus légé en bande-passante et avec une qualité audio résonable. + +Source => [9](https://www.nextiva.com/blog/voip-codecs.html#:~:text=A%20VoIP%20codec%20is%20a,two%20terms%3A%20Compression%20and%20Decompression.) + ## **Bibliographie:** -### - 1 https://speetis.fei.tuke.sk/KomunikacnaTechnika1/prednasky/26_9_2016/ST_ASTERISK_3_12_2013/Asterisk/Inter-Asterisk%20Exchange%20(IAX).pdf +### - [1]() Titre: Inter-Asterisk eXchange: Deployement scenariosin SIP-enabled nteworks @@ -67,7 +105,7 @@ Date de parution: 2009 Date de visite: 29/04/2022 -### - 2 https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange +### - [2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange) Titre: Inter-Asterisk eXchange @@ -77,7 +115,7 @@ Date de parution: 7 Novembre 2021 Date de visite: 27/04/2022 -### - 3 https://www.voip-info.org/iax-versus-sip/. +### - [3](https://www.voip-info.org/iax-versus-sip/.) Titre: IAX (Inter-Asterisk Exchange Protocol) @@ -87,7 +125,7 @@ Date de parution: 1 Juin 2005 Date de visite: 23/04/2022 -### -4 https://askanydifference.com/difference-between-sip-and-iax/ +### - [4](https://askanydifference.com/difference-between-sip-and-iax/) Titre: Difference Between SIP and IAX (With Table) @@ -97,7 +135,7 @@ Date de parution: ? Date de visite: 28/04/2022 -### - 5 https://www.voip-info.org/iax-versus-sip/#:~:text=1) +### - [5](https://www.voip-info.org/iax-versus-sip/#:~:text=1) Titre: IAX versus SIP @@ -107,7 +145,7 @@ Date de parution: 1 juin 2005 Date de visite: 23/04/2022 -### - 6 https://en.wikipedia.org/wiki/Communication_protocol#:~:text=A%20binary%20protocol%20utilizes%20all,rather%20than%20a%20human%20being. +### - [6](https://en.wikipedia.org/wiki/Communication_protocol#:~:text=A%20binary%20protocol%20utilizes%20all,rather%20than%20a%20human%20being.) Titre: Communication protocol @@ -117,7 +155,7 @@ Date de parution: 26 Avril 202 Date de visite: 1/05/2022 -### - 7 https://fr.wikipedia.org/wiki/Attaque_par_déni_de_service +### - [7](https://fr.wikipedia.org/wiki/Attaque_par_déni_de_service) Titre: Attaque par déni de service @@ -127,7 +165,7 @@ Date de parution: 1 avril 2022 Date de visite: 1/05/2022 -### - 8 https://en.wikipedia.org/wiki/Asterisk +### - [8](https://en.wikipedia.org/wiki/Asterisk) Titre: Asterisk @@ -136,3 +174,13 @@ Auteur: Wikipedia Date de parution: 4 mai 2022 Date de visite: 25/04/2022 + +### - [9](https://www.nextiva.com/blog/voip-codecs.html#:~:text=A%20VoIP%20codec%20is%20a,two%20terms%3A%20Compression%20and%20Decompression.) + +Titre: What Are VoIP Codecs & How Do They Affect Call Sound Quality? + +Auteur: JEREMIAH ZERBY + +Date de parution: 16 novembre 2020 + +Date de visite: 08/05/2022 From 7e3d46505d28bc1c5b9d8cc0188133a198da0191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Sun, 8 May 2022 12:40:34 +0200 Subject: [PATCH 025/241] [ADD] --- "R\303\251seaux/IAX.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 0158139..db12c3c 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -65,6 +65,12 @@ IAX envoit des paquets avec la structure suivante: C'est cette structure qui diminue l'utilisation de la bande passante. Cette "mini-entête" IAX apporte un gros plus car moins de données sont échangées et donc moins de bande passante est utilisée. +### > Échange type: + +Voici un exemple d'échange type lors d'une communication avec le protocole IAX: + +### **Explications:** + ## **Concepts**: ### C01 - Attaque par déni de service: From ff5b5f0f29fe75b2e228e375b4789e6399bf7f28 Mon Sep 17 00:00:00 2001 From: Pourbaix <71372371+Pourbaix@users.noreply.github.com> Date: Sun, 8 May 2022 15:12:52 +0200 Subject: [PATCH 026/241] Update IAX.md --- "R\303\251seaux/IAX.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index db12c3c..c7f821a 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -63,6 +63,11 @@ IAX envoit des paquets avec la structure suivante: - 4 octets pour le "**_mini-entête_**" de IAX ( au lieux de 12 octets pour les autres protocoles), - Le payload dont la taille varie selon le [**codec**](https://github.com/Pourbaix/Wiki-TI/blob/main/R%C3%A9seaux/IAX.md#concepts). +![image](https://user-images.githubusercontent.com/71372371/167297794-8ca673cb-c247-4b8d-8fe3-4b2b8467bb9e.png) + + +[SOURCE](https://www.semanticscholar.org/paper/A-Comparative-Study-between-Inter-Asterisk-Exchange-Aliwi-Sumari/58eb892d9574cd17312ce98adc9e7009695e3094/figure/3) + C'est cette structure qui diminue l'utilisation de la bande passante. Cette "mini-entête" IAX apporte un gros plus car moins de données sont échangées et donc moins de bande passante est utilisée. ### > Échange type: From b6f7562cd7e8e48ecd8326d3b33b5fb7335e24e8 Mon Sep 17 00:00:00 2001 From: Pourbaix <71372371+Pourbaix@users.noreply.github.com> Date: Sun, 8 May 2022 15:14:39 +0200 Subject: [PATCH 027/241] Update IAX.md --- "R\303\251seaux/IAX.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index c7f821a..70815d5 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -74,6 +74,9 @@ C'est cette structure qui diminue l'utilisation de la bande passante. Cette "min Voici un exemple d'échange type lors d'une communication avec le protocole IAX: +![6-Figure1-1](https://user-images.githubusercontent.com/71372371/167297870-0d01989d-a751-4145-add1-67474aea5d07.png) + + ### **Explications:** ## **Concepts**: From 126a676099e360a9ec772863be66cd27274c4af6 Mon Sep 17 00:00:00 2001 From: CastermaneRobin <55954496+CastermaneRobin@users.noreply.github.com> Date: Sun, 8 May 2022 15:18:07 +0200 Subject: [PATCH 028/241] Update Comparatif entre SIP et h323.md --- Comparatif entre SIP et h323.md | 127 ++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 8 deletions(-) diff --git a/Comparatif entre SIP et h323.md b/Comparatif entre SIP et h323.md index 515ff05..6053f43 100644 --- a/Comparatif entre SIP et h323.md +++ b/Comparatif entre SIP et h323.md @@ -1,26 +1,137 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) -# Titre +# Comparatif entre SIP et h323 -## Sous-titre 1 +## 1. Introduction +### 1.1 Qu’est-ce que le protocole SIP : -Texte +       La « Session Initiation Protocol » (SIP) est un protocole TCP/IP de couche application normalisée et standardisé par l’IETF*. Il s’agit d’un protocole de communication standard couramment utilisé dans les télécommunications multimédias, mais est le plus fréquent dans la téléphonie par internet (la VoIP*). +       Le protocole SIP permet d’établir une « sessions » entre deux ou plus de participants, de modifier cette session et finalement de mettre fin à cette session. +       Par défaut, ce protocole est supporté sur le port 5060 par TCP ou UDP et pour sa version sécurisé, SIP-TLS, sur le port 5061 par défaut. Il fonctionne aussi bien avec l’IPv4 qu’avec l’IPv6. -## Sous-titre 2 +       SIP est un protocole de type « requête-réponse ». Celui-ci est similaire aux protocoles internet tel que http et SMTP. -Texte +       SIP prend en charge cinq aspects afin de réaliser un établissement et une terminaison de communications multimédia : + * Localisation de l’utilisateur + * Disponibilité de l’utilisateur + * Capacités de l’utilisateur + * Établissement d’une session + * Gestion d’une session +### 1.2 Qu’est-ce que le protocole H.323 : +       Comme le SIP, le H.323 est un protocole conçu pour initier, gérer et terminer des sessions médias. + +       Existant depuis 1996, Il est considéré comme assez ancien. C’est un protocole binaire et se fait remplacer par le SIP. + +       Il utilise le numéro de port TCP 1720. + +       Il ressemble davantage à une combinaison de plusieurs protocoles différents qui peuvent être regroupés en trois catégories : + +* La signalisation +* La négociation de codec +* Le transport de l’information + +## 2. Comparaison entre ces deux protocoles +### 2.1 Codage des messages : + +       Les messages H323 sont encodés dans un format binaire compact. Les messages sont efficacement codés et décodés par des machines (codec). Alors que ceux du protocole SIP, sont plus faciles à lire par l’homme, ils sont encodés au format ASCII. L’avantage du SIP est qu’il ressemble aux protocoles http/SMTP et est beaucoup plus simple que le H323. Cela rend le H323 moins convivial pour les techniciens dans un environnement de dépannage. + +       Ils utilisent tous les deux le protocole RTP* comme protocole de transfert des données multimédia. + +       Le SIP est plus léger car il est basé sur une approche similaire au protocole http. + +### 2.2 En terme de temps : + +       Ces deux protocoles de communication, SIP et H323, ont été introduits à peu près au même moment. L’internet Engineering Task Force (IETF) a développé le protocole SIP basé sur le H323. Comparé au H323, SIP est plus simple, plus évolutif et plus étroitement lié aux applications Internet existantes. + +### 2.3 Utilisation : + +       SIP et H323 sont des protocoles de communications utilisés pour les appels multimédia et la téléconférence sur des réseaux basés sur le protocole Internet. + +       D’autres communications multimédias sont prises en charge par SIP telles que la messagerie instantanée, les jeux en ligne et même le partage de fichiers. + +       Cependant, H323 se concentre uniquement sur la conférence multimédia. + +### 2.4 Utilisation technique : + +| Comparatif | SIP | H323 | +| :--- | :--- | :--- | +| Nombre d'échange pour établir la connexion | 1,5 aller-retour | 6 à 7 aller-retour | +| Maintenance du code protocolaire | Simple par sa nature textuelle à l'exemple de Http | Complexe et nécessitant un compilateur | +| Evolution du protocole | Protocole ouvert à des nouvelles fonctions | Ajout d'extensions propriétaires sans concertation entre vendeurs | +| Fonction de conférence | Distribuée | Centralisée par l'unité MC | +| Fonction de téléservices | Oui, par défaut | H.323 V2 + H.450 | +| Détection d'un appel en boucle | Oui | Inexistante sur la version 1, un appel routé sur l'appelant provoque une infinité de requêtes | +| Signalisation multicast | Oui, par défaut | Non | + + +### 2.5 Fiabilité : + +       H323 est plus fiable que SIP en raison de sa capacité à gérer les défaillances des connexions et des périphériques réseau, tandis que SIP manque de mécanismes de détection et de récupération des défaillances. + +       H323 défini un certain nombre de fonctionnalités pour gérer la défaillance des entités de réseau intermédiaire. SIP ne définit pas de procédures en cas de panne d’équipement. + +       Le fait que H323 ait une portée limitée le rend moins complexe que SIP. + +       H323 présente d’autres avantages tels que la fiabilité, la traversée NAT, l’adressage flexible et l’équilibrage de charge sur SIP. +## 3. Conclusion + +       Bien que le protocole H.323 et le protocole SIP proposent deux ensembles de structures de systèmes téléphonies IP, ils poursuivent les mêmes objectifs. + +       Le protocole SIP peut être utilisé à de nombreuses fins de communication multimédia, telles que les jeux en ligne, la messagerie instantanée et le partage de fichiers, en plus de l'application prévue pour la conférence multimédia. Cependant, H323 est limité à la conférence multimédia. + +       Ils sont développés et modifiés séparément en fonction des différents systèmes d'application de développement. + +       La flexibilité et la simplicité du protocole SIP lui a permis de remplacer quasiment la totalité du protocole H.323 dans le monde de la VoIP. + + +### Définition en large permettant de comprendre certains concepts : + + +| Sujet | Définition | +| :--- | :--- | +| *VoIP | « Voice Over Internet Protocol », permet la transmission de la voix par internet. | +| *IETF | Ils produisent la plupart des nouveaux standards d’Internet. | +| *RTP | est un protocole de communication informatique permettant le transport de données | +| RTCP | il va de pair avec le RTP, il transmet les paquets de contrôle au participant d’un appel. C’est-à-dire de donner un feedback sur la qualité du service fourni par le RTP. | ## Bibliographie -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... +* [3CX-VoIp-SIP](https://www.3cx.fr/voip-sip/sip/), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) + - Résumé : Définition du protole SIP et de la VoIP. + - Avis sur la ressource : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. + +* [Wikipédia-SIP](https://fr.wikipedia.org/wiki/Session_Initiation_Protocol), Wikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) + - Résumé : Article résumant les informations éssentiel du protocole SIP. + - Avis sur la ressource : Encyclopédie libre régulièrement mise à jour + + +* [Goffinet François-SIP](https://sip.goffinet.org/sip/architecture/), François Goffinet, 2021, consulté le (8/05/2022) + - Résumé : Explication détaillé de l'architecture SIP + - Avis sur la ressource : Rédigé par un formateur IT, écrivains, professionel avec de l'expérience dans le métiers depuis de nombreuses années [LinkedIn](https://www.linkedin.com/in/fegoffinet/) + + + +* [Wikipédia-H.323](https://fr.wikipedia.org/wiki/H.323#:~:text=323%20regroupe%20un%20ensemble%20de,est%20publi%C3%A9e%20en%20novembre%201996.), WWikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) + - Résumé : Article résumant en large les informations du protocole H.323. + - Avis sur la ressource : Encyclopédie libre régulièrement mise à jour + + + +* [Techno-Science.net](https://www.techno-science.net/definition/1369.html), Tecnho-Science/Wikipédia, mis en ligne en 2004, consulté le (8/05/2022) + - Résumé : Ce site explique et définit l'utilisation du protocole H.323 dans ses débuts. + - Avis sur la ressource : c'est un site d'information sur l'actualité des sciences et des technologies édité par l'association Techno-Science.net + + + +* [3CX-RTCP](https://www.3cx.fr/voip-sip/rtcp/#:~:text=Le%20RTCP%20signifie%20Real%20Time,aux%20participants%20d'un%20appel), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) + - Résumé : Définition du protole RTCP. + - Avis sur la ressource : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. From 3501a58f8d0534e66220693638ebf02e359d3ac4 Mon Sep 17 00:00:00 2001 From: CastermaneRobin <55954496+CastermaneRobin@users.noreply.github.com> Date: Sun, 8 May 2022 15:21:48 +0200 Subject: [PATCH 029/241] =?UTF-8?q?hi=C3=A9rarchie=20du=20fichier=20wiki?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Comparatif entre SIP et h323.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Comparatif entre SIP et h323.md => "R\303\251seaux/Comparatif entre SIP et h323.md" (100%) diff --git a/Comparatif entre SIP et h323.md "b/R\303\251seaux/Comparatif entre SIP et h323.md" similarity index 100% rename from Comparatif entre SIP et h323.md rename to "R\303\251seaux/Comparatif entre SIP et h323.md" From ccc23ed286001664e5353cd93bce1ffa08a8cffa Mon Sep 17 00:00:00 2001 From: TommyRiquet Date: Sun, 8 May 2022 17:35:12 +0200 Subject: [PATCH 030/241] Correction et ajout des informations en tenant compte du feedback --- "R\303\251seaux/dnssec.md" | 195 ++++++++++++++++++++++++++++--------- 1 file changed, 148 insertions(+), 47 deletions(-) diff --git "a/R\303\251seaux/dnssec.md" "b/R\303\251seaux/dnssec.md" index fd62d0c..0a92de7 100644 --- "a/R\303\251seaux/dnssec.md" +++ "b/R\303\251seaux/dnssec.md" @@ -6,62 +6,153 @@ parent: Réseaux # DNSSEC ( Domain Name System Security Extensions) -## **Qu'est-ce que le 'DNSSEC' et quelle est son histoire ?** +## Histoire du DNSSEC -¹ Tout commence lorsque le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) a découvert des failles de sécurité dans le DNS en 1990. Il va alors publier ses découvertes en 1995, mais c'est seulement 2 ans après que le [IETF](https://www.ietf.org/), un groupe chargé d'élaborer et de promouvoir des standards Internet, va considerer ses failles de sécurité et publier la [RFC 2065](https://datatracker.ietf.org/doc/html/rfc2065) qui sera ensuite revu et corrigé pour donner la [RFC 2535](https://datatracker.ietf.org/doc/html/rfc2535) en 1999. Le DNSSec fut donc plannifier sur cette RFC ###### https://en.wikipedia.org/wiki/Steven_M._Bellovin -![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Steven_M_Bellovin_2016.jpg/220px-Steven_M_Bellovin_2016.jpg) -Cette dernière était censée être complêtement fonctionnel et corrigé tous les problèmes et failles de sécurité que le Docteur Steven M. Bellovin avait précédement découvert, mais le DNSSec basé sur la RFC 2535 avait trop de difficulté à gérer le système de clé, il demandait beaucoup trop de ressources pour faire de simples échanges. -C'est en 2005, soit 10 ans après que les travaux du Docteur Steven M. Bellovin soit rendu publique, que l'IETF publie le DNSSec-bis, DNSSEC de nos jours, basé sur deux nouvelles RFCs, la [4033](https://datatracker.ietf.org/doc/html/rfc4033) et la [4035](https://datatracker.ietf.org/doc/html/rfc4035). Et ça fonctionne! +![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Steven_M_Bellovin_2016.jpg/220px-Steven_M_Bellovin_2016.jpg) + Tout commence en 1990, lorsque le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) a découvert des failles de sécurité dans le protocole DNS¹. Il a remarqué qu'il était très facile pour une personne malveillante de rediriger un utilisateur vers un autre site web. -## **Petit rappel sur le fonctionnement du DNS** -###### https://kinsta.com -![](https://kinsta.com/fr/wp-content/uploads/sites/4/2019/02/que-sont-dns.png) +Il faut savoir que le DNS n'avait aucun système de sécurité car Internet était très loin d'être le géant qu'il est aujourd'hui et le seul moyen pour un résolveur de vérifier les informations qu'il recevait était de comparer l'adresse IP source d'une réponse avec l'adresse IP de la requête, ce qui n'est pas du tout sécurisé de part la facilité à falsifier celles-ci. + +Les trois principales failles de sécurité découvertes par le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) sont le "DNS Spoofing", le "DNS Cache poisoning" et la "man-in-the-middle attack". + +**Qu'est-ce que le DNS Spoofing / DNS Cache Poisoning⁵ ?** +Le DNS Spoofing (usurpation DNS en français) est l'action de rediriger un utilisateur vers un site web malveillant afin de lui soutirer des informations privées, telles que des mots de passe ou des numéros de carte de crédit. +Les attaquants se font passer pour le serveur autoritaire d'un site web afin d'empoisonner le cache d'un résolveur pour y mettre de fausses informations, de sorte que celui-ci renvoie une adresse IP incorrecte aux utilisateurs et ainsi les redirige au mauvais endroit. -⁶ Le DNS fonctione grâce à une hiérarchisation de domaine et de sous-domaines, dont le sommet est appellé la racine et est représenté par un point. -Chaque domaine et sous-domaine peut ensuite créer une délégation ([voir Délégation DNS](https://epheclln.github.io/Wiki-TI/R%C3%A9seaux/delegation_dns.html)) et ainsi de suite. +###### BLUECATNETWORKS, _Kyle Roblyer_ , 25 Novembre 2019, [en ligne] https://bluecatnetworks.com/blog/what-is-dns-poisoning-how-to-prevent-it/ + + +**Qu'est-ce que l'Attaque de l'homme du milieu⁹ ?** +L'attaque de l'homme du milieu (man-in-the-middle attack en anglais) n'a rien à voir avec la terre du même nom, mais consiste plutôt à intercepter/relayer la communication entre deux parties. +L'attaquant a donc le contrôle direct sur les informations et peut donc décider de les modifier à sa guise. Cette attaque est très souvent utilisée pour rediriger des utilisateurs lambda vers des sites web frauduleux. +###### MALWAREBYTES, Blog, [en ligne] https://blog.malwarebytes.com/101/2018/07/when-three-isnt-a-crowd-man-in-the-middle-mitm-attacks-explained/ + +
+ +### **Et comment peut-on empêcher ces attaques ?** +Ces attaques ont tous un point en commun en terme de sécurité, c'est que le résolveur n'a aucun moyen de savoir si les informations qu'il reçoit sont correctes car il ne sait pas avec quelle machine il communique. Il nous faut donc un système pour authentifier les machines DNS afin d'empêcher quiconque de s'immiscer entre les mailles du filet . +C'est ainsi que le DNSSEC fut inventé en se basant sur la cryptographie à clé publique . -Nous utilisons donc un résolveur pour faire des requêtes récursives, afin d'intérroger un par un, en partant de la racine, les Name Servers jusqu'a trouver l'adresse IP correspondant à notre requête. + +## **Petit rappel sur le fonctionnement du DNS⁶** +Le but du protocole DNS est de mettre en oeuvre des mécanismes afin de faire correspondre un nom de domaine et une adresse IP. +Celui-ci fonctionne grâce à une hiérarchisation de domaines et de sous-domaines, dont le sommet est appelé la racine et est représenté par un point. +Chaque domaine et sous-domaine peut ensuite créer une délégation ([voir Délégation DNS](https://epheclln.github.io/Wiki-TI/R%C3%A9seaux/delegation_dns.html)) et ainsi de suite. + + +Nous utilisons donc un résolveur pour faire des requêtes récursives, afin d'interroger un par un, en partant de la racine, les "Name Servers" jusqu'à trouver l'adresse IP correspondante à notre requête. -``` -Example de domaine de premier niveau : com, org, net... -Example de domaine de second niveau : wikipedia, youtube, ephec... -Example de sous-domaine : www, eperso, b2b... -``` -## **Fonctionnement du DNSSEC** -### _Chain of Trust_ -Le DNSSEC fonctione à l'aide un système de chaine de confiance⁵ (en Anglais 'Chain of Trust') qui valide les Name Servers sur base d'une signature numérique basées sur la cryptographie à clé publique d'un serveur parent. Le NS pourra donc obtenir un certificat de confiance signé par le parent, et ainsi de suite jusqu'à ce que l'entièreté de la chaine soit certifié. -Le premier certificat fut approuvé par l'ICANN en 2010 pour le Root Server. -###### https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html -![](https://blog.resellerspanel.com/wp-content/uploads/2017/02/dnssec-ds-records.jpg) -Tout Résolveur récursif voulant accéder aux données d'une zone n'aura qu'a récupérer la clé publique de cette même zone afin de valider l'authenticité des données , le résolveur confirme la signature numérique des données qu'il a récupéré à l'aide de cette même clé. Si celle-ci sont valides , les données sont légitimes et sont renvoyées au client.Dans le cas contraire, il s'agit probablement d'une attaque et les données sont écartés et une erreur est renvoyé à l'utilisateur. -Mais comment être sur de ne pas avoir reçu une mauvaise clé publique ? -C'est simple, la clé publique est elle-même signé, mais pas par la clé privé de cette même zone, par la clé privé de la zone parent. +![](https://www.nameshield.com/wp-content/uploads/2020/03/DNS-768x419.png) +###### NameSchield, [en ligne] https://www.nameshield.com/ressources/lexique/dns-domain-name-system/ + + +Prenons un exemple avec 'www.wikipedia.org'; +- Notre Internaute veut accéder à la page Internet avec l'url 'www.wikipedia.org', il va alors interroger son résolveur pour lui demander l'adresse IP du Serveurs autoritaire de 'wikipedia.org' +- La première requête de notre résolveur va nous faire interroger le serveur Racine, qui va nous renvoyer l'adresse IP du NS '.org'. +- La deuxième requête va ensuite interroger le NS '.org' qui va nous renvoyer l'IP du NS 'wikipedia.org' +- La troisième requête va ensuite interroger le NS de 'wikipedia.org' qui va nous répondre avec l'adresse IP de 'www.wikipedia.org'. +- Notre résolveur renvoie l'adresse IP du serveur autoritaire de wikipedia.org à notre Internaute. + + + +## **Fonctionnement du DNSSEC** +### **Sécurisation d'une zone⁸** +- Tout d'abord, des Ressource Records de même type (A,AAAA,MX...) sont regroupés ensemble dans un RRset. +- Chaque Serveur DNS génère une paire de clés ZSK (**Z**one **S**ignature **K**ey) et une paire de clés KSK(**K**ey **S**ignature **K**ey). +- La ZSK privée est utilisée pour signer le RRset et stocke la signature dans un RRSIG. + +
+
+ +###### CLOUDFLARE, [en ligne] https://www.cloudflare.com/fr-fr/dns/dnssec/how-dnssec-works/ + +- La ZSK publique est stockée dans un Ressource Record "DNSKEY" et utilisée pour vérifier la signature . +- La KSK publique est stockée dans un Ressource Record "DNSKEY" . +- Ces deux RR 'DNSKEY' sont rassemblées dans un RRset . +- La KSK privée est utilisée pour signer le RRset "DNSKEY" et stocke la signature dans un autre RRSIG . + +
+ +###### CLOUDFLARE, [en ligne] https://www.cloudflare.com/fr-fr/dns/dnssec/how-dnssec-works/ +
+ +Pour l'instant, le serveur de nom agit de manière indépendante, il faut trouver un moyen de propager la confiance entre les serveurs . +C'est ce qu'on appelle la _Chain of Trust_. -**Exemple :** -La zone ``ephec.be`` possède donc une clé publique signée par la zone ``be``, celle-ci est donc responsable de l'authenticité de la clé publique de la zone ``ephec.be``. -Toute zone parent est donc responsable des clés publiques de ses zones enfant.Et toute clé publique d'une zone est donc signée par la zone parent, mise à part la zone ``Root``, qui ne possède pas de zone parent. +### **Chain of Trust⁷** +Le DNSSEC fonctionne à l'aide d'un système de chaîne de confiance⁵ (en Anglais 'Chain of Trust') qui valide les serveurs DNS sur base de leurs RRSIG. Le NS pourra donc obtenir un certificat de confiance signé par le parent, et ainsi de suite jusqu'à ce que l'entièreté de la chaîne soit certifiée. +Lorsque une zone enfant termine sa sécurisation, elle hache son RRset DNSKEY et l'envoie à la zone parent pour qu'elle l'ajoute en tant qu'enregistrement DS(Delegation Signer) dans ses Ressources Records. Celui-ci va ensuite repasser dans le processus de sécurisation de la zone parent . Et ainsi de suite jusqu'au "Root Server", dont le certificat fut approuvé manuellement par l'ICANN en 2010. +
+**Exemple de requête :** +###### RessellersPanel, [en ligne] , https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html +![](https://blog.resellerspanel.com/wp-content/uploads/2017/02/dnssec-ds-records.jpg) +- Un utilisateur essaie de joindre "www.DOM.com", il va alors contacter la Zone Racine +- La Zone Racine va alors vérifier la zone ".com" avec sa KSK publique +- La zone ".com" va vérifier le RR de la zone "DOM.com" +- La zone "DOM.com" va finalement vérifier le RR de "www.DOM.com" +- Le RR est ensuite renvoyé à l'utilisateur -## **Pourquoi le DNSSEC est-il important ?** -⁵ Le DNSSec est très important dans la sécurisation du service DNS en général, il permet d'éviter qu'un intru se glisse dans la chaine et renvoie une autre adresse IP pour une requête, c'est ce qu'on appele du 'DNS Cache Poisoning'. +### **Ressource Record DNSSEC** +Exemple de Ressource Record 'DNSKEY' : +``` +ephec.com. 3600 IN DNSKEY 257 3 13 gkfdFDSdsfl21VC== +``` -**_Qu'est-ce que le DNS Cache poisoning ?_** -L'empoisonnement du cache DNS (ou DNS Spoofing en anglais) consiste à empoisonner le cache d'un serveur DNS pour y mettre de fausses informations, de sorte que le résolveur renvoie une adresse IP incorrecte aux clients et ainsi le rediriger au mauvais endroit . -###### https://bluecatnetworks.com/ -![](https://bluecatnetworks.com/wp-content/uploads/2020/10/DNS-Poisoning.png) +| Nom | TTL | Class | Type de RR | Flags | Protocole | Algorithme | Clé Publique | +|---|---|---|---|---|---|---|---| +| ephec.com. | 3600 | IN | DNSKEY | 257 | 3 | 6 | gkfdFDSdsfl21VC== | + +- Les 4 premiers champs définissent le nom de domaine de la zone à qui appartient la clé publique +- Le champ "Flags" indique des informations supplémentaires +- Le champ "Protocole" est toujours égal à 3 pour le DNSSEC +- Le champ "Algorithme" correspond à l'algorithme utilisé pour le chiffrement de la clé publique + +Exemple de Ressource Record 'RRSIG' : +``` +ephec.com. 3600 IN RRSIG A 5 2 fd3Fsd5G43dsqlm=) +``` + +| Nom | TTL | Class | Type de RR | Type Covered | Algorithme | Nombre de label | Signature | +|---|---|---|---|---|---|---|---| +| ephec.com. | 3600 | IN | RRSIG | A | 5 | 2 | fd3Fsd5G43dsqlm=) | + +- Les 4 premiers champs définissent le nom, le TTL(Time to Leave), la classe et le type de Ressource Record +- Le champ "Type Covered" indique le type de RR couvert par la signature +- Le champ "Algorithme" indique l'algorithme utilisé pour créer la signature +- Le champ "Nombre de label" correspond au nombre de label dans le nom => "ephec.com" = 2 (ephec / com) + +Exemple de Ressource Record 'DS' : +``` +ephec.com. 3600 IN DS 2371 13 2 3K12J312LK321L +``` + +| Nom | TTL | Class | Type de RR | Tag de clé | Algorithme | Type de hash | Valeur du hash | +|---|---|---|---|---|---|---|---| +| ephec.com. | 3600 | IN | DS | 2371 | 13 | 2 | 3K12J312LK321L | + +- Les 4 premiers champs définissent le nom, le TTL(Time to Leave), la classe et le type de Ressource Record +- Le champ "Tag de clé" indique un nombre qui identifie la référence du record DNSKEY +- Le champ "Algorithme" indique l'algorithme utilisé pour le RR DNSKEY +- Le champ "Type de hash" correspond à l'algorithme de hash cryptographique utilisé pour créer le hash ## **Avenir du DNSSEC ?** -Le DNSSec est très important dans la sécurisation du DNS, on a remarqué que sans celui-ci, de nombreuses fraudes et attaques pouvaient avoir lieu. -La popularité de celui-ci augmente peu à peu chaque année³ et d'après moi le DNSSec deviendra un standard de la sécurisation, tout comme HTPPS, et tout le monde l'utilisera d'ici quelques années. +Le DNSSec est très important dans la sécurisation du DNS. +On a remarqué que sans celui-ci, de nombreuses fraudes et attaques pouvaient avoir lieu. +Sa popularité augmente peu à peu chaque année³ et d'après moi le DNSSec deviendra un standard de la sécurisation, tout comme HTPPS. + + +

## **Bibliographie** + * 1 : Wikipedia, [Wikipedia - Domain Name System Security Extensions ](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions), Apr. 2022, consulté le 26 Avril 2022 @@ -72,34 +163,44 @@ La popularité de celui-ci augmente peu à peu chaque année³ et d'après moi l * 2 : dnssec, [ DNSSEC: DNS Security Extensions Securing the Domain Name System ](https://www.dnssec.net/), Sept. 2018, consulté le 26 Avril 2022 **Résumé** : Page Officiel du DNSSEC - **Avis sur la ressource** : Il s'agit de la page Officiel en anglais du DNSSEC. Même si le design n'est pas parfait, c'est toujours utile. + **Avis sur la ressource** : Il s'agit de la page officiel en anglais du DNSSEC. Même si le design n'est pas parfait, c'est toujours utile. * 3 : Apnic,stats.lab [ Use of DNSSEC Validation for World ](https://stats.labs.apnic.net/dnssec/XA?hc=XA&hx=1&hv=0&hp=0&hr=1&w=365), consulté le 26 Avril 2022 **Résumé** : Statistique sur l'utilisation du DNSSec **Avis sur la ressource** : Il s'agit d'une page du laboratoire de statistique de Apnic sur la validation DNSSec dans le monde. - Cette ressource est utile quant à la compréhensoin de l'expansion de DNSSec. + Cette ressource est utile quant à la compréhension de l'expansion de DNSSec. * 4 : ICANN,stats.research [ TLD DNSSEC Report ](https://stats.research.icann.org/dns/tld_report/), consulté le 26 Avril 2022 **Résumé** : Statistique sur les TLD signé - **Avis sur la ressource** : Il s'agit d'une page officiel du site de l'ICANN qui représente le nombre de TLD (top-level domain, domaine de premier niveau en français) signé par DNSSEC dans le monde.Cette ressource est utile quant à la compréhensoin de l'expansion de DNSSec + **Avis sur la ressource** : Il s'agit d'une page officielle du site de l'ICANN qui représente le nombre de TLD (top-level domain, domaine de premier niveau en français) signé par DNSSEC dans le monde. Cette ressource est utile quant à la compréhension de l'expansion de DNSSec -* 5 : ICANN.org, [ DNSSEC – Qu'est-ce que c'est et pourquoi est-ce important ?](https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-fr#:~:text=Les%20DNSSEC%20renforcent%20l'authentification,par%20le%20propri%C3%A9taire%20des%20donn%C3%A9es. +* 5 : ICANN.org, [ DNSSEC – Qu'est-ce que c'est et pourquoi est-ce important ?](https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-fr#:~:text=Les%20DNSSEC%20renforcent%20l'authentification,par%20le%20propri%C3%A9taire%20des%20donn%C3%A9es. ), consulté le 26 Avril 2022 **Résumé** : Page expliquant l'importance du DNSSec - **Avis sur la ressource** : Il s'agit d'une page du site officiel de l'ICANN, cette ressource est donc cohérente. - -* 6 : Wikipedia, Domain Name System, [ Domain Name System ](https://fr.wikipedia.org/wiki/Domain_Name_System), consulté le 26 Avril 2022 + **Avis sur la ressource** : Il s'agit d'une page du site officiel de l'ICANN, cette ressource est donc cohérente. +* 6 : Wikipedia, Domain Name System, [ Domain Name System ](https://fr.wikipedia.org/wiki/Domain_Name_System), consulté le 26 Avril 2022 + **Résumé** : Page Wikipedia du DNS - **Avis sur la ressource** : Plus complête en Anglais, pratique pour se rappeller de petits détails. - + **Avis sur la ressource** : Plus complête en Anglais, pratique pour se rappeler de petits détails. + * 7 : ResellersPanel, DNSSec Enabled On our Platform, [ DNSSec Enabled on our platform ](https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html), consulté le 28 Avril 2022 **Résumé** : Page rassemblant plein d'informations sur le DNSSec **Avis sur la ressource** : En Anglais, très complête avec beaucoup d'illustrations -Tommy Riquet -Dernière modification , le 26 Avril 2022 +* 8 : CloudFlare, [ How DNSSEC Works](https://www.cloudflare.com/fr-fr/dns/dnssec/how-dnssec-works/), consulté le 28 Avril 2022 + + **Résumé** : Explication sur l'utilisation des clés et le fonctionnement du DNSSEC + **Avis sur la ressource** : Très complète avec plein d'illustrations + +* 9 : Wikipedia, [Man-in-the-Middle Attack](https://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu), consulté le 7 Mai 2022 + + **Résumé** : Explication Sur l'attaque de l'homme du milieu + **Avis sur la ressource** : Très complète avec des d'exemples + + + From bd3b7cb34e4beb97f788021b1d78b43704b57aed Mon Sep 17 00:00:00 2001 From: TommyRiquet Date: Sun, 8 May 2022 17:50:04 +0200 Subject: [PATCH 031/241] Ajout des permalinks de Wikipedia --- "R\303\251seaux/dnssec.md" | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/dnssec.md" "b/R\303\251seaux/dnssec.md" index 0a92de7..44cdafd 100644 --- "a/R\303\251seaux/dnssec.md" +++ "b/R\303\251seaux/dnssec.md" @@ -89,8 +89,11 @@ Le DNSSEC fonctionne à l'aide d'un système de chaîne de confiance⁵ (en Angl Lorsque une zone enfant termine sa sécurisation, elle hache son RRset DNSKEY et l'envoie à la zone parent pour qu'elle l'ajoute en tant qu'enregistrement DS(Delegation Signer) dans ses Ressources Records. Celui-ci va ensuite repasser dans le processus de sécurisation de la zone parent . Et ainsi de suite jusqu'au "Root Server", dont le certificat fut approuvé manuellement par l'ICANN en 2010.
**Exemple de requête :** -###### RessellersPanel, [en ligne] , https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html + ![](https://blog.resellerspanel.com/wp-content/uploads/2017/02/dnssec-ds-records.jpg) + +###### RessellersPanel, [en ligne] , https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html + - Un utilisateur essaie de joindre "www.DOM.com", il va alors contacter la Zone Racine - La Zone Racine va alors vérifier la zone ".com" avec sa KSK publique - La zone ".com" va vérifier le RR de la zone "DOM.com" @@ -154,7 +157,7 @@ Sa popularité augmente peu à peu chaque année³ et d'après moi le DNSSec dev ## **Bibliographie** -* 1 : Wikipedia, [Wikipedia - Domain Name System Security Extensions ](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions), Apr. 2022, consulté le 26 Avril 2022 +* 1 : Wikipedia, [Wikipedia - Domain Name System Security Extensions ](https://en.wikipedia.org/w/index.php?title=Domain_Name_System_Security_Extensions&oldid=1081721838), Apr. 2022, consulté le 26 Avril 2022 **Résumé** : Page Wikipedia du DNSSEC **Avis sur la ressource** : Il s'agit de la page Wikipedia concernant le DNSSEC. @@ -182,7 +185,7 @@ Sa popularité augmente peu à peu chaque année³ et d'après moi le DNSSec dev **Résumé** : Page expliquant l'importance du DNSSec **Avis sur la ressource** : Il s'agit d'une page du site officiel de l'ICANN, cette ressource est donc cohérente. -* 6 : Wikipedia, Domain Name System, [ Domain Name System ](https://fr.wikipedia.org/wiki/Domain_Name_System), consulté le 26 Avril 2022 +* 6 : Wikipedia, Domain Name System, [ Domain Name System ](https://fr.wikipedia.org/w/index.php?title=Domain_Name_System&oldid=193399624), consulté le 26 Avril 2022 **Résumé** : Page Wikipedia du DNS **Avis sur la ressource** : Plus complête en Anglais, pratique pour se rappeler de petits détails. @@ -197,7 +200,7 @@ Sa popularité augmente peu à peu chaque année³ et d'après moi le DNSSec dev **Résumé** : Explication sur l'utilisation des clés et le fonctionnement du DNSSEC **Avis sur la ressource** : Très complète avec plein d'illustrations -* 9 : Wikipedia, [Man-in-the-Middle Attack](https://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu), consulté le 7 Mai 2022 +* 9 : Wikipedia, [Man-in-the-Middle Attack](https://fr.wikipedia.org/w/index.php?title=Attaque_de_l%27homme_du_milieu&oldid=191530746), consulté le 7 Mai 2022 **Résumé** : Explication Sur l'attaque de l'homme du milieu **Avis sur la ressource** : Très complète avec des d'exemples From ee92389733c692d27aef4b8d9a5a19f1f6b5d420 Mon Sep 17 00:00:00 2001 From: Abderrachid BELLAALI <91373823+Rachiid007@users.noreply.github.com> Date: Mon, 9 May 2022 01:04:04 +0200 Subject: [PATCH 032/241] [FIX] correction selon le Feedback :) --- "R\303\251seaux/https.md" | 77 ++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git "a/R\303\251seaux/https.md" "b/R\303\251seaux/https.md" index b85188c..13354de 100644 --- "a/R\303\251seaux/https.md" +++ "b/R\303\251seaux/https.md" @@ -12,11 +12,12 @@ parent: Réseaux Le HTTPS est un protocole permettant de sécuriser les échanges de données entre un serveur et un client, et de valider l’identité d’un site visité. Cette double sécurisation est essentielle : elle garantit la confidentialité des données et rassure les internautes qui se connectent à votre site web. -C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SSL ou TLS. +C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SSL ou TLS.
-![image](https://user-images.githubusercontent.com/91373823/166163525-721fb773-5093-4672-8812-efc90ac67c41.png) - -### +

+ What's HTTPS?
+ Représentation du protocole HTTPS [7] +

## Pourquoi HTTPS ? @@ -50,7 +51,7 @@ C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SS Un client peut spontanément se connecter à un serveur (pas de prérequis). -### Comprendre le SSL/TLS +### Comprendre le SSL/TLS [1] SSL signifie Secure Sockets Layer, qui est le nom du protocole lorsqu'il appartenait à Netscape. Mais l'IETF (Internet engineering Task Force) a décidé d'en prendre le contrôle afin de le rendre plus ouvert et standardisé. @@ -58,7 +59,7 @@ Mais pour éviter tous les problèmes légaux, il est renommé TLS pour « Trans Aujourd'hui il n'y a plus que TLS mais on fait référence à SSL par abus de langage. -### Versions SSL/TLS +### Versions SSL/TLS [4] - SSL 1.0 (jamais publié) par Netscape, - SSL 2.0 en 1995, déprécié en 2011 par la RFC 6176, @@ -69,7 +70,7 @@ Aujourd'hui il n'y a plus que TLS mais on fait référence à SSL par abus de la - Mise à jour sur TLS 1.2 en 2011/ RFC 6176 (compatibilité SSL), - TLS 1.3 / RFC 8446 en 2018 (compression, renégociation, MD5, SHA1, RC4, 3DES, PFS obligatoire, optimisation réseau (0-RTT) , SHA-256, Courbe elliptique 25519 & 448). -### Rappels cryptographiques +### Rappels cryptographiques [2] Le chiffrement symétrique et asymétrique sont les deux techniques utilisées pour protéger la confidentialité de votre message sur internet. La différence fondamentale entre les deux réside dans le fait que le chiffrement symétrique permet de chiffrer et de déchiffrer le message à l'aide de la même clé. En revanche, le chiffrement asymétrique utilise la clé publique pour le chiffrement et une clé privée pour le déchiffrage. @@ -80,7 +81,7 @@ Le chiffrement symétrique et asymétrique sont les deux techniques utilisées p | Algorithmes | AES, DES, 3DES et RC4. | Diffie-Hellman, RSA. | | Objectif | Utilisé pour la transmission massive des données. | Souvent utilisé pour l'échange des clés secrètes. | -## Authentification +## Authentification [3] Un certificat c'est comme la carte d'identité d'un serveur, il permet d'assurer que vous êtes bien la personne que vous prétendez être. Pour cela, il faudrait passer par une autorité de certification (autorité reconnue, validée, sûre, qui peut délivrer des certificats). Il faudrait donc prouver que nous sommes le propriétaire du site à l'autorité de certification et, si tel est le cas, nous recevons ce certificat. @@ -93,15 +94,11 @@ Il existe 3 types de certificats. 3. Validation étendue
Enquête sur le propriétaire (vérification d’une présence physique, opérationnelle et juridique), permet l’affichage du propriétaire dans la barre d’adresse). -### Let's Encrypt - -L'idée est d'installer un programme et que notre site passe en HTTPS sans rien faire et il est GRATUIT. +## Mise en pratique [5] -C'est un ensemble de choses, tous d'abord c'est une autorité de certification qui est bien connue par les navigateurs. C'est également un protocole qui s'appelle ACME et enfin c'est un agent Open Source qui va négocier avec les serveurs de Le't Encrypt pour prouver que vous êtes bien le propriétaire du site afin de nous installer un certificat de type Domaine Validation et il va le maintenir toujours à jour. +Si vous avez un site HTTP en production sous apache et que vous souhaitez le mettre en HTTPS, la solution la plus simple consiste à utiliser l'outil [Certbot](https://doc.ubuntu-fr.org/apache2#activation_du_module_ssl) de [Let's Encrypt](https://letsencrypt.org/fr/). -## Mise en pratique - -Si vous avez un site HTTP en production sous apache et que vous souhaiatez le mettre en HTTPS, la solution la plus simple consiste à utiliser l'outil [Certbot](https://doc.ubuntu-fr.org/apache2#activation_du_module_ssl) de [Let's Encrypt](https://letsencrypt.org/fr/). +L’objectif de Let’s Encrypt et du protocole ACME est de permettre la mise en place d’un serveur HTTPS et l’obtention automatique d’un certificat de confiance, reconnu nativement par les navigateurs, sans intervention humaine. Ceci est accompli en exécutant un agent de gestion de certificat sur le serveur Web. Voici les étapes à suivre : @@ -139,36 +136,50 @@ Après cette opération les sites devraient être accessibles en HTTPS de maniè Vous trouverez une documentation plus détaillée à ce sujet sur [cette page](https://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl) de la documentation. +
+ +## Conclusion Voilà, nous avons terminé ! Nous avons appris ce qu'est le HTTPS et comment le mettre en place. +- dîtes TLS et pas SSL (déprécier) ! +- HTTPS bientôt le « défaut » +- commencez vos nouveaux projets en HTTPS (même en dev pour s'approcher de la réalité !) +- Soyez à jour, testez régulièrement votre site et actualisez sa configuration +- Utiliser les outils d'automatisation TLS (Let’s encrypt/ACME) + ## Bibliographie -- [Qu’est ce que SSL/TLS et HTTPS ?](https://www.hostinger.fr/tutoriels/quest-ce-que-ssl-tls-et-https), Bernadeta Kairyte, 08 mars 2022, consulté le 1er mai 2022. +1. [Qu’est ce que SSL/TLS et HTTPS ?](https://www.hostinger.fr/tutoriels/quest-ce-que-ssl-tls-et-https), Bernadeta Kairyte, 08 mars 2022, consulté le 1er mai 2022. + + - Résumé : Présentation des protocoles de chiffrement et de sécurité. + - Avis sur la ressource : Très bon résumé concernant le protocole SSL/TLS et HTTPS. + +2. [Différence entre le cryptage symétrique et asymétrique](https://waytolearnx.com/2018/07/difference-entre-le-cryptage-symetrique-et-asymetrique.html#comment-2889), Anonyme, 23 juillet 2022, consulté le 30 avril 2022 - - Résumé : Présentation des protocoles de chiffrement et de sécurité. - - Avis sur la ressource : Très bon résumé concernant le protocole SSL/TLS et HTTPS. + - Résumé : Explication de la différence entre le cryptage symétrique et asymétrique. + - Avis sur la ressource : Resumé assez court mais très pertinent. -- [Différence entre le cryptage symétrique et asymétrique](https://waytolearnx.com/2018/07/difference-entre-le-cryptage-symetrique-et-asymetrique.html#comment-2889), Anonyme, 23 juillet 2022, consulté le 30 avril 2022 +3. [Types de certificats SSL : Lequel convient le mieux à votre site ?](https://kinsta.com/fr/blog/types-de-certificats-ssl/), Salman Ravoof, 28 juillet 2021, consulté le 01 mai 2022 - - Résumé : Explication de la différence entre le cryptage symétrique et asymétrique. - - Avis sur la ressource : Resumé assez court mais très pertinent. + - Résumé : Les différents types de certificats SSL. + - Avis sur la ressource : Explication dans les grandes lignes. -- [Types de certificats SSL : Lequel convient le mieux à votre site ?](https://kinsta.com/fr/blog/types-de-certificats-ssl/), Salman Ravoof, 28 juillet 2021, consulté le 01 mai 2022 +4. [SSL/TLS and PKI History](https://www.feistyduck.com/ssl-tls-and-pki-history/), Ivan Ristić, février 2022, consulté le 27 avril 2022 - - Résumé : Les différents types de certificats SSL. - - Avis sur la ressource : Explication dans les grandes lignes. + - Résumé : L'histoire du protocole SSL/TLS et de la PKI. + - Avis sur la ressource : Résume assez long mais très pertinent. -- [SSL/TLS and PKI History](https://www.feistyduck.com/ssl-tls-and-pki-history/), Ivan Ristić, février 2022, consulté le 27 avril 2022 +5. [Utiliser HTTPS avec Apache2](https://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl), Gabriel Theuws, 16 mars 2021, consulté le 25 avril 2022 - - Résumé : L'histoire du protocole SSL/TLS et de la PKI. - - Avis sur la ressource : Résume assez long mais très pertinent. + - Résumé : Mise en place de certbot dans un ser apache. + - Avis sur la ressource : Les etapes de configuration sont très bien expliquées. -- [Utiliser HTTPS avec Apache2](https://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl), Gabriel Theuws, 16 mars 2021, consulté le 25 avril 2022 +6. [Mettre son site en ligne (4/4) : Comprends le SSL / HTTPS](https://www.youtube.com/watch?v=_UpuZ0Y3k-c), Jonathan Boyer, 24 février 2016, consulté le 26 avril 2022 - - Résumé : Mise en place de certbot dans un ser apache. - - Avis sur la ressource : Les etapes de configuration sont très bien expliquées. + - Résumé : Vidéo expliquant le fonctionnement des protocoles SSL/TLS et HTTPS. + - Avis sur la ressource : Video de qualité et les démonstantions sont bien illustrées. -- [Mettre son site en ligne (4/4) : Comprends le SSL / HTTPS](https://www.youtube.com/watch?v=_UpuZ0Y3k-c), Jonathan Boyer, 24 février 2016, consulté le 26 avril 2022 +7. [Représentation HTTPS](https://www.oni.fr/wp-content/uploads/2018/07/est-ce-que-le-https-est-bon-pour-le-seo-1.jpg), Camille DOSTIE, 03 Juillet 2018, consulté le 08 mai 2022 - - Résumé : Vidéo expliquant le fonctionnement des protocoles SSL/TLS et HTTPS. - - Avis sur la ressource : Video de qualité et les démonstantions sont bien illustrées. + - Résumé : Image expliquant le protocole HTTPS. + - Avis sur la ressource : Images bien illustrées. From d0899f192c951f3c2de520dbd962b126bd60d18d Mon Sep 17 00:00:00 2001 From: Marina Date: Mon, 9 May 2022 15:06:36 +0200 Subject: [PATCH 033/241] article Proxy Ti --- "R\303\251seaux/proxy" | 171 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 "R\303\251seaux/proxy" diff --git "a/R\303\251seaux/proxy" "b/R\303\251seaux/proxy" new file mode 100644 index 0000000..5d22fce --- /dev/null +++ "b/R\303\251seaux/proxy" @@ -0,0 +1,171 @@ +a[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Le proxy + +## Qu'est-ce qu'un proxy?[^1] [^2] +Tiré de l'anglais qui signifie "procuration", le terme proxy désigne un serveur qui permet de relayer les requêtes. +Un serveur Proxy (également appelé serveur mandataire) est donc un serveur qui agit comme intermédiaire entre un utilisateur demandeur d'une ressource et le serveur distant, fournisseur de cette ressource. L'utilisateur ne peut plus s'adresser directement au serveur distant sans passer par le serveur Proxy, qui fonctionne au nom du client, masquant potentiellement la véritable origine de la demande. +###### Fig.1 Schéma d'un serveur Proxy + +###### "https://www.proxyvpn.fr/wp-content/uploads/2019/02/1200px-CPT-Proxy.svg_.png"© proxyvpn.fr + + +## Que se passe-t-il au niveau du réseau ? [^3] +Le Proxy travaille sur la couche application, au niveau 7 du modèle OSI. Le Proxy décapsule donc toutes les couches inférieures quand il reçoit une requête http et réencapsule les paquets IP pour les retransmettre vers le serveur de destination. Il y a donc deux connexions TCP ce qui signifie une rupture de flux au niveau du Proxy. + +###### Fig.2 Décapsulation de la requête reçue et réencapsulation +![Décapsulation de la requête et réencapsulation](https://zestedesavoir.com/media/galleries/5382/2e3db985-cde5-4e61-9bf7-5af14485d872.png) +###### "Décapsulation de la requête et réencapsulation" https://zestedesavoir.com/media/galleries/5382/2e3db985-cde5-4e61-9bf7-5af14485d872.png + +Dans un réseau, on peut donc empêcher les utilisateurs, grâce à un Firewall d'accéder directement à Internet et les obliger de passer par un Proxy, ce qui permet de contrôler les accès dans un sens comme dans l'autre. + +## Les différentes fonctionnalités d'un serveur Proxy [^2] [^4] [^5] + +#### **Amélioration des performances** +* Le caching Proxy ou proxy-cache +Grâce à sa capacité de garder en cache les pages les plus souvent visitées par les utilisateurs du réseau local, le Proxy est capable de réduire le temps d'accès à ces pages ainsi que la bande passante vers Internet. +Le caching proxy a été le premier type de serveur proxy. +* Le PEP (Performance Enhancing Proxy) +C'est un Proxy concu pour améliorer les performances TCP en cas de : + - temps aller-retour élevés + - pertes de paquets élevées + - taux de chargement et téléchargement très différents +Il peut compresser les données afin d'utiliser le réseau plus efficacement ce qui participe également à la rapidité de la navigation. +#### **Anonymisation de l'utilisateur** +Le serveur Proxy transmet la requête au serveur distant via une adresse ip publique et de ce fait masque l'adresse ip initiale, celle de l'utilisateur. La réponse du serveur distant ne se fait que via le Proxy car il est le seul à connaître l'adresse d'origine. L'utilisateur devient invisible ou presque car le trafic reste entièrement visible pour le FAI (Fournisseur d'Accès à Internet) et pour le Proxy lui-même. Un certain degré de confiance doit s'établir entre le serveur Proxy et son utilisateur. + +#### **Journalisation des connexions** +Le Proxy enregistre l'ensemble des requêtes dans les logs et offre ainsi une traçabilité centralisée des flux. Ceci permet, entre autres, de rédéfinir la politique de sécurité du réseau sur base des données récoltées sans oublier, dans le cadre d'une entreprise de concilier RGPD et récolte de ces données parfois à caractère personnel. + +#### **Filtrage et surveillance** +- Contrôle de contenu + - Un filtrage peut être appliqué suivant la politique de sécurité en place sur le réseau. Ceci permet de bloquer les sites inutiles dans un cadre de travail (pornographie, réseaux sociaux,...) mais également ceux considérés comme malveillants. +Les requêtes peuvents être filtrées selon : + - des listes + - White List -> le filtrage se fait à partir d'une liste de sites autorisés + - Black List -> le filtrage se fait à partir d'une liste de sites non autorisés + - une URL + - un filtre d'expressions régulières (URL Regex filtering) + - le MIME + - des mots-clés du contenu + +- Contournement des filtres + - Dans certains cas, les utilisateurs peuvent contourner les proxies qui filtrent à l'aide de listes noires en envoyant les informations proxy à partir d'un site ne figurant pas sur la liste. + - Certains serveurs limitent leur service en fonction de l'origine de la requête. Par exemple, en cas de censure gouvernementale qui vise à bloquer l'accès à certains sites dits subversifs en utlisant la géolocalisation basée sur IP. En passant par un proxy situé dans un autre pays, il est possible de contourner le filtrage(5). + Dans l'autre sens, un internaute étranger pourra accéder à un site qui n'accepte que les internautes d'un pays ciblé en passant par un proxy situé dans le pays en question. + +#### **Sécurisation** +Le serveur Proxy protège les utilisateurs de son réseau en servant de visage public unique. Tous ses utilisateurs sont anonymes car ils sont dissimulés par l'adresse IP du Proxy. En cas de tentative de piratage sur une machine spécifique, son adresse IP sera beaucoup plus difficile à trouver. De plus, les Proxies peuvent jouer le rôle de Firewall ce qui augmente encore la sécurité du réseau. + +## Types de serveurs Proxy [^1] [^2] +Il existe de nombreux types de serveurs Proxy classés selon leur fonctionnalités décrites ci-dessus. +#### **HTTP Proxy ou Web Proxy**[^7] [^5] +- Proxy transparent +Ce type de Proxy ne masque pas l'adresse IP de l'utilisateur. Il est utilisé par les écoles, les organisations et les gouvernements afin de pouvoir contrôler l'utilisation d'Internet et ainsi censurer son contenu. +Le serveur Web connaît donc l'adresse IP de l'utilisateur mais il sait également que l'utilisateur utilise un Proxy. +- Proxy anonyme +L'adresse IP de l'utilisateur est remplacée par l'adresse IP du Proxy. +Le serveur Web ne connaît pas l'adresse IP de l'utilisateur mais il sait que l'utiilisateur utilise un Proxy. +- Proxy déformant ou distordant +Le Proxy transmet une fausse adresse IP pour désigner l'utilisateur leurrant ainsi le serveur quant à la source de la requête. +Le serveur Web sait que l'utilisateur utilise un proxy et pense connaître l'adresse IP d'origine. +- Proxy High Anonymity ou Proxy Elite +Il s'agit du type de Proxy le plus sécurisé car il parvient à dissimuler également son existence au serveur en modifiant périodiquement l'adresse IP qu'il présente au serveur Web. +Le serveur Web ne connaît ni l'adresse IP de l'utilisateur ni celle du Proxy. + +#### **Proxy SOCK (Socket Secure)** [^6] +Le Proxy SOCK est un Proxy de tunneling, technique consistant à utiliser un protocole pour transporter des données à l'intérieur d'un autre protocole. Il crée une connexion TCP vers un autre serveur derrière le Firewall au nom du client. Le serveur Proxy SOCK relaie la session TCP et UDP d'un utilisateur qui n'est pas autorisé à établir une connexion avec un serveur extérieur au-delà du Firewall. +###### Fig.3 Schéma d'un Proxy de tunneling +![](https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png) +_shivk "https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png" +"Le client SSH crée un proxy SOCK (tunnel). Il prend le trafic local envoyé à un port spécifique du PC et l'envoie via la connexion SSH à un emplacement distant, le serveur SSH" + +#### **Proxy FTP (File Transfer Protocol)**[^11] +Celui-ci fonctionne comme un relais pour le transfert de fichiers et permet de contrôler les connexions et les commmandes telles que PUT et GET en fonction des adresses source et de destination et de l'authentification de l'utilisateur. Il peut également réguler la quantité et la fréquence des transferts et limiter la taille des fichiers. + +#### **Proxy SIP (Session Initiation Protocol)**[^11] +Basé sur le protocole SIP, le Proxy SIP permet de contrôler les appels au sein d'un réseau. Il redirige les appels selon les informations reprises dans le registre SIP. + +#### **Proxy SSL (HTTPS Proxy)**[^11] +Le Proxy SSL effectue le chiffrement et déchiffrement entre l'utilisateur et le serveur de manière totalement invisible. + +#### **Proxy SMTP (Simple Mail Transfer Protocol)**[^11] +Le Proxy SMTP contrôle les e-mails, entrants ou sortants, sur base de l'adresse source, le serveur de l'expéditeur ou encore le contenu. Les proxies SMTP sont utilisés pour, entre autres, filtrer les spams, prévenir contre le phishing et autre logiciels malveillants. + +#### **Proxy DNS et Proxy Smart DNS**[^11] +Le Proxy DNS transfère les requêtes et les réponses DNS entre l'utilisateur et le serveur. Il peut, entre autres, améliorer les performances grâce à son cache et protèger les serveurs contre le piratage de domaine et l'usurpation de DNS. +Le Proxy Smart DNS se distingue du Proxy DNS par le fait qu'il contourne les restrictions mises en place par les serveurs DNS comme par exemple la géolocalisation. + +#### **Reverse Proxy** [^5] +Le Reverse Proxy se situe entre un groupe de serveurs et Internet, il gère le trafic pour ses serveurs. +En bref, le proxy protège les clients, alors qu'un Reverse Proxy protège les serveurs. +Pour plus d'informations sur le Reverse Proxy, se référer à l'[article](https://github.com/KeviinKeurvels/Wiki-TI/blob/reverse_proxy/reverse_proxy.md) de Monsieur Kevin Keurvels. + + +## Différence entre Proxy et Firewall [^8] +Les Firewalls bloquent les accès non autorisés à des réseaux privés ou depuis ces réseaux privés. Ils empêchent les machines au sein du réseau d'être exposées librement à Internet. +Les principales différences entre un Firewall et un Proxy : +- Un Firewall bloque les connexions, un Proxy les facilite. +- Un Firewall se place entre un réseau privé et public. Un Proxy peut se placer entre deux réseaux publics +- Un Firewall protège un réseau interne contre des attaques tandis qu'un Proxy fournit une anonymisation et contourne des restrictions +- Un serveur Proxy peut faire office de Firewall +Les pare-feu ne peuvent pas être considérés comme des serveurs proxy car même s'ils ont la capacité de bloquer ou d'autoriser les requêtes en fonction de certaines règles, ils ne les acheminent pas. +## Différence entre Proxy et VPN [^9] [^12] +Un VPN (Virtual Private Network) est une connexion sécurisée et chiffrée entre deux réseaux. A l'instar d'un Proxy, il masque l'adresse IP en agissant comme intermédiaire et réoriente le traffic. +Un VPN ajoute un réseau privé virtuel, une sorte de tunnel personnel qui vous cache aux yeux des autres. Ce tunnel de chiffrement transforme un texte normal en un mélange codé, déchiffrable à l'aide d'une clé de déchiffrement que seuls l'utilisateur et le serveur VPN possèdent. +Les principales différences entre un VPN et un Proxy : +- un VPN fournit un cryptage, une authentification et une protection d'intégrité au trafic tandis que le Proxy ne fournit pas beaucoup de sécurité sur la connexion elle-même. +- un VPN fonctionne sur le Firewall, un Proxy fonctionne sur les navigateurs. +- Un VPN crée un tunnel de connexion, un Proxy ne crée aucun tunnel. +- Les protocoles utilisés sont différents : PPTP, IKEv2, L2TP/IPsec, SSL, TLS...pour un VPN et HTTP, SMTP, FTP... pour un Proxy. +Le VPN et le proxy ont des objectifs similaires, mais un VPN fournit plus de sécurité qu’un serveur proxy. + +## Risques liés au Proxy[^4] [^10] +#### Serveur Proxy gratuit +Il y a toujours une contrepartie à la gratuité d'un service. +- Performances diminuées : quand la charge de trafic est importante, le maintien de la vitesse nécessite une bande passante étendue. Seulement, la plupart des serveurs Proxy gratuits fonctionnent avec une faible bande passante ce qui signifie un ralentissement certain au niveau de la navigation Web. +- Logiciels espions : ils sont généralement téléchargés comme des applications libres ou transmis par des sites malveillants. +- Sécurité des données : Dans le cas d'un serveur Proxy hacké, les informations personnelles qui transitent via le serveur risquent d'être surveillées, récoltées et modifiées à des fins malveillantes comme l'usurpation d'identité. +#### Historique de navigation +Un serveur Proxy connaît l'adresse IP d'origine et les informations de requêtes enregistrées dans son cache. Il faut dès lors s'assurer de la politique de conservation de ces données. +#### Cryptage +Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu’il filtre. Il faut donc associer son utilisation avec un protocole de cryptage sinon les demandes seront envoyées en texte brut et à la merci de celui qui écoute . + + +## Bibliographie + +[^1]: "_Qu'est-ce qu'un proxy?_", proxyvpn.fr, https://www.proxyvpn.fr/qu-est-ce-qu-un-proxy (consulté le 02/05/2022) + ** Résumé : Page Web décrivant le Proxy + ** Avis sur la ressource : Court mais concis pour une première approche +[^2]: "_Proxy server_", Wikipedia, https://en.wikipedia.org/wiki/Proxy_server (consulté le 02/05/2002) + ** Résumé : Page wipédia décrivant un serveur Proxy + ** Avis sur la ressource : Beaucoup plus détaillée que la page en français équivalente +[^3]: Vince,"_Le proxy dans tous ses états_", zestedesavoir.com, https://zestedesavoir.com/tutoriels/2789/les-reseaux-de-zero/reprenons-du-service/le-proxy-dans-tous-ses-etats/ (consulté le 06/05/2022) + ** Résumé : Le fonctionnement du proxy plus détaillé + ** Avis sur la ressource : Un des seuls sites où on aborde la couche OSI +[^4]: Jeff Petter, "_What is a Proxy server and how does it work?_", varonis.com, https://www.varonis.com/blog/what-is-a-proxy-server 27/03/2020(consulté le 06/05/2022) + ** Résumé : Le fonctionnement du Proxy, risques et avantages + ** Avis sur la ressource : Très clair mais un peu simple +[^5]: "_Qu'est-ce qu'un serveur proxy et comment fonctionne-t-il ?_", avast.com, https://www.avast.com/fr-fr/c-what-is-a-proxy-server (consulté le 04/05/2022) + ** Résumé : Un récap du Proxy + ** Avis sur la ressource : La page est claire mais Avast en profite pour faire sa publicité +[^6]: _shivk, "_Adventure with Proxy : Intro to Proxy_", medium.com, https://medium.com/@_shivk/adventure-with-proxy-intro-to-proxy-f7e640b455e7 février 2020 (consulté le 06/05/2022) + ** Résumé : Le Proxy et ses différents types + ** Avis sur la ressource : Très clair au niveau des différents Proxies +[^7]: "_What is an HTTP Proxy? Types of HTTP Proxies explained_", bestproxyreviews.com, https://www.bestproxyreviews.com/http-proxy/ 21/04/2022(consulté le 06/05/2022) + ** Résumé : Différents types de Proxies et leurs fournisseurs + ** Avis sur la ressource : Très clair au niveau des différents Proxies +[^8]: "_Différence entre Proxy et Firewall_", waytolearnx.com, https://waytolearnx.com/2018/09/difference-entre-proxy-et-firewall.html 09/09/2018(consulté le 02/05/2022) + ** Résumé : Un rappel sur le Proxy et sur le Firewall + ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails +[^9]: "_Différence entre VPN et Proxy_, waytolearnx.com, "https://waytolearnx.com/2018/07/difference-entre-vpn-et-proxy.html 28/07/2018(consulté le 02/05/2022) + ** Résumé : Un rappel sur le Proxy et sur le VPN + ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails +[^10]: Vuk Mujovic, "_Cacher les connexions Proxy: qu'est-ce qu'un Proxy et une adresse IP?_", le-vpn.com, https://www.le-vpn.com/fr/quest-ce-quun-proxy/#:~:text=Risques%20li%C3%A9s%20%C3%A0%20l'utilisation%20d'un%20proxy&text=Le%20risque%20le%20plus%20courant,transmis%20par%20des%20sites%20malveillants. 29/10/2021(consulté le 08/05/2022) + ** Résumé : Les fonctionnalités du Proxy, les types et les risques liés au Proxy + ** Avis sur la ressource : Concis avec en prime une liste des serveur Proxy les plus connus +[^11]: Catherine Chipeta, "_Qu'est-ce qu'un serveur Proxy? Une explication claire de son fonctionnement_", upguard.com, https://www.upguard.com/blog/proxy-server#:~:text=Proxy%20servers%20work%20by%20facilitating,directly%20back%20to%20the%20user. 18/04/2022(consulté le 07/05/2022) + ** Résumé : Le fonctionnement et les types de Proxies + ** Avis sur la ressource : Aussi clair que le titre +[^12]: "_Qu'est-ce qu'un VPN et comment fonctionne-t-il ?_", avast.com, https://www.avast.com/fr-fr/c-what-is-a-vpn (consulté le 04/05/2022) + ** Résumé : Un récap du VPN + ** Avis sur la ressource : La page est claire mais Avast en profite pour placer sa publicité \ No newline at end of file From 185f04241ab947cd44ee139cde06c1d85167bf03 Mon Sep 17 00:00:00 2001 From: Marina Date: Mon, 9 May 2022 15:09:20 +0200 Subject: [PATCH 034/241] article Proxy Ti correction mineure --- "R\303\251seaux/proxy" | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/proxy" "b/R\303\251seaux/proxy" index 5d22fce..2e90f25 100644 --- "a/R\303\251seaux/proxy" +++ "b/R\303\251seaux/proxy" @@ -126,7 +126,6 @@ Il y a toujours une contrepartie à la gratuité d'un service. - Logiciels espions : ils sont généralement téléchargés comme des applications libres ou transmis par des sites malveillants. - Sécurité des données : Dans le cas d'un serveur Proxy hacké, les informations personnelles qui transitent via le serveur risquent d'être surveillées, récoltées et modifiées à des fins malveillantes comme l'usurpation d'identité. #### Historique de navigation -Un serveur Proxy connaît l'adresse IP d'origine et les informations de requêtes enregistrées dans son cache. Il faut dès lors s'assurer de la politique de conservation de ces données. #### Cryptage Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu’il filtre. Il faut donc associer son utilisation avec un protocole de cryptage sinon les demandes seront envoyées en texte brut et à la merci de celui qui écoute . @@ -141,19 +140,19 @@ Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu ** Avis sur la ressource : Beaucoup plus détaillée que la page en français équivalente [^3]: Vince,"_Le proxy dans tous ses états_", zestedesavoir.com, https://zestedesavoir.com/tutoriels/2789/les-reseaux-de-zero/reprenons-du-service/le-proxy-dans-tous-ses-etats/ (consulté le 06/05/2022) ** Résumé : Le fonctionnement du proxy plus détaillé - ** Avis sur la ressource : Un des seuls sites où on aborde la couche OSI + ** Avis sur la ressource : Un des seuls sites où l'on aborde la couche OSI [^4]: Jeff Petter, "_What is a Proxy server and how does it work?_", varonis.com, https://www.varonis.com/blog/what-is-a-proxy-server 27/03/2020(consulté le 06/05/2022) ** Résumé : Le fonctionnement du Proxy, risques et avantages - ** Avis sur la ressource : Très clair mais un peu simple + ** Avis sur la ressource : Très claire mais un peu simple dans la description [^5]: "_Qu'est-ce qu'un serveur proxy et comment fonctionne-t-il ?_", avast.com, https://www.avast.com/fr-fr/c-what-is-a-proxy-server (consulté le 04/05/2022) ** Résumé : Un récap du Proxy ** Avis sur la ressource : La page est claire mais Avast en profite pour faire sa publicité [^6]: _shivk, "_Adventure with Proxy : Intro to Proxy_", medium.com, https://medium.com/@_shivk/adventure-with-proxy-intro-to-proxy-f7e640b455e7 février 2020 (consulté le 06/05/2022) ** Résumé : Le Proxy et ses différents types - ** Avis sur la ressource : Très clair au niveau des différents Proxies + ** Avis sur la ressource : Très claire au niveau des différents Proxies [^7]: "_What is an HTTP Proxy? Types of HTTP Proxies explained_", bestproxyreviews.com, https://www.bestproxyreviews.com/http-proxy/ 21/04/2022(consulté le 06/05/2022) ** Résumé : Différents types de Proxies et leurs fournisseurs - ** Avis sur la ressource : Très clair au niveau des différents Proxies + ** Avis sur la ressource : Très claire au niveau des différents Proxies [^8]: "_Différence entre Proxy et Firewall_", waytolearnx.com, https://waytolearnx.com/2018/09/difference-entre-proxy-et-firewall.html 09/09/2018(consulté le 02/05/2022) ** Résumé : Un rappel sur le Proxy et sur le Firewall ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails @@ -162,10 +161,10 @@ Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails [^10]: Vuk Mujovic, "_Cacher les connexions Proxy: qu'est-ce qu'un Proxy et une adresse IP?_", le-vpn.com, https://www.le-vpn.com/fr/quest-ce-quun-proxy/#:~:text=Risques%20li%C3%A9s%20%C3%A0%20l'utilisation%20d'un%20proxy&text=Le%20risque%20le%20plus%20courant,transmis%20par%20des%20sites%20malveillants. 29/10/2021(consulté le 08/05/2022) ** Résumé : Les fonctionnalités du Proxy, les types et les risques liés au Proxy - ** Avis sur la ressource : Concis avec en prime une liste des serveur Proxy les plus connus + ** Avis sur la ressource : Concis avec en prime une liste des serveurs Proxy les plus connus [^11]: Catherine Chipeta, "_Qu'est-ce qu'un serveur Proxy? Une explication claire de son fonctionnement_", upguard.com, https://www.upguard.com/blog/proxy-server#:~:text=Proxy%20servers%20work%20by%20facilitating,directly%20back%20to%20the%20user. 18/04/2022(consulté le 07/05/2022) ** Résumé : Le fonctionnement et les types de Proxies - ** Avis sur la ressource : Aussi clair que le titre + ** Avis sur la ressource : Aussi claire que le titre [^12]: "_Qu'est-ce qu'un VPN et comment fonctionne-t-il ?_", avast.com, https://www.avast.com/fr-fr/c-what-is-a-vpn (consulté le 04/05/2022) ** Résumé : Un récap du VPN ** Avis sur la ressource : La page est claire mais Avast en profite pour placer sa publicité \ No newline at end of file From 5401d910f3d4c47e4c5ba9f6f896f7a54af62fbf Mon Sep 17 00:00:00 2001 From: Marina Date: Mon, 9 May 2022 15:41:49 +0200 Subject: [PATCH 035/241] correction historique de nav dans les risques --- "R\303\251seaux/proxy" | 1 + 1 file changed, 1 insertion(+) diff --git "a/R\303\251seaux/proxy" "b/R\303\251seaux/proxy" index 2e90f25..889d26e 100644 --- "a/R\303\251seaux/proxy" +++ "b/R\303\251seaux/proxy" @@ -126,6 +126,7 @@ Il y a toujours une contrepartie à la gratuité d'un service. - Logiciels espions : ils sont généralement téléchargés comme des applications libres ou transmis par des sites malveillants. - Sécurité des données : Dans le cas d'un serveur Proxy hacké, les informations personnelles qui transitent via le serveur risquent d'être surveillées, récoltées et modifiées à des fins malveillantes comme l'usurpation d'identité. #### Historique de navigation +Un Proxy connaît l'IP d'origine et l'historique des requêtes de l'utilisateur. Dès lors, il s'agit de vérifier si le serveur enregistre ces données et quelle politique de conservation des données il applique car si ces données sont consignées et vendues alors que le service attendu est l'anonymisation, le dit-service est frauduleux. #### Cryptage Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu’il filtre. Il faut donc associer son utilisation avec un protocole de cryptage sinon les demandes seront envoyées en texte brut et à la merci de celui qui écoute . From 7d02171ace390f520525f59c1906514946579ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Mon, 9 May 2022 19:07:13 +0200 Subject: [PATCH 036/241] [FIX] Fixing the article --- "R\303\251seaux/IAX.md" | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 70815d5..3ad121b 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -28,7 +28,7 @@ IAX est utilisé en téléphonie sur IP, mais quelles sont ses caractéristiques - **Ports** : En VoIP classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. -- **Diminution de la bande passante** : Sa première caractéristique (unique port) apporte un avantage sur l’utilisation des ressources. De fil en aiguille, cela inclut une réduction de la bande passante utilisée. +- **Diminution de la bande passante** : IAX utilise une en-tête racourcie comparé aux autres protocoles (_voir carctéristiques techniques_). Comme moins de données sont envoyées, cela inclut une réduction de la bande passante utilisée. - **Diminution de la latence** : Le fait qu'un seul port soit utilisé au lieu d’un seul, apporte aussi un changement au niveau de la latence. En effet, comme les deux flux traditionnels sont envoyés en même temps et sur le même port, on a une réduction de la latence @@ -57,6 +57,7 @@ Toute la partie signalisation est gérée en couche 2 (Liaison de données). ### > Structure des données: IAX envoit des paquets avec la structure suivante: +[[10](https://www.nextiva.com/blog/voip-codecs.html#:~:text=A%20VoIP%20codec%20is%20a,two%20terms%3A%20Compression%20and%20Decompression.)] - 20 octets pour l'entête IP (**=** autres protocoles), - 8 octets pour l'entête UDP (**=** autres protocoles), @@ -65,7 +66,6 @@ IAX envoit des paquets avec la structure suivante: ![image](https://user-images.githubusercontent.com/71372371/167297794-8ca673cb-c247-4b8d-8fe3-4b2b8467bb9e.png) - [SOURCE](https://www.semanticscholar.org/paper/A-Comparative-Study-between-Inter-Asterisk-Exchange-Aliwi-Sumari/58eb892d9574cd17312ce98adc9e7009695e3094/figure/3) C'est cette structure qui diminue l'utilisation de la bande passante. Cette "mini-entête" IAX apporte un gros plus car moins de données sont échangées et donc moins de bande passante est utilisée. @@ -76,6 +76,19 @@ Voici un exemple d'échange type lors d'une communication avec le protocole IAX: ![6-Figure1-1](https://user-images.githubusercontent.com/71372371/167297870-0d01989d-a751-4145-add1-67474aea5d07.png) +[SOURCE](https://www.semanticscholar.org/paper/A-Comparative-Study-between-Inter-Asterisk-Exchange-Aliwi-Sumari/58eb892d9574cd17312ce98adc9e7009695e3094/figure/3) + +On distingue 2 personnes: l'appelant qui initie l'appel (A) et l'appelé qui reçoit la demande d'appel (B). + +Voici les différentes étapes: + +1. Mise en place de la connexion: + Lorsqu'une personne initie un appel vers une autre, il y a envoi d'un paquet `NEW` pour demander à B d'initier une communication. Si le poste de B est disponible, il envoie un paquet `ACCEPT`. A accuse réception de ce dernier et c'est à ce moment-là que l'utilisateur B reçoit la notification d'appel. Le poste B indique alors à A que la sonnerie est en cours (`RINGING`). Si l'utilisateur B décroche, il y a envoi d'un paquet `ANSWER` et si A accuse réception c'est le début de la conversation entre les deux personnes. + +2. Échange/Conversation entre les 2 communiquants + +3. Fin de la communication: + Quand l'un des membres raccroche, un paquet de type `HANGUP` est envoyé à l'autre communiquant, qui, à la réception, envoie un accusé de réception. ### **Explications:** @@ -107,7 +120,7 @@ En VoIP il en existe plusieurs, les 3 plus connus sont: 3. **G.729**, c'est l'un des codecs les plus légé en bande-passante et avec une qualité audio résonable. -Source => [9](https://www.nextiva.com/blog/voip-codecs.html#:~:text=A%20VoIP%20codec%20is%20a,two%20terms%3A%20Compression%20and%20Decompression.) +Source => [[9](https://www.nextiva.com/blog/voip-codecs.html#:~:text=A%20VoIP%20codec%20is%20a,two%20terms%3A%20Compression%20and%20Decompression.)] ## **Bibliographie:** @@ -200,3 +213,13 @@ Auteur: JEREMIAH ZERBY Date de parution: 16 novembre 2020 Date de visite: 08/05/2022 + +### - [10](https://scialert.net/fulltext/?doi=ajsr.2017.110.115) + +Titre: VoIP Protocols’ Bandwidth Based-Mini/RTP Header Using Different Codecs: A Comparison + +Auteur: Naser K.A. Alajmi, Hadeel Saleh Haj Aliwi and Kamal Alieyan + +Date de parution: 15 juin 2017 + +Date de visite: 05/05/2022 From 57b7fca11aa42cdda4d78b1db115ea049a69cb1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pourbaix=20Micha=C3=ABl?= Date: Mon, 9 May 2022 19:09:08 +0200 Subject: [PATCH 037/241] [FIX] Fixing a sentence --- "R\303\251seaux/IAX.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 3ad121b..b05babe 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -88,7 +88,7 @@ Voici les différentes étapes: 2. Échange/Conversation entre les 2 communiquants 3. Fin de la communication: - Quand l'un des membres raccroche, un paquet de type `HANGUP` est envoyé à l'autre communiquant, qui, à la réception, envoie un accusé de réception. + Quand l'un des membres raccroche, un paquet de type `HANGUP` est envoyé à l'autre communiquant. Ce dernier envoie un accusé de réception. ### **Explications:** From f2c701694ce41b14d1c9a4a8f640e06da5fa0141 Mon Sep 17 00:00:00 2001 From: Abderrachid BELLAALI <91373823+Rachiid007@users.noreply.github.com> Date: Mon, 9 May 2022 22:26:37 +0200 Subject: [PATCH 038/241] Update https.md --- "R\303\251seaux/https.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/R\303\251seaux/https.md" "b/R\303\251seaux/https.md" index 13354de..998cbe5 100644 --- "a/R\303\251seaux/https.md" +++ "b/R\303\251seaux/https.md" @@ -183,3 +183,8 @@ Voilà, nous avons terminé ! Nous avons appris ce qu'est le HTTPS et comment le - Résumé : Image expliquant le protocole HTTPS. - Avis sur la ressource : Images bien illustrées. + +8. [HTTPS n’aura plus de secret pour vous](https://www.youtube.com/watch?v=NCPgs4YlijU&t=2186s), Grégory Paul, 09 mai 2016, consulté le 01 mai 2022 + + - Résumé : Conférence Devoxx sur le protocoles HTTPS. + - Avis sur la ressource : La vidéoconférence est présentée par quelqu'un de très compétent en la matière. From fa754702e8c3d6e17f6e8cbc8f0478dcddc3bcfe Mon Sep 17 00:00:00 2001 From: Rachiid007 Date: Tue, 10 May 2022 11:53:04 +0200 Subject: [PATCH 039/241] [FIX] Correction selon feedback 2 --- "R\303\251seaux/https.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/https.md" "b/R\303\251seaux/https.md" index 998cbe5..0071b48 100644 --- "a/R\303\251seaux/https.md" +++ "b/R\303\251seaux/https.md" @@ -139,13 +139,14 @@ Vous trouverez une documentation plus détaillée à ce sujet sur [cette page](h
## Conclusion + Voilà, nous avons terminé ! Nous avons appris ce qu'est le HTTPS et comment le mettre en place. -- dîtes TLS et pas SSL (déprécier) ! +- dites TLS et pas SSL (déprécié!) - HTTPS bientôt le « défaut » - commencez vos nouveaux projets en HTTPS (même en dev pour s'approcher de la réalité !) - Soyez à jour, testez régulièrement votre site et actualisez sa configuration -- Utiliser les outils d'automatisation TLS (Let’s encrypt/ACME) +- Utilisez les outils d'automatisation TLS (Let’s encrypt/ACME) ## Bibliographie From 24edb807b40b2597ca5adcd45acfd5598e3d4949 Mon Sep 17 00:00:00 2001 From: TommyRiquet Date: Tue, 10 May 2022 12:23:38 +0200 Subject: [PATCH 040/241] Modification des Images --- Assets/Images/DNSSEC-DNS_poisoning.png | Bin 0 -> 25409 bytes Assets/Images/DNSSEC-Exemple.png | Bin 0 -> 21278 bytes Assets/Images/DNSSEC-RRset.png | Bin 0 -> 18022 bytes Assets/Images/DNSSEC-RRsig.png | Bin 0 -> 8756 bytes Assets/Images/DNSSEC-ZSK_KSK.png | Bin 0 -> 18711 bytes .../DNSSEC-man-in-the-middle_attack.png | Bin 0 -> 16914 bytes "R\303\251seaux/dnssec.md" | 42 ++++++++---------- 7 files changed, 18 insertions(+), 24 deletions(-) create mode 100644 Assets/Images/DNSSEC-DNS_poisoning.png create mode 100644 Assets/Images/DNSSEC-Exemple.png create mode 100644 Assets/Images/DNSSEC-RRset.png create mode 100644 Assets/Images/DNSSEC-RRsig.png create mode 100644 Assets/Images/DNSSEC-ZSK_KSK.png create mode 100644 Assets/Images/DNSSEC-man-in-the-middle_attack.png diff --git a/Assets/Images/DNSSEC-DNS_poisoning.png b/Assets/Images/DNSSEC-DNS_poisoning.png new file mode 100644 index 0000000000000000000000000000000000000000..258e6b12d9dab30e056ad9e1392764e69d11a90f GIT binary patch literal 25409 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 Q2QNjO?f2U~vGtArADju-AOHXW literal 0 HcmV?d00001 diff --git a/Assets/Images/DNSSEC-RRset.png b/Assets/Images/DNSSEC-RRset.png new file mode 100644 index 0000000000000000000000000000000000000000..57ba282b5d4582c804906097e651e8c486e11c4d GIT binary patch literal 18022 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 literal 0 HcmV?d00001 diff --git a/Assets/Images/DNSSEC-RRsig.png b/Assets/Images/DNSSEC-RRsig.png new file mode 100644 index 0000000000000000000000000000000000000000..de63acc0e3c6b4b7e09c1b1869fab5542ff2c8f3 GIT binary patch literal 8756 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 literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/dnssec.md" "b/R\303\251seaux/dnssec.md" index 44cdafd..00dea4b 100644 --- "a/R\303\251seaux/dnssec.md" +++ "b/R\303\251seaux/dnssec.md" @@ -13,7 +13,7 @@ parent: Réseaux Tout commence en 1990, lorsque le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) a découvert des failles de sécurité dans le protocole DNS¹. Il a remarqué qu'il était très facile pour une personne malveillante de rediriger un utilisateur vers un autre site web. -Il faut savoir que le DNS n'avait aucun système de sécurité car Internet était très loin d'être le géant qu'il est aujourd'hui et le seul moyen pour un résolveur de vérifier les informations qu'il recevait était de comparer l'adresse IP source d'une réponse avec l'adresse IP de la requête, ce qui n'est pas du tout sécurisé de part la facilité à falsifier celles-ci. +Il faut savoir que le DNS n'avait aucun système de sécurité car Internet était très loin d'être le géant qu'il est aujourd'hui. Le seul moyen pour un résolveur de vérifier les informations qu'il recevait était de comparer l'adresse IP source d'une réponse avec l'adresse IP de la requête, ce qui n'est pas du tout sécurisé de part la facilité à falsifier celles-ci. Les trois principales failles de sécurité découvertes par le [Docteur Steven M. Bellovin](https://en.wikipedia.org/wiki/Steven_M._Bellovin) sont le "DNS Spoofing", le "DNS Cache poisoning" et la "man-in-the-middle attack". @@ -21,19 +21,17 @@ Les trois principales failles de sécurité découvertes par le [Docteur Steven Le DNS Spoofing (usurpation DNS en français) est l'action de rediriger un utilisateur vers un site web malveillant afin de lui soutirer des informations privées, telles que des mots de passe ou des numéros de carte de crédit. Les attaquants se font passer pour le serveur autoritaire d'un site web afin d'empoisonner le cache d'un résolveur pour y mettre de fausses informations, de sorte que celui-ci renvoie une adresse IP incorrecte aux utilisateurs et ainsi les redirige au mauvais endroit. -###### BLUECATNETWORKS, _Kyle Roblyer_ , 25 Novembre 2019, [en ligne] https://bluecatnetworks.com/blog/what-is-dns-poisoning-how-to-prevent-it/ - + **Qu'est-ce que l'Attaque de l'homme du milieu⁹ ?** L'attaque de l'homme du milieu (man-in-the-middle attack en anglais) n'a rien à voir avec la terre du même nom, mais consiste plutôt à intercepter/relayer la communication entre deux parties. L'attaquant a donc le contrôle direct sur les informations et peut donc décider de les modifier à sa guise. Cette attaque est très souvent utilisée pour rediriger des utilisateurs lambda vers des sites web frauduleux. -###### MALWAREBYTES, Blog, [en ligne] https://blog.malwarebytes.com/101/2018/07/when-three-isnt-a-crowd-man-in-the-middle-mitm-attacks-explained/ - +
### **Et comment peut-on empêcher ces attaques ?** -Ces attaques ont tous un point en commun en terme de sécurité, c'est que le résolveur n'a aucun moyen de savoir si les informations qu'il reçoit sont correctes car il ne sait pas avec quelle machine il communique. Il nous faut donc un système pour authentifier les machines DNS afin d'empêcher quiconque de s'immiscer entre les mailles du filet . +Ces attaques ont toutes un point en commun en terme de sécurité, c'est que le résolveur n'a aucun moyen de savoir si les informations qu'il reçoit sont correctes car il ne sait pas avec quelle machine il communique. Il nous faut donc un système pour authentifier les machines DNS afin d'empêcher quiconque de s'immiscer entre les mailles du filet . C'est ainsi que le DNSSEC fut inventé en se basant sur la cryptographie à clé publique . @@ -46,8 +44,10 @@ Chaque domaine et sous-domaine peut ensuite créer une délégation ([voir Dél Nous utilisons donc un résolveur pour faire des requêtes récursives, afin d'interroger un par un, en partant de la racine, les "Name Servers" jusqu'à trouver l'adresse IP correspondante à notre requête. -![](https://www.nameshield.com/wp-content/uploads/2020/03/DNS-768x419.png) -###### NameSchield, [en ligne] https://www.nameshield.com/ressources/lexique/dns-domain-name-system/ + + + +###### Wikipedia, [en ligne] https://fr.wikipedia.org/wiki/Domain_Name_System Prenons un exemple avec 'www.wikipedia.org'; @@ -65,20 +65,18 @@ Prenons un exemple avec 'www.wikipedia.org'; - Chaque Serveur DNS génère une paire de clés ZSK (**Z**one **S**ignature **K**ey) et une paire de clés KSK(**K**ey **S**ignature **K**ey). - La ZSK privée est utilisée pour signer le RRset et stocke la signature dans un RRSIG. -
-
+
+
-###### CLOUDFLARE, [en ligne] https://www.cloudflare.com/fr-fr/dns/dnssec/how-dnssec-works/ - La ZSK publique est stockée dans un Ressource Record "DNSKEY" et utilisée pour vérifier la signature . - La KSK publique est stockée dans un Ressource Record "DNSKEY" . - Ces deux RR 'DNSKEY' sont rassemblées dans un RRset . - La KSK privée est utilisée pour signer le RRset "DNSKEY" et stocke la signature dans un autre RRSIG . -
+
-###### CLOUDFLARE, [en ligne] https://www.cloudflare.com/fr-fr/dns/dnssec/how-dnssec-works/ -
+
Pour l'instant, le serveur de nom agit de manière indépendante, il faut trouver un moyen de propager la confiance entre les serveurs . C'est ce qu'on appelle la _Chain of Trust_. @@ -86,18 +84,17 @@ C'est ce qu'on appelle la _Chain of Trust_. ### **Chain of Trust⁷** Le DNSSEC fonctionne à l'aide d'un système de chaîne de confiance⁵ (en Anglais 'Chain of Trust') qui valide les serveurs DNS sur base de leurs RRSIG. Le NS pourra donc obtenir un certificat de confiance signé par le parent, et ainsi de suite jusqu'à ce que l'entièreté de la chaîne soit certifiée. -Lorsque une zone enfant termine sa sécurisation, elle hache son RRset DNSKEY et l'envoie à la zone parent pour qu'elle l'ajoute en tant qu'enregistrement DS(Delegation Signer) dans ses Ressources Records. Celui-ci va ensuite repasser dans le processus de sécurisation de la zone parent . Et ainsi de suite jusqu'au "Root Server", dont le certificat fut approuvé manuellement par l'ICANN en 2010. +Lorsqu'une zone enfant termine sa sécurisation, elle hache son RRset DNSKEY et l'envoie à la zone parent pour qu'elle l'ajoute en tant qu'enregistrement DS(Delegation Signer) dans ses Ressources Records. Celui-ci va ensuite repasser dans le processus de sécurisation de la zone parent . Et ainsi de suite jusqu'au "Root Server", dont le certificat fut approuvé manuellement par l'ICANN en 2010.
**Exemple de requête :** -![](https://blog.resellerspanel.com/wp-content/uploads/2017/02/dnssec-ds-records.jpg) - -###### RessellersPanel, [en ligne] , https://blog.resellerspanel.com/domain-names/dnssec-enabled-on-our-platform.html +
+ -- Un utilisateur essaie de joindre "www.DOM.com", il va alors contacter la Zone Racine +- Un utilisateur essaie de joindre "www.ephec.com", il va alors contacter la Zone Racine - La Zone Racine va alors vérifier la zone ".com" avec sa KSK publique -- La zone ".com" va vérifier le RR de la zone "DOM.com" -- La zone "DOM.com" va finalement vérifier le RR de "www.DOM.com" +- La zone ".com" va vérifier le RR de la zone "ephec.com" +- La zone "ephec.com" va finalement vérifier le RR de "www.ephec.com" - Le RR est ensuite renvoyé à l'utilisateur @@ -204,6 +201,3 @@ Sa popularité augmente peu à peu chaque année³ et d'après moi le DNSSec dev **Résumé** : Explication Sur l'attaque de l'homme du milieu **Avis sur la ressource** : Très complète avec des d'exemples - - - From bb7157abab3158f5cc65ba99ac5d8fe386e70041 Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Tue, 10 May 2022 13:17:40 +0200 Subject: [PATCH 041/241] =?UTF-8?q?R=C3=A9organisation=20des=20articles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reverse_proxy.md => "R\303\251seaux/reverse_proxy.md" | 0 index.md | 1 + reseaux.md | 10 ++++++---- 3 files changed, 7 insertions(+), 4 deletions(-) rename reverse_proxy.md => "R\303\251seaux/reverse_proxy.md" (100%) diff --git a/reverse_proxy.md "b/R\303\251seaux/reverse_proxy.md" similarity index 100% rename from reverse_proxy.md rename to "R\303\251seaux/reverse_proxy.md" diff --git a/index.md b/index.md index de5e4de..d054a8e 100644 --- a/index.md +++ b/index.md @@ -29,6 +29,7 @@ Les informations sont organisées par catégorie : - [DNSSec](Réseaux/dnssec.md) ### Administration réseaux +- [Reverse Proxy](Réseaux/reverse_proxy.md) ## Développement diff --git a/reseaux.md b/reseaux.md index 912e7bc..c657f1e 100644 --- a/reseaux.md +++ b/reseaux.md @@ -9,10 +9,12 @@ has_children: true Cette section regroupe tous les articles concernant le réseau : Protocoles, configuration, outils, bonnes pratiques... -## Articles +## Protocoles transport et applicatifs +- [Délégation DNS](Réseaux/delegation_dns.md) +- [HTTPS](Réseaux/https.md) +- [DNSSec](Réseaux/dnssec.md) -* [Délégation DNS](Réseaux/delegation_dns.md) -* [DNSSEC](Réseaux/dnssec.md) -* [HTTPS](Réseaux/https.md) +## Administration réseaux +- [Reverse Proxy](Réseaux/reverse_proxy.md) \ No newline at end of file From e1bbc5973c499fc4ef48c60fa42149960915b2fd Mon Sep 17 00:00:00 2001 From: Pourbaix <71372371+Pourbaix@users.noreply.github.com> Date: Tue, 10 May 2022 13:59:50 +0200 Subject: [PATCH 042/241] Update IAX.md --- "R\303\251seaux/IAX.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index b05babe..942b8eb 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -26,7 +26,7 @@ IAX est utilisé en téléphonie sur IP, mais quelles sont ses caractéristiques ### > Avantages comparé à la VoIP classique : -- **Ports** : En VoIP classique, on utilise deux ports, le port 4005 pour transmettre le flux de données et le port 4060 pour transmettre la signalisation relative à ce flux. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. +- **Ports** : En VoIP classique, on utilise deux ports, le port 4060 pour transmettre la signalisation relative à ce flux et un second port qui est déterminé au début de l'échange (généralement le 4005). Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. - **Diminution de la bande passante** : IAX utilise une en-tête racourcie comparé aux autres protocoles (_voir carctéristiques techniques_). Comme moins de données sont envoyées, cela inclut une réduction de la bande passante utilisée. From 56f909133a55e8b63d4821179ef57776aef5acba Mon Sep 17 00:00:00 2001 From: Pourbaix <71372371+Pourbaix@users.noreply.github.com> Date: Tue, 10 May 2022 14:00:28 +0200 Subject: [PATCH 043/241] Update IAX.md --- "R\303\251seaux/IAX.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 942b8eb..26d819b 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -26,7 +26,7 @@ IAX est utilisé en téléphonie sur IP, mais quelles sont ses caractéristiques ### > Avantages comparé à la VoIP classique : -- **Ports** : En VoIP classique, on utilise deux ports, le port 4060 pour transmettre la signalisation relative à ce flux et un second port qui est déterminé au début de l'échange (généralement le 4005). Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. +- **Ports** : En VoIP classique, on utilise deux ports, le port 4060 pour transmettre la signalisation relative au flux et un second port qui est déterminé au début de l'échange (généralement le 4005) pour transmettre les données. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. - **Diminution de la bande passante** : IAX utilise une en-tête racourcie comparé aux autres protocoles (_voir carctéristiques techniques_). Comme moins de données sont envoyées, cela inclut une réduction de la bande passante utilisée. From 6aa21a7b73521360f8f66f0d38a8494b119119b1 Mon Sep 17 00:00:00 2001 From: Pourbaix <71372371+Pourbaix@users.noreply.github.com> Date: Tue, 10 May 2022 17:06:21 +0200 Subject: [PATCH 044/241] Update IAX.md --- "R\303\251seaux/IAX.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index 26d819b..a6338b1 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -26,7 +26,7 @@ IAX est utilisé en téléphonie sur IP, mais quelles sont ses caractéristiques ### > Avantages comparé à la VoIP classique : -- **Ports** : En VoIP classique, on utilise deux ports, le port 4060 pour transmettre la signalisation relative au flux et un second port qui est déterminé au début de l'échange (généralement le 4005) pour transmettre les données. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. +- **Ports** : En VoIP classique, on utilise deux ports, le port 5060 pour transmettre la signalisation relative au flux et un second port qui est déterminé au début de l'échange pour transmettre les données. Cependant l’avantage de IAX est qu’il utilise un seul port, le 4569 en UDP, à la fois pour la signalisation et le flux de données [[2](https://en.wikipedia.org/wiki/Inter-Asterisk_eXchange), [3](https://www.voip-info.org/iax-versus-sip/.)]. Le fait d’exposer un seul port présente divers avantages. En effet, la configuration du firewall est plus simple et la NAT est également rendue plus simple à configurer. Cette caractéristique apporte donc une certaine « légèreté » en matière de configuration pour ce protocole [[4](https://askanydifference.com/difference-between-sip-and-iax/)]. - **Diminution de la bande passante** : IAX utilise une en-tête racourcie comparé aux autres protocoles (_voir carctéristiques techniques_). Comme moins de données sont envoyées, cela inclut une réduction de la bande passante utilisée. From 4690ca984d4a7253d217bd64f0480c86713009c9 Mon Sep 17 00:00:00 2001 From: MagnesSimon <55548308+MagnesSimon@users.noreply.github.com> Date: Tue, 10 May 2022 17:23:59 +0200 Subject: [PATCH 045/241] Add files via upload --- "R\303\251seaux/Analyse Zabbix" | 46 +++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 "R\303\251seaux/Analyse Zabbix" diff --git "a/R\303\251seaux/Analyse Zabbix" "b/R\303\251seaux/Analyse Zabbix" new file mode 100644 index 0000000..6248677 --- /dev/null +++ "b/R\303\251seaux/Analyse Zabbix" @@ -0,0 +1,46 @@ +# Zabbix + +## 1. Introduction +Zabbix est un logiciel de monitoring open source. Projet démarré en tant que logiciel interne en 1998, il est rendu public en 2011 et la première version stable du logiciel, la 1.0, sort en 2004. Actuellement, la dernière version majeure disponible et stable est la 6.0.4 disponible depuis le 3 mai 2022 mais il existe aussi la version 6.2.0 qui est en bêta. Zabbix est utilisé pour la surveillance de divers composant informatique telle que les serveurs, machines virtuelles et services cloud. [1] [7] + + +## 2. Fonctionnement +L’outil de supervision Zabbix fonctionne avec une partie coté serveur qui s’installe sur un environnement Linux et un coté agent qui peut s’installer sur n’importe quelle plateforme. [2] +Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix, c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]
+ +Il existe aussi le cas de figure où c’est le serveur qui initie la communication via des requêtes grâce à un agent Zabbix et des paramètres utilisateur. Les paramètres utilisateur vont permettre de définir les éléments à monitorer et les données qui devront être récoltée par l’agent Zabbix. Comme pour le trappeur, les données récoltées vont être récoltées et traitées par le serveur. [2] [4]
+ +Pour assurer la sécurité des communications entre le serveur et les machines clientes, Zabbix va appliquer un système de cryptage. De cette manière, toutes les données transmissent sont protégées lorsqu’elles circulent sur des réseaux non sécurisés. [5]
+ + + +Afin de mieux gérer les comportement non désiré ou état critique d’une infrastructure IT, Zabbix propose un système d’envoi de notification. L’utilisateur installant et paramétrant l’outil de monitoring, va pouvoir définir des seuils pour un élément que l’on veut surveiller. Ainsi lorsque, par exemple, l’espace libre sur le disque de stockage X : de notre serveur sera inférieur à la valeur définie, Zabbix va envoyer une notification par mail, messagerie instantanée ou SMS selon ce qui a été définit. [6]
+ +## 3. Avantages et Inconvénients +### 3.1. Avantages : +* Découverte automatique [2] +* Intégration SNMP [7] +* Très complet +* Monitoring distribué +* Hautement configurable [8] + +### 3.2. Inconvénients +* Interface très encombrée [8] +* La configuration demande une très grande maitrise de l’outil [8] +* Gourmand en ressources [8] + +## 4. Conclusion +Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration qu’ont apportés toutes les versions, Zabbix est maintenant une référence connue dans le monde entier en ce qui concerne le monitoring de système informatique. Malgré la forte concurrence dans ce domaine, Zabbix a réussi à innover et à se différencier des autres outils de monitoring existant.
+ +J’avais personnellement choisi ce sujet car je suis amené à utiliser quotidiennement l’outil Zabbix dans le travail étudiant que j’occupe en attendant de terminer mes études. Mais malgré mon utilisation quotidienne de cet outil afin de monitorer les infrastructures informatiques de client, je ne savais rien du fonctionnement et de l’implémentation de cet outil. Cet article m’a permis de mieux comprendre un outil que de nombreux administrateurs systèmes et réseaux utilisent quotidiennement.
+ +## Sources +* https://stringfixer.com/fr/Zabbix [1] +* https://www.syloe.com/supervision-et-metrologie-zabbix [2] +* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] +* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] +* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] +* https://www.syloe.com/glossaire/logiciel-zabbix/ [6] +* https://www.zabbix.com/fr/release_notes [7] +* https://www.axelit.fr/technologies/zabbix/ [8] \ No newline at end of file From 8285b8bbcb254cdd2698e0f678728be165c62b66 Mon Sep 17 00:00:00 2001 From: MagnesSimon <55548308+MagnesSimon@users.noreply.github.com> Date: Tue, 10 May 2022 17:24:47 +0200 Subject: [PATCH 046/241] Delete Analyse Zabbix --- "R\303\251seaux/Analyse Zabbix" | 46 --------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 "R\303\251seaux/Analyse Zabbix" diff --git "a/R\303\251seaux/Analyse Zabbix" "b/R\303\251seaux/Analyse Zabbix" deleted file mode 100644 index 6248677..0000000 --- "a/R\303\251seaux/Analyse Zabbix" +++ /dev/null @@ -1,46 +0,0 @@ -# Zabbix - -## 1. Introduction -Zabbix est un logiciel de monitoring open source. Projet démarré en tant que logiciel interne en 1998, il est rendu public en 2011 et la première version stable du logiciel, la 1.0, sort en 2004. Actuellement, la dernière version majeure disponible et stable est la 6.0.4 disponible depuis le 3 mai 2022 mais il existe aussi la version 6.2.0 qui est en bêta. Zabbix est utilisé pour la surveillance de divers composant informatique telle que les serveurs, machines virtuelles et services cloud. [1] [7] - - -## 2. Fonctionnement -L’outil de supervision Zabbix fonctionne avec une partie coté serveur qui s’installe sur un environnement Linux et un coté agent qui peut s’installer sur n’importe quelle plateforme. [2] -Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix, c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]
- -Il existe aussi le cas de figure où c’est le serveur qui initie la communication via des requêtes grâce à un agent Zabbix et des paramètres utilisateur. Les paramètres utilisateur vont permettre de définir les éléments à monitorer et les données qui devront être récoltée par l’agent Zabbix. Comme pour le trappeur, les données récoltées vont être récoltées et traitées par le serveur. [2] [4]
- -Pour assurer la sécurité des communications entre le serveur et les machines clientes, Zabbix va appliquer un système de cryptage. De cette manière, toutes les données transmissent sont protégées lorsqu’elles circulent sur des réseaux non sécurisés. [5]
- - - -Afin de mieux gérer les comportement non désiré ou état critique d’une infrastructure IT, Zabbix propose un système d’envoi de notification. L’utilisateur installant et paramétrant l’outil de monitoring, va pouvoir définir des seuils pour un élément que l’on veut surveiller. Ainsi lorsque, par exemple, l’espace libre sur le disque de stockage X : de notre serveur sera inférieur à la valeur définie, Zabbix va envoyer une notification par mail, messagerie instantanée ou SMS selon ce qui a été définit. [6]
- -## 3. Avantages et Inconvénients -### 3.1. Avantages : -* Découverte automatique [2] -* Intégration SNMP [7] -* Très complet -* Monitoring distribué -* Hautement configurable [8] - -### 3.2. Inconvénients -* Interface très encombrée [8] -* La configuration demande une très grande maitrise de l’outil [8] -* Gourmand en ressources [8] - -## 4. Conclusion -Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration qu’ont apportés toutes les versions, Zabbix est maintenant une référence connue dans le monde entier en ce qui concerne le monitoring de système informatique. Malgré la forte concurrence dans ce domaine, Zabbix a réussi à innover et à se différencier des autres outils de monitoring existant.
- -J’avais personnellement choisi ce sujet car je suis amené à utiliser quotidiennement l’outil Zabbix dans le travail étudiant que j’occupe en attendant de terminer mes études. Mais malgré mon utilisation quotidienne de cet outil afin de monitorer les infrastructures informatiques de client, je ne savais rien du fonctionnement et de l’implémentation de cet outil. Cet article m’a permis de mieux comprendre un outil que de nombreux administrateurs systèmes et réseaux utilisent quotidiennement.
- -## Sources -* https://stringfixer.com/fr/Zabbix [1] -* https://www.syloe.com/supervision-et-metrologie-zabbix [2] -* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] -* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] -* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] -* https://www.syloe.com/glossaire/logiciel-zabbix/ [6] -* https://www.zabbix.com/fr/release_notes [7] -* https://www.axelit.fr/technologies/zabbix/ [8] \ No newline at end of file From 869b8ac30a5b2a1687ca1a7d5689b4f1c748a3f9 Mon Sep 17 00:00:00 2001 From: MagnesSimon <55548308+MagnesSimon@users.noreply.github.com> Date: Tue, 10 May 2022 17:26:22 +0200 Subject: [PATCH 047/241] Analyse sur Zabbix - Simon Magnes - HE201558 --- "R\303\251seaux/Analyse Zabbix.md" | 46 ++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 "R\303\251seaux/Analyse Zabbix.md" diff --git "a/R\303\251seaux/Analyse Zabbix.md" "b/R\303\251seaux/Analyse Zabbix.md" new file mode 100644 index 0000000..6248677 --- /dev/null +++ "b/R\303\251seaux/Analyse Zabbix.md" @@ -0,0 +1,46 @@ +# Zabbix + +## 1. Introduction +Zabbix est un logiciel de monitoring open source. Projet démarré en tant que logiciel interne en 1998, il est rendu public en 2011 et la première version stable du logiciel, la 1.0, sort en 2004. Actuellement, la dernière version majeure disponible et stable est la 6.0.4 disponible depuis le 3 mai 2022 mais il existe aussi la version 6.2.0 qui est en bêta. Zabbix est utilisé pour la surveillance de divers composant informatique telle que les serveurs, machines virtuelles et services cloud. [1] [7] + + +## 2. Fonctionnement +L’outil de supervision Zabbix fonctionne avec une partie coté serveur qui s’installe sur un environnement Linux et un coté agent qui peut s’installer sur n’importe quelle plateforme. [2] +Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix, c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]
+ +Il existe aussi le cas de figure où c’est le serveur qui initie la communication via des requêtes grâce à un agent Zabbix et des paramètres utilisateur. Les paramètres utilisateur vont permettre de définir les éléments à monitorer et les données qui devront être récoltée par l’agent Zabbix. Comme pour le trappeur, les données récoltées vont être récoltées et traitées par le serveur. [2] [4]
+ +Pour assurer la sécurité des communications entre le serveur et les machines clientes, Zabbix va appliquer un système de cryptage. De cette manière, toutes les données transmissent sont protégées lorsqu’elles circulent sur des réseaux non sécurisés. [5]
+ + + +Afin de mieux gérer les comportement non désiré ou état critique d’une infrastructure IT, Zabbix propose un système d’envoi de notification. L’utilisateur installant et paramétrant l’outil de monitoring, va pouvoir définir des seuils pour un élément que l’on veut surveiller. Ainsi lorsque, par exemple, l’espace libre sur le disque de stockage X : de notre serveur sera inférieur à la valeur définie, Zabbix va envoyer une notification par mail, messagerie instantanée ou SMS selon ce qui a été définit. [6]
+ +## 3. Avantages et Inconvénients +### 3.1. Avantages : +* Découverte automatique [2] +* Intégration SNMP [7] +* Très complet +* Monitoring distribué +* Hautement configurable [8] + +### 3.2. Inconvénients +* Interface très encombrée [8] +* La configuration demande une très grande maitrise de l’outil [8] +* Gourmand en ressources [8] + +## 4. Conclusion +Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration qu’ont apportés toutes les versions, Zabbix est maintenant une référence connue dans le monde entier en ce qui concerne le monitoring de système informatique. Malgré la forte concurrence dans ce domaine, Zabbix a réussi à innover et à se différencier des autres outils de monitoring existant.
+ +J’avais personnellement choisi ce sujet car je suis amené à utiliser quotidiennement l’outil Zabbix dans le travail étudiant que j’occupe en attendant de terminer mes études. Mais malgré mon utilisation quotidienne de cet outil afin de monitorer les infrastructures informatiques de client, je ne savais rien du fonctionnement et de l’implémentation de cet outil. Cet article m’a permis de mieux comprendre un outil que de nombreux administrateurs systèmes et réseaux utilisent quotidiennement.
+ +## Sources +* https://stringfixer.com/fr/Zabbix [1] +* https://www.syloe.com/supervision-et-metrologie-zabbix [2] +* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] +* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] +* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] +* https://www.syloe.com/glossaire/logiciel-zabbix/ [6] +* https://www.zabbix.com/fr/release_notes [7] +* https://www.axelit.fr/technologies/zabbix/ [8] \ No newline at end of file From 51d5f1904f5d02e3de69af8208af30a3d84579a2 Mon Sep 17 00:00:00 2001 From: Marina Date: Thu, 12 May 2022 14:25:34 +0200 Subject: [PATCH 048/241] lien index --- "R\303\251seaux/proxy" => "R\303\251seaux/proxy.md" | 0 index.md | 2 +- reseaux.md | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename "R\303\251seaux/proxy" => "R\303\251seaux/proxy.md" (100%) diff --git "a/R\303\251seaux/proxy" "b/R\303\251seaux/proxy.md" similarity index 100% rename from "R\303\251seaux/proxy" rename to "R\303\251seaux/proxy.md" diff --git a/index.md b/index.md index 9e8f402..10e673a 100644 --- a/index.md +++ b/index.md @@ -25,7 +25,7 @@ Les informations sont organisées par catégorie : * [Délégation DNS](Réseaux/delegation_dns.md) ### Administration réseaux - +* [Proxy](Réseaux/proxy.md) diff --git a/reseaux.md b/reseaux.md index 4798770..ca06275 100644 --- a/reseaux.md +++ b/reseaux.md @@ -12,3 +12,4 @@ Cette section regroupe tous les articles concernant le réseau : Protocoles, con ## Articles * [Délégation DNS](Réseaux/delegation_dns.md) +* [Proxy](Réseau/proxy.md) From 97af7dca1b23b301de82a09ea1bd6043680e91a4 Mon Sep 17 00:00:00 2001 From: edouardmais1 Date: Fri, 13 May 2022 11:08:30 +0200 Subject: [PATCH 049/241] PGP article TI WIKI --- "R\303\251seaux/PGP.md" | 136 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 "R\303\251seaux/PGP.md" diff --git "a/R\303\251seaux/PGP.md" "b/R\303\251seaux/PGP.md" new file mode 100644 index 0000000..e032da4 --- /dev/null +++ "b/R\303\251seaux/PGP.md" @@ -0,0 +1,136 @@ +# Artcle Wiki PGP - Maisin Edouard 2TL2 + + +## Introduction + +Avant de rentrer dans le vif du sujet en détails, il est intéressant de d'abord se remettre dans le Contexte et de se poser la question suivante : "Pourquoi utiliser PGP ?".
+ +Inventé en 1991, PGP ou "Pretty Good Privacy" est un système de chiffrement utilisé pour chiffrer des données, chiffrer des emails ainsi que des fichiers sensibles à travers différents logiciels se basant sur PGP lui-même. PGP s'impose rapidement comme un standard pour la confidentialité des emails et sa popularité repose sur 2 avantages significatifs.
+Premièrement, PGP est un "freeware" ou "logiciel gratuit" (pour les francophones) qui lui a permis de se propager assez rapidement parmi les utilisateurs désirant un niveau de sécurité supplémentaire sur leur transfert d'emails.
+Deuxièmement, PGP utilise le système de chiffrement asymétrique ce qui permet aux utilisateurs de communiquer de facon chiffré de bout en bout lors d'échanges de mails coté serveur (sans échanger leurs clés privées ce qui est un réel avantage en terme de sécurité et à moindre cout et assure le chiffrement de bout en bout des communications. [1] [6] + +## A quoi sert PGP ? + +### le chiffrement de Mails + +Le chiffrement des emails de bout en bout est le cas d'usage principal de PGP et est utilisé pour toute personne souhaitant effectuer des communications sécurisées et préserver la confidentialité des ses données.[1] [6] [5] + + +### la vérification de signatures numériques + +Outre le cas des mails, PGP est aussi utilisé pour la vérification de signature numériques, c'est à dire la vérification de l'identité d'un expéditeur d'un email. "Une signature numérique repose sur l’utilisation d’un algorithme pour combiner la clé de l’expéditeur avec les données qu’il envoie. Cette combinaison génère une » fonction hash » : un autre algorithme permettant de convertir un message en un bloc de données à taille fixe. Ce bloc est ensuite chiffré à l’aide de la clé privée de l’expéditeur." [lebigdata.fr/pgp-tout-savoir] [6] [5] + +le destinataire du message est alors capable de déchiffrer les données en utilisant la clé publique de l'expéditeur. Si un caractère du message à été altéré pendant l'échange du message, alors cela signifie que l'expéditeur n'est peut etre pas celui qu'il prétend... [1] [6] [5] + +### le chiffrement de fichiers + +Le chiffrement des fichiers est un autre cas d'usage de PGP et est utilisé pour toute personne souhaitant effectuer des échanges de dossiers ou fichiers sécurisées et préserver la confidentialité des données. [1] [5] + +
+ +## Fonctionnement et Concepts Théoriques + +PGP possède certaines caractéristiques semblables à d'autres systèmes de chiffrement tels que Kerberos, S/MIME ou encore un peu plus populaire : SSL. A un niveau basique le chiffrement PGP utilise une combinaison de 2 types de chiffrements c'est à dire, le chiffrement symétrique et asymétrique que l'on peut qualifier comme "a clef de sessions". [5] + +Avant de continuer, il est intéréssant de se renseigner sur que signifie les termes chiffrer, déchiffrer, crypter, décrypter et j'en passe car ses termes sont très souvent utilisés dans le domaine de l'informatique mais le signification ne sont pas exactement les mêmes et beaucoup d'entre nous n'utilise pas ses termes correctement.
+ +L'ensemble de ses termes fait partie du domaine de la cryptographie, c'est à dire l'ensemble des techniques qui permettent de rendre un message inintelligible. Le chiffrement des données consiste en l’utilisation d’une technique de cryptographie pour rendre un message clair illisible à l’aide d’une clé de chiffrement. Le principe fondamental est que cette clé doit être connue par le destinataire pour permettre le déchiffrement du message. c'est sur ce principe que repose le logiciel PGP. il éxiste plusieurs types de clés et chaque appareil ou utilisateur dispose de sa propre clé.
[7] + +Contrairement au chiffrement, le cryptage est souvent une confusion vis à vis du terme "chiffrement" ou l'on associe trop souvent les 2 termes et pour autant "chiffrer" n'est pas "crypter". en Effet, prenons le terme "décrypter", décrypter consiste à retrouver le texte original à partir d’un message chiffré sans posséder la clé de (dé)chiffrement. Décrypter ne peut accepter d’antonyme : il est en effet impossible de créer un message chiffré sans posséder de clé de chiffrement. c'est pourquoi le terme "crypter" est une simple erreur venant sans doute du mot "cryptographie" et qui est, en effet, une erreur de vocabulaire. [7] + +Revenons à notre chiffrement PGP et son Fonctionnement : + +Tout d'abord, PGP génère une clé de session aléatoire en utilisant un premier alogrithme. Cette clé est un très long nombre qui ne peut pas être deviné, et ne peut être utilisé qu’une seule fois.
+ +Ensuite, cette clé de session est chiffrée. Cette opération est réalisée à l'aide de la clé publique du destinataire du message. La clé publique est liée à l'identité d'une personne particulière et n'importe qui peut l'utiliser pour lui envoyer un message. L'expéditeur envoie sa clé de session PGP chiffrée au destinataire et celui-ci est en mesure de le déchiffrer à l'aide de sa clé privée. En utilisant la clé de session, le destinataire peut finalement déchiffrer le message. + +Enfin, pourquoi ne pas utiliser une simple méthode de chiffrement symétrique ? En effet, le chiffrement symétrique est une technique plus rapide et plus facile à mettre en place mais l'inconvénient est que la clé commune à l'expéditeur et au destinataire nécéssite d'etre partagée en texte brut, ce qui n'est pas sur du tout... +C’est la raison pour laquelle on utilise une clé de chiffrement publique pour chiffrer la clé de session. Ainsi, PGP combine l’efficacité du chiffrement symétrique et la sécurité du chiffrement par clé publique. + +Comprendre le chiffrement symétrique et asymétrique : ->
Cookie Conneté
+ +Schéma de Chiffrement PGP:

+ +![test](https://github.com/edouardmais1/AdminSysII2.0/blob/main/IMG/PGP.png) + + +
+schéma rédigé via draw.io par Maisin Edouard + +
+ +## PGP, OpenPGP et GnuPG + +en raison des problèmes de brevets de PGP dans les années 90, PGP n'était pas toujours la solution la plus pratique à l'internationale, le Groupe de travail OpenPGP fur crée après la diffusion du code source de PGP, lui, protégé. OpenPGP est basé sur le système de chiffrement PGP et est lui aussi, une méthode de chiffrement basé sur un système de clés. OpenPGP est largement uutilisé pour sécuriser les communications par courrier électronique, mais sa technologie peut également être appliquée au transfert de fichier via FTP. [2] [1] + +GnuPG, lui, est une autre norme de chiffrement libre que les entreprises peuvent utiliser, basée sur OpenPGP. La principale différence avec le PGP réside dans les algorithmes pris en charges. GnuPG est un outil utilisé pour la communication et le stockage de données en toute sécurité. Il dispose d’un système de gestion des clés robuste et s’intègre facilement à d’autres applications. Il prend en charge : le chiffrement, la signature des données, S/MIME et SSH.[2] [8] + +
+ +## Quelle sécurité fournie par PGP ? + +Il est assez difficile de certifier à qu'une méthode de chiffrement est à 100% infaillible. Cela dit, PGP à maintenant plus de 30 ans et peu de vulnérabilités ont été détecter dans l'implémentation de base du système. De plus, son système de à 2 clés, son système de signature et le fait qu'il soit open-source contribuent tous à sa réputation comme l'un des meilleurs protocoles de cryptage. + + +## Algorithmes de chiffrement PGP + +Différents types d'algorithmes de chiffrements peuvent etre utilisés avec PGP bien que le populaire "RSA" soit l'un des plus courants étant donné sa robustesse. L'on peut noté d'autres algorithmes courament utilisés comme AES et autres. + +A noté que la taille d'un clé RSA peut varier sur des longueur de bits différents renforcant la sécurité. En effet, un clé chiffrée sur 1024 ou 512 bits (assez faibles) ne possedera pas la meme robustesse qu'une clé chiffrée sur 2048 ou 4096 bits... + +Il est interessant de noté que certains protocoles, logiciels ou certificats obligent l'utilisation de taille de clé RSA minimum afin d'assurer une confidentialité et robustesse accrue tout comme par exemple *SSL dont les clés minimum passeront de 2048 à 3072 bits* [https://www.ssl.com/fr/les-blogs/nouvelle-taille-de-cl%C3%A9-rsa-minimale-pour-les-certificats-de-signature-de-code/] + + +## Avantages et Inconvénients ? + +Le principal avantage de PGP est qu'il est presque impossible de contourner son chiffrement, ce qui explique sa populairité encore à l'heure actuelle. + +De plus, ses différentes extensions et les solutions qu'il apporte en fonction du type d'objet à chiffrer font de lui un logiciel très polyvalent. + +Néanmoins, le plus gros inconvénient de PGP reste sa compléxetité d'utilisation assez complexe et peut induire des failles de sécurité si celui-ci n'est pas utilisé correctement. + +à l'heure actuelle des solutions pretes à l'emploi sont disponibles, et il ne faut pas oublier que PGP n'offre malheureusement pas l'anonymat... En effet, meme si le contenu des messages est chiffré, il est possible de remonter jusqu'a l'identité de l'expéditeur ou du destinataire. + + +## Choisir son logiciel PGP + +Afin de choisir au mieux son logiciel PGP, il est essentiel de prendre en compte les critères à mettre en place concernant la sécurité à mettre en place ainsi que le type d'objet à sécuriser. +les Leaders en termes de logiciels PGP: + +- Gpg4o (Outlook): très populaire pour les utilisateurs Windows et permet de chiffrer les emails avec une interface intuitive.
+- GPGToolss (Apple MAil): populaire pour les utilisateurs Mac OS et permet de bénéficier de chiffrement pour les différents services d'un Mac (services Mail et applications). +- ProtonMail : utilisant directement le chiffrement PGP par défaut et permet donc de profiter du logiciel aisément. +
+ +## Conclusion + +En conclusion, PGP est logiciel de chiffrement de haute qualité et reste l'un des leaders à l'heure actuelle pour ses performances et sa polyvalence. Il met à disposition différents types de solutions en fonctions de différents besoin utilisateurs. Son système de chiffrement à double clés, son système de signature et son algorithme de chiffrement RSA font de lui l'un des logiciels les plus complets et sécurisé. + + + +## Bibliographie : + +1) - https://fr.wikipedia.org/wiki/Chiffrement_RSA, wikipédia, article en ligne dont la dernière modification date du 12 avril 2022
+ + +2) - https://fr1.buffalo-mn.org/pgp-me-pretty-good-privacy-explained-4745, buffalo.org
+ + + +3) - https://tutox.fr/2017/04/28/chiffrer-nest-crypter/, tutox.fr, publié le 28 avril 2017
+ + + +4) - https://www.malekal.com/le-chiffrement-pgp-comment-ca-marche/, malekal.com, dernière modification le 16 juin 2021
+ + +5) - https://www.varonis.com/fr/blog/pgp-encryption, varonis.com, dernière modification le 1er avril 2022 + +6) - https://www.lebigdata.fr/pgp-tout-savoir, lebigdata.fr, publié le 21 janvier 2021
+ + +7) - https://www.clicours.com/cours-fonctionnement-de-pgp-programme-de-cryptage/, clicours.com, dernière modification inconnue + + +8) - https://docs.microsoft.com/fr-fr/system-center/orchestrator/standard-activities/pgp-encrypt-file?view=sc-orch-2022, docs.microsoft.com, publié le 2 mai 2022
+ From 1a283bad0c4e77f586a9af038f22fee5bb56b87e Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Fri, 13 May 2022 14:36:02 +0200 Subject: [PATCH 050/241] =?UTF-8?q?Int=C3=A9gration=20des=20articles=20sur?= =?UTF-8?q?=20IAX,=20reverse=20proxy=20et=20PGP=20+=20refonte=20des=20inde?= =?UTF-8?q?x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/IAX.md" | 6 ++++++ "R\303\251seaux/reverse_proxy.md" | 7 ++++++- .../PGP.md" => "S\303\251curit\303\251/PGP.md" | 7 ++++++- index.md | 16 ++++++++++------ reseaux.md | 10 +++++++++- securite.md | 16 ++++++++++++++++ 6 files changed, 53 insertions(+), 9 deletions(-) rename "R\303\251seaux/PGP.md" => "S\303\251curit\303\251/PGP.md" (99%) create mode 100644 securite.md diff --git "a/R\303\251seaux/IAX.md" "b/R\303\251seaux/IAX.md" index a6338b1..b27096d 100644 --- "a/R\303\251seaux/IAX.md" +++ "b/R\303\251seaux/IAX.md" @@ -1,3 +1,9 @@ +--- +layout: default +title: IAX +parent: Réseaux +--- + # Inter-Asterisk eXchange IAX est un protocole VoIP produit et créé à la base pour le logiciel PBX « Asterisk ». Il est utilisé pour transmettre des sessions VoIP entre les serveurs et les machines des clients. diff --git "a/R\303\251seaux/reverse_proxy.md" "b/R\303\251seaux/reverse_proxy.md" index c53b7fe..1ed9406 100644 --- "a/R\303\251seaux/reverse_proxy.md" +++ "b/R\303\251seaux/reverse_proxy.md" @@ -1,4 +1,9 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Reverse Proxy +parent: Réseaux +--- + # Le Reverse Proxy Dans cet article, nous allons essayer de répondre à la question **"Qu'est-ce qu'un reverse proxy et pourquoi en utiliser un ?"** diff --git "a/R\303\251seaux/PGP.md" "b/S\303\251curit\303\251/PGP.md" similarity index 99% rename from "R\303\251seaux/PGP.md" rename to "S\303\251curit\303\251/PGP.md" index e032da4..1a56696 100644 --- "a/R\303\251seaux/PGP.md" +++ "b/S\303\251curit\303\251/PGP.md" @@ -1,5 +1,10 @@ -# Artcle Wiki PGP - Maisin Edouard 2TL2 +--- +layout: default +title: PGP +parent: Sécurité +--- +# PGP ## Introduction diff --git a/index.md b/index.md index d054a8e..53fdd70 100644 --- a/index.md +++ b/index.md @@ -22,14 +22,16 @@ Les informations sont organisées par catégorie : ### Routage et switching -### Protocoles transport et applicatifs +## Protocoles transport et applicatifs -- [Délégation DNS](Réseaux/delegation_dns.md) -- [HTTPS](Réseaux/https.md) -- [DNSSec](Réseaux/dnssec.md) +- [Délégation DNS](Réseaux/delegation_dns.md) +- [DNSSec](Réseaux/dnssec.md) +- [HTTPS](Réseaux/https.md) +- [IAX](Réseaux/iax.md) -### Administration réseaux -- [Reverse Proxy](Réseaux/reverse_proxy.md) +## Administration réseaux + +- [Reverse Proxy](Réseaux/reverse_proxy.md) ## Développement @@ -52,3 +54,5 @@ Les informations sont organisées par catégorie : ### Conteneurs ## Sécurité + +- [PGP](Sécurité/PGP.md) \ No newline at end of file diff --git a/reseaux.md b/reseaux.md index c657f1e..aafac6b 100644 --- a/reseaux.md +++ b/reseaux.md @@ -11,10 +11,18 @@ Cette section regroupe tous les articles concernant le réseau : Protocoles, con ## Protocoles transport et applicatifs +### Le DNS - [Délégation DNS](Réseaux/delegation_dns.md) -- [HTTPS](Réseaux/https.md) - [DNSSec](Réseaux/dnssec.md) +### Le Web + +- [HTTPS](Réseaux/https.md) + +### La VoIP + +- [IAX](Réseaux/iax.md) + ## Administration réseaux - [Reverse Proxy](Réseaux/reverse_proxy.md) \ No newline at end of file diff --git a/securite.md b/securite.md new file mode 100644 index 0000000..cf6469a --- /dev/null +++ b/securite.md @@ -0,0 +1,16 @@ +--- +layout: default +title: Sécurité +nav_order: 2 +has_children: true +--- + +# Sécurité + +- [PGP](Sécurité/PGP.md) + + +# Concepts liés à la sécurité dans d'autres sections : + +- [Reverse Proxy](Réseaux/reverse_proxy.md) + From 0b3d06ffaee0786965935c31c91088140816e3ad Mon Sep 17 00:00:00 2001 From: bricekouetcheu Date: Fri, 13 May 2022 16:45:03 +0200 Subject: [PATCH 051/241] article LDAP --- "R\303\251seaux/LDAP.md" | 227 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 "R\303\251seaux/LDAP.md" diff --git "a/R\303\251seaux/LDAP.md" "b/R\303\251seaux/LDAP.md" new file mode 100644 index 0000000..7bda1d8 --- /dev/null +++ "b/R\303\251seaux/LDAP.md" @@ -0,0 +1,227 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# LDAP + + +Aujourd’hui, l’un des enjeux majeures lors de la croissance d’une entreprise est la sécurité de son systeme d'information; il est impératif de garder le contrôle sur l’ensemble des données nécessaires à l’authentification et les droits d’accès…ces informations sont très difficiles à maitriser car très volatiles et éparses, il devient donc de plus en plus difficile d’utiliser un stockage de données classique. Une solution à ce problème serait de mettre en place des annuaires LDAP. +LDAP (Lightweight Directory Access Protocol) est un protocole qui spécifie une méthode de stockage d’annuaire et facilite l’authentification et l’autorisation des utilisateurs aux serveurs, fichiers, équipements réseaux etc... + + +## LES ORIGINES DU PROTOCOLE LDAP +LDAP a été codéveloppé par Tim Howes de l'Université du Michigan, Steve Kille d' Isode Limited et Wengyik Yeong de Performance Systems International, en 1993. [[1](https://ldapwiki.com/wiki/History%20of%20LDAP)]. +Au commencement, l'Union Internationale des Télécommunications (UIT) créa les annuaires X.500 qui reposaient sur le protocole DAP (directory access protocol) . Ce fut à l’époque un concept novateur dans l’uniformisation d’accès aux services, la centralisation et la protection des ressources. Seulement il était très difficile à mettre en place a la fois pour les systèmes et pour les réseaux. LDAP apparaitra comme une solution a tous ces problèmes en permettant l’authentification et l’autorisation des utilisateurs sur les serveurs, les fichiers et les applications tout en réduisant la bande passante et la demande sur les terminaux. Grâce à ces gains d'efficacité, LDAP connaîtrait un grand succès et deviendra le protocole d'authentification de facto des services d'annuaire Internet pendant un certain temps et en 1997, LDAPV3 a été proposé et acceptée comme norme internet pour les services d’annuaire ; aujourd’hui encore c’est la version la plus recente et la plus rependue + +[[2](https://openclassrooms.com/fr/courses/2257706-presentation-du-concept-dannuaire-ldap)] + + +## DESCRIPTION DU PROTOCOLE LDAP +LDAP est un protocole de la couche 7 qui utilise TCP comme protocole de transport et fonctionne par défaut sur le port 389 et 636 pour sa version sécurisée (LDAP OVER TLS/SSL). + +On distingue 02 méthodes de communications : +- **Client/serveur** : accès aux informations par les clients +- **Serveur/serveur** : duplication des informations entre serveurs + + + La version actuelle (version 3) proposent les évolutions suivantes : +- L'utilisation de l'encodage UTF-8 +- L'authentification via Simple Authentication and Security Layer (SASL), et Transport Layer Security (TLS) +- Le support des Referrals (une branche pointe vers un autre annuaire) +- La capacité d'étendre le protocole +- Le support des schémas dans l'annuaire + +## AVANTAGES ET INCONVENIENTS DE LDAP + +### AVANTAGES +- Il peut être open source : on a par exemple OPENLDAP +- Standardisé : LDAP a été ratifié en tant que norme IETF (Internet Engineering Task Force) en 1997 avec RFC 2251. [[3](https://www.journaldunet.fr/web-tech/dictionnaire-du-webmastering/1203397-ldap-lightweight-directory-access-protocol-definition-traduction)]. + +- Flexible : l’authentification LDAP est utilisé pour de nombreux cas de figure. +- Securisé : en effet grâce à SSL ou TLS, il est tout à fait possible de chiffrer les communications LDAP et donc les rendre plus ou moins inaccessibles +- Multi-système : LDAP est compatible avec différents systèmes d’exploitation et d’appareils. Cependant, différentes offres LDAP peuvent limiter cette flexibilité ; active directory, par exemple, est centré sur Windows et necessite souvent des options complémentaires pour fonctionner avec des systèmes d’exploitation supplémentaires. + + +### INCONVENIENTS +- Ancienneté : LDAP est un protocole plus ancien. Aujoud’hui il existe de nouveaux protocoles d’authentification tels que SAML qui sont conçus pour les environnements informatiques modernes orientés cloud.[[4](https://www.okta.com/fr/blog/2016/12/what-is-saml/)]. +- Mise en place assez complexe : l’installation et la maintenance de LDAP dans une entreprise nécessite généralement des compétences assez poussées. + +## PRINCIPES + +Un serveur LDAP agira donc de façon **asynchrone** comme un **intermédiaire** entre un client et une source de données qui pourrait être un fichier ou une base de données. Ses principales fonctions sont: +- **Mise à jour** : Cela inclut l'ajout, la suppression ou la modification des informations de répertoire. +- **Requête** : Cela inclut la recherche et la comparaison des informations d'annuaire. +- **Authentification** : les principales fonctions d'authentification incluent la liaison et la déliaison ; une troisième fonction, abandon, peut être utilisée pour empêcher un serveur de terminer une opération. + +![image](https://user-images.githubusercontent.com/64273779/168279400-381b5146-817d-4bc3-a4c5-85a5499e780a.png) + + +les modèles LDAP représentent les services que propose le serveur au client. On en distingue 04 d’après) qui sont : + +- **Le modèle de nommage** : définit La façon dont les informations sont stockées et organisées dans l’annuaire. +- **Le modèle fonctionnel** : définit les services fournis par l’annuaire (recherche , ajout). +- **Le modèle d’information** : définit le type d’informations stockées. +- **Le modèle de sécurité** : définit les droits d’accès aux ressources[[5](https://openclassrooms.com/fr/courses/2257706-presentation-du-concept-dannuaire-ldap)] + + + +### LE MODELE DE NOMMAGE + +Dans un annuaire LDAP, les données sont représentées de manière hiérarchique, on parlera ici d’arborescence d’informations d’annuaire (DIT). Dans cette structure arborescente, chaque élément est appelé une entrée et possède : ++ Un ensemble d’attributs qui représentent les caractéristiques de ce dernier. ++ un DN (Distinguished Name) qui est le nom complet permettant de le situer dans l’arbre. ++ Un RDN (relative distinguished Name ) qui est la partie du DN permettant de représenter cette élément de manière unique dans l’annuaire. + +Toutes les entrées n’ayant pas de subordonées correspondent donc à des feuilles et la racine est l’entité globale qui englobe toutes les informations dans l’annuaire. + +![image](https://user-images.githubusercontent.com/64273779/168279486-c4a11c9f-1f0f-4231-a445-b73a83cb3e17.png) + + +Dans l’Example ci-dessus, la racine correspond au nom de domaine où est hébergé le serveur LDAP. On a donc 02 branches (users et groups) qui correspondent aux organisational units. + +La feuille BRICE par exemple aura comme DN : **cn=brice,ou=users,dc=ephec-ti,dc=be et son RDN sera brice** + + +### LE MODELE FONCTIONNEL +Il décrit les moyens d’acces et les operations applicables aux données. + +Les operations possibles seront : +- Opération d’interrogation : requête pour accéder aux données +- Opération de comparaison : renvoie vrai ou faux si egal. +- Les operations de mise a jour : + - Add : ajouter une entrée au repertoire + - Delete : suppromer une entrée au repertoire + - Rename : modifier le nom d’entrée d’un repertoire + - Modify : modifier une entrée +- Les opérations d’authentification et de contrôle : + - Bind : Initier une nouvelle session sur le serveur LDAP + - Unbind : Terminer une session sur le serveur LDAP + - Abandon : Abandonner l’operation précédemment envoyée au serveur. + + ### LE MODELE D’INFORMATION + + Il définit le type de données pouvant être stocké dans l’annuaire. + Une Entrée représente l’élément de base de l’annuaire. Elle contient les données, un ensemble d’attributs ; on peut faire le parallèle avec les classes en POO. + + Un attribut pourra donc appartenir à plusieurs classes. Il est caractérisé par un nom, un type, une méthode de comparaison, un objet Identifier, une valeur. + + Une classe d’objet est définie par : + * Un nom + * Un OID qui l’identifie de manière unique dans l’arborescence + * Des attributs obligatoires + * Des attributs optionnels + +L’ensemble formé par ces classes d’objet et leurs attributs seront définis par un schéma. + + +### LE MODELE DE SECURITE +Il décrit le moyen de protéger les données de l’annuaire par des mécanismes permettant aux clients de s’identifier et d’acceder aux données selon leurs droit. Il s’etend sur plusieurs niveaux : +- L’authentification pour se connecter au service : Pour accéder aux ressources de l’annuaire, le client doit s’authentifier auprès du serveur. Cette opération est dite de « binding » [[6](https://openclassrooms.com/fr/courses/2257706-presentation-du-concept-dannuaire-ldap/2260351-modele-de-securite)] + les différentes méthodes d’authentification proposée par LDAPV3 sont: + * Anonymous authentification : accès sans authentification + * Root DN authentication : accès administrateur + * Mot de passe+ SSL ou TLS : accès chiffré + * Certificats sur SSL : échange de clé publique ou privée +- Un modèle de contrôle d’accès aux données : droit d’accès aux données(lecture, ecriture, recherche , comparaison). +- Par le chiffrement des communications : utilisation de SSL ou TLS + + +## MISE EN PLACE D'UN SERVEUR LDAP + +La configuration d’un annuaire LDAP passe par plusieurs étapes a savoir : + +### Etape1 : **la phase de conception** + +On determine: ++ La nature des données ++ La finalité de ces données c’est-à-dire ce que l’on compte en faire ++ La manière de gérer ces données ++ On désigne enfin le DIT (DIRECTORY INFORMATION TREE) + +### Etape2 : **configuration du serveur** + ++ Installation du serveur ++ Creation du/des comptes administrateurs ++ Ajout des nouveaux objets en fonction du DIT designé au prealable + +### ETAPE 3 : **sécurisation du service** + +Configuration des ACL : définir les types d’utilisateurs et les niveaux d’accès pour chaque ressource de l’annuaire. + +on distingue plusieurs d'accès: + +| niveau | Description | +| ------------- |------------- | +| none | pas d'accès | +| compare |comparaison | +| auth | authentification | +|search | recherche | +| read | lecture | +| write | ecriture | + + +Les différents types d’utilisateurs + + +| niveau | Description | +| ------------- | ------------- | +| * | Tous les types d’utilisateurs | +|anonymous |Utilisateur anonyme | +| users | Utilisateur authentifié | +|self| Utilisateur associé à l’entrée recherche| + +[[7](http://igm.univ-mlv.fr/~dr/XPOSE2009/ldap/xpose_ldap.pdf)] + + +## LDAP VERS LE CLOUD? + +Aujourd'hui la plupart des entreprises se tournent vers des solutions CLOUD; il nait donc le besoin de solutions d'annuaire plus flexibles, pouvant fonctionner avec des ressources cloud et s'adapter à differents systemes d'exploitations. Les solutions centrées sur Microsoft windows et Azure d'active directory commencent donc à présenter des limites pour de nombreuses entreprises avec des systemes d'exploitation divers. Ces nouveaux défis avec AD et les annuaires sur site ont poussé les entreprises à se tourner vers le cloud LDAP et, finalement, vers Directory-as-a-Service. + + + + + +## Bibliographie + +* [[1](https://ldapwiki.com/wiki/History%20of%20LDAP)]. + - titre : History of LDAP + - auteur: + - derniere modification: 20/06/ 2019 + - date de consultation : 11/05/2022 + +* [[2](https://openclassrooms.com/fr/courses/2257706-presentation-du-concept-dannuaire-ldap)] + - titre: presentation du concept d'annuaire LDAP + - auteur: Antoine Bouet + - derniere mise à jour: 14/02/2022 + - date de consultation: 11/05/2022 + +* [[3](https://www.journaldunet.fr/web-tech/dictionnaire-du-webmastering/1203397-ldap-lightweight-directory-access-protocol-definition-traduction)] + - titre : LDAP (Lightweight Directory Access Protocol) : définition, traduction + - auteur: + - derniere mise à jour : 09/01/2019 + - date de consultation : 12/05/2022 + +* [[4](https://www.okta.com/fr/blog/2016/12/what-is-saml/)] + - titre : Qu'est-ce que le protocole SAML ? + - auteur: Ed Sawma + - derniere mise à jour : 04/09/2020 + - date de consultation : 12/05/2022 + +* [[5](https://openclassrooms.com/fr/courses/2257706-presentation-du-concept-dannuaire-ldap)] + - titre: presentation du concept d'annuaire LDAP + - auteur: Antoine Bouet + - derniere mise à jour: 14/02/2022 + - date de consultation: 11/05/2022 + +* [[6](https://openclassrooms.com/fr/courses/2257706-presentation-du-concept-dannuaire-ldap/2260351-modele-de-securite)] + - titre: presentation du concept d'annuaire LDAP + - auteur: Antoine Bouet + - derniere mise à jour: 14/02/2022 + - date de consultation: 11/05/2022 + +* [[7](http://igm.univ-mlv.fr/~dr/XPOSE2009/ldap/xpose_ldap.pdf)] + - titre: LDAP et les services d'annuaire + - auteur: marc olory + - derniere mise a jour: 12/12/2010 + - date de consultation: 13/05/2022 + + + + From 0b5dfcf90e004b44cc4366dd3f1e724271c2e9ac Mon Sep 17 00:00:00 2001 From: Marina Date: Fri, 13 May 2022 17:30:17 +0200 Subject: [PATCH 052/241] =?UTF-8?q?rectification=20confusion=20au=20niveau?= =?UTF-8?q?=20du=20r=C3=A9seau?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/proxy.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/proxy.md" "b/R\303\251seaux/proxy.md" index 889d26e..1f24b04 100644 --- "a/R\303\251seaux/proxy.md" +++ "b/R\303\251seaux/proxy.md" @@ -5,12 +5,13 @@ a[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) Tiré de l'anglais qui signifie "procuration", le terme proxy désigne un serveur qui permet de relayer les requêtes. Un serveur Proxy (également appelé serveur mandataire) est donc un serveur qui agit comme intermédiaire entre un utilisateur demandeur d'une ressource et le serveur distant, fournisseur de cette ressource. L'utilisateur ne peut plus s'adresser directement au serveur distant sans passer par le serveur Proxy, qui fonctionne au nom du client, masquant potentiellement la véritable origine de la demande. ###### Fig.1 Schéma d'un serveur Proxy - + + ###### "https://www.proxyvpn.fr/wp-content/uploads/2019/02/1200px-CPT-Proxy.svg_.png"© proxyvpn.fr ## Que se passe-t-il au niveau du réseau ? [^3] -Le Proxy travaille sur la couche application, au niveau 7 du modèle OSI. Le Proxy décapsule donc toutes les couches inférieures quand il reçoit une requête http et réencapsule les paquets IP pour les retransmettre vers le serveur de destination. Il y a donc deux connexions TCP ce qui signifie une rupture de flux au niveau du Proxy. +Le Proxy travaille sur la couche application, au niveau 7 du modèle OSI. Concrètement, dans le cas d'un proxy web, il décapsule donc toutes les couches inférieures quand il reçoit une requête http et réencapsule les paquets IP pour les retransmettre vers le serveur de destination. Il y a donc deux connexions TCP ce qui signifie une rupture de flux au niveau du Proxy. ###### Fig.2 Décapsulation de la requête reçue et réencapsulation ![Décapsulation de la requête et réencapsulation](https://zestedesavoir.com/media/galleries/5382/2e3db985-cde5-4e61-9bf7-5af14485d872.png) @@ -76,7 +77,9 @@ Le serveur Web ne connaît ni l'adresse IP de l'utilisateur ni celle du Proxy. Le Proxy SOCK est un Proxy de tunneling, technique consistant à utiliser un protocole pour transporter des données à l'intérieur d'un autre protocole. Il crée une connexion TCP vers un autre serveur derrière le Firewall au nom du client. Le serveur Proxy SOCK relaie la session TCP et UDP d'un utilisateur qui n'est pas autorisé à établir une connexion avec un serveur extérieur au-delà du Firewall. ###### Fig.3 Schéma d'un Proxy de tunneling ![](https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png) + _shivk "https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png" + "Le client SSH crée un proxy SOCK (tunnel). Il prend le trafic local envoyé à un port spécifique du PC et l'envoie via la connexion SSH à un emplacement distant, le serveur SSH" #### **Proxy FTP (File Transfer Protocol)**[^11] From 8e7090bbaf731d0db7c5582eb6af867965bf4d73 Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Fri, 13 May 2022 22:05:36 +0200 Subject: [PATCH 053/241] Ajout articles LDAP et proxy --- "R\303\251seaux/LDAP.md" | 7 ++++++- "R\303\251seaux/proxy.md" | 7 ++++++- index.md | 1 + reseaux.md | 5 +++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/LDAP.md" "b/R\303\251seaux/LDAP.md" index 7bda1d8..8d57769 100644 --- "a/R\303\251seaux/LDAP.md" +++ "b/R\303\251seaux/LDAP.md" @@ -1,4 +1,9 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: LDAP +parent: Réseaux +--- + # LDAP diff --git "a/R\303\251seaux/proxy.md" "b/R\303\251seaux/proxy.md" index 1f24b04..38a3225 100644 --- "a/R\303\251seaux/proxy.md" +++ "b/R\303\251seaux/proxy.md" @@ -1,4 +1,9 @@ -a[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Proxy +parent: Réseaux +--- + # Le proxy ## Qu'est-ce qu'un proxy?[^1] [^2] diff --git a/index.md b/index.md index f9947e0..f8ee560 100644 --- a/index.md +++ b/index.md @@ -28,6 +28,7 @@ Les informations sont organisées par catégorie : - [DNSSec](Réseaux/dnssec.md) - [HTTPS](Réseaux/https.md) - [IAX](Réseaux/iax.md) +- [LDAP](Réseaux/ldap.md) ## Administration réseaux diff --git a/reseaux.md b/reseaux.md index 69c029e..5c7482b 100644 --- a/reseaux.md +++ b/reseaux.md @@ -23,6 +23,11 @@ Cette section regroupe tous les articles concernant le réseau : Protocoles, con - [IAX](Réseaux/iax.md) +### Autres + +- [LDAP](Réseaux/ldap.md) + ## Administration réseaux + - [Proxy](Réseau/proxy.md) - [Reverse Proxy](Réseaux/reverse_proxy.md) From b8bd476136f8163bda89a4187829b9c8f2301551 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 17 May 2022 10:43:35 +0200 Subject: [PATCH 054/241] Create IPsec --- "R\303\251seaux/IPsec" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "R\303\251seaux/IPsec" diff --git "a/R\303\251seaux/IPsec" "b/R\303\251seaux/IPsec" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/R\303\251seaux/IPsec" @@ -0,0 +1 @@ + From 3e28852ee4a59965d59ac56525a6d6ce72e2cdcc Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 17 May 2022 10:47:04 +0200 Subject: [PATCH 055/241] Update IPsec --- "R\303\251seaux/IPsec" | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git "a/R\303\251seaux/IPsec" "b/R\303\251seaux/IPsec" index 8b13789..37132da 100644 --- "a/R\303\251seaux/IPsec" +++ "b/R\303\251seaux/IPsec" @@ -1 +1,14 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: DNSSEC +parent: Réseaux +--- + +# IPsec ( Internet Protocol Security ) + +## Un peu d'histoire + + + From 0eb0820dbbb4c993694e91e3e24c431a33b98778 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 17 May 2022 10:48:32 +0200 Subject: [PATCH 056/241] Rename IPsec to IPsec.md --- "R\303\251seaux/IPsec" => "R\303\251seaux/IPsec.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "R\303\251seaux/IPsec" => "R\303\251seaux/IPsec.md" (100%) diff --git "a/R\303\251seaux/IPsec" "b/R\303\251seaux/IPsec.md" similarity index 100% rename from "R\303\251seaux/IPsec" rename to "R\303\251seaux/IPsec.md" From d2c7d42f862278e8698852da80e5b681610744ac Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 17 May 2022 10:49:16 +0200 Subject: [PATCH 057/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 37132da..31c8e99 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -1,4 +1,5 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) + --- layout: default title: DNSSEC From 72749c023e0232204439be2db0b5e437715d6809 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 17 May 2022 10:53:49 +0200 Subject: [PATCH 058/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 31c8e99..158f53e 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -1,9 +1,7 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) - --- layout: default -title: DNSSEC -parent: Réseaux +title: LDAP +parent : Réseaux --- # IPsec ( Internet Protocol Security ) @@ -12,4 +10,3 @@ parent: Réseaux - From f0ac07283e32b62fabec5150433609f65df123f1 Mon Sep 17 00:00:00 2001 From: Debongnie Nathan Date: Tue, 17 May 2022 10:59:35 +0200 Subject: [PATCH 059/241] Update kubernetes.md Ajout d'un exemple illustratif --- "R\303\251seaux/kubernetes.md" | 50 +++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git "a/R\303\251seaux/kubernetes.md" "b/R\303\251seaux/kubernetes.md" index f21e229..cf37192 100644 --- "a/R\303\251seaux/kubernetes.md" +++ "b/R\303\251seaux/kubernetes.md" @@ -10,13 +10,22 @@ parent: Réseaux ## Historique [1] -La méthode de déploiement de plusieurs applications à énormément évolué. Originellement, les applications étaient déployées sur le serveur physique. Cette solution a vite montré des limites de performances. Pour répondre à cette problématique, la virtualisation est apparue. Elle consiste à exécuter des applications dans des machines virtuelles (VMs) avec un système d'exploitation propre par-dessus l'OS hôte. Cela permet une structure évolutive et une sécurité plus importante par l'isolation des applications. Les VMs ont cependant encore un problème de ressource, chaque application nécessitant un Kernel. La conteneurisation est ensuite arrivée pour pallier à cela. Un conteneur est similaire à une VM dans son fonctionnement logique. la différence majeure est que les conteneurs sont exécutés sur l'OS hôte et non sur son propre OS. Cette avancée permet d'avoir des applications légères, une meilleure portabilité et une uniformité pour tous les environnements. +La méthode de déploiement de plusieurs applications a énormément évolué. Originellement, les applications étaient déployées sur le serveur physique. Cette solution a vite montré des limites de performances. + +Pour répondre à cette problématique, la virtualisation est apparue. Elle consiste à exécuter des applications dans des machines virtuelles (VMs) avec un système d'exploitation propre par-dessus l'OS hôte. Cela permet une structure évolutive et une sécurité plus importante par l'isolation des applications. + +Les VMs ont cependant encore un problème de ressource, chaque application nécessitant un Kernel. La conteneurisation est ensuite arrivée pour pallier à cela. Un conteneur est similaire à une VM dans son fonctionnement logique. La différence majeure est que les conteneurs sont exécutés sur l'OS hôte et non sur son propre OS. Cette avancée permet d'avoir des applications légères, une meilleure portabilité et une uniformité pour tous les environnements. ## Qu'est ce que Kubernetes ? [1] [2] -Kubernetes est un outil permettant la gestion de conteneurs. Il permet le déploiement et la restauration automatique de plusieurs applications sur plusieurs machines physiques disponibles dans le réseau Kubernetes. Il permet également la mise à l'échelle et facilite la mise à jour de ces applications. Toutes ses fonctionnalités ont pour objectif principal d'assurer une haute disponibilité et une gestion des ressources évolutive. +Kubernetes est un outil permettant la gestion de conteneurs. Il permet le déploiement et la restauration automatique de plusieurs applications sur plusieurs machines physiques disponibles dans le réseau Kubernetes. +Il permet également la mise à l'échelle et facilite la mise à jour de ces applications. Toutes ses fonctionnalités ont pour objectif principal d'assurer une haute disponibilité et une gestion des ressources évolutive. + +Un environnement Kubernetes, appelé Cluster, est composé de 1 ou plusieurs Node(s) ou nœud(s). Un nœud représente une machine physique du Cluster. +Parmi les Nodes, au moins 1 doit servir de Master Node. Celui- où ceux-ci s'occupent, en plus des ressources applicatives déployées par le client, de gérer les composants nécessaires au fonctionnement du Cluster. -Un environement Kubernetes, appelé Cluster, est composé de 1 ou plusieurs Node(s) ou nœud(s). Un nœud représente une machine physique du Cluster. Parmi les Nodes, au moins 1 doit servir de Master Node. Celui- où ceux-ci s'occupent, en plus des ressources applicatives déployées par le client, de gérer les composants nécessaires au fonctionnement du Cluster. Kubernetes propose un ensemble de ressources permettant la gestion des applications. L'unité de base de Kubernetes est un Pod. Il contient le ou les conteneurs nécessaires au fonctionnement de l'application, et se voit attribuer une adresse IP interne au Cluster. +Kubernetes propose un ensemble de ressources permettant la gestion des applications. +L'unité de base de Kubernetes est un Pod. Il contient le ou les conteneurs nécessaires au fonctionnement d'une application, et se voit attribuer une adresse IP interne au Cluster. ## Quelques concepts Kubernetes [1] [2] @@ -24,28 +33,49 @@ Comme expliqué ci-dessus, Kubernetes propose une multitude de concepts pour org 1. Deployments -Les Deployments, où déploiements, sont des ressources permettant de contrôler un Replication Set. Ce dernier est une couche supplémentaire permettant la gestion plusieurs Pods basés sur une même image. Alors que les ReplicaSet s'occupent d'assurer la disponibilité d'un certain nombre de répliques d'une application, un déploiement permet de gérer la mise à jour des Pods en garantissant la disponibilité de l'application. Il permet aussi de garder un historique des versions de l'application et d'y revenir au cas où une mise à jour s'avère non fonctionnelle. +Les Deployments, où déploiements, sont des ressources permettant de contrôler un Replication Set. Ce dernier est une couche supplémentaire permettant la gestion de plusieurs Pods basés sur une même image. +Alors que les ReplicaSet s'occupent d'assurer la disponibilité d'un certain nombre de répliques d'une application, un déploiement permet en plus de gérer la mise à jour des Pods en garantissant la disponibilité de l'application. Il permet aussi de garder un historique des versions de l'application et d'y revenir au cas où une mise à jour s'avère non fonctionnelle. + +2. Service + +Un Service Kubernetes est une ressource permettant de faire le lien entre les différents Pods et l'extérieur. Il existe plusieurs types de services remplissant plusieurs objectifs différents. Les services de type NodePort ouvrent un port sur chaque Node du Cluster hébergeant l'application auquel le service est lié. Des services LoadBalancer vont eux utiliser un balanceur de charge externe, avec son adresse IP propre, pour rendre l'application disponible depuis l'extérieur. -2. Stateful Sets +3. Volumes et Persistent Volumes -Un Stateful Set est un contrôleur permettant d'assurer la persistance des données. Les Pods étant des unités non persistantes, et pouvant disparaitre à tout moment, il est parfois nécessaire de garder un certain nombre de données sur les serveurs. C'est notamment le cas pour des bases de données dont les données sont partagées sur un même volume. +Les Volumes permettent de créer des ressources partagées pour tous les conteneurs dans un pod. La durée de vie d'un Volume est liée à celle du Pod utilisant ces données. Les Persistent Volumes ont eux un cycle de vie indépendant du/des pod(s) auquel/auxquels ils sont liés. Cela permet d'assurer une persistance des données même si un pod vient à disparaitre. -3. Service +4. Ingress -Un Service Kubernetes et une ressource permettant de faire le lien entre les différents Pods et l'extérieur. Il existe plusieurs types de services remplissant plusieurs objectifs différents. Les services de type NodePort ouvrent un port sur chaque Node du Cluster hébergeant l'application à laquelle le service est lié. Des services LoadBalancer vont eux utiliser un balanceur de charge externe pour rendre l'application disponible depuis l'extérieur. +Un Ingress permet d'exposer des applications au travers de règles de routage. Cela permet d'avoir plusieurs applications accessibles sur la même adresse IP publique. Les Ingress s'occupent uniquement de gérer les accès depuis l'extérieur. Cette ressource nécessite cependant un contrôleur d'Ingress, qui est parfois intégré avec le fournisseur, sinon configuré en plus des autres ressources. -4. Volumes et Persistent Volumes +## Exemple en application -Les Volumes permettent de créer des ressources partagées pour tous les conteneurs dans un pod. La durée de vie d'un Volume est liée à celle du Pod. Les Persistent Volumes ont eu un cycle de vie indépendant du pod auquel il est lié. Cela permet d'assurer une persistance des données même si un pod vient à disparaitre. +Une entreprise possède 2 serveurs pour héberger des applications Web. Ces applications nécessitant une très haute disponibilité, une faible latence et pouvoir supporter beaucoup de requêtes, l'entreprise à décidé de mettre en ligne ces applications à l'aide de Kubernetes. Le schéma ci-dessous représente l'infrastructure Kubernetes de l'entreprise. +Les 2 serveurs de l'entreprise font office de Master Node, ce qui permet d'assurer une haute disponibilité des services de gestion du Cluster Kubernetes. +Chaque application est mise en ligne à l'aide d'un Deployment. Chaque déploiement assure que 4 répliques de l'application soient en ligne dans toutes les circonstances. Les outils des Master Nodes permettent d'équilibrer la charge sur les différentes machines du Cluster. + +L'application App 2 nécessite une base de données à laquelle toutes les répliques doivent avoir accès. La base de données doit être déployée dans l'environnement Kubernetes à l'aide d'un Persistant Volume (PV). Chaque réplique d'App 2 y accède à l'aide du label indiqué lors de la création du PV, ou de son adresse IP interne au Cluster. Etant donné que c'est un persistant volume, les données ne disparaitrons si un Pod cesse de fonctionner. + +Pour permettre aux utilisateurs (User 1 et User 2) d'accéder à l'application App 2, cette dernière doit être exposée sur le réseau externe. Pour cela, 2 types de ressources Kubernetes sont créées dans le Cluster. La première est un Service. Chaque application possède son propre Service de type NodePort. Ce Service permet de rendre l'application disponible sur un port de l'adresse IP de chacun des Nodes. +Acccèder à l'application au travers de l'adresse IP des Nodes n'est pas une bonne pratique. Cela réduit l'efficacité de l'équilibrage de charge et expose les adresses IP de tous les Nodes du Cluster. +Pour pallier à cela, un Ingress est créé. L'Ingress récupère les Services des 2 applications et leur attribue une route. Lorsqu'un utilisateur désire accèder à l'application, celui-ci doit indiquer l'adresse IP (ou le nom de domaine si un [DNS est mis en place](https://kubernetes.io/fr/docs/concepts/services-networking/dns-pod-service/)) qui lui est attribué par le Ingress Controller et la route définie pour l'accès à l'application. + +![Infrastructure Kubernetes](https://user-images.githubusercontent.com/56077782/168284673-0240a527-f302-4835-8311-9c6a074cc591.png) + +User 1 et User 2 désirent accéder à l'application App 2 en utilisant l'URL suivante: /app2. +Les requêtes sont alors renvoyées par l'Ingress vers le Service de l'App 2. Celui-ci accède ensuite à l'un des Pods lié au Service de l'App 2. +Les 2 utilisateurs ont alors accès à la même application avec les mêmes données, mais sur des répliques différentes. ## Bibliographie 1. **Documentation Officielle Kubernetes**, Kubernetes, [What is Kubernetes?](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/), Dernière mise à jour le 4 avril 2022, consulté dernièrement le 7 mai 2022 **Résumé** : Présentation officielle de Kubernetes + **Avis sur la ressource** : Cette présentation explique clairement l'utilité de Kubernetes avec l'arrivée de la virtualisation ainsi que le fonctionnement de base de la technologie. 2. **Introduction aux concepts de Kubernetes**, Digital Ocean, [An introduction to Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes), Justin Ellingwood, 1 octobre 2014 (dernière mise à jour le 2 mai 2018), consulté dernièrement le 7 mai 2022 **Résumé** : Explication d'un bon nombre des concepts et composants de Kubernetes + **Avis sur la ressource** : Ce site reprends beaucoup des concepts de Kubernetes avec une explication claire de chacun d'entre eux. From ba165d23073d0c0aa150ed39b134fa15a1c7fcf8 Mon Sep 17 00:00:00 2001 From: CastermaneRobin <55954496+CastermaneRobin@users.noreply.github.com> Date: Wed, 18 May 2022 19:48:47 +0200 Subject: [PATCH 060/241] =?UTF-8?q?Ajout=20des=20sch=C3=A9ma=20de=20commun?= =?UTF-8?q?ication=20VoIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/SchemaH323.png" | Bin 0 -> 121887 bytes "R\303\251seaux/SchemaSIP.png" | Bin 0 -> 103927 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 "R\303\251seaux/SchemaH323.png" create mode 100644 "R\303\251seaux/SchemaSIP.png" diff --git "a/R\303\251seaux/SchemaH323.png" "b/R\303\251seaux/SchemaH323.png" new file mode 100644 index 0000000000000000000000000000000000000000..dbb653cd1dea13218b583c5cf2bdf9a4ea2cb92f GIT binary patch literal 121887 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 literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/SchemaSIP.png" "b/R\303\251seaux/SchemaSIP.png" new file mode 100644 index 0000000000000000000000000000000000000000..f0cd28fb94be26475648d1c0dbbc2e2fe3586d78 GIT binary patch literal 103927 zcmeFZc|6qn{|7o9l~bK^I;BFWkPuE~C_)<=vM*y-gpj4IVTS5R5o&DNWoIy12V;;# z$T}F?7_yFSY-6&Fx$lq8_xro|{{FcC-urmm>CrhCA$K?~|#vPWm@Y z@0cFg3cq;nbznhG>g(63sTW$`R-75vo~uZ$d)*p%MCk2r)CanIj}~xaU%xB}{5?%a zEYzU$#-ZPBiyXu{f74vuN}n3+l(9H_pgK8%lS}>SqT+P&Fvd?g#jkz2WN5)_54fFQ zk3g5D2#B8u&7=cw$s=`~&$EH=SEL9;2GANg`WgZtEHI>7!B2L!aZEn^a+?!MlC zxO%`AQ!K+L=WH}zqW@4<&2g-HpmF1!Yl#DL)&*7l!(HTjfrJs=z35nPi5lK|3);ZH zBKx=ri|*i^O0MZ4)l|e}gzqqi75l~F;=%7Ned2uBR_eI?0x$024-0JNTmGFoT45K) zUOQxRrQmW<+;IxtI|%0r8@0YaYYMv&=R90$LfkyuGxko2@> zXKIb^qIGjyn?BgOGWjP3*;V6Ea|9*ZiOfVK~cwgcMCgbDn{j@g+xOnJcJn&nUmCvfS zYMy|1hl2|n`Tvv>QqXXtDt?h+O!D~JH?QbrYoqL&pCYeJbg(K&a z^RKPi7G=!6j4-;28dOu?=n=D&Ow>~K75efzQ?9}H&r+@~QZIw8US zyQ!{+>|3x;L~s=lW~AW_`U;DyPU1c2DN*8ba@uopkGlt5YodhjX}?qm7tFFb0cHujE13!#0U zJIe}|bAlvfU;blTJ5$fuHJYAUbOv2H2W&sBEY`Af^Kb%ad4Ul_(N#kq)}88w#zTmL zr%z`vPgG~V(N@G_)6+cW``sPO#?Ob?m^Tmw1*HyxJFTG7Y3p0O_A7`|nPFYy-t2@q{_H~si zweAZ7{;NhTVLMqSC~j@)t%DYoCmeoSR9O%!BIti1RKx-!v;O(L=~BBMC?`^LMRv9d zs8~eMXS}_oPc!X#LWS~+A0sF6;hQx94rVH);$Q5X=3^s}mY46$>ZjfuMH)RsA^lPO^`G z^}Pq@O)kWhzg zeO(_;DIoO5G{3f8VyR1NV~)Y3B>4x+F7?IuyR1k|nyM8&!jP6N%6&eYHTojb8dDX5QUAc=*5*vz@-3E=)$n&%Lot$q5PB;2($}E-pmS^X4>!mYP-L9p-ys&}+NE zo8_$)U7eUnltC97mShbTZ^$NejaZUBrPp_e-dyhuK3qt-?7XRB#<$wPObtuv;PP3o ztjQJ@b6D66?LGmk%M9}QhuJ7}@8emi$gkl}U%LxQusZ!y05!*c#HPnbVYfHtOw9Rv zGt~R=#>@p(M9|5d040-CY2d_iT$1GF-$&Zq8;b=6@}A-9cl`)H1{ZPF3m)=25^6Ty zJLhcf+`i*;J80+9W-2HpS_?@EYzst?9JlNCs$ipjtoA*hyJRndYEg$)7lupeqHLz7 zit&{K)7TGnzE0rqx28**d41`pKwYm|Xg@kTm>KEIoc(yBtxZHLEG8jgI%?wd6~}*; zM-p(g`OTy(iAxSiF{tD8wPb@2ofoUhF~T;K=?pmaxEb~GgGq5jkkftj_PJXpDB9qz z3VtqGggtxo;$qC&A^%BrYN_ zrUQaY93Y8RJN8^h*OAENzMoIH9?cMKqCjsRZ&K6|AG=(eh4{d;Q zvIbHO?%rn(A*7TKH$&bmrdujjA!((A=`EkH)0l%D39B5*@82U4;@k5e-706ClJ~&; zAvhAMcC}Bbc6#x1w97G=`R@=d5+E_+wM;)f$~|$>G_R2C@$_I!vf$DmM~*zbMoC_q z4(r|^VWS(4R-?Ax*B&Q~(ua$PMYz1*M?iObEi4K%p8}=Ju@S4k#+nj@S~>tHTKe@z zK=12f`6`Gga`CtSJ)*4qUJN1Ew5D&}E&nxOGpLmrs+A&+_!4}iFJ>aj+DXc^q&Q5> zgYyMue!Kpw6<@Y?N{!FcrGnWPhNf7t5y8De5B4p9~c4bS1pj?&ljjjia+bWoy zdxPo$g<-vwHci$DLK<~d!7D3f!%ta4!Yueo_*G&#=nPZsR%_Eyp99|h{-o*B)9y>N zU!p(1+z&;Z>Bb~-5R+(q@3|b2)m$vs z_PeQi&}Y@)>gwwV5vuX=q+-{;AvQd@xLOBb(2aA9^RT*vYkj(jOW&@7LR}!Kob_mE zJ*8CSnhL-UA)(rx6VoezS%|M^C7=Aq z{ho@Ehhl4rp7+TZO6+3sBFe$Ruus~8;2{n_<5QE?q$l(HjJSgYccH5o!ns3Z=fnaI zv=n)t8J)PHPvCk0l8>(_0;JdRRqG&-)-G7@UfbK1AZ6pxK&{3Cp4#|Ql zsQOOUWuX4)zBBwo(H?(Htnj(9pK5^ zxW`0LgZ0e)Uy#f<3@L%Du}w^r&xaQ_E@1QgK@RYacw{j9Z2TWw|5A7n2$x6dDH`Y!#} zecVo5wzt5*hkpswW#r~5ene@WhZFmeq;aXiativRu28TB=7%z?-UoL91Q0-77yU@) z=N0%5XsOkgTr3O^$-|VDh_?a^(%jMHINN%qh1mWGCqNn5kT2Qu;rg{9!`;}TRIzULg>q?@_k z#T;FV&X80-QQmyqt{c?vS(%pmbLITDh11)kR(E{9{KZaG=Ka$9EqZN@<75F?e~k!; znAwK1ctGn&2DZ~zf?l2ae7&i(Nafhmn>TN|)Z$w5ZWCkyYkNy`;wSYTsk8|sG4q6U z9S33;%PowfcWb;u^uTG8d<(!f-DZbYuVs}x z59jDc<4Z2*n+$|(OAvvSORsq4AHEajnFEadWcdC!i$g;W#JBzlZ6CaF!qXALmlA|T5LDNlE?a_K zdvf-If;SJ&b8gT?Z_M=mG~N@?Z3)UrSfB zqweFM0sb=tnS4Up!t#fbU9BSZ=Rgsf7BppiC|YcD56o8OdfGd=CLv2UGeDSIieuE+ z4s^afK;o--y9Qw7sY{nZ<7B+y$p{Li#)1TanB^so#qJj>8Y0|U67D-e&OmfPbpK!~ z@6z%;?JEb59O-`kG8pQ~+B+;2A)N%*67K!3><=fVMhL-oH&@S#g8Bv+O5=sN&tC*| zvKaq7Dfu);5PU0tT1aoiq}UvEqEnv-n>!Sp=bctcX~pxJk;44#SJMEVrbRGX`}npl zf#};xVXgZ^F9RYb^K8%~y*3YUQ@i=CT{I~!Au&W_w5%zBlsNFm@0}pV#dF=(>Y<{C zJw~1dKQuY?7`!zU)V=^uVh(axg&%$T`SVR)g{r^bpWK>1E(!D;K>yw@BqwZ#*tN&c z$-F4OsGoQZ6HmWrA{8n^nf(3Rk%hriE~rvo5;1xH+aVd-ZRbM#O1PmdgmLdQSMDEW>J zh=w|E;hO|5zj*ToF(x0CBy+D(3`HRv@qyLR1FIiA~jsCJ#SQxJa8P!4gKy zmST>a-qz&Oe%<@s#2sQbnn`P=fHd}ke2DsrDg4L`hx94v)$f|=iG3yV0moIyQb{sn zN2lxNQOrL`KzF(TDrg1m{Xuf?Ym}FIw7)E%x!wa@(@bsKEq<8W@>Pr>gjPZI|4U5{ zK=CdB0Iw2dp(+o^Ht5b$wYZLe!5Zhem=K9f#b0QWS7>FCVE>`@ss4Gz0x?pSlg85! za6IY#TcBRJ@pg3%5BK!DcF|P;wB#C*GY7|3uu^jv1kF2z{ij%ZdTG*Euigbe+vy%@ z^&TuGShPW&=qjtmdw>=y3BCm&LwC%?ac4^TZACv1ci&q32p6cBJYngs@n+??rT}vg7u%j<#07(SgSzE<-5PXHM9>xAidimD(_z)`Qz$NYzpA6Kz|f9gG=A_? z?$Vnto$vlEbEfDm43&8iM#$?)gsAsV3@~qtLCmRR04RSj{QFf)cXQbE)D(}C2RHFT zJ3t;Ezwm%#3-;QM63<;~ZgR0uP}rvv+DG@Px>RN53YU|UG_nVbUUifSl3}4g&UBuU zM!&Y1ii}viEElHtaKccEBQxBl{}YX~%yq~#NufNp(jf{G)gnc;E3faQ;i9u130CS4 z+V6!eDFOD=P2ze4>R@yYJ9XK2tGu9hu4*w8&0O60n#Ql3DGtOxh;9^^m0eg@r2Vv% zSn#WVa`;RoJGlivu=Zt2kg=L<6$O6zT!M@dDBc!*79P|C5^PaKRrwGc$TP&1_Qb9! zNiz$yatfPbZmCkMpt03nW@qaJwiePmii=Ca#%TcHSyQ(}%5Zsu76!wjDGpQlm8!7P zjPdQS#Yluxp9H`%N27_p9@5Jd{N%^eDO@5%OQT~czLpRg0vY!8uM!w6YTxqjbb$ZY z^?9L_Ir^{daa|bn!O;g?-{Kv5f9!MRA)WL~4@;1hSRW9(oFG)@HZmW2*-#3SwJZMP zhHybuCZ{N(1+>}_E-IsCuQg~ri#4u^07n2${q4~a=;tjzQ%Q%Rf51kc0%0N(2z5X> z>;-txuj-lHA}OS@;@c&iEYu*Ou|=|3|G6v~dWr6}`&C_t&_`f{Fq)_R*Uh z*D0r=xBUBWPf6%2%<>GVQ9w!oTvyl4?Ok?)4bYS&q@_FN1|b6s_J4JLvI=)!guVg$ z|E6hkY=#E;eZXrmn~PZYt2$sQ_T+|;g-PfTKuh3|bRfR{pU3~ROQqCiUG&WbkK9OE zTl3Hs1V#XO3*YPWOkfYa=YV<63ehj#x{!Z#HR*7I6JNZF+i|_T^VVOy1ZA990_% zc*{8^H2_&)S|*H0VSC(QN?D4U-Ta!|Fn_f7hM-bEviG-b#wJ+-KG_;&ZF|I6TO9*r z1w|BahQTBC?e5J;bVAu%7p*%4~_X#@++*X|X`n<{H#6*r(lKdv^lOdjMmG-n_ zK)e*EdKS*8U1k~LjNT~?RaymDlovG=Z?Ql4Ha?d1tNOLQH^jg@!FG4Iee6pxw}3z) zt1q(3cG1yxGP$4=J-gqK6g%#!7x`&$Fv`n-SzTfz8-3lg?Q_1q_$TCJM?TlsloUD* znBd@{llfZEKoNwV|6x!91CawnKm0i%AzMY1D*pS1I%kO%@{#hM6%r@cn&Fn}gUyY* zF)m5WXsy^4gXw|o-}n{cL=i2`&C4E01D=Go^8o=hE4$uu?2#Xwh7lkRtQv%WzyigQ zIy$L6Jq81<8y+?wdwPp)HIhoWXBJhQqI`w1_0AujA-ySsSw(2&=%mZ?zU2*;iiyzo!>jKhSq-f53(cS_Cs?3R8SkC~q`NqbEp^xA0W=L^1 zaDlzOVGAX&L2hZO4BU0Zy!??{HjCpJiqthKR465@k^vDcps%0ayvf zR1&$x1wSV(__*^GQLUwng`N{bbWg3>Y>ElBy7QZ;sCqc$%|74rzwVuT_ujAht>@47 zVnxB*dSzQHQ}kwK%bfPk4!r?BVamew)NG^2g>Ee8`rC}LmniO2qc~*EU=~x>tc4gc zKU^>7_!skZpL>cZGKU}SMVPl-x-&K7lrZ<%DZ#IbXLn^+&!Tmp(qJGUafkz!_x z3q#pinhCRyYc!d)%&_*USf$DDeBNFpXJ=gZ*s*NSA-2fuMBMhlUJJ!etCaB2zFx-c zqt%^p-m-~=r}XqUxiLy?r?-yeoGg4_w&TdF5bc2R!#ke#-o04vj0uh=&-2tN+SKl~ z&%F8h9Df!Kt0V88;UJBa9VTXU=?!l+x=+5{ zD%WCJ6l}g5?>Tx6T-Ap_?Tq~mH10rk1)rtV*}eiSeVxBoxpq+3aigZK9zItnApU8H zQP<5FtY-TJ&7s$`j_?lj<|kg6_Sj;hGT%m4P7W&lU1zmyvz2S{55jC+kgP~Aj4XIT zqWZj?eZI3} zyke5887?WYIV5`tSymX{XEE!DBUY{&WNrWK|82KN^=?8Z{a|2Vz;UFyQdn%A zBw2jA&#u~=N5e4^y&}aeLuHof@}@l`gV@Vk)|j! z1t$ZhU2(Ef`kvJmwoEqO;hD5{l=q!~M8B7VBkGe)t5B#7l=9l`GIX>Ftw*WHpJmTkbZ;(u* zdUtkjK{i1Xv-UZ{uWY*s<#WE23`vwkGW+73YjjR~4-}3GmJ@US#MKN9B zq_CJM^YI&74i;;zYX%KcXV|AemlAKf(W!axKw%*SEMmor8iVDY*|>T4;OfBQ=P_Vjv_^G4+t-`SYHFvD7-!-ybld-RUZ+xQQT5>J?CS&Wxq$%`%GU3ilU zRnIHf)Vji2DQfDAgE;fuzI~(jEPB)e3O56&qC^dRydB(AWTQ5);1y=EUXY*NQ6# z&85%i+2M+0a8R>_K~@sAsdXfZi9;_33-0Qp4f>M9`lf}t(h?y%;n#50GKci-ZQv}u zg&fm+k7W~Pdvb*k@q`EXntQA^=Z!5w9K)F2C+{h1b^C;{7&a;)9@CRAkfYr=azVe1 zSG~WewuffDNFTYU@4E1Kn}9Ch-R$U`^KeRNl#fE0a!jEny)2GctvtTRSyplGPOWWH zUJt2oHxvxGK}`?-xhGJA2kKaH+naMZ2n3<8dEL@RRSh@~gd<-$EPhJHWYqe9x;b>j zM8cdN5X>|PR(&vt5;kK>Z!|g&%$ztHAD}Ib=$^BpM+sBSpQ@%LO* zHlbKurZ%lGnUMQZm{t@aCpP^(^U3NiO<8jOPl=U>O03?(K#7{9S-AoF=5tj^6CBBY zRpX)=K{Zv${}ay9h^r@I&db4MW#k}PVX^82Z&z=Aq?= z#z>of1*g(gH={SUPT=@Kx68F-+-TdhLuU5*`+V}d5;i+>FS~teZqd7McI{e1>(kG@ zza3XzSEY1U6+tz{8Q{*uEA38h*O?oco{`?s6)P{l@~B#rhME z$mKDSYTZEi(s%eg+_4g#pi3X#bp0WsyicPH7SP5wq7Qh{X2+(12wi!Rc7FGoQtsf$ zxu7HGQw1$PWB~7)Vp`^y2_Va66I)Lhf%YP6vnf5B>WZDjxX1gv!cc6p$?2g942 z_8QgC7upO|*_Ir!#6kPbR$OOx*ej3MQNoH0njNcx?elfEI#7KU7sBgpaj5K(4pOuu zkrXA3k8x*vfiv9LcxEQOdn5il%P(7m&@fmu)Rsmkmd3s~QmV=T$rWJxM7B?z{HBee zd{uFwq&mjCdynbAVBZ_gat_Yd+b8`>bhy)$7%yw!wP>PPx~&k)Ky;VAKfE@$U;$wo z9)yC7>zBp9T75%OD3+Pdd3*+%k*+jhWo2dJX0Mltc8a9E^462c-LeefEzq7IM5|B! z4fY4%28|u`oh7W%yj!hN;|o6=lCqXU0S6n=4 zDQCP4IEB=p$7y=eCUjzI??1SvCLMu>jg zM~{A7`yLs8icK6U=CY!y-&Rne{mi{iA@~$L-p5U_%>gSA3}3|ZKHn2xGG_lZGo$k2 zNr2uXRGIqe@8V6%=2ERCieiGLX@H52`;|peTp&~_Ui*Ue2NdNu3_rrzVw_Jt=&s%GEq#&jka)x{snCt+N<}5b_u{YxoB`xxDN+8b zm)zaFEvTg*FE(jEYWU$PenE}DM!b%y&6cZnb4=NwE_A&@sr`#3>uke+K4(Hr|EVfC z;8geN_U4C|5ttEkyoOUi^M#_vj2i)x{GKmgLpLU<=HD?e|~j8rY}iEd2=DUBPGzC z(rVfj7XdH%Fm+^3tho?sK?+Aq6e$)bRSb-siEi#-CWWfBF;-l8ZMTN|NdG5=`9V9Y z_@0@WnX8!~D{n8+nIl4-xpzQYMP1J$^mkT)tJ!2yiNl27oQG_!^|8928ou5SU4#1a zKX!NtbXFfGSj1qFC9jkO+|&Q3=U8fclU1(R_j~4qYsGGXH9gcQhgsg#22m9oikJWb<56p_C98Tuqyhhp;HpW`ted z@HA9)eU~9oa6BO_5BF=1ZYL}ijGsS8pZutHh`V2e{a2pC`&ituXNxI?rw7H<@ue>L z!|ofr?6JnszFl1mW_}j!_TW!tSYQhzIK>uma30A~2|clSmi57s-u+BVkhA)wXzwBXBa#wI`IA$|zH$zsSqy^KqQb00jsvntjN@)aENv%JJq$32dx zO*JqrhO&U_tWct&Qyvx~)j;Kq$B)_L<-{;+vkMl-L5Uz-E|yVru;1smD+dPV-Q2F@ z0d-(W3TR8Cmpy(o9DqCZf$GovM{*FgcIS=l7CfSJ?j-?%Io}w7yFHK%kWj`Be-B{I znXKgWY>f}<=K*llpx1sjMvk}kP{qxui4Vv$aeYaVg=-lJBbzBheED1gGuSb*d4VC} zh+|zfZg|mq8AbFAz}szFlW!jO(CzDRiDgBIUZ&IS`hIM=bbg#C`L3@%#BVKtTEfM2 z6d_O`AUnFV|92S7{O>Tw{W;Glj+>JW*ZAAY#A?%YO@U~7dimuKkaL0F&@g}O$M4_o zK{(Ziw_2(Pe2WB&4*Cj$YGyRgK4{BK2aZ8}u%{n=(o*AwW)!=$c- zUa-1_mT%pp17=`3-wHK7JK&m-io_MOa-7zwrOS)f1XLf?-chewC?L10;yusN^94*7 z(X3EFKxV=|Q$)B&CX&7>Agu>r0m}dO!FV=Bz`5VAw7v--AMvU3^Kkh1;O1A$0DA0c zO{$&97?>WI|5Mpb707+n5w+Q1vb3VYYjHR?C+C7~l2UpXolqN?@`{4rtoX5F^Hz!3*`Nf4X29+HZK*)6D7eLdU+V1+cx5Sy z@csFP?(sKvBKt01-;wS_!lBlf^#+F|-d-8kpPnnLtE4Lj%pe3iOEvckwqfc3xHB9l}N@FfB~!P@muyfjGZaZHHI_Nx9SZzDT4;C z#G}eE7`@>&WYcc%Y|$Obg-OB=^-WX)F_2EWXdbXIa0@E5AS|MuT*lWkl>GELJs%y< zA~w0NeYY3UuD$Fx<9RUeM5+mZ!1{wlPkWX`0}%8Pvf0Pay=4zWRa)_j?q=x4rQ|#- zg}Z>b#cnpxlsP>OkLf!XY{754%guY4l>{1c!mMQ(}~DnaFf;%bI~hi>}Jl zL^(X%{J=N+(NfZL^Knfh`qSry$o!kV9B^jDPC~IGw!2_4WjIlxIvbR2gCC2xP2;Qa zzhcbJqg5W0VWpKws;69QkvFSoH|!huO>#IX-8nAkW<%59E8nVIa8k$rb5dWSle+hq zT4TX4@6idO9KLg#d2+IY+M_Fp`@JiI6HNwO#IQn38L|3`X`pjIaAafWWP#*^7M|eo z>=j|e1GtkxPK_4w6-|(%@VzjqT2fQ4{E>n60Pmh1U-xfin2djtI6W*#uS8-P$T8A~ z9W+{f(EaX$&^<@N2jWHBFDY$~Kr1O1*tTFxWwKv+g>*|6@JY}UHMvm6%QO@~5?}Xj zBA6cz9ZO=fHvVb7tP#-G1!p+r*nc?#&*MqGoh>1&C;-Ml0)IZg0-X&7=ty<8qk!7z z2OkO2R@t!~*v~@G-g{$f2LGdrYBLDP>Wu)4nwvlz-4-{dzf_FJYL~bHIXIh*Ph0a8 z3TJf{ZkDwKr0W5BKx47?Cj2)JVFVjzrNF91+YWi%in85t>jKtOe*VA!*BR}08fy&q^-$U-!8 ziYratBgVsJY;@!h-N#b=rRQi@GF{xaAC4W1W9)o*k#&9NS`Kzl^+PGsCtNm@V3m^Y z7rE)!ms%K}@|`qG2_BAtlX2-zLVPno-dr9cO-|L^egMbL0kuH{;aZ^GJH=|EEN(>) zRb8ld`Q&B$(80Gm{2&t!e5H!p+0KJWo<@?lu};RM!A&=Mv$d@YF)!=4?L)WmeBl$% zs+vKZ{n@}3vb&&&-30+x2kMGYuCtA{N6Y6wwIg@;{yUK7kUPe?zU)h>C9}PGx)m-B zF~tRZV;_8{LQE$Kx|O-MLYfsH%bs>j&Xu#zi^GMm4aM)XOb2(q--meG*8P`Cl%m>( z;^%vIHkWg6Vlt4mgN0&NSryJr0Fr26(2B|Fh|D!A1lqqb3P68lkSF;dc4-g*&L$+G zQb@zy&+4Pn(VJ4olDd%lH86JUs7!yqXUrq8Kv$sKy#hiWCaNjt&6mWKXK!x2qejC4}pEK_40_>>W-?_(I@ zfZAehFPl7*+o7tK(gDiKimN8YLkY)~5r=Cg`(an%#1Z6wI&poAj51j=V8 zapeTbA>6Zn7U_0I?Q!l^EOw0^_zJH4E@kR4T?}xIHnvNI?7X7hSPiflqVZ#Qlfx$m zJXG9LN9MeP`cAhP{&1}fsl05=;@u~4q0S0ZdTt>qJK-R#Zr{!AR3CnT?&{=z`c>@# zlkMa410{J#T(U4N46dL-JcXWZ^a}X{TR`s)pJiQEx@m$5;Gz}Y2nc8!_+&;H9=>{< z5t}U8i+}ddx|#N@@|=FF(fgFOfG>WtE$>WCS*xz`M3>m1A6!hA%$XBmP`5dcp5NJ@ zXK^P75=>SO9h6yTxq7y@9g76%Cga_|+n7SFwsREKia`)I&v-!!e|YkD!^gL1PGIgU z@Q?&miukG0t%aBh3!wNKN)o%$Yd{Rfyq`#9>7Q_N2N{L%>I=rAEQqzYZ!HxQ(7HMnukgqeVD9ubpZ;E!scR94cb}&o#uBN77k0C&h zTme6mhO&7=eaEKSc>y}DO_2vpI$*AxqB%$IS{phv_p_CgFDlxvyrCEvPY{!1)WKMO z3sNkd7E_)MCO!28@}CPEbx+zX=XTCZbQ@?$k8~q2YZIag(Vm<6U{TWrt>5%<|Ge}C z7=gca>&nN$!t-b^1(~zKYvZ>0U*SzEKP9mER^QEgapiGW=H-DaLdHm*0HE`JTscqoB|UwY z1z~~(Z>@hi&=aJJ@@q4^Ro9FPczf5Vbgwx8^@bO>Tv>y8eh)cVzVrWBUYtCSGyL+W zB0t4)W8XgCM;odG4`T^$+^7DS%Qfxgh%TLe7xTEtAP?7S4J=Os#dp*3FxZ9A?^pKu zihRvO>g69?J2v+O9MQAgUIf5%9TS?4)A*jNpKVZ!Mj^VR49&_G@b~bObG>;Vmx-pi zK;R76b~VeKt;u9WSIHJX51*QF1k!nHY1@)hVPC43CInOhB*uMDk9od?lt@H(S7haE zcSdrROfJ%T1N&t*2VeOSAV9$OXL^SSQO13MtwbTlWm55qW!;z8G^dcw%m%u zaBVM^&v%CFR+VYm04hcMILRl`OSbJ&EUt-B?ni=NCJ)>%kS6HQbKqq3Zh}t&xaA6= zbxtpHK<*wFM9>-@+S$$KVGFw(QEDxS)VCwB5fvywcY!3%i(*Oq%gM@w>}RL zh0wn4L3qB}0G-qH1Q`{!=-iS>eB&G-GVMT~^bm^}C5FtzO>B18ir z!AP^f>@Ri5e{T^luE5N14ESjg7hYueMTh0CgM?ZRnr()P_SNyK#UM+4fEfmzC|c3$ z7L&*f8_K=|xmFq+@~tj-r|n=q4U0LOW|rJHu%_jq?&wdefkVY)RoTvTqFFOAUvWS= zp-!ROB3p6*?M`9CRoiCChFV(T=gys*pm*>BW&mmfPz^yh1;YVAz=TN8@7UhF&Q6_z zK~J4k*?B3FY&robxfa}}8gl}II@Z?!Dp8h`+p8i;HQkJi_H;BL0j|~zZb4i0aTg$6 znJ)U0byoC@`R5)vxkE@442mZ-?RZZj7mvKIq`Tf-IXaIrmt*tC$%;OlC!H+WINv+6BS0l z9eXP7GkytiKn=9t^{bbhAtw6Q(rSk?)(~s7$?D+&nyYhM`EqPe83NP*06|*Tj%O;6 zWeT%_+ziYaGsgk43q9?8)}ZND>jRdz&45eZ4uB2va)sFzJSLld^(XMQ930z>MHCUr zWLJNpKHs{4r`b+Tq21v}?$O~B6SJ<%RDvX*xnx~MbA0Jalb&mF@>>@y@BwK3&DX&M zM5P|eJpS4jUq?{8gb~?VNqTqgH0&z?<8ffz$n3S?)ql?ck|2~8XS&iId-I}&Y40Oy z^c&v{Uv@^Gq1~$ism|x0rN$ zi`{{)z+*o+zaCZIExwm%vap|j1M2u0O(=(BLocB9m{^Tm|m z3imT}QNpM&!H!m6F)+v?}z-+ub_N0?q?0HB=M0+ z?sA?wH3c`gq)c3g-$p-N?-YQXq?E_nkT*Y6ym0OoV6KZ-pkJ2yFKigsNvYkRc=QgtD_ zS50ZN(0u3>`LGda!6U)n`c}$E z#pB#YW}wyM%U$w!Byks4z(+w`GsBDy-!=fbGEiyH0MZI&kzg8_;+ybA1c40hHR?{s zS4dLxZ}J;*Es^=G=mssWi>@CQXHVtsapwJ(%G7jZU3YOnWlkNIF#qz!x+urCHRfc# z6tsju*K;7Lcb5Q-R4nP%vepw!@h+0!EH1UyNRkFms94zMNh0L$E1HNb46vKR)I;~5 zm7>!9Z9gPe6(zL~9F(yez!!5zq1|Qj-J=%iK+~B3vb0iLebNXX=vWdD)DuDWR28WV zkUz}yR9MEffbHlB#gc)SM281Or8VHK?uQJUk|o zp3q8Q{({Rdm0NZ*coZ{9hb9VJL?tCP!D94)xhP;sR+~Xv4K>c(q~iBLjPL%*B^P751IS;_B==c$B{y?i z{>W7Mzjt(HRgb|@NY!#|; zxB-HCg4yc&%Ds|jg?$B0xr`|%uO*`Wko)%Sp8=qkMj)!GJG*{) z7auRX#0#3WB8z5cnic1X6%(L*k9l6ak^~@cZDSTPHj0vZ76ERj6S*C#fa7p z?JJ8j=Mla(ZCd=zN()|8;5p}m@wn(%SJG+<%Qy=yi3^|%Sbz@x4&2v3i9MJ|N)pHI z>hq&p|7j0(nQx#4y-QN?1|L`Tl8=wXA|wK$D7ZAdnBE;qJS4r1%@6A_$3OhYlnE}; z#@<{w1KPJfz)V=z)!!*yHE*<1+Q_RCk*%c>Cf*F409(R-3%~}@ga~lw3^TWO!IU}gYr#aa6p-}-HMnhh_tdGK22+g- zgJqGw44>JV=4$l?T(h8l$LX9jxNL?pdG3+1s4*P7Z>E-cTx54>9@a*%8b{)35joq#Q#7c{|z>yKu z(OH_VI{wRI>$l2f?fa%3cFS=#zu*SXKsGi%iF3yom;UT!Rn_Oyg?5ZNNBu$FHq%(s z*>c?nWsH=MV3PgmO1s0zQnE`cC-P8dSep>Q1RVp=9A|~371lR(lclR9o*%9R4C$ej z_gRCxy=}1{$2~-%#3Z@hcJhpPd$&YD+_&jYwe@|-0 zJIog!7QZk#pdPT{u#A$+0VB2uJp*=*; z(`&}V=kc}>7S7y5z6->QizaH?Q-(g2W5~36N2kf#m-3DoXo6Yc(et~L3_9n2a2D=H z!%3+8Kc&%V(Ad<$c`wBZ52DsY5_V0AFW87xdZjx>`{BB)XQnVMlkMDF_%>e;kL5p} zBWC4N@FN*poqp|^ys^3<5ndX6>jl>7%ZSisZ5RPty5kFXder-KCnU#A-;cRy2#qKc zzzj(Q??8UJJQ+JivpZG3gI3iDkVN?^f+ODlgEJY7mcXtxl0aeK&wHqKZJi(BpAG!{)4aYz-9CZFyz2AqGi^4;x~nC9P_jk^U2SFh2ky4 z$<>I-E2)|`hiRuW!B7FqbE8q5;ti@gYLon^49v?WCZ1NgbLYaDGj%pi2VsHPj00TV z8SM{}U0y{#*K`!ydi-38YUQcFu?MDe^j}dgRtjiGqhBEj0!$P-B2{COS=TFD)`uDl ze%`UGojTfBb!@R8_|?(luTp^?QDI9Jry4~c8}f+-r3VfyIZOudnOoK-985M^wKdcj zx;QM~Y{Q#l#RHF_d6sN0FfbW0=q9X9XJOJm@q&-tg`8cz_q^u%4ZurB0ne^J3Cy30 zPe5x7j8)gr&?jYSLcmT}qXx{Gnnf=tNHFtj`aM6LHj7$#a}QAkSoWsU!UuGJ!1fQX zeihk`7%fNZyaHnF^rOL9XTvJG$!%P3692*MxNDxXQRmLJtn^$29|A1*C#>mkZwIkQG1HAY>LW=X3wbE0wGtPUVqO$FeyzfZPa`Pzy<#+kz&ViSCl zCin2;{vbuN1_3>C+Fl83QAB#my$^_Rz^VD+V}t=H(MDRK%CfmmLTzvqi~{?}0m|(* z_N*fjSP);JDN($O1u6x74;S+!>7eT+>t*?*!umtrt};Lu0Ql5lqYnj&=|}M)`nN(m z;#0Geh;G1pD-gRBr9x%9jsV5^p$IVcJZcLKf}W5x1wQuaw!RWM&n1sYojWC)o}SJR zIe@+2)eupOD`t)KpSyMF7a|5DK229a3BB>Losl=!Vmjh|Xlp3f- zsk*rauH` zv$FC$=lTS$od?#@fQ|F*-jWC4BNMvc7xPPaw+&zY_Yz@VyNiHej!!NZhB-T(J^-Rr zxLK-s%SHb>sW2Gln)%A}1!JK`$gsHfe3q%{wVm@pdkx7utgTA07pZ&OZs$F#Iv`c{ zM**1V00{?;bCg&>XZqs|bf&W}0s5hZvv%JWSbLO1Dc{!a5MFt_HTWX`*{~Sb3C4ur zHMNC*Y@*trJG?Exw1B%eSdl64$; zocm`;wRfaHKJCfT723CdrR)#b4Mg(hj<@3K7kbsXt92yJOU50?FOcn+9#?=_ zEdq(P6;15dK!bj`gNYdlcZi6zHhd@#n=WQD6riuKw7%N1Q#jYpdc+>(iSSM zi*BSFfkl@IN-cWPsB}w9KVt&>y6*e=^giF;b?oE1EY5YF^PF?Uf6VzCK?B`(H*n`w zKb6N4``0%pM}o${3Wvb%F%sq%Fq=py?(~13T>trYyNnqh%EiTnUX48epClx44&!*) z+$42T^fZr|CDBhbmD6|~Ci#9=0g@<|nt`+xe;L?%kG4rDXKV7x^Y0xGcytC{{M}u~ zTbe$ITbgcqR;VU_j#2Ik2Zwy2S;vBX0b1`Qk15a~h19kel8`9Bg-t5!-=Bz4^<7rP z*)I%ZQ=)g*FiH+du65i)cdPPQueDWye>`AC7K3$Nnf|fo&PZT)Is7GZ9V9BlgHAe` zXZOocErcYb8Kiu2{}Npg5qsd^f@aafiT^cw*iY6@nsao@_pKAj7xc_S3BcmkP9F=>2>!t3#1Oh10F*EWUsB!&sV3?)5Apm#Lh*usAk)<#N~C{x;orBZJxrnt#d4LgrkF*0 z?z>L|sD-6)9y?o3I_}FI`?vj_>t74)`wSgSfjJ>{|5mCw3i#mHr1ck5WsdIN=I;L# zqXOH%pZ^;p*tz>NB#^hKE{OIY%5A?Ya1D~y{Syz``TzT85#j3J&-?$M9=JOc|Boof z??Eoh7t?gNj<}#h9`Ea|{oyJ;KYPI9Awlrp(IxqRxa_~j=?4CRV~}|Uwe(mxV=LMp zZCelMHC4x=r%#_gIDT^8-fr*W>{rn8A_;p9XP)V?m9EQot*!6o5kGy(z5CM9LaJ|j z@8oI5%8VvZ^4=EB^(FiHCBo@bT&byY`ZAn2P1@#k*C|RjiOA0wFB)6DX$ptf^$>>* z&ez6<|9ai#iVj@EG1u*|5{WmmRGC1!!6m_2*K!%=(Du$>zgXJ)`ta?JA$WI4r|cb+ z;k0#xr}GjP4paJQ6*V&kfo(${!`rZ@2y7=8kk5esV@Miv)--@fKd~r3z+r47E;=(ZsUpNrX0_=u3&x)k>bv;-2P&glbg`q6)&A3RlY=BT*VnT21;OSYw znlQn6cQ_->Ai~x3NED7=+Kp9bmi&Hxw%8p`b5e|T=~$zq8Qd*=-X}jthVH$gQ5}B5WpO#I zUfB_tD(K8BP~8fFKTw=_JzJw2ur2>!%gldS(1)52<`goB(@rh*e7N}%f3HOm%e)ec z@p>V^cmOy_{Z52;ioKrOj`ZJ(yAh5KGto%d7L9v`_z7p@1I0z;MpG1ylX5e0w`FAa zI-0;YMGBhdoK?+f{kdjE(Yv~4A^IjL@p(ul;5O>@v1)KGb+jQ?L4UAJs1p!sfR(ca z5()x|AvzRdA!5?u#5Cdyp(EzEKT_08?LHex7}ehNIRoPiXLIp3ZAQz}E!pi0=#)N8 z005B%n3eiNsSaQQ_}xl1z@!NSb}%GeTcgp#wF-{g0)^+R zsm}ml9ZZNrrvvRW+Rjt`1BkSJY7*RWxy+Grv#DlbD>XQz8|(ao9>0R$Tj z+Y!0#jvNQk4MVLE(v1_*bnylhd`Hu!~99Ob595AY-A7wrzqAqs*}y| zI5!rDh5={^?5izrbuQk1&d<8)5)LRCm!Y_wtJ_=Hk9D>ddiYAo02(`&T)Wy8-0^em z^o6_C6q5I0d*9t41A~?H@sN6p!sA&13Dc&S>aQaka2i`0_u>?#GONb;3|hgssY4b3 zm*G6_2#54zH#dBHs_fJvBtM1TMt_>Y?Y{HD) z7IGz%J9%6Pk_pHUcmsmjqI>6Tt(j2N4iqi4zF}?PfEz&er=H1pOmR6IBLBhhZe$lS zRT&YKrN%WNU9WNUs}$pAMF+4dSOEhF49djii+rXq60D*2uw)Q*3T%X|$Lz#$#&c7h zaI~Y&Hc!HMp>qbXEG~J(OG<~MKFUOH_O->%{SRVFHjU(d7KVhxBaaH1XdOE!iXaJlZIjWVK5yhk@j=csp0e~fx%N^N}nFPcX@+N@i z2rj1%xMkGa$>v+>J@Qdp$ zHrFv*Tfhhc6bpm(dDvRw<9cfEQ5SbZ9PJteB?EJgZDrve;5lnRZ{yb^1JF=-=fDKI zfwLcre-bMe%nZ!ViK6n^HVdbKX21ZHvxQYSfUTT6Nes(81rR<_k;|%zKfX3*=nnC? z?_9?!4oUd48xi*$yY~5A7td}7ND3w3Y#`L?hlFIPBLewodK|c?z@205u9f6u zEDrV`I@}lDJK_HRAUa!4LK4X}VcPFF_KGW{vd|L`ur#x*MnT{tQdCxc(<(+>mt^on zdo0{uu4hLEcBiFjb5*E+e3JkphCKIDw+V65-E%zd5N#woO#F}*8%2e+`G2c9GqNosQ)pmE5HbW zsRc;GLeu_*gkoZ(DO>1OR;;PFoaEW7u%6{*u83vWexw_+w&GXY%%VgiM9MZVgziXb;PMl zN)L*4)Zzo68XoW}{k*@6^yyAC6$9)R!DbLJY)eQt3gDP;#v}INyMmQ3aDWG1ZgQo) z!Xg~?;B}zj|3C>Rr$!B_ELiZJq*-|kFBt(S4J1M=&WG_&bmUr#UK7(IQMunq*D!M8{8v(H(x?*2gqbMO3@LO9&tqn_Aykc%sT z{NkT?&(;Q;030nwSFhx^`xp0xh&J;dKh!QLrI)rs=dh3|!pHhs8SB{?@V4LsZhfgh?C-hm(rRJ_uT-7kfF~dPZgURvt@t(3eUWLx53a*?T`L zQJD$?oECRi7T~g=dG$2wjdBRP{nO68o%r~8E?^X0nX{}U&!C20T;Qy%{E~v-r{UtJhtpyKI0LTirFUQE)u9n`Nr%Qryc- z_Yh@O#fVOKhf7)-DI0c|f|9rjlPfaTD*!b;{8Y|hJe;dVMO>>OA5lTm9f;{lS`eW8 zo&L_Vz9$t(FPKu1;=0APgO7{%-J2q~zy3>Ygqib20}tzH3ru7@#6p=?cTLfI`Wc** zy(L5#xjP%;`Rc9GtOk6N%xx|=AmW&hgmD7M=9e#wcX0X%8z!42M=QAQ&8h1t;o6pp zFLq|xmrA6TyPwy|W!i&yq4>*pnHc}1nEWEW3oP-`CQl;M6Vv0|reCQKBFb9g+$9TJ z>jrOH0E{Xa!E5#bm{6Xh*!=I``pacK18?!XQuIJW{x~6|W1*K7mtifM3BaWZU^mOT zFKbVK*8ig&UNppd94mss?KF~}7?1fp6a=My-Ug)e5+IFzwsh@hTCoPSmnL{{x#NO1 z|1e4dILIL*HHr5UVaLrkl$O`FMCnFDzu-#yAPoy&ely^P!Q^U9ua-gx2j+1?>Zs+A z*jiSXO=vrTp2A&F{$cX+;+jK=rhNN+WcQ_X@P&oyo&p|{h`R$*-E^~BwRPt{ zkX~gY_$s>&{vEJIG1Hb%Ef2Iv?iJ7NIm;FoY8c0HFXOnS^_LPP-`yZmTZff`44ZrP znq-`ey(Z)&JUq7m^QT`2yZm<-M>*zfOwQTpfFv!VxlsD`Ef@A6&44%h8?7tCve}b& z{&q3=xR~>yn9_nLip~KD(HRe__wtxSiGx)9W=X(NMBGBeyc!FbF$A*iQtu$6EN`d# zWPj#Mx#3|G@IEMlDYDqXT2*c5V-Tbnfm+{?*kUf-ym|Z_^X(v6#8P^%Woet?1gyB4 zDrSRkM`?v(Xs=(Nm8=l#?9VtpMr)w_;2cbsE8reb5`faGJI6%VRw?{3!9ct|I(IP# zMb|K|(m4pt-qDxBl+Fp`q75Vi+Yuug0x_6xUeDVVHdFNw#s{HjcP1zxLrMS`Ct}+A z(vzxrtc57-z{?KCJ63{q99m?FoMw%*cf#`m%XB{&1K7L0REcoU_?=i{wvyyUzAa?0 zP-dg#>cg;gY3ua7ktU6O|2v;japP7syl6pg+TAq4i z2dIAMh35+L^K}@w3G%iSqN@;TF*#2;BHAG?hQv({sH?@N{hWm%-HEdV^&URgoPXOV zv~`T{Qo&=(kA^W}0cL*>gLhdOPoao)R|GiUMXZu!{`-!vA2XT@rBiLK+8_rod~itx zR=f^1nF_u9+8k5ch?*Pcv9l-6K2X>mQyI~nQ!BY#jv>dq%Yaa5534hP+Pj?>p zQ3-0h>mNa3Ezrxjyk1;^%-?c`)&f)KQ-s2^J0#@PoL%B6xwECN@3t4lgV5+fLdP6q z55ppgD;WU3+J5$(E92gDp`YKQ@1PH*br|G>$nAos;s;!Iy+9a(G+*3UR)ypNaKQ11 zTMm>ll(JGis+aw8*0?iET(Sp9=pXOou&d+S!#((c=Vc(_-~2f>79f-7lea5UyY7U* zyg*Z}CeZa7N;P@F;`~5()2;iWnHOxz~l^_63R(=#FjxEgNu+ydWm5 zuX>JBKItx991KwoA9l0)pe3;eptmG&4#_ZEG=Y3wuaJ_=)U$%H#Bo^QhN3(jX3<0M zEo~g)!){Q4EvXUVxelR+N8WTc&f#jg{p>xr0GuDe29_0~Lhb7a2-Y@vj{B>CYVBIp zbmAkrZyI>{qwwruy6!h2*}fP7KBJjPJ{55$Ce zxf%qMy$k}hg~LOzc2f%-uP*NA;$7^pf6G zY+>#vOBHy0V!(Q}8O6qFdmpn(8?UO|O=y88ZrA?mK83seEWy>|4dx^;CYAD8cHwLk za_L$S`eR#bS;WGWAF;0nPM9yDR8lGbYm3$GlT?o~+wvgGcM_US__I8KxGIBj-^eog1TJP8b z5>(=!1tf|{#2h(#)U^H8M}>x*lvOs;T0xp~{i*5)@_~d|Ggq1E!H$KrM(PFg&l`a>=PgjgEq!Ru{IfUsaC-Do0m$n={;vh&DSWeH}8Jh+A zYTMc}(9!(Q#0FrDTg2=)XDz#yp6#w*_@9!yZd@&;5Clq)MLe|u>^6@>Ynw{sXIqR& zEy8kJEAQdTLS`mDmLqZz8YrnvH`Jmo2AlzL{r4#vl%c zjkRz981!3t;z58!W?EsyBn4oYSjrdNEdhL|G^Z=mTeO40ngOOWZxwn+B*NPFKcvw~ zJEjWcH=Wt~Hx;%^S_%M-b6Q{RP>}VDqod2Ubs@Bnt8Ia zKf62AzB0%;gm0^}$lwqixI|uzW&V<|<8(<|H9?%iC*$i};!vO8!`7}5=dn9?%O=Ng zCn`o#^mBoXm;c!#=hf(Firh|)R_d?SPY(lF`4-x3PQ`rv#<||C6W5tVsja^Qxv|+| zZJt21h;!W|LPwffZ61Zrr`^&f4CLdCQ9C6fxei6nzI)c6I-#1(39RiY-k7Cd&(#qJ z+jBZmu1!p}rV5W|W>O-Xt#o|_{_I=$@ixwNbFkD@Jim-mG4~-o?zSTEr<7-3k^G1( zT^>y$i-yW;?J6PWjMj~`W3{h_K=TYMeb~|xejCwpzd4*;+k9Z8Frq=1m*fGl+z^*( zN2a7x*hp`YWx9Z1Ts2aN@I^_Vz+E{&kTZ1M%b?bif8ZiCq$r+gtgjDJt{VI@oZSn{ zS;Q%s^_$Dfe7C9)l~$gz95HUmv+XKREAe8YdSOk}J~1}~FxFV_S>G1mMD2ZkD<{}N zq9KQEN|?H-dj~k{Ezl$+cVp+mZK3&eV+6K4PNd!?lseE+n`@NmH`av$Ssvf$br#eN z2vam5v_^nv&FcF|#{-n(bx0!RrcMiWE(UFDpX>NhNHiAAj?g5B3)o>8{kzNBWw7eFN#C? zPV?&paqGW~GEfQ&xsQ}gyA;K?Q6~xtB~7OTUEXVG9{uqGVW~ad-YnY46*pfDR~YgLS|pe8ipUeI5c)-c}gdE2pHe3 z|J6TK1$3-ZR8T~#DY9dcx_qwOaU$u@KtH?5XOR2%7F$?MXO2?^8~$K^v(QF6CFv4` zaMwu7acz@|5h8M$EkNUm5)sDM*42w!j#a=bSNqo9Nbmo**p8h8<`ZBWGu}E4=w?+I zm}#j^HAmjK>1Wpfy<$YJUEPBvo2Hs7Be7v*Dnpl=%uwXo-GRlNjFL!lC%v9+UqvSf z!&pT93+P%VE>OFQfnI?1QtJJ;JY)U#cLP-nKo2|BgBGDfMM)Y~?j=Yrk=*6hw!%M zG3#xi$H_J_Et6fVYsh$Xrof|g@j`qtoO5l)-&J_X=pQAd}C?nTU2 zgou6Clyg;UN>TQ4a%q=52X0>vz5pg{E^Gr&!V&M;V`Qk?W`KMSs&joNXzLo{MZe9h*cC`(_s1y(I=%s|B&ldj`lvm>o-cYQKAdS|Dr%tA76 zwZ1ns;8r?s+hl&Ol-4IQXhHJ@5srViF9N~U&a0Drud+3}b}PZo;ism-p-#_1m&DJ7 zlTwJ`JK13s5A_xG*`(;3;QvrN8Eh*=7s>*ce}?1i;7wbWPlIlqEy?a zVN8B-B3!ZU&4r9C=s#l8-X)1*JzsjEOWrAfVFiG$BE)J2!Ky8V=b^(!atJ!;NzFMi?vRWOaU;RJ>B}b_Nq9}kD^XG zx9YwdIV2nCyAmxWKW2f*BC!Ure~|Ogg`&$>2Sjh-@XqzBNR0wCH-}?@#Tw^r#UDIh z!P!7?aMh#Ms4-&BzUfXYh*;+Ew9CVTdRfi$f;|{4w=uzP9eS(mHaJQQ|HFw)Iz`QE z+=Kr-jh(GeOD*J@(2|Iab6!&gEo=B}OSArW5Qb3r~Iv3?r~%!(3;+ z;!uPNl1x0ySFItfM%LiB$3 zK>@_I2B@Z2VCp^x7Q)hYMx)ndU?9N90jSw(sT=gh3nMT0I&yS;I;X!2#9m3>BVnf# z#GUnu`vq@6yvHE6T#+Kq+hk}CCKv}=(1E<^PEy@i}_P|81tE=M+a9UW* z3yB@*AcH92E2H=*hbu>r^D-B0tJZww69qii4_)eZ(sN zT4^e;*>oa(EC*7)9NhmPxpo;^A3*+z0L0Kl!mRnd7Fqw?kyJ{(T^Dez+u1$A4rUE# zNc4h%pP5;}B+B~5V9ZlG?u@FS@RP>#Q8d!h0IuHwiYH6(;}{`OF?oOUL4&JB{XYZX zrm1-K)xE!kddfv*!Mee*x4qCBO9gxIw!0=jpDal0q>-DBFf#kxOeX2TriST4M9qxk=YOa%JZ?ohOsy ztk~l45NcS~Y1Q>0nAa-;8M$R>V$ybJ2Fg)v(fnF0XREHRH$s&U0^RnFsvoH3gqNga zSo;dh4D8gXs+V)YPI8Ezhv6mkPk4U)u$iQ7TYVZ^4YI_S_4YUM)9S;k#aSTTYj4jw zf~0cLs`Q(|RNMiQ?<_tHqO$iHP?*22J-GN(Vhnsaa}p{|WK69vRf)NBc{cSLH8)ivPWVPW^Q;4 z#7-LPt-EoIR^1f~xLA~bWlC1Zc?Db9E{*k6Kz^|wD=Mpyh|4z5=VS;GLSO}_A`=62%aKBAZ3VN+vVj0g5sX0tk z#O{U=O!-?H$f$KgH)JY@(kI-~!d%kBTsR6{BFf0oPs2_S^K&s^tvM|$KxT&>0cQnM za{K3%n7!qGXO$lrOo5gwuFG>&sABCi3>)0wLpD_C-2`#ZMe#6)$~*FDTClq^ibPox zylFd#4D$T2)BAh={r@cG7q+=NdzF;q&K3!6YR_NlUB)7-(k6?9#_wP5Snh^5cMB`{ zT1uglNz%uAkNM5-R>xu}+osW9J-&(NpxgMpLd%Y)a2JoBAi)3ahA88|Sg;UA06?1T z{Q1wTP{Vs%A<*KyFbt4RFkPs99DIVcAUTKWO9YOkwYNr0i7KvrufG_XtEkB4@nY$q zO8}&&7FI%Sx{wgOkLrd(rJ*KcS6(G%Xs2YcR~av(p<>^=xbc>!U@$fpfMt0aD9@b4&5pu;K_=fvnRkV%`FgHCQ{X{l*eF4a@zIHOr6l!5jB)_~kU zNK{ZN9uN8kdfwxV;X-e@+TeGH;SSm0zgv(V*UGv(zrZkA0v+O3D@>Fi`xV<;rVN z-5~Pi)+GRS9D1`cvx~j`Y!L_k8i_9NA3xT2*EkD>lNe#g_GhbuLko*n>hmHS-?&U# z1yX*S0!tzab#erD2f?rd%C#{)P!Y5)o$rAXzEoEoD%y@r1*F?hGp`?t9{MJ16|N6L zk$i3?r!-C^_EHh_Wh@ewyu(~UdBJ6DMs99vLwr%n!WgnJXfW^^0=xxm{Q}bZ#dPOO zp03nBn4>JK0X^46bD4SrDvf9j#o~GXIm5|;A zo#&{2x(z~=ZL-SsMM%%~VlfLA?hsn~VX#(B;iJKqv_T4bL*l;q!v^u!)x)t75vph| z?EAEkceWuQsg-wC5v-;_)&$c*4;~LJ8*0dAyyACuqq8FqI<2$_ONYY73nGLSG5Rd~ z^*_`h2aI*ewEiV{nA@;`xUY;8?ztL1o!f0>v)pBzDzN4HDKaF)ESFyP%AWz{$ zqQ)CwBM9Vx0AHzy7S~bJ)zyvY5!^4vfJ5-760B$iw2OdQyK8Cxp-Tdf?!d%r&y-wc zmbWik7h!}Zhj1l!@twM!c_p(v1DoZ@L|If%@V;e?1r1PY%Q-N#Hv8%Ua_~orU@6(l z2T=*}yW%|%^tukk->3k6~Q6pf-66oHYqHem< zCUhpJ#6{{I^Hy+~mST6@-%Ad~{SI+u_Osvlu9rTVur<__FLBq*+wG*O?e_67HdrSB z`t+p>$nz&eLp2VXZ75G)`rT`A+7wD5Qd=>;ppfC(q0Oal=P1+>`2*+I0PtY?~psiUT4gS zBH4}%H6@qzKalNlm}*ym6)7dt1n*{oqFxuI{|?wU#@y!=;GRAB4vX`vV#(g*2(9c{ z^u5gpd&e_wFLK4m&+=Hd-@(CdjBI@<(N_$B@r7zIRc!?*m3$A^ujBlx_jdvMgs@>- z2ni!B{rmle!{uNrQSTamck86cs3_HL8<09Kn46`{ ziL2*WKx;9-IIUu{A4{>Y=LB^())+o*(KC-O zqvoCa#m^YsI8e#!7r-9rx-6eGXuN@~;Yoq)almb>LorAb`ug;B4S@A-4mr$^-kA;l7CiDPKqjT0eJTzx43fe~s5~`v#j9 zOIcaIsmI}2zm0>TVcWPeFi~>JU9GjP24Ae%$32Xi`xE8cs3>F$nd})eExHLwD zT!svC%PY_}tuO*w0KpAGEElD3DE+fbvM=AO#<&c2@r8{^VdEM>_3?WUKi`v83T>lM zXU&=&Z1R=|?5%;~fpLt7G4+@N#B0d*{8*w4OU?DELTxjVA5;h|zh#Wt2ujN|!!}f% z?H$A8yjZDSEq74KUbF4rjbD|y_I>>O8^0zzGRNCE@QdS=H4|3zgwMSAQM>M0sx!wq4U z?}yBDF-TEQOZYP9Ij%A_0BeNu&*UFBkLuxFPQ#1)bPhyQ$eWfRQO97>45*nJV~HG& z2D79?-EpfnV8;?8JqJ}4=)IfM8x>nEy7C&@pLBvjMT&svV*5~yD@>I)!}gfR(8sNF ze;?|QQ5t^vADYNtJ7|+7L~4+*`#Xy9uaSWpXo2EY$L?NC_T4QsK~HsZCmvi<1Bn0{ zxs<8rH?>fJ7j2Dy!e5`yFDotfyV-Cp;amD%b{pR5Uf!ZkJH!zvHjzKaP$S3H(>}Hy zTf+xxZW**ftU0L&E(1EHDdVEoJ6fCq?6O$tBK4q`P+MNV-RiwYu)|P#EUk!Oc3~&W zc7+x@11FRLrhBsM ztws9C!Gj012eMF0oUw+H{Ozl-IIYtu!K2UrJ?!(GL(2U%?|;Jy)oeN2veOPSs5qf2 z^kXa=mZKr;oe6;e1DQG447j(Q6>UF2>H@UgQxk|#FP5XmDyphF=B?t2Es4XXZN8PG z&{h-P$naPNBf}AJeX|$~A_L0TbS$6l2b6?n|(||cdg1vQJIUV#ocFjuI zvw1`DzP{O)mvg9>8tT+X-V~J$uSG&|ik6}Y^~L&@3su525SCDTd(^~}v&X1QW%3Us7w9=PlN+nB0(ekVNWXromR12voRbm;6;J(m)t9E=={FOgf#(w zR8aQqWhzKX(8laScFyY%%Ot}_Qz}kxuumM>WoKd6kqYiS^yuqCy|g%=cFfm8vvBB> zg|t2vF}LE+hs<+nyb_hE>#N`vv@I*dTDl=Ob^xIS$Lw%jBg7|Q2?P)QQi_CJzobGh zY$4Q^hj;t^+SssQot?cX7K9zib?-RAPe4`2rbi7G!%tSIz?i8hKOfRxpMP0PCM^MB z8#qrXTe*K?33=Q1k+8XO3`)E9g9Bc*bN{42a!?Ld;$ncvr)BGSy%y`lPF$sHU_eIM z&dyFo5W$K*n=e9H>X(7+16A`+vahcx{c|$>yw>&MvmB2lE|*+8^P1yO{g)TY*XS2+ zUpu6B?k?tUs)POs}ovK*Y?mWZgQaP{x-Yfl$at{^a8JwZy!s~46s&~{{K zi*q7J*lnQq{{6S3)mAlw9YyaXG&?v}QuwGpDJW%zIZcQ1wr2b}G-qNLhbGaXz-%i& zXS!cLA&s7?t&ADP&NuNk)Glu)6P(Ze3aMx*uWaAi7#t<+EbnZoy(f_7sW(I=hNTd~ zk|eC&pL%X{a$u0atM%z_@vj(uhqOm=TwxrYa9?Umu5b$AaZZX-SPt)|QHw~jOvL5# zN=0Ya0kg%jCl(5Gwi6L!e0OXKm`i8Gr+td7g4w)%*548gwr6KIrWXnH*p^HBtMR~u*xak@NX z!%3eRIL?}xnUj%|o5lK`G2!ER=lL*k%4@TM@Fh+mr6$NGuVk)rHL7AGKV#BY;-EBk zeSOLki=$-be~`ti|EnU=;gfGQzp=cdF^r>Bl$fkwuWd*Ho7z#a-**!|Y%+gZQud8^ z3B{o9tFOd1HtkeA)-^JFc=xPeq9?UMHg#NNdfvr53YgeY};*;{NS;W$CKLNvdW-W{<2|g~YFlANU`u z2aia~X6KZSPD&80Zf#zrXQa<~mv)OFy7P3<&>`|CWx%ORfAvmpv!!PlxXqn&|Fldk z{2IO@Mmg-5(8jH0KBBjJ@qJ&91p}?1xAKxMlM{tT_s%ygpAmT`^2w?C;%GtRF;zdV zEB;KZ%%+P}X*E4$&?9vFz<_RLj)juA$Qr3)veh$bLLPTrHx>7-gCkZa8#_xl8EWPn z>As5C52w{&0vC?^MVW87eM#*%IvLt-x;nW*)HcXbGRP{__s37Z-I!Z0^Zp4#pc$Fh zQ&D=&wz|sy@Ss0uO>yb!N_rrH+3;tK$EVF}lp}UpbXEi{O}Jl5+oD2cnqk1^`5_@clZYd+*i0e<6d19Qm@wF z$-TJ|%;yd)D2DWw+9)kjy4M~rUaSvvn24+WSk%-mTQbZfB>pJza9astAZ}fi3Y41d zj*~rH=dW?qs_3kTSVc?iK}z9?-tK3O7OR(Pvr^S~C>xISIBK;YdZ#MmdMr;pm}_1x zS*AjXB7=RheWIWT)^MB4$)UsZH# zEQV$sn^SvcMr-Bjin)zWj; zJ;5bYUfHUj&n1amY+h^i@J@ZH=1w28it2WMA7C`ebcfnnd8PeVC2t$v<2DdINFY_A zaF1<^{JWBKnLW&T_IWgn+_lvr{WX36C;{GhcTZ6UER0}d29N1!+47%TY{DL`bFF+Q zPfpYJPM?(=s@>L{;(Mr|Fn>L6PEq3XY3|Hd$s8J&zlko|-rG@+S^u3yUYVHKTcOi2l(*9m_q;I@s#iNkjO%Mv}4@ZELlr8UMPH(1FR6Z$;{ z+@Ji;wW{KzwR*%q_jX6H=YjA^VkPeYt-n`kjrqfh;_Nd&MmJX6yjESy^N9I{+sf0r zskKz5^uw@mm)|7F9R^+Q{qXR4T3?{uEuUsqu{ z%nhN{4l6C3_|5A!{jSYXXJDi^b8TYC_Ow*F<{r{FD2ZXDXNJkqv))>Bs`NwGVtHU_ z))W*enq%xEC}WPm*XcHPCy}ub)9_i^5t;c*^WE}1uA|Rpw%;~+(oc1x{ELtlJ{SGfv`b4p~ zje~hM#R=sP&DxyEsot7Gh#?0phrr=ogC{hv>kkSpU?WnC5!{r0X*^}N^sQQfk&rEV zcq2GWFCJ`Jql4HcB~N^uhSccnhOyZI9k)a8_?valozrSwR^J`%fJ>SADQL#xcMcrNu z<}!TYe1^~Yqd>uoacu9sBX%=|G&wder(aNb=Hg$bOw<-t^(;$xByN?9I^&P~O2H$l zc^3yXgSYBTA^nt@yB!OEs_eL#q-xBrQr#7GUO#XAM#pW@)lE`dl5=1~Fecac_mv#r7DIC{^CZSE3gPyPr72a^rJS0)8&=t9ze#@)h_o>c^%g7nWn3+{qeh~ggq@rams;7roBvL&v(i%E#flJz$D^Jy_ zg)?;VEEBfZQ-@DEbc$^V+vx}nRf8?%8JWdeoD$(s)@g?qSRv*Aa3H+H@`=3Gl5gd= z6YTzX>k9&7r;bz6cs>j@Gc#)}6regH9mQ{S`263?-jfzDR3wC7`m6#)MY-3G&(vex zwtFT-%pIb~LjAR$M#jF`p0lQn;3FJeleyFkne0?TSBErMwvMpZ^jtpK>knS=T+Luh z%DiP)>Wi^LG4tfX#f9P*8R8H@^;B?5OLMF83pv7uoCnvqXUIjj!$Xa-LKA!5I$SI= z>3_jCD&QycihpN%&BcgST5U9gHMd+&wAN}ik-L}2Beo{6Qpb7iFf$v=YGi*nxLIcL zt%lUCGxMJsNL$+Rg17_ak1QMF|Jb5(&%Iz^@w_wEyp_j|11^PLHT@u`225_LDueve z7pY@*Nmj&_&8?I|mq$%E1T(0`Y9an!Hfv(Y^(+QQtj#gkHM1Ct+`0j6#KfZR!;=tw zIomzA`SeWu8`ir{yQ-vd1{L_OT@@|oy2+$uWa7~2Qkh3r-ZB^P@#Bs1&(mMU$!LT7 zb<<1UK6_SG0o;dcSKY@JM(V?!^?Mg}fmMxWGrR*~rA_e(KI4anKTc$|&7Vuf3tQ!? z9SZ^z(9KO-kzjt|$WJhi>x+4T%1T<9Pqqwrhew~}FZ**!uTd2=P>GFkcy2|(NXVS| z@nao;yyrLC;_xO#p=}ze&t3+Ed#-F=wGdeWb5ybJpc8i`x9Sm1;*Xc}E@9G=f$k4h zxYu7ykvY}h+v@5hj=7zc2n-oM6?Eg~O^2+dl2g=zX0g4$?iW9*+}@8jd>}lRH|f`o z+g5gK7Ri0}%X&Gm^4r{nI1zUV6%{>`?~m2vR%MiCgw4#*6$o9oC3n(pkKCf>Eo5fi zz6OTZJm3>}w2YLZqV6L9vqfwc<>`6mX)wDZ3gX5aE3H`IhC&`q9fKddW8CEN)2Yv| z${BXW`sY_M|Bgt)I>StrX-$$te$ z6>oXgK9X@L@6l$EH2Gvhx4iPYLMfUyIAlKshuVyMJN-F1f!Y51$E?@HM$MrO;D?}3 z^Y!&x%d@S9<`(V-W%fHT=XZ>`?`W(55p+BD4wEYgfKTWzv z9zWA({XZR7!7$q%``xoUOB+U_pMx%@c0=+K?M@X7074|kTz{3ii`6x?5a^U8FzW=&J$)6d*Ykw0KWuwD*kY-}O9>-#dX%LXtybo}>~qTXqvX=Id-LnRhVG*TVk$9BS`-t!9s* zcQLM-b9{I3nkxm&%(U>;U^-mFSi1Tx=LLp>=9F}PL+F1f)1Or%tdOW+_*8-ixOs_^U~MmhM$!I&>6sk7evIWHCQ z$hg40SMSj^2$nSM#VG4rc^RCQ%l%|^bYh%yWc~L!8$x?8-3^bqBLa;JX(FQ7zg3RD zo~bbj2@T1F{1<{Kj&Jbt=XG@*d295DX{$9Uqsg3=2!DzHXV2Th$7B#0Q$E z49k-a*$a*qCms3srjiTK?i_pcO}$hCu9YvL$!q`h?_7<@ZPrG0HY}w5jVG?mj4|_w zyO&<-I3>!(uS4&3_;{W=1`A10CVUm27QUzouW*^%H@Znkw7~J%exw3sedW01MXDf? zI%CICuMA(Q2(FvBU|1VyJ-y?EYX~j<-n$DE8gukM-%HpWORh4~Ms z1dD@G2_~LD{tz@X8?o=4fXHZuL*$-iaa^X!QYl0oZIC^b-E~lacw>cvrWt-WIuu)r z>r3`LO)HoJ%Ztys5B$W69U0^R*Wd@Zi2@dnMD}j^k%0tSjukwtyuHD=)2F3TYOTtR z=XtKqN+rHRM1i!A&uO#f#~$cAAgRQx#hh82;>6Z?h2C$w%*zbhNRv zUf40p9c99u7G3{Dv1#@e=q)+NCZ?!PNUPq#4Ga`0@fH>und%uBO{BLOhmO3#CeflC@rx>dd5`XUazpJSIG)oy}?lpq7o zWoax9WkCH2KTl&yiRTI>p7T3T=MOQW+p@WN)O@jq)ljtZ2FwnaHfUWCt70!3gMsOZ zEx@7(0!9I%XnO2m^=Ra&i+jfFagN{aeVG)X;C67PGH2@v62H7K6H~c6WYalPIJjC| zL?&E-nU%Sve8ab)P~zm_je!tMvM3K*ya5M<*-Yo=c#8Wk*gaEBX}AkBDpouHE=DQ&4&T+|;&~!J- zk&C@5*II1;iVCg(dH~qe483XDKd8ljj18Dat-y*}TTGVLgM->3H2lTRp#>pHm-$bh zSosUZM<4;X>>70w-d_I}T#{9l&5?2zHZG)47JvYDtMTF1Wq%kd%}(gtwJy`aUY5g4Jr@wc*WXXLdAlTRn0TzHL!y1#zoW zX(=s%(iDOrBctUhrZhBX44~~D=Je;PgzA!+f}W+H_k4N3K$CHtC(ZPa{c8p9UF*JF zjM&t&apJAaJR{?quq@UJj7y0uhSRwoOxU`5j=SK#A-ypyR;x4e4P6$0Yw4Pqp1xe( ze<86>UcCJ0(C(d)G?V>>R&#uZr92IwdqEo;tQ8mA@Wz-z!jElra8H04Go9sB>b9~I zwH1wV5+tV7RXPU0dw17vWunD^cA|glHZG}~JJm@&3Sw5VUQjROigTEDFMrK=*BLxk zy=c354XX(67Z&d?mxr*>M@A^_;BXQU#JJa5re3f>CM>%eqRtANoT!c*NlnP1%kv_aoT~hg-g} zy*OOK6aXqtCpEr-G$q=i6qYT^H|iW!kM#(+rFQX^l=y)C5i`EM>!jP>|B+Xx9!k^f z@!~Jv+vagwF-_51w~}c?GQrTC2VK^u-0&T!5yMV=!w}z53H+^^Di_!BmQIrF3{6hl z$@1HI;#=OtX+r3$W2gBy2D(_kemhsgblIas4Z7fb3$(!XnR~f}hA$IUm3l?irlNTN z(YBiY+BrBqwnVJ%MnS&a2`<$f(++{X;aWQXKLZb`3!-uW_T7FKgP7DXvq5_LtHR7{-c~6Tg~F%#m=ttAB#E!JYi~FEQpXD~ zh`)HtqpjzZ9*g}x_xc~p`R)ceqPh?& zfOj`6xII-9enB?&>a0&g5>F>T??*Yh@A&QnUe{53FfbflH}@jUX4BoEDZX~@Sxb6D=z;EwaMs^qa?yvt>R0)4# zFL?RGEd2kmQ>g`Vwer!evlW#-ua2pWE`0eg3(4T_=a3&f%43?(5KS2**A{|S2b!~` zrM#Tf2}k1ozlpz%ru+CP7+;h^AzP1(GrBhVTr2+@Lecn(|MVf{3qH;L=rNmRy9g?2 z!=FCY?R*l3m-)1xdhf4E#_u9?Y=3`-(vrcC=3=u4B>aU_^9OF1v*HpEPoIpEcwp;so z4>n7aSkxH9U48fdPf+{V@*^z2qAJeFH$o}_k(y*=p7BrJ=O7{a9}m3u04Fu*K8Eb6 z-9gR!QSG(jTd>Bi@e{8uiKx10Zw$EV!5aTCyKfjs@Kh*p7kvdw!T={}3bsHH$}^x^ zI*!epbS&N(B#rx>O%wxF2#g|__sNcE*?fqIdTYzd zgy5@q)*r>z5}1N&rrsW%T@;!f{&Oh!FL7-c58al$M)gqkZ`3s~UH*Rb?_ig`fs4A5 z4z!e=)WVeBl%|`0_;Bat7;EtGsb7{CMHTnL8JD#VBFf#|=PGl9y`3Tn-M{sVkV){z zo4I#NfxL#oU&EX_92oDTt)t`q)ZJ{6GvQ#^2u0F*+c$52IU2H``?WqTEoi7cdUBjN z%-Rva#o*jdW`$;5)qm$hvj@A*x*~}AZ$P52(9wcSA)aA%M``{#iqRo+U~mow{Thpd z={Hn6z>alsuC;_p6t3?>+8Lp3k2cK${0x}ZC*oeOyHZ&DkXbO)!U z(MsVS@=I)pkW+8bVbM6{R;_DxzOs%H-0*hw)WQ?W!a-r4+TNH|06`7~4IsGnjJSaZ zd(b2!>M~8YSOVV~Zf;Li!0K-Svf-|t+@P9BC@_{=od|>Y9W;(N{ko=>z7UhJgmQEq zG_@N}bG%|jR9$pC2a*%UF3Nafuy}R4-6zDnqHaA!hAMYsHugKWZVjvYGbmNRoUK;- zQ=B#@n29?Wl(B{p-(JHLf5aDD-Hx&JzWHTi({d2r{BG1hm0KFvwB+1pV!YCDlzxqa z-{bdJPMCt>JF}~|YJ~dB7gr+5E`om2PI%GZYFSw@v+GLB=F0wlz(!Z*uifjY~xAbv>=E>Ya_9hK2G<&n}kuu?tf{P%xuf z_SJHLS_lM*%uuPcAap-yy5%4=)o@h_2dN!>Y4s(&JX_fyL(eVF8%>a4Kr|I)=oA%cZxE_k%#pi zRgn$pz-9S~8FE}%ha!+=Wfb`urRQ9wY7 z3L00zY8J$kfuL;pKw-DwZ{gs|?yr6zSTeEBWNleVHVIT-v zZ*rWAc8zYWcRc($U$S!jh}5WFEK(tr`jnRFMs9Z{FoJI{WJV zb=qf z64X{P2?@m>-S}O=J$2~u%dFLct+@>rV25^-iWQGTL<-*h8FBa6Ndgy0_=je|E!H zt#e-+i>72#bNBc^dGZ7szq=xiJeZLsJc|$r5A)Bk-=!2d0h5A?%)n zJpkRbu76H3nTr5C#h`3`+p)!`8qEw4@ zXq4q8bSa^4R*bM!U+tLMNwCV2+lJ28@eNkDg^5qE=p&UY0Q^~Yf;9fxy`kl_A2m_Z zvEu5#a2o%bZ7ZbZhY~UIM(gU)Aao5q!k(pPFXMXsC@Z(0jx!P9gN=}a!}}jc z;YwZ7?!D86+L~_JTSB`O-2Js>$A?R}obiW|fM<4pN|s&SE>QvLg-%04{NiQHMqGVS zt^xRp|U3=M6rCf-%_=U!<}E--G=G~pfjjh09Osj8=Xdxx#Mv!@=2 zLtrfXTj7mSy}@so5`G*M=S5D7pKN!7ublFIR;`ZwWHzQKEjEx5w&plvuC-8;xRx2X&Hj ze9l{_cAhjw$9ibm{v>Fa9fwm6%_wi!u@9Z~WT?H zN%Nu+!xhyVSob8MvZ{CH%rhPz+~C$bw(e}2UgzcH{cdK5Q(1jNo0Bot<)}akx$2)j zrVM_VNvlP7t0@#@K?2XD`#!Z^;fek{KUw4ju&N2 zJ;po68AM(O_068E2cww9-MPa(6ZL%B%_CNPzxw<8ee%lD!W8e#?GvW-YW1V63U!~F zpKE4)Em~DDuj?ML?N#}{(%yFRA&%zztmj3M^UB2CjDe#e+4kL9&*>oQkK^vi;55g) zC{P0Ms*%>lp$n^`VoQZy{#eewtDyNtJc@w(nao z&4APA?R>-tWoP!54bz}U9KVhI*uEZM#c?#`jN@^5Bhs54W3Y(Xe><*(L`nDKd-)X3 zh~C2_iTX)d1+s(hGJH;;=%_mDt(swb@~wcX5%mkt-DX6eXkEk7YF~yz-~11M zoQn|qoV)SC$h77KRsuGT_AgI1dxhl!_ad@1RMW|d6TcBQnvT-(^xYmD7D3#?+LVeq zWuRhTdunRVDr4vA@#L-<8ZkwK7}of%EUn90KvERdVHDx#(>;=2hMEk7d8VdVWpP$_ zKM)yOA8c0ln6TP~Q+NK@@O%w`*!^NBu*=!o-*L*mZx_mFoA7iWz1`}giOI~(F@1mv zWVCx-5o-wmhMM)-mazBW|MJTzJR$AW)a&2tX}83ub9=*w zqLjyy8uM>1=Wl7~Q@;FSWm(8R`~}yi`c_`RAG86yeIQdI@*XYvHy`H~t=&=JUD7c& z-_m_hLb0Pyy?X8jkE%^QKej8N?2NDdMmLaAz?e&}ruyz>q9TU^tPJPviJD<6dL6TA zOWjcTdg=IJ*9|tHD2?gzOKtT(DgdQMAD~Wes5dQd-vbHA)&gUtDCM~Nv)lx*I8F2%jFcg8=&D>XU2aLbkJDXdf^8#(_JUb&RiM-$(|{EFIRa;fxSaatA+HUA|LK!_ z9!gjB9riL-IQRx+#aMS3GDnI708$2>c@XJa3}tL{ES1R!u)Y zZ&~%mad%&UsfP4nRBiEYv@f^IQfB%^#j1$R-s4zd+_9>|Ug~uK!o)gicdhl=bsSsI zIq026A{k&?gc#X73%I|XF#-o4KYz%a3NG9*B&ESl>`iLMo-L}_0Kmm|YTxYz*=v-U zdahrBqNi=t<#=plr`~O~`9HS1VMGY#(mL*gr%MH6ZlvHY`5z1l%0wLqdPe@Lb3m6u zDlznWwB)l^7LJ|Gc30n^ZtxJ6Rg2Ptc=1{O3v{XU)mGe`Ml-&O#W=V;DvwD0cvv&k z%msqC7f?=BOm00QT%}xTw;^ae`vHjBFz%|qZvw)9ub|8lJgcUpATg1C%SosW%nBQ_=IA0;s`@GrybJ5RlA)cf%zXovQr+dca2cTk8>ig_99WBvRpkG_lsG&|o zW-J-+uRT8J2MN2~*v!}EH{SJNYx78A_0wPv-!Y?wtK+{@VkK8K(%tD7Q@;{T4K_Mk zuMT|(OEo_%BnlPt+cFlC*REd=GTrw4dC{KSaAg!(kPq5ib!LI(MQz(R`vQeXWyyZq%KA>ElLeeJ3${a=V;lE%2>C6>Sp&t>RLw(BDE(y3MgB z8!S?md7z9_PF~wmZ$r03mn_y?&vPlhXv=8i#=H7Has0jmWZVajH|e$iQTp~zT}x!m zWHjG>DT96oQu?gB7p6TqE<#-eqDyqNwF&wLB>6@A>jR9ypCArNsV)43)!D_=-7ZbL zi%H?&K4_UMsc94o8sOGUvq8$9k@-=3f|EC&l`xJgpPsiouaF-f6Y##)79Ux*+}x6E zBB7k*jHq3IJgb;Gdm}_#H=(q~!kfKGk|M7KF43Ijkyx6qXi+44wy=d+{dA=J(eXP{>X51{5bR=dcz8C+y4PUB9gRR zm$`baoNS?ACxj-ZcN}&>ORv)XdpDV&CGC|I6oGQ**4Nu9QK!R}BT4~{4wxu40qHWT zuH{D0BgfQioRp0k`N)w2{X>_|@9ceg&7Z#JrAk+rfVNLzO&udh2L!M&-QOr08C}bn zb)hRA-0lWkSZZcu-`2#?L@f^5s9?Q4^_tG+zFa-BQKFpu)pdtQ{SOXaVCc-hJdp9M zS+i{aGW728#iy+O`8@F~dX%(tp7H&FhU%6~Kz&NBcm)dJ9gBx1<28B=R8vv3+$(pm zGNb?_yB6`<+f=s2uAY_JFA-VifA8}H%=x8?Y?=oJl^q6{THGo1O?<9V-^IYD3*li~ zYd$OIj>l-2Sx+W7pOjy{Qn;a4l+*N2hb2e}bcxd1(op@hjnu9qKKDUiVmn&az8~+g z=tzh_|CEo=W&pI@5WVo)AnLC7zYk0(Jj)7|F6)%8eb%%mNZvPZyu9ks2DytTwVKcU z{DXrcPCc}B0fa}ci}9B4GTupm3J{G@l<3Z#$hZEhXzm&z?z6S?wZRE%LuK(W=j?UN zS)#@>{yn>x0POfUSdidE$L1XYK;4dxC<=^~jnt_b-Qvr^KBWUS1)nX5i2ufiWdmZh z)(;~_hCyHqS#178TJ3Wv<3)e%LNlS(u*s^*&ZOPuKI2BFnKK=L8mI%615FKAoKG6+ z?hM|MQL(8FNRHgF^5GFKHDTZnCS!52Nbv8UCk43Zr%9q zX8rG@t|*ry-yOaijgAnA75+p7V!9UbdiA-}_3eA^+|!_wo*dvOP^^=E7YpznAqf-5 zcTG)IPY+B?mIwNF60j5>8pW&D=T?{lhGpMY)T;VE#I~84U1l+T;Xz-32qT4IWLDY? z_Y#3ak}mqVn%zZPNpMIU1=djRuV~jN-2){^(LRIVcIYt2C)+HyTw1bhSp}$O@>|C; zj`UtS&lVhO<>P-7dcv)WISs@I_KN5ktWlWJBJh$^uXuniUs4P}4GXRHk*&ubBckXn z{#3+hwDMV`N9vu3Nd8zqNQmrP8R)3-DT#b7g!{>~sEzNk!;D9BK}+=!AH?MV>lucMS+1HU{uw-t)#O*7LbO6GEarLDrsi-isvToY>U8%5QGntA-N zO4MBc2g^`Y4}?WVP=0Fi!^mgPD^HoZlHN#wyM(9!77`Q*bo$?Eg)a7?#(__OppkY6 z&zQEjA>kU?)@S)GG`eV9JVp&d(vz#tcSFn_*mcxB!I%b(T2Y^V1TZ;hg-IR3=)tB= z6oh)pdKNn?%I;KPHF0|z%SH|e3g8$_zv}>2l2ucu`cq9Sdb~$JWaSP>K|(8Ikp7w} z^76uZvmUFfZ5c5rQe|tWpI4sgSw!$CGlLAm=k+{5_iPdBwl|!gfzGz#&j%aO-_=dZ zcZvbAVg$azb8D5*Yvx{j;nKK9aXNvJD7-Jlpc4o8S{Nm;0~+uS{hzb??(vIauc3Kb zJtJywoN6xd1^luOiC)a}CW$xatH@V_yTk(pX1yJ!=?HVBZzGT1iS_l^2yQ!wmdw{9tyyg77OgaSGZu=zTr zp5@@k8Lc*CFy%%D3@XaYgJ^Y-uWRbJGQx^{G|)5=Ng!c4j(K|M0tAujT$i>T9rbup zyq(JBy4;+xE#WCIaaWlGDIx$q&+?5rP<{alaU`cX!>4o_Dh|R?W|@4t@zuqMxz>rA z=Ku<2*=@nUM>6UaUgYk7ez_sy%kr;Aqr&c!Nd^z&>>~S4<#>!;Oq55`k-F#|VevmR zgV8t260zHoXD92%ZfQD>R5VhZgc3%Nqbh?pXQW8>ST##WYD`rAl7H9Iuw_~nN?6!h zfB{mhX~pCL5j+dzh|+;iO`G${{tb29M4ThvBH&-lN$VzgyHuA{E6saY_So4C74zoE zt(E+)=qgys$2eQU_j}T#9)7CB5A8~j>La-{r5BL0dDV1<~_zGV*xDN3#m+oHRIisdRh zY`$Q*S^@B0v$A;EX%!2?lHp5b#Q})LUi<0jpZq17TlppaUxCytU@WuYv%QR^25rXy zi@Ci6n_A|{iO<$P8GDGJ>`Gr|<1*?HftiBfC?W>-KbN=Hn%UL-{_N=sh zel&1piPsE!7*xOO%y5;H;^CS|nSp3(RAwvC!c)USw>e z+*-84Lc^dv=Cm_;($EYtAm8vo>p#MZ*TM`Xb^(mjzN-2kL3Z!)nyz8#B#-j}LQ=cP z$~elWm|8l0r#~tZPqvlyp zI;%S3w4v=FQ)Cl0(dk-GdZr(D}m80-LLqrWlzB~hgmputmD(jXs~=uNMK(FG&xx(0?R1bV719DDR?F0y3ZkLF;1O+lB1|RhxO0 z1xg1X52%vqSr!M}M%lIusoLGej$NZ6t=$wB7bjFQgdHOQ`-9#Xnt5`Rb(>6T7mWH= z5N?}D0W}tc@ehYRM{(1G@jf$9!V#J7fC_{y>iz=|m2n+-q#*Csa z6U+}H;zfBzxLW9kOYpzP@$VqNi8Gdz$5Vud1C0!3({J_KM-u{EH)rqr>3vWB_QWFI zNx^>-z}OZJ5uU^J86;j1BZa{z^LZ4Sf$FEkbZKnY0#FLbr|ftY9@1(QY^VT&pIo4> zUgN!yvLj*n-wZCW_o92uq#H914i z7dN_Uqr{+Gycsez)zE75$&c$1iC2w{NPOKjvSY9c4jZj;`WjLUGJk{TQx|U^5{V2< zVFQ_`LOf<__&in|xQT61%$;AjWS;k3oX-ku1#6#Vt%FQ{Ua?`KTyEb= z4SUf5O{*3_7_mWRrUKesvgu*Y1c5=d-*OuNZhk3%xkEOb^JX-Jp-unnJAH?*3;Cpvdq#%Iv~WL4%iE(PQ$AetT+upZf;vHSgLbV z7O58G*8=&L?3NhoPZa4(QI)kTBnoQCRdn?AU!aMXp4*PTgFEUBorMoYI1-Hn&TO(d z5ldm?f)L^^naTpxPB2Y^?Lv>^S@}`dS2E|f4ns^pVWL=MCadMW99HeSNJ~V1blJgi1?*pn21BXqqQoOv`7e%ExXO*cA<@D-}|T13kXz#SH$ocWf;?rgJP!k}yV4AbyZA2qJRoLK{!BtWoKM65i~B zQ098T%rC1|N?m+lG^%gggAE&e2QX8dt|OT{&#FU9T=|@HU`Cw-S~^R=d76V%3S zBf%|O|KKQ0vv!>v%UYgi_$2iAr*_BD_02dev?qF&l@s#Qb5!iWv&@T7z#bH_}tKD_{)xj1GwP7g(g>FkUI&4*JS-J6MN z9NJ5wlVy*uB9CdaeZ8}iz?t?NMZHTx!CAJ4nRf-}^CSKqz)|h(Z^Lbv4(S8O;oZCj)-E@;98XB|*m!sN(HtwQLHnuJtfJ|kW zc_wY!teu{5yO}3}ow$2+b4eD?G{uo&!=bmk2P#)8t@}m8N+Qvryu5R4oe5FYI%SQz zmE_=_V9e9!cPPT=7MM=i@@4-Flzqsp1gPn)jdgrAI_Gwp#zC7I4WAKE2o#+OC|`-h z6&QRl(*diMhsirS;X$F>V!_E^_*9e4#KJoTxQ~eE9u}8#II#neBVO>4dWvcCvTW7L+k>??a zwd8}$l7TRDzxwTfg&FoHH}rTweu#9(|K|NVN%h#6oD#sLO0}w6-mBAz5A@LCyW4+J zI0Z+m%=mBbfSBtYn@_(A%JRbdGy(_$s1R@I zR+Bv{z;=PCoV~Od@K+!o~XyOQ^G=Xs&gOl18N->Utri1d#H0(?4MlsU02-?AlP@qVygl|Cvx#=bh zE?H-wCFzrleEx0E;u7Fy8JUVkm)$${bUA-o=nWpKrZJecND~4xA|fNT%p(O8JYnKc zhk)Q*uXktjX!^aSzhZDu0d2ES$(&5c9n8>hwQ8OwT>EM$4Ipd`Tz4Yx!yOS46rnIW z-lhu|v>mAn(6$&kCV{yitbHV?^>aRpINSTEr-o-ymX;hz85E;w6Us@JHPhuRoFdR>JPA)8TTS*E=ng1`lu$nwXIsLVTi6y-Bd{w0>qp!n>zCipa( zV*)Lc?{72+ElZPau&sI=kH2*o91fHjIm4@9(A5zz7a$H%!MeIP>}AyRZ1_a;1r2H{ zfEY1=QRgtM&{TXBI3vy2oYv=2pS3`0yBGjnf*!SA+?KbeXH<kQ5BLbg~v|> zg}r?EUqJiS>fQ-LvB=CP*dzDW^7T^rN%1%Y;2E|`pjl;YSvF1OOHDnAO&Wq$8Mi6W zz?d}y6N;DG8l$rm?Zn3J7MO=A+TAl5{$^$}u>t!m-f9`F`ckH~a1Yyz>|cryne|c7 z?2vQ?k7*p*GzZV)^X~E(YRgJ#_9-NJ2@<#j(gTTl6rkHTdAZzHdzGB3KyNdA3N+E9 zG6}5f2($q|Duw1AFW(j$49V<#`}!u@*QhWG-B!4~v5imlry&17U~FKA;W(KEa>(O@ z+MDc8&G(n>bh~rgqjCU)Hzy+%t6)iMu@(vYnDJo%__cc1YE$HX_Bjrhw06~F1)h@a z#N(#!#77Ey5O7`r>pB+i_1~%6+9{3xE_-`j79@sw8pFmve}!j1r8$LN#I4Qf&d0k3kC8bjCnfOOCl`YxGtfxT&%84CSI3DTiP$b5PUkvg;&TdopKd zwWxS7y^abLwLqx`3(6x%Qc08oI+WfDc99@+xV0gz_N!spqdzUPECfC475wj8`QVdb zm#{7!a}VtUmXSS9W+CLzCf*FRWKp0iNkxKfxYg%}yeV+1sp*A7vHODyPuIBA`wZ-N zXtB&>gw%ZI^&8<7&=KigM={CO1QfN1%m?R0Ouef+v9A#91DNufk^w{a!xq{bCXKY+ z3SNDxd~iaSZJJ56jV!Y~!?CSVit>$m4D{Qw2p$YODyuGpb9VFX6lYZ1r@ zP@~C}q>T8KLeS!f-3c}-aRRQMvc^BQR`Ed;ot-@39V~laAfJ;n;?uSbC+n*0L2qf}^ynN~qGQ6e;rd*#?=$d5ApRmY zNrGrTOtg%tBV^a#MR5*EYDHP2)k*I1@gNRR%qFad6ez#K46YUZ2}T}KG+o2ztlzyo zXe33g&{vCSN>%agv1`0hdr-oE%hfa9p8Z?j|8C_lS^vc16$>;h+a*r)a>|TvLb}$L zdhon=zE!+R{>#WVI|Y{HYCAQ3eM^-I8BQpzliS|+t!KZ#qE6Z}IcOOP#1wRU<;29x zq8Sr8piw=T(>vF>uiCT?d-YtNKe0Y|@0+$HfTYas&d@8K!~g>8qX31c_t_Z}VP_$p z>L|3B2z30@Kb6EG;t7RR+N(Hibw1}yZZUC_?l+Sw>aG)~lzg`WX(_laKTcZFd{+!#*Z{BVRgqb~K5Hi_uecuq{|Q;S8Aj=w5`d4C4J#j*L*ucKvMO$}z6%}pctcSsB+yjX6+V0PQ3l_y75`{?8@i0d+ zUi;UDy~B5jdSxjDQ~}Wk>PnbO;2EM*>Dl3uKUwJS()EW7X9qM2a0!#h72r|O zZ?rp2Pp*X-jUE9x!wWHI&Aqw5o|o%N#vUqvwop<1Z{hK^_ZtyYuk))h=vKEkwY>}G9&U8;z;;4P^jXha@DimcgdM@m%dfs} z;mLRWz~{vGLB!4$xJTr=WB!MP&_QBW%vwRgFd$##=&T<7k?2Dal9|WI{DUx!*iQ*O zgcEl=fSLV6S{L<7Eg395tbK8O7wA2QBR|yw5ZI1>8Lvc6UV`}$br2kzwjB21iwj@j zZ^ZELU`3yz;IbYq>>wOKmKf{XV88P6AZX-wIOy9cKf2lpb_&roAvPQl?4) zEdB1)vJ?Z*CwwH>tl>i_j!3Pj`r2NqH8F^i2p+G%0I1&3Ha$p@{~>(U5#kkmrM|>+ zK7OdPvoolkfm8=iB@U{yaX43FVsa2IaOdeW@A4Ll%`7ggBks4j9hzr-7Oi;2n57Z4 zhD3uv!Bv!3y7f>W$F^liPo>T;3mvFJ6F`VdU`l>~!k5aaFJ4lZw7arsPhMjBkY$W! z9-kN3C+U25AgKhpKzS~;ImPUXZg}k9l6buR?=9xeX>Z7=yHiYbxR}~wZFovjmMXc+ ztw_jMJV37+_(F(603{2KZsGu4i45jTJ3k3YEfAJ*+pAW+V0s{qArf;p3vBqyqwse3Ei3Qze(VzOSpX?iFS&a+FxuQ9tIRwrmS z9y2we)C#dTuMSmS48s}5*a5vcZ@ z^)um%AlhD%dkBJ?h@*jVLU6Sr>=2KWRqfi7F}oZIV1jJ080`&V zI*{v$gYw3iqkVgBBFP@aaFETSu!5RA66q7N<=0ua!t=silRU5=yDJG$fc6g0@S~gCbx@lXtv&|Czku_R?0Y1GrXy~Nq4L$H z;{!@U+Z*z2ip?jByhu(0Vul2}6LO*8&HZCN6kwd zh#a$9TTF7BhV$S4j>!qZX=QidXR@(*sYl9mYXdIGa6RrFc`TD1JDFe+M(p|Si$|j& zv>+Bpte3zZWq@)FM>SL{v;wc+0RPWgs!1MpPr);zNx9VLjLUaT&5+&~NoG4f#xUaX zNT?v-nuE}zNO6+FVoN{)#G-s5-9^_p6xN1pt0&{3F@`w z`w6{m*Xvo^m(E9{>}AUg)r|&UA0liOw86~Qu7%-dNQ5ClPNbL};}~9S+&$x^o-@ao z6180J_ATXmWUNgN=!9eO_$=5$Wcr87VZ1S{$c5m73<1g%NbQUVMwTJ8&s<*~Nh&17 zq|tF7cfKVK38Ktl>`E{C!ZwK}3L}JY+1GV-b{6htEovv01A@q+YMC{?N&8xKZ$RbJ z8uUU{5ZfdPp#u%o->C;evvo*>v#yVj&G7wCZD<&%jS31fBq57qS>X0edRU=j;UXOS zS*$gvD-egNM(81J!_RE^jEZug0wtLQsoGn7*jLhv7LMl)ZGQW%i2qY4F)l#UHN*lr zK@1uo{GbC_=1J#D=L>DQ+`lY4HgMuz@<1nO3wj7;tD@CBRA|@V^6N~jp*kbc- z=XU>?fkxEwTcS~+83FvslM?(H=)j2eI{+ThJb$K3(Q`%YCHx+)H!k=p%aGIL1U{sR z*NAl3?vh2uNLwIT3ha?Tt%tM1^h3pF)V_NENe8|{wj&~ZcRQ-ZJV&3~5t}=Jpe2$u z1-d9HE zv24|-mG4Cx!31nS+yvF>BQSbDB|E()<9vqW?vU z9ni9TV6tZe$V@#!NZ8E7;Q2h)%faFP$aC=VN=tN?x2EUaz`TMw(xc`Pnh#KRYWP;4 z;<)VNj-`_?8zoyFMgXEHRN^dQULHwU_*-Dx%=KZ1CU;8u0>(i+K zor^aggqqnRF*F(It>hzR*YTqd@`)Lh-#=C|z-`1C)jEM(L^{3-WzOxiuxEy#zX|r_ z&XHna9uU+DF^JT<_t6koEZGEvn|xiejs09q+~B2?>6^`6u-g#%0M2^DETyQZDdcSJ z;+xyD32qv~HZTI^Rb5NLN0F@&CV-*EEq5+Pz=%@R=0b3QsZ+*1{ec4l$gOkX?nkc3 z(h^t;Ib!Q<<~<1oO|FAA1Yuhxo{$HBSigN^StKNVOrM|{!?4}mY%_Y0P?UBQOU>G2 ztsRUGgonlsYB{Q}Y6?3@;s;Nf{`URobt~MGuyQ9JALgM}q?+;ydmv>UL6{qzk>4JC zrBbbPm&I}8d*tAw6yZ#~Q2Z#P8M-?`gSF6YFG>%fm-=Jg=&91OQ^4Xbvn0?_&4|n8 zr^ZC)M2n`sy<#pN;^5~rSLhJ$LAlY72|Bo0`|_J$7IopIMG}*ao?aBYp^79R;kal= zMQCK4GYSRrRtnS@E6ex5K1qZ%@P$U9Z06!nChi#`WyK7~QV6EHxZU`RKtZe|Of1P4 zL+i4}1Y_awb&c2SC@?)gMnuNr%(kN?kOu`RumRnSKlG<1l*jR8Kd{q(e4caC+II9o zn}mj$(|PsrPP<8{IIITZ#J$fvA5cPt_%-F2#UXh5B1%W7q8*4QwS1Wy8fnSBp1$Mj zuA{&=EMxy`6of|9GC7~{4+2&+c5}v|;PXYE4$lE-KE&pPoW99~9sG;TXzz=3zRFfQ)#>+$kqKHTfBDajj*T~NVyMKQ{`sYPQGn6MMRM`? zbz$RtG2+SPrW$+K zr!|?hdRLa(EMpx{cs5>Rh>DD8so^58dCo~*`9*!uC}6DRMvB+0OFp2)nOFm4gB9X4Z{*Wje3l`aR5}+Ji1g3$zr^9SxXK98Mq@c;9 zH#REUFVwtW*{43ZGxF=MOV$a=H0>O4Ffw6!9f!XP?KM%g?1G)!?;~xQ+4BpBM^fV9 zUpNySx;$RL^2To8>}4#Rlj_05Otb+Uv5O0 zqJ?7xrOj98Fe2(0%9_q`FYMt}wIE_M^b!rA93_!Rbze2-8ce**J}aS)&9p;dLL_}| zHE0#GCo`n?8a;&{rL`*=MhwkwArOb=Y2=tf-!J7JhcMXglAKhOW-Br#PBY5ERAvd= z%XLX1>V{h|6<-7fo;U4K?d}5lyr2 zUmQ*oxDkpFp*6A&=Myt$l4Fo|Qf8&jcC(I=qH1F^BqAK-)g@q|1DHUSGGdq}v0tn- zO2R^&kIJ7K`QDa_go;P!tbC?%{`sL84D*~yCl(U^)kd4+!K~XUIg@1H>6^}I33$g8 zMA-fPRD>I{>nxytH!dAY2bE2$dQ2M?gC2;;sZ6KFWoKgH0CO2~-LC6PeCPFXAd`QQ zOss?I85L3hASfv7m%5o6k$#!!(F249qe%rOLVVyv?1w|0@=Vpuk1yw+5MH)KpFG$Y zfU3t)X|;N*?&}>B-g8Cg8PamuBq*4;-muF?C%$M=zPvb6@^UfhF>!7Y5(k?aYF0IP zU>E#5X?_opX&*jyco0j$NRfFSodt3Ci8KD7|lOvBJWLWycX~Io@BnF+h zTnodC7ey{bSJR3EFwIA}W6j!|*RK=2-4NsNuG;Qx?kT`B08?DiMN8F%-3FLqS73@@ z){im;ikT!StOEKonzb2DLL%tK21}$Jq|i$u-fqO+UOG7Pd>qV(HI_fEmr5n@)~tMs z3=7bFrs=HdE_-wXPJD>sP->C73J?!Wky?<`5RQ?c0H9gKNjOo;RC-i)rMO?jh=F)Y z(}zZ)aIaIIk#xOy-!gE3f5jXhM4pj%cVL3t{mA>O`CA@p)|~a-$E3D6wmu`MFRBkf zjgnRM15}WN@VpVx5`ODqYf~QV;>J*{hUuqhfipTQrQG9@-kw7~UJhLEiEDavcikRd za$Dp1D)5g8YhjGup(jj@pB|Q$k}9`z&ub3InY`&`)79l{e%9X8I>xhkfIuFNKs|}g zMz=`7mXRaSybk7{Zix~Vj&x1d@K~gX z6Z;thyG>R!PX-IF3g3?kOpOlx7cYZHW$WAjk{IOJ87?_{4*=9JG?v#Me99)gCi-kq z3MkuZn{RXHSSp`-frsP$?GFB{Fi?%{GL3AP&zBY0rmMYStrmLN99tx;B#T zLYbYgi$@dx`KdXIS^+=Fp>reVIJyY719)tD)-02U`YlH&#H;WH0=a8^C+59W!xwGq3xn1e;WaeE@bD; z@4g>=t4hFkKQQ^Z|LtG*7?Xhai!Y7BU4)E0-v9IJATJ)1_vinE7ys|#jQ>wQ%WO&` z_B=X~oFJ}&LL_-m&zyFSK0LC4yyvAePqgF^#8%%;DKG2!;$g8FM^Fk;N;PsxsnR2G=&o70 zG68BdHWt9xwOgTF%WVihghoyW=cvZr6J{*gyy&Jq=zWNbq0rvahHU(E!kH7r2v^^= zFcWlD^2xXDN%RObXuRlRIg(LEb^tI|jrnP9HgwPy>{LYD2AwfJgi6y2nIjC^jEeGe zkuu6Jb9d}EL}4-{s3ud{h%EP$tub+1ILL}5x%QfkVEj(PnLwZP);$m9AkcFlo`!X@ z%~dEzpj4qP2$;&-hs_b?i~EQ(xI9L96_cSsLHY>tDaVJIqAX2ViudaR12ZoSf~`W! zK$Br9m9=0_cx>|o;WlQcU40#bWz1j5_LbhmV%-cfW^{G8HmW)7`U%;L+~03ll62lf z#WVDWGTKa(#6N?NBD_i1R7<}3K4|W6K?tmh1fJ!xr#Ysx)Cd7If#D1G7rw#&A({wE z?$Tp12pQl1I9)N3B8~x!Fot;J?KOFO?#4W;XQjm_#?Pz zKp_E~$FAJ*Ai}(WJU}WHay2?f+K7t4_xcCygeTC|;{pOwU#VK;3z&X^za#?*Hk7jH z&lV|X>{9{w5wxhm%l@VaC$9KTlo6jYgNbfO)<{1`wv2?YU*lr?%k0uc`sI*JMaH!=8-D3S>ylZu%k zLQvd}IBIGx@!V``LxV#CKZyJ9&_3egKxvPV5+X_$u|noQPS7IZ%pIGeT6P*xQ4eCo z!%jP@kIFDv=yZqV67Y+0#fVt&4nsN#U2kmWAZ2W%5rrMd27Od9Bs~+7Sm;=fF`J2T zEgzXGYRL3-3iD1mL=aUD6M6=SKrjNsg*D55@Z~{<4r^x@b`hR#494E0(hXPb;JVC> z3>qPsZ5{RN{u9QHA{U5Ym~9u>LX+k%LR9`rwA%5!ZKyZP(k@$S-{F6NqLp~H+r4JR zf|TAlec&;I6>NZh31VL85Tz? z%PWI?C&cdytX;dE8c{)Q1SBg;Ap(z{cdw^ z^y;BTK$s|P@qR2zDfQ2)ho}FF+At&>h}>Q*0hkI?+N&-@GbWBScnZNgtpZ>G>;T>0jih4XwS!gNpfb%21P8qHt#n~lQAuqB@asi838-7=N9zqW45%*Zs% z(`RFiz05AWtvL?!XJ_9#mju0ZG`qZtHd1#2iDXh^E@lx zr`JjT%JpMu98(*v_D2U#gdCZwJbKi@@%yn$Xh4!0iEbM_>sZ{Uj_4$z5)l3T>Iv4=DTv>HxPCb=Nl-k6wAv!1EGEtwDE`TOer2>EZTsW|WzwAV2u?gO;5Stm8P3q}(Dzh)gi-{4g#> zAqa*DB27;-J-J0sT`?AFX||2n!tepThFY}AUmQlbtEB{F4%8dbz|1C=*&}wbo(PCp zW_`W8h~o#Ejn6Fu7fqaQzQmEAW@%hbICpUDL#KQUVtPI-vJ?y!<2B$RYlz63yk*|G zLM~^5DgsOSDa$+bhme)0TEDKde5<%3XyWLrwgW(Yj?lMg@>%pYLV!2Za!J|#eG(!3 z;aJBAXCO*IO2ZpVZF0C=t;91R3Lea0v(Y}1+y}%AMN7%j3f+RH+twx=v zo{E~Bu{DGEUxY$ZuvupC$@`H!24d31&o@h(5g9Caicj5kHHSV=rk3_glk2}opcYW! zLQl{XrO!E6lvT$XQEJ(7%y`@L;qm{zgp$StC~!V%>y(QQh9NDCM{VVQowjYp5Z9Sf z1ONdUtH{jjuU5t(NYoe5?f%%yfm-O}DZh#qC7dz%y-iGil80fwud2#|2ut!b9t)hG zR^aRsljyHz4_#nQNuTPH!pjoQ)Fa2jH27znwa_(nOA5-~v!@k z1K#Odfm>6Se7^!js13S3^lUaxxzN~UPbolW=r#UeL)WYik{%IpV)F>RA>VeaqJnjS z`jTLV#~x3T*v#1^K->^__V&SJ1=*pksC9u3pTd%=Krkg1KcV9x;%D!G+&nzt{}tp(#}8S_x^xW!D+^UO0-p| zYpVY4PnCqomt0~&wCgy_c^T0qz2BzL9LQGA_^3C|0boFoLhKZyYqM5$_a;|k*~0Eh zE?mIfO)F=DrB!avUNG{X@J5NpTT!5311rU-z3Dv`3m60GR3`LcMDy70ktcV&sIX?+ zFO^F;22!Lvb3{7+{2GWHk1O?&x~}Fu3&0W)clNU`Z*r)qSgiYgsFnDUz%a6+UJ}mx_eLh1 zVc)@>OS&^Pg4-NokjGa^{Y+|QJ#Z#nU`!-%j<#G@`+4Ca%Ut@~A5mKt^#<&Av&jq< zpRuiL+H#H$^X9C<~;{T04*75 zhTbTV&lmpN%nCoT&o+ajCqyh zoJD-Rovq|5-Yn?{32=ZMT@m=VPpu^AkWR%qI$<6SfzoQk7f*d$66+#%RX1r1?HT3Mj+xxb*N6Z3 z@C!6P0M{*5JIe`ZR^qcBA=x6RoBTjYA>gszrX<~Q;uzv@ad8Gfb&!@;xVwr(4`7)S z%8^tppi#!Jh4>7tyJ)!i?Nvo`^NHop#cY-}z-u!!OeM$P~cB3@PH$eLeF zC_c3vA1QZ&xF)bxi0FaCNLPj4_yM;nG&A@fPWf=b+1Q9Vuh$Ip;sWS0fI7+;D{XW}&ZY&bACE>tybJpYD6h*7yT_OYp1<0Bu%&Zj`rJ%C1v7g90 zdhA&|s`>fuM=%&Asxu`P*6eW*RLetnzq41{`VxjlLIh*XH@kJctpo+2z6K!F6otNl+w+SRrsaxR%6iLf}QOyL@&~=z%n-IfClWAOTxElv z1BKJ_SKg3F5S^Qd^SunmiQ>~Mpfa9g`0vDeiX&G9hu)rW1AihpM0qKcnVsqj+cNQk z5y}tU2Zr$X8!tf6;y$TQr)rs^*hD2iwL%nAfx)_>XoDABRPtR%i$@ny7#C$d`@wEOt5fC`nEi2#z3YuslRFpww$W4w&tt4U~ep<@BH8w(X!RgR*wdo8+tAMv|-1~ zE?@fOqes!~TMz#nz4}*Gvhh0If^L`9x(DCUI09EwS0y^}=~Hjo`;UF&nguya7H-Vt zU(lD<)w$TBVaQ9lP4V5Fp+`WrJ5sZYDxW^fzbmdVDc~cd__528U^>>gW7Eu5IJ)WG zTgTdOM)j)Qa%m4D#D039Xzd(dV89r9Nm;e^#aHjC!xq!uwtAZAF&=g}PmFKE;r`0z zdmMf^+haOUux_f}I;|_9OExAVxv*#OEn_+?W$))5r#$SZ<+qFN_)PyWj7TzRdu5dO$~Z0ai}dExNB{8E zY05FKNfkY8ZhuWg%$;_(vr|xEG+oR&QzEQq^*@|jcSN#!3`o0r`x%wN5J{aG73X392bM(N2k^}D4P_DguY zaO(3oVL+965s`cpf|Bl}(I}B@dRj$$#`?8NCsz~&Mr)+kju*sedPth-bzf5PMF|Ka--cDVIHi+aa}Chj#T;%i&1 zY*fr|>MP*-AfLA7*eeau$a5H&p+#~UXSQr^ak$vq==eBZHYLn!bYwK`Rs09B0$NxU z>v7Ko6)Ty;|G9|u_-)Y)#DrxcxeyF_QBUvKKQs#-aduOd=0hW@3A~N zzmXAdzm`QiY8Tw4pA}wN-J3-33+%j5ot7(97cCd^?4sT1&k1UG_b~A`#=D1D?jFbJ zKlgP$w$0yZ%a1`vtS? zUY7K$U+dCbcyhh*a9J(>=Lb%5EP;rkLechZnlZ`L# z%NDFQr>B(0bTT(&8tYw%`PfC9nsN>vNTL2!t&Oo4$+tAL3knJrrC^OzM{}j6r8)I~ zq9;{Jn*|`|gzM=G#@kLi-F==SV_0FG=5AxRU+?o)$9?igl&x32lG}f{)~zcqIrS%L zTB`qY_B;&FCA)tXPX6e+4N^J6BO^7B-rc+|7@*_+lhBIER_FhZyEl!B^4g+BNl5IK z7!yShhzGD2R0ISBG%5%vC`co%1`z=P>H8)@qedDnK@=>3fHWc?()ZYbh|)s|MWfPF z6o^347QDHu@SL3Y#vSjz@y57!jLVO6j8;)!?Qie3=9+V^^-W0j z&DMyXNlCWfRqPs^Ewomtq3>IErR98gHalu(@ASlB5-97r4+g`Rq<&F59<(ZK!$_`o zb#hweZ%L>jtB*@J^{!a8N_)EX6o|hI&;C9p{<3_VEo;T;s>UsDbj?`avALP}acipE z%j4QZ+0>^7*3!0R0fvRY95Po4X(+g=jwcbJP`DQ2Vr0K}>Om6B<>Z<0(NpW4q{kwX zv%H2GDief$TqOL@&6hlwC1;u@6)C#6cW!;Ys2zpgZIvX|*y?@o%8^&td``<(Ve_R_ zntoinkM(D%KMxz5n0@i1_G!TsVd?V2s{Kh1Z?s7iIH?x~7fuxKxMPT6AhyO2lw@_W zPgOqP(Cy;+dM`du$^wOx9*5l%4mb1Yc60XWa-lTX8La33AzJ)~u%7lOt#fkvvF7Dk z7v8=TmG(BsEo0UT`jV52X9;eTKusKOb3%oxcP)+WI%+zs36Bf8;Hezz$gP%WN=@vG1d*Q-bCW8Tva%UF3Kc@%zg1_&;MV zGvn~jSV?F7{*SSgxND5mahI)R_gV&~a)X_JN0Piw%Fm}6=WH|8DZlx-7o=%m6C65N*+|>kikc?JO*PQL$EVrGuPAd3SEn4Lq~WpJnoqfo1#p z6P;Y_GV^cDQ_n(AX`H@(t&aG1P~@87RGpuFqKy-@G!Q?KSeyWUehJe?0e z?W`~-z%I(tD=_J;_KS&*{skG*+k{BT66V8&dF3>5+{Z-DZ;38PHgleSdpeDVez{n| zx1z`~UAJ4RqUL|yn$fd$qmo{8@|~$Kd$|iAy^eGDqsuj;6`Vk3qtT#)8Qza+@fi`I$xB&hVmuvd67vRA*(^_Z9b*Iml zUg5I|UHsQ0?-ZXvVne{hvtHN!ynUxnjOvO0orTIWDNHZ5aP_Liwi0 z;Vy9-$3-FiPCC+z;&XV#`m8&lcdSgRdQ4AiHJr9YyxfZ*nI=LuAGxyu!Q>u~MNsPY zn7>ROEeSn6dJ4ZRv`Z}H!;{qFXMKszf8MA3gm8<%5{8|vR`)>PY{IkfNXR*UhU20| z-(BD&G}U&md5VjC01bfeokpbXpt-^135zttO=?eN3|&5TiFkGwzO8mY(X;xNqT!*1 z2fYt*j(m-zddP;xxlaL4n+*dim6E0!CR^4!=1aD>bvHw>k@D1A^GzK z+(_zN-{bTksiV%RA((ZWLScoYROF3{UI%nxihZe%vEpGJ$C{(MMnPt)w+(N{^2 zl=hi(z6ww7Pn-xiw%n#(w(S;Hj#7MDCxbbz={H*+B}DfVI>x%g5EUv{cAdRUW6)Da z`UgLU#^Gdy%vjiFvPPP@O#1;00KhNob8;D9X;^eVKuq;Q{|fo5SNNoVeH(7-(P$fI z+j!6V=OUjI6q3=446BRkhbUcrFK0hYs&zU>rX0Cq&o-o-TPD>XoU2CJ&=yzaa#$-$ zj*-nCl^py$-p@^7xjVj}&L1 zdLBm}KBe_s00a`GM?OEcCsK6(5V$vNX^0gh{n3QziV#(5b{fQk&mmZ5fA%D$7&qL?Hsfa z#5s{G_yJ;ygoX1{lbVHfE?kSdsX3gH^D73sk{@RgZb}iyM@7*ZZLlI56cXoY;{TNw z&YZv#-g2>K{PUW#{UJUk3y*>IT+My|!`<-9*;vG5$WLu!2V1|Xp6lo2KgT(lyS5+< zy)lg7erUk^g)q+jPoDh0z7qHNi~mUwfmeRT9@C{U6j9H?>tWN_W~U<~d^iaaNkTI^ zjdSGupOLWF{c{*a47XG5y4yCTA=N!s{+!I;%ejJCVIi`wd20A@>ule&r540j>lv1b zZu4f)oIN?IyoPtd5m9Y?sJdW?8f#K8@do*WX2Dse5Bi)~%)_IESidk*6;=v-0$ikC$qrJEg zDLM*;wz_(u&WM9DW$WITv~JGt{}8_L&munntl+1nVBs%9ULIDpI{#*G(Cl2$LTBRG z9xl4- z$Oh#kq-b@@Uh%U}(<)V!_xa5&fA}^6orkWI2hwcmf`&|2Mb=Bl(>t=%qaq*qP51f@ z)G_HzEgj=Cf(UM^AwnfxGALKa1b!?iZgN&}pOh9*@N5tdkvl(jRIRR2-!JC{O@iEC zHn*lZQ1aR|(%hT5Vr`4Lt+igym&US^rSg*YNPhA@J&)<5ziioZbm>SsTkpltA2bj| z)?hZ&@A|$r-c`FlX_H=M)-r0CFkzXI)fY84 z6}9NFTNn`fLl?n>W)|V8Zlkf20rJRBV9hF{1$cpcCk{< zTy#!J!8C{94uoFR&_)UJFNXAveWw+(+w5j{Yi zjTI3%do>x5CU$$xR#Z0FexLadc_!H=h#wz+KYU4kjO8n6T(?H(;n-De zY1gqWgtD1|PJcXTbYdi;@=I>zIk;cDc#; z>|yWIprB3wBh_vfO&Y!y8HeH#NL|;5)oIGewGHt&9JheT-1x!-OybCP_YUAB`~xL_ zh0NTN>9(WUT$w3aM18f`cV^u6cHttbjM0su$lDvaBx`!rSv9MB*dIOySKZFP9i&DOI*~wq_^gohB4!T4JbJ&Y7`*&dou; zNZ`KTx-BGav?B`))rpE{vTe^Z9!WJCKIx0Rb$55|NrET2Wl`aSw1--At^2Y^i}mh5 z!W4&eQd*>C+wFb+3M+&vGi>bm`|igbIBm>?C>JZ^0ZE$uDO~5Ne} zPH+1j5ve9W5WA>4eim`3+5TjuA7z>1TF|3d_(lDqfYY&CI>pSN(*7cAWC{ z8^bdS(w`(6G}}1+gwvByyy~=V_FBclzWLXv+M1Q;l5}DWECYoUIXw1~C=-#}`O~Zb z%^MH(cGqtDd5GS9(hMm9oYNka%?eSA5vS;P-&gIgHWukvvw8j(ybg=GR`T_(2YkAg zkAljJL~+~FZM~|K>Rt@5FL!49I<)I2fQCrKRa9Sm%iPuKn{uf{%nDh=u3F!6SBZqB zQ^L3P!9Rf@uw+}ChQqw;A`iC4JLKC>P zw=kMqroyY0!o|R53o>NYgDwec*B9pn0`Vw zKwEfKuUT@NZ$)qOnh@n}73>kVZN=Hn`+33Vgir(`@MYAyxOK}leo>w`_eSqMy_J>G zcWVXiTw~HI)5^`k5)H_hA6%zUg`di`4`-FkIi@{c6G6EjN8cPc?D+aLaLGs%C`uXI z=CjU6bFk!*5Pxi2p1zn=5*Cq4)e0eyCEDDXQ_1zY<@gA-{DecA5^!;*%3Dnv6iH!w zYEoYFy z;GSSTG~o2+CxO2~)&QsUr@z%T3@`ds_O9xdefy5$!l|o%S||DX1OSO>EA>I>h5f2t z$)nm7qZ92vR|U7T;($^f&!E#lvm(9tak7@Rb>OgSMXdwfNHl_gk%jWq-*+9p12S-V zOF*wR^rEdcIvKmC>-Ybwj===ab3Wxo@beHPce0DqV^!D3I#L;D0kPDJExGBmYsGRA z>jtn}=P&Cc9;vI(URN~%lJo4zGd3^0Xt}RoG5s%L*`|FD#9}pcDCxexc@ZKMto_d$ zHpGeF=(Rxv1|=t8b30ya^HwE0?eKg#@rg4TDeZlq85+z+H=lFouI4Dtzw#3_Q>Z>$ zKz}g*oGG^#*iy2*Fty&rC^8~w{D^`%;^U)zy5csmjeT}|xynb`(VpPe)v{_{rao;3 zi}y;FluimetW@+G(5_C7EbJf)i{ zKl=R*tQJ-@|2q*Oc4t$CMw?}3FKpk^7wK;~>SSX9hSccQVuC!{zNL=kB}IhG(BHdO z{C#yCvzC&_K6`Cb`kaa!EBcFzNpF2#cC14IB-zHB8v%ntaR^ZQyQd^G4NfQ2+++pZ zzT3Cuis`=$mLiEw%3Dmgse=?C0iP4AzcodfUEo&yzJRam7g|{FX)TihxyH}5QB&Sw ztZ3H!csSsJd6=-$z~pEDhfVHtdBNxHw6M2`-bwDt#EB#l-LOhn3KPjOZR2u9ully3 zn(R(DfXm~NBhin8^oqvbB-_~xvq+`JZ&r}nMx5?v&TvbS4{N}4p$0!S#ya@$Vb!UT z-`&L3fQ1|iavYd}UbD4V3mS9*)@p&0$zr6~NI-jq{?yhqA$8@?E#yl9nUNFUG4*uy zT6vn=ewN7QK&DeunoQHv(BjjK+DMlCIB>yuB8?QqIczsE?D~Z=m|)Nem0QU8C=CRJ zGTBMYmJo^;t?NK%i^u!M-g_AZO<^{hzdSS^kh6d)IK(toZI?Jb_JjyOZBzhA$K_un zEkJ&zb%-KXyKd`yoWj8cjpOM!(pO$qOJo|ido^fs?~vh%txNiOiW;1(X+uTo_oTH-j7w_G z&CGnK!s3EehYe8;oE<32x7Ykr^?h^Qm*YHs0Unpdti0duQwy#-M`JPu1aUx~`MNt7 zk2KW1;yN9y{T$|n1+k{3rKNp_WO0>nD^6lh5LmiQ%BtaYqzPrdYe< z%_+m_U%_iyLjf4eS-$R+_XiUYtk6fK%P8$~;-=_+hxBo~Ye~|58^QSM;{4f?_LZHsSl8+u3j1XgGe%JC*W}4GXjw5K1Gn1S%uU22yw)|u|VrW?&UA{ z`81*$lwMHMl7Es2V@^}nInyD+3KD>DpleCFZXc57v_Bok>HTG{Tz)j@da!n0xP+d4 z_3GX{kD;k`&OYbj058Mo?#;zD_j;QdVbL=V%OxE=RR7mG~s;w zF&)%P#Bq_WdEV>KD}0UHJ&c0Jd8simU45pJ(BtS4e<6+up0&W@Eh{N*T`y6UFWLOQ zX}!u?QihaN*;2oGl(C9tD_#Np?~v2^ZHSkTAdhh?wW7RvA+X=-TkD7Kh@o)N2c7`x z-YPDqHqjyb&LFB*Zb;Yh@sV7c^0l@e4hhi8NSJ~JN31-t0RXo3k4lm$V1)T%y6sYO z$9U^lj+t#+qJGEwG$cCnKx+>5PKkMcIZl&FvT7MS2et%<=e9n=&aUGg=Mg&;?3spGk7LM=|n~urS+P;2lL680pHt%ni#SZK=o`b7$z%gPE!Z=%0ET8X5`02^!2p+E=S}?8{fKT-smf zRIBS&tU5cs`+FW^VfT4R(>Vt_YWrtJk5h;`W{@BTzgOp)(%F+l=bua{_4k)xD~W8_ z(9qA5xP4~mBEL&w*EQnZ@k(gxZo1xVog*mZEn4DdUXU~V#)mnO*Kfm{@*s6Uof+JF zsF(K*YoeA)9~;c|8COJA;#oEolRRoRn=`DNfpJ^^|R7(loowpJc|@cR>_0EA;q)NzI(8|0Q?WJ5~6qZT4%y< zW7o;^Bj};AFAryb;qm|GrP&VyZkh*ejOub$2jvCLdzDZ2Qa&6Vo;;qVV@%@AN0+RK2b}ojn@B=TKk1%r}^u2he z*t~${dTGsP3KzH0*DNaf{sBF^>&ZDm|AVh21FE2y2uN1>u+>5jiK~Vd$&~MF>bWny zqiY2ZZ|Q-#LtO1|#R}eWHZRr%7J@f-_3mcv(Lo%Vs7PXhM$7u4h^#{xSBLAu5^i9#s_IgXjn?tkYq5o_9ms} za^e*zUD#njSQ~Lb_Sy!cl~+VA0*SNye2D)7(th0oQKOyK40a&kU8Z7JV!5LA3fgE1-0zQtTnr{V#WdqtU)Nxzcyr6`JM#5?gT_y`=-|K}1V)@FYweLjj>+aTy zN_s@WG8Z({5uVYpIHKONio|@73aR( z2$^4`F@Vbu&<7^2hM4LNui@o4UgTY4m663CV?5p3Anf<%Rm<4%*EEx_Ry7&J@wa8h zggPJYeF*OpBH@-2v*E}pe(}JrD!*(MQ0mo5AE=EGMy5z|r ziurFJg&c0u6uxPfg#mD|9HOC!qTLl@8tg*%Z zU6U_wI9;|yQq)q7A-DyG(=tCfhW>WY@f1?%FRokX*{}}i8M{}qK&u~h>LdKIzvnyu zG@o(hd9ACDjP}~n*S&FnHNbEr*L0?)V0W@<^&IODrRiA_SjO0iAYd*SdjQ6GS^Rbu z$>`YGcwwexlTQV~bI5+fFL?b+)_*>jkU{ku`6Ezxo@WcBO#(m2n$ZYvY#uy?hIJ!t(Fb~ljxcdpLMB8Lt{!nje+y|d!mYREc56Wcd7_A#rLcV zVH&!biB!{>cP;ozMZ8BIn%JM3HL1_`iLnW%+4NMYgt4dmd`vh~fsEHynN9k6_T;P^ zd(m6PD0}RwIIfow?Ds|4I?HU##j5X6)kMg`iwHr7{BZ^y}40s zo99e)n${W~=SqKJ6B{{wb8khfPnU(6$*IK$BOP-DsWDYNS(|%Wl@Ed6BNZT=Buqwq zcUfNISlwp7RP1>&gSw??^hl?1+=7hc?+{7AHNYGywtObJMOr&e26yL|LbJks5?~~# z2d}EnY`CYgrL8^v{?n$51n$r`ctBr5z4paD@V;`PPJD;0aT8Q8>`;N&%O*L;!9mbF zKN&}6G2ePF1jrrV4dsWtld}Pp(VrdyT*%=;2d{URO*slXd20Wywf4uw{w%VHM-nc! z_{)iJ4+;(&~jh*o=Z*e!{OU;e@8$Znk<|(#l zCAX!PKQNF`Yq_6M#$=BUITjDw*=7>inpt$huVz7+>wg;21zjf*ggH(_;D#~_`vZ%q z7Q=X2B@8nIwX!z&J)89{G#qDn`m8Jy>nHCzP&O!khpKH+>vAiEygCteUF^CYcUm-> z3}8n3{>BD|D`=Abo?Ej2wmukqPs=)rI?m=ulRV-xEEl1n?g@YK6_RnH#KB?fYv+^m zq8Lsl!ojb;XbNshNq&YyyaUM!xK;9ZE*^rrN5!9tpiEmOl8Pr;7$dWu0_Roi*SRv^ z=lP^-hy{Yd4Ofle6SAN3ZHO@yDuPx2a*`U#`6da)bW;|!2QjxpARwpMY4rP@D7@1| ze0jpASK*cKbT_S$r*d_X_|L5$c*gmuySqY6P5 zp^mRarK5n=A@3bB1=&-g`GS-IDT!=!_%6u_)ErD0y)7Z76F+`Ixk`iwB~#J#ueQrp z-fG^k5!FWdT<2w@gpUVCifrcJO-|pA(4w!Dr*^J^O{?|Sd^nn=hd&-c9i)SFO=y{{ zq~;|@GPsN^WYQCF#tOpjj9f#BLzt1aWi!Ymu$O62e6w6)PY%Os_g6?{-1j&3gw1?P z%bd!~qQt=}y-7`&8t$ffUH{EvkCtL7vz(xkthP&ZIWHw7dSc?<*A9w~L{Tt&TfN#A z#R@i6OnEyposUN<9>U7%dUkC=?Hx7QH|p0%t>5`(=EHVs$>({lF_9-aa*5*Nkap`H z2dcq7<<4iODGqfnmm>I#HFrIS9>6rU1h|0*ojo&YB-vc^?T0VYX9B8_6er^<;jVJ= zQchLod0<+cNn;#?R{`gnF{Wy{_*_l@^!0G!+j_y&fH;Gi)4o+=*Ds}_T{AF1i&yN{ zDP|@dd0=w;A@YoCLA&4VuyWw{PdXG&4X^@S2K!DjeYYhr6M|6xFdH_z-|uu-<2P-d z^TR%HAgH;BU|=MBkw8%ys|?Frw&NZc-r|0ze_Vd%(!je*^<#cY6XV?Hu4f+X>+c{t ziqgq0A9AD`z=0O2OCg1{;Yky)*5Y5DWrG8a=FmQ^Y+1yT?i>xEO)T&Qg>K~)kHqzMGeQx z&LN8F#t_K~F-o(YAG5q6)(?+m2!njN+8d7<-@Zq|*^+5-74%Z&d7F`ZAN_3GN|yro zc07&!@SOYc!oh-hYj2^|BZ?s{-;|nV&6U9H%E65O2YYWvLYu=B9mw z1p>hI=veN(eII2yi@FK=!j^)>sfU&c4hnha<$khY*oZfG|H}8lRqaopKSCMIIyW+_ z6uEO~@bh+9yp3KsMql!&EjeX*5tdFMfo(9HL&V2?Awx>6jZ+m{YOmF&??hiKuy4hh z*N@jr7ZLLq5o=NC2Wl~n25XJA!l9ib(u15|M@r^wCp*CfMHIGS=Azc)?>g=a+Q*zn ztg1EfgeNwqRB@wHw$>j`=$MbZI)B?vcuvdn%jQF#4Q=b)U*()*m%Q-t;Y?FIbAnMN zCX~OA9r;Rodxcl*kpw%xR2A&OO4Pj&QK#d|es3*Z4SE`?0WEu{oFR}Js$Bwuci5f> z?Fwt#O|hJbUdT&KG-$w?9uICpEqKD&kMcvWOHu~(L^#K!VolTf4UQmWGR$ zO<|UheV&*7z(YbmCT622xKah<_wNO1t4e-jq!eD4Opnx!jfsOb2sLNZ)!La8Up=6VSo`>kf$=zm4I(|?yMDk z?fhp5h){5VHmx$q^+YBemXtibzk|6SHcG%ym6cG^-@?A!1fzo)yX%OIfcVsM}H;!il9dx7SNaklV>f>a&3o}OFC7>tqp zILMD90nZ` zId;sl;OsYNewiK$`(}E6lS$INeO(xNUOA~&mdGxSs**@=T#xNpE99BP$e-~|;pQ{2 zkh=3xiJFegzicmNX47+>2VT^d`Ltx2-xz6s0{fZNgN7EhAhY zI2{4>SrAtBX7LFU_2HttVA?Wh*Lc6cHbHDFL{aih#8i*wgVx3R=DH*l>*bnJ_CG(; z>oo>$(6vC>mOc0RB=#5Sv-zmJX4cg&pr6-^g zES2B=VdeYi`t|ZIZekZzZ~UMYr~waw*1;8U5nT}_odmd--|XEN#}c1 z>d&KCut@`)BU;D87Pz13jPCozqfGmPE1@_go;~4O+d<$G>oY#mRK%QCn+Xew@IlMi z%1`uz2ZuTZBkuC@m4;-lROIuURo=F5#Epxy1<36&&Q29}yh4fnW2x-o^mhKGkww<0 z3x-1!c%M{hW)=Koc|!iCpptP%=QztZwchW+Y=D?m>&~3qD}R79FB)w!&C1N=KfWs~ z%kNfJ?KYje70msSzaGkTKltY=^dVW>4Yi*;WTWF$u!grD1ZLIN5xZdpg^o%Qr5&xd zbR>kJn-kjaj#Zs-0U?>w`vO)S1ayvWf!zAQFyDam*GRvEt5@cT15hsxP~gO;0;!d2 z`Xo8|&wGactXLvO=f0?``QNeLCVz>QFP}|q^CIm>Wy{S`y{vlC3T(O^q%8{FPp)}j z)c(@ZrNk*Dywq@X_C|oD#Gwcc{QeQ*uWiRYNj1Y;Q+LJ6`JBMpLT1AGQ45~x$djCV z6B}IO%`zkLn=ejs%-~duM=BgPD63EEIAwsOZZN->yg%E8-B9&#Xy()R!FepmG6SfE zbEcotY%eK1NY-#!3NC}yww>46Y%C|s@0r_p^Yo>nJFDa03(hrjy`rTS9|tz-_a#NG zsGZR=PEoeF%DC6RG2#-tHsNNOs*_#sHKR;EHVeB2LB3a3$#C!>F9NKXj2497;DLg;i*S)J@&Y%mC-1FT{vn55M(#-ouq zWX+8#R(~-a@EHQaTB2L@ed$>?ymUIhJYW|2z9$ERIL7+6vcq=LlH_wFyJg(xv~~En6iYw zHkkh@Bso--H;5Rq6Kp+ARpk+`@qI7oe$R>-U)5GIqBX+lZPhxlt6sM(9lVd?+=U6> zo8Ockn4tRQ{i>t#z15q<-`P@}l5^1wEcJx<=Fi)~-w~?_IuNDhdlm^;ir(ldZlxXQ zlwX!xWCu>SINfRIv0kq_RGpy6AN8wUx7*mB-iaX~q#3q&7dj?76>xf29`aq1 z%tk!+O&29vwCHe=ec@z&@y&c<5peCbZ5%2}BQgSVUD%B4HLhiFPs2eRsMh zo!^Yb9S#%r)k10~CZzXDJ6+;Y^|$ih+b;KQIaKyn<;NYpR=fV0TOJ&B;#JbN(>pB6 zvgeiN^m2NS0}hiuKLtHPbt%m(XG$t1!gVNbIKrvv_72@K%7o1#M?|K*ikegYkeT>( zx_-Dw?@XBpm7QDOX+al26DGi3eu_!6P->ZmR71;r0$zqT!dgxzNa5$rp^I@OWb5feMu_63jJ`K{P6HKOFE<#ROH;7UJc92BJq*Ife^zX) z-B(|=P0{-lC6sc%D`T`_J*;rsD^|aEiRY~yXWK2X2FHZS9)ox4Cx^By%7&o5itkq3 z*C@^Uc>#SQz9z$?G2R>!G*pE;+SN--4)u_`$PBuBbd6@#mDkw@=~<-Fqlw+qa|KQ1 z@n~il4WMW*Sfs|E{R^ zes%i(8~<8hR{6IWCv-F-!O^Ed1(E7q!+DUI~ zKW|fuJ~D{KG+SnE_HTAUl(FNB&Y}&R1pE_@GgaZFSL)^u79(8sTyIy(zHd?y0*L40k-cVoSoP3Z{%x0c3 zr?blH)PuV}aYXlC*A7myntJLm*W&6WA0EOx+X$kIF}v{uI$K)T`8|ABoigsCwg?+z zWGTf@#1Fl^TzVg0^Z){_N8mA`EyzmvLMl}>7pBL!i;#lv^GP=x=NyR&!Z>9)kBCpK z2J;A+1yf?Pe6uelk$894DE1V3iSY7YxfO@`^$fzho!)N-5VjqBEzwa4x3<`KRKeW# zEhbRuLBz!8e~F8?C*fa{i|5jaYD39%fA&ySq&i>nG@*IGF=?NFC-sMx<UMkgr9fO(Gwj=7|zH8z`6mwdROFB>W9EC_0X`%`*@Ue*B=qXya?iajHH zQ>-NTOqoCO5*`?|z9<^M|4N&&_9yjVi8Az!kKewWtKsUH4^qjUe0Qkt$5BGt9W+Bq zTdVvUYtVbp)lDq5YPZ^mw0mEn(C z6`iLW)l93Cz&`OyDWJd(Z;f&?>n)ia*0eQ(t;c7$#ScB7FZV%`yz%RyU-##mQ)iUm zm`DG0^T$pz{f z&6EvJ@x2e|`Yxr5 zzcwGvIYiM3H6hGt;NRGb$rMZFzL}IRSt2i9et!@rhl8XZ$?LQYOAkV4xf@#qnYy~1 z+uetYntk!)b4&{Y*PJcOwv0cyq6many78NG+L zYEyql$S%t9tO@C)BtHlAi2;?PCdIF_Yk3;mA+KOUTMF|*U43Qv^t3b2fsiTP8q&kw zn0$xKE9hFH;KppHCzNN(NZTOx=z~fXD;J3Ie)Cmdsu3EkJ1=VmPHunv_MLWN_*5gwqK8Mmol2P>wA2quWnEcN0 zUebad$Gu!0-;1U#7cEkpzY9THCdwq~UZsWTfD;B0ZFOw>f?9VT-!PyoN5Ztwy_R;w znMN*P-31VKv+#}%jofg?jwJj%cD%Tp(#NNAmO-$!`S_r-$c$s8N7IKt=^W?bT~Z>7 z57*~qyDg}O>NwqE#FPM_*wXp19ugQ_Ir@Zsu)s=Mb$tUt)1_vsobM0k(&%R{Qz)XJ zXVreaztHYaZP9{JGniezl=!X9&7c6Z_OsCzSbkuhXq1zSxF0z8x!`xy8pyITceHMA z_#F+gRARQ+yTkiJ!h{nF-D&tybNuUJ@^AXfV(%9o{?J*aK4)wCmHu-ws(qvZ8YF_) zRw(d3Q{DR0UnR?{mOj5C{}*nTOaDFtmxHPVr$)^*&;cNvUZg?OeH+S~q^{76o1=yZSJF zUsd=BM3?{jp^V;(0 z3i;o;-S~4hT-U%&u~%@}z-{VdQs@68CQ^eI`x*boIjMLLzcZ)Hsb(i4Fe;@Bvjyl< z0l&i;V$kBh8^jgZx;He7h2O8vXbwCcD`X zhMJjajAbA{#&;Gz!b4I{rK#%Jy?8$F91Q_+1@ybYO z-StfSZ4JelR^*fkGAe|<0c?ariSe+F*Ekm^N1JoMO?YFYY$Col1*OvNWvfKqca8{V>Z^*kR;)fOf2azAHzqO}LP(D{QOLf4CIw0ySTxYh+hN*=r5cRC z@+r^3lIg*63SmA;mw6n*;~g+ZsNX^SUYMv_mxa+N5Zt$NQCP6BLOXMs3tVeFIESo{ zLTHIKRBAAV@cwGr9!D&qQg8GRVAP9+@M^2eDOEf&D6UBoqkq5XJL1z-;V0(R)&WVV z!sW#pd?I0D;vG`D6!UW_8N5<9ulD4usv+_Ocq_53ZuBZU+SgU!j6^vQzVFbl8FJ72 zoI~RPbU7qS`!=PTUKez`dVF^ojQu9He2c+%@K1c6l*G^!wYqRK-|k#KSgk+TyRbDQ zQ(o~KDJWK?`<@5pabSNw`%!p&U-cEI$F^>qzD5M@-gFfLMDx#)-hevNxkMTQTnMFr zyGxqp;XOtrS7YfSHaAu-9Iku+5k(9)k>4bteFMNaVj38&i2&B^nK{rvzs~@Tq}G__y28eGx7I8s+2fb=wcb^JE4qX-?<77w?uKh zQO!f+xF9QU#RY>R7IgOzE9*I%5{I4EMI(!1!4 zqx-qSOz4F6?{LCo>&&>g{>D0m98OeA^YFaDjaWI(d8Nz8DqmpvH^Gv;nx^0e;6YQ)w9;D}u z8%=)tY3yC1ey@cls8Xsa?Wt(Y#$fgxVYvb6zKdQL6XYhUNk;;y1Bq-*<|&Egtj^n#ymIQM=U$9jyWCj>} zyBg_3fIle+&kh#M?A0x2AB~D^3FliVv5QqWb4D~B7I{=m9AiE)ug%N0Km%palij34 zhA?~TmF|ZzQb+fBgBMJ>ZU0(5?&gSUM zA+3-Itz2KP2h)H^x)d@#0j8TKz_Ri8Yqp2&v3Y=a0yk|0=!Z1ne{n-dh7lI}o5yi(k(#x4?{IM$``hX)o0MfKh1%4_Nr9B@)yqbw!N7Nd@51vxC#9e5xLA>+U;gHYgo z(=TO7q%tUGae80b0&2~g15qBylblDj$tj&lM@TQ0usVQV5EY;_ zLMd_(!a^$MDXq@?^T7g_`d*}6V)WWkv+zZwAy9i%URy1bg7~3p;=@b5Awj?+jAT>! zcp901od~W zFkwPj+5c@hUk2lCt5O0UfO!GQmdZv>-i) z2vi^$Uo&$}l1RoVy1^NO!ozg-lW?ZY(%ldV*e-w(pEE}sj3DDNbncp-}q2Wou-R4 z>oA4{&^_-`8X8)6aBzp|izbGsC=Bugm69cntyejHO)%s=0@hN|Phh-nfp6V_GKMC{ zK(?{ZxSJx2=_z5zWUZpfv-Fg)44&(_EZF2m*qeMTI8$DZ#cU#ynM)+-D>O(A?iyrV zM`<>i`}otTFo#(U7d_zx)IlL_FG{W#`}3-q zxwnwWged9j$2QpMDRv0uW!d`{G`9O_bH2plg)i|tkrs!1<;X!4O~%X*K}vWZO{ zClDH6M}KriT;^l_fg8fIgjrk$FZ`Iz--zfS$FM;_Rv$svq~JG0$mHwkLF*N@DOgTV zq2u)T7o>|>GA%?gVsnuO{)BN-uxjq8sO|6DFxt`t{~N%}ZGaRm%z6YjO#WMVvF%KH zt8P6hdggJzPEXs1%VwsD=0Z~+w3^I8$9aXvZhVg?w!6IqzjV=%~k~EPZ$x^ z(K-^S3eA*C-Cn$ zX{ZBD9E+-}h=8xLwwjDCBa_W4YVS2Sv|bD>Hvu81DtjJ|AKZPyqkmB$zHJP;^BnZ! zwn!3Z9R_?PfN=BC9(|Yp5MO!dT4Yz{RnqDv!JU_ZKRDsiE!dtb->{l`oTWiWay_pD zNDY190;G3ZJ^GVxIhim3jG2VbLAn@2&m#lk|CnJ4I#ikf*GWvm!QX8s3(`ed?V62S zTMc?1EH1||ujG-YX2QYFT@k{KcQP{Ci=ef7;M)U!*cmvbj~99zwy90iuPo2Ee*J@5 z$K&0ttV6;)m*oCm20gA=VN2^D)Tna#b!Nc#J9cFW8fO!G6?i|anVT*+_zxgCnM`G-a;m6WC~pK!_2%bx_|F1!M)ma*`?z-J`^( z4MYK<2R)DtaN!ge(|Kx=zwQZ~BUS7QLLZkI-bdxR#jEkDsfpYB_3p)#99@7=3Yk(t z+;EWp&7!{L>HGOV4A0o@uSuBIVe#GAsAAcUQh&4>NOh0zFFQ4%@(K-JCt~GcFlpu+1YHv=LFqb_%RzjyGEaAz&^6$A_{z{oXy_KB#S~*DVDLxo` z1C(FKaQXO==4@pK?TwJ|WXuC%0qGW2Xj{FEhj%GAq?7OC69;A)o<1>1J9k{BSTK?u z$XxF&w`VZUp zizxK|XJ#r-=^0(m$wV3th&1zGh4SkS;U^y=jQ{E`(9Nr+H9q!^Nyq<0$UWTM`QrN2W- zDJAISGMrgJz=b(|w`@pg!^pJ`jtFt$#Jo#2sp&cjTyr}f-?m0mR8oRp65?j(9?SBl z*h-|e1tt))@avUJxFgQUb&P$3D2Xm__c1{hb3?ac0v#~s^uu;kQ&6#enzHEY$S@cX|HRsj*&<(u zXGe;Xn}%T|J|>@{oru#EE*XJ;UXGd2erMih ze*)&`HP+aq>OmvqOrZYzs@M2r6>es@y`NQ@CR9{RVDV%-IJW7lVsy&*(Se)~?fU-+ zC%haEh-}+}BEDXO69CQtr7q0RA1QGdpF~uo!yRX$i@yC^ZDk z6lgMJ+BlZ)jbX+!{_6_jXC1H3Y=PXiq!Cmr0j%ai^+c4#I27TH+MpTDzf030Kpl=` zV#ZsNcwbsAxcvRpc>0UQVsg(j(b!D}%+TjB1I8l7phxC>F07*PlI69vhvm!+7e2-o zDw;0yH~0f2bpZBmm7l0Z8$*bFY0W%c-7 z^BUAEyI68ls>-2aq{o1;L_oLnh)~qNX!f&ekRk?2j6Oio6C}Npda(0ur0T%!2m#P! zSfZa4?HbfjTgUK4#C=s;4*j?!!7Tz}Q zIotMq8shu`tR}$5Pe1NC4B?nG8i2A6ynk74^ zE_OiBpzCe2!fPwg4t^3x7)O$P6+~C!Mkh@daDeR1&cK}1-eiW;Bdp1Yw~x3zBYL^Q zQj~L?pJ+*q+%1U@+g0x@?;{r zBFl-`wI!PKnoomxQ@N0d?%qyg;ziwH~#k^Z8xf^Y)bp|HY%cetemslS?6KUR$nh|YJsH`D=DLHh&4F}t zubsaI7*7sfmUDXT&v{%QX%7&7#v#J7rgOM>fT~IE31B% zFW@q!vq;X-X>L{rrUr)nWQ&V0ebmTdpi|;h`Kp4eDx`-2{bruCCnur@7X4rCeR(|9 z`TMqNnwn`FHI+3}n3`m(kiDiPEli80Y?VTE$X?cVDxA`yaL`D0k~nsmib@XI4vvEy zTXxy^=XxKS@Avn|^Vje7{P%cGuNs_lKA-pJz1;V8U)OaHEY|X8Ud|l9xtuxyra1Nx z8K#Uh=s`O|F^LfJih5Xm@v13qws2=Sf0w-G@l zs=If^Xj7ap-y+(VJ_M3BPWUcifow}V=hiSO{O{pXS`zZK4FSiT+6Xn?f=*YPKAjxi z-;w!qxwde*q4x)BW41hMUaal9@)+ur0T>Y!AV0cnJkLXTb=Xj_ACQ8!-Wj#$_ZspJ z1HVq9yS%>c+Sm; z$vB~pt`A@Bo@|qGN(^Q>n-(~8{cz6Jd8e7(7B3Wtq9`lUi06CZSuiFs+2le^6HD$V zp>qMXtr*=E&bxbnNbITncdg*Rk$c~Ii}pVh=f?pR-aPD0U*$TUQ7`aQ)&^@DB5Z2v zG^#=~UgTIv!yhD`NTCVo7Te2{vUJ7RF$h2iz-5IpHaK|As#OOYK7 zLN-KA70UWpLu;Ru*<<=`O_`G(jyKL&4O?zEOL-a~xfM*MwG$@B2v!#GEC1*I0Vcn^ z5>vH1KJMmHy9s*dBK`v3;oLRn2`=LB1r&e(?yPj@^RV8?e3j!st1epjZxp%o7wrEe zK@BwB*{-;m zcMEak?_iHaHJYBqj#;7OR`)y!D0Bx+VI-OasVhWu!Ph5puvu|p^7Lt(m2eH=%ZCc} z7+X=izFG&sps|{>Tf{+H?UL&8H$*F-c(E-ZCnvL~4|gr_^rgd8QC!|cQou9fj3;^m zZ325HH}yT2@?X}=$gt_<6J9t*aT?ma3R~XDVsqo6p^<}Lb0+>Le|f?eSpAhk6;>~mItlQ&jYxB}?gd|$K zID^fh&$v8EIvoJ|R83?n{!FJ665vH+NE)n@ZibX8P?N-{Q%ukCCxyd|#8Qaxl>Km?6sIo9{K#o1&D&kt+BLCyme+BR9+fl9}SSpbwTCY{U*Qm^3 z#87ih4y0rq0TT;wE)iH@c}1YhgDXawa4`$5yA_!V4_s~QY+N#KZrfO-bBSF5JGA*? zw${SKza#WR2BeZ{LfmIi#P=#)6&j8+`SbJ*V4kc0RFqk-67G-5spuN!iDoyy6G zo9Ne^gJooV9MdM=Gv}UtT~U8JS`Zx6(k{!R=IL^5_{(i+*6pg$_z;!xET9%qxT^`& zB!Dun46WCvwW;e&?+V~#v|1w`1Tzw)R^p1?js-^8xA-R1GMx!c3y9h_c?xzfY@6Pt zlfc_zo<&jb!)6BPIa^j69N!EOeU_n<~J^WE3573Vt zagQjWf*nUZEs&)UWjf5U`I*GC5?1$OG0ly^1P%o(WLHlpIA&e8*j(*RCv}t5_P$$G z|4@v=I9|RH16^GEC~@9t{LsY1ERW^PaF9p0oY`%9yk*>vNS6F+Nj?%lxU!(F-UTDA zdZt58kT|aU-7U?az->Ls#C8tT0zn`ejw=f5q7X!wnd0Fm&!7~+&&~v`t{t^!VgrU$ zhihwRY=6wod*~CFxQ;k92%?X!VWlr!{}5tUYg^Uu2TrTRzkq_wPGXvj<1&!lo}X{^ z;DF^};*Gg%liO}=8U*q7|I7I|1BA_>Rl)K~7o&{!HTr1Gbdy*OG_UpzVE|Y31>K&H%M>^4--X4Ie!T)ASvlL z>c?KZ?`Coh#DL?{BJ~Q^LsydBw zxjqz6CS&0M{L+kZ$Yna6H&3{rzG6;uKv$x%ved#d%@C<6eXF0qE=_hW%ncGi_!S{; zO6bYwZ2e1?Ywu4YUH7-YniCA3(BxqXN@R=(NEOz%{YG?s++-W<`CO^O-KjHey;f-@&SH0w;t1-0gesC7vSs!qlv*T#5J4|Ar7Sks)_P5{;!0 z(SX97?(|g+>K|lQKvf7A{M7TfS7-X&2?>-83u@9DRKYkP$$nGn{i6{9LYx!E3tp05 zHC6jH4O)zn=%~javI25bE4n=o{zmpyNqWc`3ICaePu%<}P)WL|ekR;yUGs9{)QO)z zsu4OB5{O&sX0SHnctGlC?rvJioPkTOWj&2v$+xjnB@h>-3rj@9O)6MbCU!Md{PUw` zYbQ4IG6xi^Ly1WQCTAdSoph_P!Kc=Pby;Xl+!RUsDhzjoHfSFtT8FogTg8wt77&;t zd<_eLvtr^_SWX3FmJP-w2u{Q=VFrFDvd$;%Rs1LVD-BR*mXYaKp3iggH;3sEvO%H2 zLVUk0=f{>{#)1z!N7;?g**yexSuEy4L*lxmn3~|St?TZ+Yg*imGpm}}@{0HYfVpZM zmb4!52qf+qZwg5YMGT8`<*lAR-MoMB9Oj_#(l=OwMi!e+h> z+JR?doZfdfOjXY~q0sa{^JY9B(eQ1b(a@4N0)t7=e<~E*w`mx&r|xwfehxXfuk178 zcEoHkD%<&!HyjC_#Zb+H|BVmCa=s-RK_}EU+&)nAR*B8ussFum4`6$5OrEpxe~gkI z1@OW@QSxZ5i$JFd16oUF)FPhDf1Bi@bI35WT+yE}=?y>oQzEBgiAZykd%|1)0``{D;`=WhGE-resn5t~=wfxrha3$ci zpU-#fzdp=@s5xL2#a+k5+ZkrDT@PQUVCrD+Co(23Wd<Y?hY#uIcx;#S|xC-t%06Ln!CeU_`V_x0DhTpTYzb4m9-Ldjvt8eMw>8p845ctYDs zu84g;e3Td$(3UF$$9|AwbB*`?e*e;nU#-aI!0WySls24mj*8D56P#F&gs^h()xL19 z7sVjyN+j{JN-F?5u-N!#20)c#@E6V=ajg=Sz)t62>`CttwqTU}h1J5lbc=|0HsLL3 zk(xarWKNMpD*p>HdPCf0MH(MY7a=yuYE0Fxgq;-$D`%-oq|IaDa*@&=nzR)ds!res zAyW{YfHRX{I$%&=3dT0d=ZC>m z^AosqG>U1<1qWXx<-C4Dn4V{RpFJeKlhBv}%D?P-^U)U<(0`~`1??F)N)`$hh7371 zqG+|TzLGW+STbESI*yW{a<(aU-K~48L)9G8*dF?{nBSX;Q0uaqeDqb&DK&_+Xx2B7 z;?06zdx0~G3;{x3=ix&C90BY8cJ9i{+0rYnIZ7YB7k0_W1&M5SeSzHe?v4kc$m&hD zo{2~0LTsclRdi1BiIP%&=g?d(%N3B%O-j*g8`{w$@)fpQPWemiIT#!Xfj*Md%<-(5 z4(F+ja$$sjQ3e{VuYU>hmpN5A##CwOmI--EI}72iK{|n9DPrMmmqKHMJy9cHYKv#{Kb`X1`wVgnA9oLgf2OdVw3-}mKd@BN^Nl2rm?4MDkZ2(U!Hkc+vTXqTuD)<7hF*C~s^FXX&; z)@t50A+gt3IlG7+!=>h1`dI9+qP!CD3M9ZW@{t?Yml9Ll9KCJiZC>Zw5;GR#17VXH zh{eSf=QGes$x*ZJnT=lvsce3?9Dqm*?&~Dg#Cb_T7Mz&e-QR^+iSkU|?rg9DDpot% zC9N`Tj+&L|`AO_8IX!R8Cw{Nqe&Z%=tOjt%y`je;wuL|T~2eud4~3fH29OTr@L#lYU&#-8I9k@ z-*-wK=fE6H7(G1EYOVB(2Wc<%`BnYzGe#o(=i>ixMSUCYoSU@>lM5)GhjSuXB#rjX zF1sv{qC(ru;?vDSRE$%-=i%j)1Y&IoN#rJE0$dX?v>FI`L45Xklun}f4bMuyy8}le z3~5)Mb|TS*6Sag^!J@<0u3bY(S}VZHdZsBE_}l5p;&w`Qd>ja}iOEUeTKDvMaut?l zv8CWNKud(0P4omzxsk}bT;x86oo%DKrRVS=C2N$b>}BEdhdp(|eUP{>6QBpgKXEN= z`?cSiv`xc^p)wC&X{gsJZyZ?Qi#VsNMIt@ql~1ERGXp!Uj^dw}4-ND-DKAULL9HX8 zWZBRj1N#ki9S;l;%8yRTdZ|k4t3-6KS$YB#dlq|`gzcnbDCvOm#zT1|kLW{Z<51{? z7~U3S{K5lA50w&C)KJhefOw>A1QG@UjzRZA8fgQ=>%0aiJcOIMYTR`r^P6H}7I8!Y zc!8pj$&7=sTRFcG`K4M|)gn$MwIkF3IlZq*&U;=2bR#X|enEQG;mU^c`|lG2isVlp znlwGDVq9&*Wa`^92@{PlE{Pt@iPVDu%4~w+fR;ax6K0uq7!@_v!iE>{9o&+7@MjWy zTsHakosmkr2joY#z|y5&FUk7ppf|BW3~L-ZD-1T`|I{*3+|h-D_h*y+RUZ%1UzZN` zO6qreRHx3?Nd_}}DTel$D)ZWB&G)_@DW=#GwIPnh?E0$IdjEnkq)zqu6N}Kvb4;W3 z9G(tJLjgqINf;RH+7dvJ#5ae?$s6+ee?&(C8nFi|Qv)zX%t#1)0M-Yxw80PK;l`(s zF`>D0l&P}OqS!f0no3wIcMK#KP*CaqO^d)R6J5!~9up;OQ7tm^po6K-{IgukYNYtr zlP{WxJ>-vxK(kOqw)Q4mt1^!5RurI#EsVC8qaHlRNFxC&u#;+qS6O3bf=;b9bLra( zD=V9-w?ENgR-A4#qir+i`FY7WN878}K+tivP3x$5C(%KHwhE<5vG~jyJ5>erc4@B| zh3>r6Bik!y*SBAIcz*pyYtJs|r>+H?{y;;EN6=YGTtO)6MRd|q2NM@zjcQ^iBg!3N zTBda-=RUpLBZ!`as)dr>w-v51kd}S)0U|pBA_tzO$D|A}*HZ5c1U|>+k|`AKvX`Y3 zXaW8wF%kq~A?A7fO$%4Fg$c1!bJl)!o`_?nze*ie2%4(^mjjs=RgIt9^I}y9e`tay^8y zI~8-%*U1#f4*}l-D>J42`;T37xSj+lh}Jl?c7}ARdEZsJJn2Hq+QZA?JM@DqRek(I zAPKJpBh>D%^lJKCQ+*#X^^Sc2ph%U}M53-CX_rO)f!TD^WOpKvAi^LemsMQ6Haj#B z-I|Gdc)Y!FD6brUyfT=f zs*%Jgx=jL`NF9OZcT6bMhoerE{Kf-a`kY=)J|Gsa#>(#Lq(L59FVKFjrddzznCjQ@ zs)Ck;+dgl**dAiM#PIGMW~5#T8JVDZji;cNGjUe2j1O~&`?XYUfl~Vx%oVZ1p!@8f zB0@w}#reNz14&%6Hn*#4y7o3&7m->sV({~6k30n*3XD5-i|Ba(y<~S<)(-z!2ZU2K zV>64AQ-(I|A_x$`ILe?2TKuJ=W*$PMosO%OQjM1k6i@Y%#^VIS0TYp3wStX}5GOb> zrOBd6U_c<~zLX`$buSzFeEfdrIH~lJ)X#1bhri7(3)YaNF>-(Q*YHfF(+Cf`YN$6<=-60)_ zCn6xW|EZt15v>V4I~?M^LfJv`A+D#a9x+74e(TrG%A%?prX$8~hPKowYa|Q1IPb7x z=O17ZN z^;JuQb_Re2@Mnq^JN>|Gao@uSH9VgcudlK@v$}U(bWfv5*M%8_5<8}Y^QoE}DJ!x~ zyz&QB+QvLXdwXO;2Gkl#h?1uLQKnPr6T@XYdbUNBbPQ!Uhdohe78cVbeG9rw|8`}> z?~7XWHq;`F8fbIfm5A=S^vr=fzPY&%evXWHPtkKR_(#;Fy|U2~^5M?I~A zLKR(>L?6qn^Nfs9i;147TxEB(((f~VH9e-I!2Rx{4;5>3G{Y(uan`E4ZBGo{u6A=d zzt9pJx2T7GSFTB~7PfukrB-I;YjiTliN%fMS6Q?JUz??qwn<( z6za8wB^w;7DLCI19p@+R;t|1K{bYrE?*#8>q3x|5UmKEaw`6n*CZC+n_PH1(e8J5= z-%UyNH_z$nj!C0Mb3ODO5c%V`vUtXyaowMg&n?M07T-!vUc?Y6ycVp5+{*->#o zLh9D^)Oe`#Lc26s!6mIFcUG_1;`em-kA>}rMLAg`QvN_Q;ZLMD^C_nY`WMpF^yV&jQ^1RcQyY^LK1SdNx9!>0OJ*J)U zJY2&@>O6(tsP$R-f}e-qPd0Bt^R?;eN8u9=O}3SNPF$A0}}nk+Nj{#jul!Shb)%FrE8 z6;Y3qYp-#gnV6B9X_F1hjjha}x;MW`=$O6XeX%w_zdVuqrz@G$|0%TX^h|!>>CR!=y$=BcQ*>CwJ*F}@nD@q&<2`ClhAwZDIX4pY z3%!Q7Ei9BuNPpH?olJjI-90mq746khd3B)1ta#U#xTGAt3q1$*#?#`v-5O?2Wii*O zj+^h=Vfd*fOyJmscmuwMts%zly;Br5H~pewhghB1#!K33m(JdvmC} zrUmEQ`raRoyqh0?YgIwPO~2H`Sz}BKVaL`#BkN-GkL(-jS*@=lAVU5uv6*l^vs~Ce zmOfHZH)%RU^GY-Fn;M_;=pP%e2$#QBfKWg zd78Y%-6xbeHEqLt_q<)C-go7yL(~$Evhr{ZABJK;?RTtOW82=`1+o`Q&*o+$8|W>g zTw~n4sj%U1hf{}2LVK_4)R+}6IT6uXkY0*4^Y-f4!0AiHv7`NF>V7c~??-4JKaNSW z;eHGiFFM_RH-BN0o83%)3SWW)X3HA4P!BcpgGpNqoLEPS!p>^qfs1^cxzw_|=)_b` zW9=G>@tqF|7bRQY-lErfP!e_R4YlRvF1^8p>^!W{kS4QX177WmL0aRX15M}J2pd61 zXN?2Z$9hf1F7!5vnEHQ?*qf%*U|;g?*?S=+p^}`w(~~VpUXq!;W{k%=rmKsr^)%9C zgKa;!p3~4cvvo+ruzYWJ%IV~Usx*p!Wqzk&$CUG^d;0XlZB~M;!@bM*Wu5jl&I*%y zoX7Ov{;N^oI)l%#{w|BUF;JysMUaPeujBr0EDC?SFn)GN4&of6^Yw-u^J~j=B~P^# z(^m2Fjz}8v8g`@=et7>oBhET~KPL*#Y*j ze9{_K0$2l@6U9Y;jNN! zS?=x1POV+76H$vom}_=q1Z~*xoDo7>5#cbe8H2^iJu9IkSKx7=$JfV4&YD@+)d-wNK0XHN?V)58 z?s+JS730M&Qn}Jq@x~2SBA*kF-S*gpEOkfT)+gfzCMlZ}Y0hTHigO~5ny&eg=kl|! zX$jVbJ%Nv{b6nHbP4+05vB$#-mbi_yEqLwdx)Yn~@6YwLdydhPa))a#g#}}&aNbQV zim>VQ=U&}i$;yqZ2W&$H!-8exz2dQo;tiZ_>vH=N-^-g1xVblDQJsFbpg}FEq%0zS zi|1h9wSH-O{XGoBdPjy%m5NYHiv?ZNV$a*s_16a69#v7;hkxOL^fZwz|9VWZn=KLB z_USgpXYD7`p^)PVo_Y4M<{pavA~V+Ks|^eXEp$~a9_8qgV|(S3gC1Lq9Ch|=_e#zh z53_jJxGPYD`ts$GKs@-iw{F@rC8yX5jaQLYJ(6T+B|AXDtIo{k(2c=CnS<)1%=*4m zT(wz$p7fT?-j)os$(%y7 z*Ww~~bUd3l8m9NHsmjiuqOZQ_-}k1ozbW^c-Pqk-W52m#XZl>)w>QpAvXh-*?XqW2 zz7g%b)$IlwR!!`4Uj5~Fs8Ng7__9n6b^C=WI_}u&y}WJ2T$t?jOd8{8R@g1|+{q}i zhr82udoN{B*?Pv(Gk>g-?osE(?*ggex_7OwaxST{CwB$-K9LdM zu)&$aGU_-2Axegqe#zS>(=66KHvwk)+H(AtA}})P#|q^ymoRI(o}6pB#OQ&$C(ngb zooNzEq8m0x8LcAwPIs%R%kk2hhwCkdtNSN&ABk!j+10m2WoKLXu9Mrkmnu;6lo{zd zayxFLpL)c}v>fa4kxs*3DwYXvO)pl^#w=xJo8m!8#l+p@?Ow5~g>>6wOPI9^H#WVeK9N#OZ@WTJHusHx~Lxc%L&~ zVl+5=hgA|v@R1_XD5kP7_w zr^QO@3a8Fj#2X3Y!`$2QgADAM3j2+ZgzV_oBj4raMKIzN+(!WY^b5zyYZ9C$!c(xG z>N5I<$@(VeeXLCg|JN(4#S_j|c4&&S9{U{&J9eyi+&%^x2fXldg1hAt-C!P`zuvkX zFn;}nPu1!SIn*{Z4c~Clz_Saed>LuuhJ_=@TTF4v`G6PkFd`AWO-y2oxV>*rDL-#= z(-m9ISe?z-MMtAL3^`|xmS0Lbg$bN|=IcuzpU2znjEq#zxyO9(10l8l)=x@DbKKrh z*LmWY!^_e+4bzzGb1XFa?4$KDhY3Ypz-ofO$_-xTp^bf zU5BGU7JKDDS%EXokm%T4xjgAMms}_MBUy5ZxS>C9{j4M!G!ps#1`Q))aNvj_&j&0 zo4W&IvyX@!uOdTIhcl5+rTyh{dY~$fh-xhIxu-onI=9j6pL#!gQLkC`4jmOSMF zPVwKKy)I5qT>!z`D}+?NZU<+h+bcdv>hUA)jJO^{Gm*ayXIpl7QX#3gBE_ zs&q%q^7xaJT)-F#xL%Bjl$ln+p%Hxg*;0C+@AB5`pxb;IcaCp z_d@vPxBqeoZq0EFd3aW8elPut`G2qI?-QD>BJ%Lu-SM44`v2dMJI4P{$8ccgjJxt$ z@ue!I_$+Zp4FktBryS2Jnc1JkUp!l7wr-V_k&~3&c1%`5Nmf>AtD=OAjFOB@T;xHr hWB%s_6x%cB%rE`lUr;+bm__bJOGA54;-4q4{vTN3oE`uG literal 0 HcmV?d00001 From ff53fef73f8513a7930e7329c45f00bba1bce607 Mon Sep 17 00:00:00 2001 From: CastermaneRobin <55954496+CastermaneRobin@users.noreply.github.com> Date: Thu, 19 May 2022 11:24:35 +0200 Subject: [PATCH 061/241] Update Comparatif entre SIP et h323.md --- .../Comparatif entre SIP et h323.md" | 117 +++++++++++------- 1 file changed, 71 insertions(+), 46 deletions(-) diff --git "a/R\303\251seaux/Comparatif entre SIP et h323.md" "b/R\303\251seaux/Comparatif entre SIP et h323.md" index 6053f43..152a31c 100644 --- "a/R\303\251seaux/Comparatif entre SIP et h323.md" +++ "b/R\303\251seaux/Comparatif entre SIP et h323.md" @@ -2,11 +2,11 @@ # Comparatif entre SIP et h323 ## 1. Introduction -### 1.1 Qu’est-ce que le protocole SIP : +### 1.1 Qu’est-ce que le protocole SIP [^1] [^2] : -       La « Session Initiation Protocol » (SIP) est un protocole TCP/IP de couche application normalisée et standardisé par l’IETF*. Il s’agit d’un protocole de communication standard couramment utilisé dans les télécommunications multimédias, mais est le plus fréquent dans la téléphonie par internet (la VoIP*). +       La « Session Initiation Protocol » (SIP) est un protocole TCP/IP de le couche applicative normalisée et standardisé par l’IETF*. Il s’agit d’un protocole de communication standard couramment utilisé dans les télécommunications multimédias. Ce dernier est le plus répandu dans la téléphonie par internet (la VoIP*). -       Le protocole SIP permet d’établir une « sessions » entre deux ou plus de participants, de modifier cette session et finalement de mettre fin à cette session. +       Le protocole SIP permet d’établir une « session » entre deux ou plus de participants, de modifier cette session et finalement de mettre fin à cette session.       Par défaut, ce protocole est supporté sur le port 5060 par TCP ou UDP et pour sa version sécurisé, SIP-TLS, sur le port 5061 par défaut. Il fonctionne aussi bien avec l’IPv4 qu’avec l’IPv6. @@ -19,9 +19,9 @@ * Établissement d’une session * Gestion d’une session -### 1.2 Qu’est-ce que le protocole H.323 : +### 1.2 Qu’est-ce que le protocole H.323 [^4] [^5] [^7]: -       Comme le SIP, le H.323 est un protocole conçu pour initier, gérer et terminer des sessions médias. +       Comme le SIP, le H.323 est un protocole conçu pour initier, gérer et terminer des sessions médias. Cependant celui-ci est standarisé par L'IEEE*.       Existant depuis 1996, Il est considéré comme assez ancien. C’est un protocole binaire et se fait remplacer par le SIP. @@ -33,7 +33,34 @@ * La négociation de codec * Le transport de l’information -## 2. Comparaison entre ces deux protocoles + +### 1.3 Schéma illustrant une communication VoIP (session + multimédia) + +SIP [^1] + +![SIP](https://github.com/CastermaneRobin/Wiki-TI/blob/Comparatif-Sip-H323/R%C3%A9seaux/SchemaSIP.png) + + +H.323 [^8] + +![H.323](https://github.com/CastermaneRobin/Wiki-TI/blob/Comparatif-Sip-H323/R%C3%A9seaux/SchemaH323.png) + +Documentation du schéma car ce dernier est plus complexe qu'une communication SIP : + +* ARQ = Adminssion Request, demande l'autorisation de participer à un appel +* ACF = Admission Confirm, réponse positive pour cette appel +* ARJ = Admission Reject, réponse rejeter +* H.225 = Pour le contrôle, la signalisation et la gestion d'un appel +* H.245 = Défini pour les canaux des média par H.323 +* TCS = Terminal capability set, codecs envoyé au terminal +* ACK = Accusé de réception +* OCL = Open logical channel, ouverture d'un chemin de communication +* CLC = Close logical channel, fermeture d'un chemin de communication +* ESC = End session command, commande pour mettre fin à la session +* DRQ = Disengage Request, mettre fin à l'appel +* DCF = Disengage Confirm, réponse pour mettre fin à l'appel + +## 2. Comparaison entre ces deux protocoles [^1] [^2] [^3] [^4] [^5] ### 2.1 Codage des messages :       Les messages H323 sont encodés dans un format binaire compact. Les messages sont efficacement codés et décodés par des machines (codec). Alors que ceux du protocole SIP, sont plus faciles à lire par l’homme, ils sont encodés au format ASCII. L’avantage du SIP est qu’il ressemble aux protocoles http/SMTP et est beaucoup plus simple que le H323. Cela rend le H323 moins convivial pour les techniciens dans un environnement de dépannage. @@ -44,40 +71,32 @@ ### 2.2 En terme de temps : -       Ces deux protocoles de communication, SIP et H323, ont été introduits à peu près au même moment. L’internet Engineering Task Force (IETF) a développé le protocole SIP basé sur le H323. Comparé au H323, SIP est plus simple, plus évolutif et plus étroitement lié aux applications Internet existantes. +       Le protocole H323 a été introduit quelques années avant le SIP. L’internet Engineering Task Force (IETF) a développé le protocole SIP basé sur le H323. Comparé au H323, SIP est plus simple, plus évolutif et plus étroitement lié aux applications Internet existantes. ### 2.3 Utilisation : -       SIP et H323 sont des protocoles de communications utilisés pour les appels multimédia et la téléconférence sur des réseaux basés sur le protocole Internet. +       SIP et H323 sont des protocoles de communication utilisés pour les appels multimédia et la téléconférence sur des réseaux basés sur le protocole Internet.       D’autres communications multimédias sont prises en charge par SIP telles que la messagerie instantanée, les jeux en ligne et même le partage de fichiers. -       Cependant, H323 se concentre uniquement sur la conférence multimédia. +       Cependant, H323 se concentre uniquement sur la conférence multimédia, c'est à dire la possibilité d'interagir à distance à travers une variété de canaux de communication. Par exemple : audio, vidéo et partage à distance d'écrans ### 2.4 Utilisation technique : | Comparatif | SIP | H323 | | :--- | :--- | :--- | -| Nombre d'échange pour établir la connexion | 1,5 aller-retour | 6 à 7 aller-retour | +| Nombre d'échange pour établir la connexion | 1,5 aller-retour (voir schéma ci-dessus)| 6 à 7 aller-retour (voir schéma ci-dessus)| | Maintenance du code protocolaire | Simple par sa nature textuelle à l'exemple de Http | Complexe et nécessitant un compilateur | | Evolution du protocole | Protocole ouvert à des nouvelles fonctions | Ajout d'extensions propriétaires sans concertation entre vendeurs | -| Fonction de conférence | Distribuée | Centralisée par l'unité MC | -| Fonction de téléservices | Oui, par défaut | H.323 V2 + H.450 | | Détection d'un appel en boucle | Oui | Inexistante sur la version 1, un appel routé sur l'appelant provoque une infinité de requêtes | | Signalisation multicast | Oui, par défaut | Non | - ### 2.5 Fiabilité : -       H323 est plus fiable que SIP en raison de sa capacité à gérer les défaillances des connexions et des périphériques réseau, tandis que SIP manque de mécanismes de détection et de récupération des défaillances. - -       H323 défini un certain nombre de fonctionnalités pour gérer la défaillance des entités de réseau intermédiaire. SIP ne définit pas de procédures en cas de panne d’équipement. -       Le fait que H323 ait une portée limitée le rend moins complexe que SIP.       H323 présente d’autres avantages tels que la fiabilité, la traversée NAT, l’adressage flexible et l’équilibrage de charge sur SIP. - ## 3. Conclusion       Bien que le protocole H.323 et le protocole SIP proposent deux ensembles de structures de systèmes téléphonies IP, ils poursuivent les mêmes objectifs. @@ -88,50 +107,56 @@       La flexibilité et la simplicité du protocole SIP lui a permis de remplacer quasiment la totalité du protocole H.323 dans le monde de la VoIP. - -### Définition en large permettant de comprendre certains concepts : - +### Définition en large permettant de comprendre certains concepts : [^6] [^7] | Sujet | Définition | | :--- | :--- | | *VoIP | « Voice Over Internet Protocol », permet la transmission de la voix par internet. | | *IETF | Ils produisent la plupart des nouveaux standards d’Internet. | +| *IEEE | Institut des ingénieurs électriciens et électroniciens | | *RTP | est un protocole de communication informatique permettant le transport de données | | RTCP | il va de pair avec le RTP, il transmet les paquets de contrôle au participant d’un appel. C’est-à-dire de donner un feedback sur la qualité du service fourni par le RTP. | - ## Bibliographie + +* [^1]: [3CX-VoIp-SIP](https://www.3cx.fr/voip-sip/sip/), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) -* [3CX-VoIp-SIP](https://www.3cx.fr/voip-sip/sip/), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) - - Résumé : Définition du protole SIP et de la VoIP. - - Avis sur la ressource : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. - - -* [Wikipédia-SIP](https://fr.wikipedia.org/wiki/Session_Initiation_Protocol), Wikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) - - Résumé : Article résumant les informations éssentiel du protocole SIP. - - Avis sur la ressource : Encyclopédie libre régulièrement mise à jour - + **Résumé** : Définition du protole SIP et de la VoIP. + **Avis sur la ressource** : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. -* [Goffinet François-SIP](https://sip.goffinet.org/sip/architecture/), François Goffinet, 2021, consulté le (8/05/2022) - - Résumé : Explication détaillé de l'architecture SIP - - Avis sur la ressource : Rédigé par un formateur IT, écrivains, professionel avec de l'expérience dans le métiers depuis de nombreuses années [LinkedIn](https://www.linkedin.com/in/fegoffinet/) +* [^2]: [Wikipédia-SIP](https://fr.wikipedia.org/wiki/Session_Initiation_Protocol), Wikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) + **Résumé** : Article résumant les informations éssentiel du protocole SIP. + **Avis sur la ressource** : Encyclopédie libre régulièrement mise à jour. + +* [^3]: [Goffinet François-SIP](https://sip.goffinet.org/sip/architecture/), François Goffinet, 2021, consulté le (8/05/2022) + **Résumé** : Explication détaillé de l'architecture SIP. + **Avis sur la ressource** : Rédigé par un formateur IT, écrivains, professionel avec de l'expérience dans le métiers depuis de nombreuses années [LinkedIn](https://www.linkedin.com/in/fegoffinet/). + +* [^4]: [Wikipédia-H.323](https://fr.wikipedia.org/wiki/H.323#:~:text=323%20regroupe%20un%20ensemble%20de,est%20publi%C3%A9e%20en%20novembre%201996.), WWikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) -* [Wikipédia-H.323](https://fr.wikipedia.org/wiki/H.323#:~:text=323%20regroupe%20un%20ensemble%20de,est%20publi%C3%A9e%20en%20novembre%201996.), WWikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) - - Résumé : Article résumant en large les informations du protocole H.323. - - Avis sur la ressource : Encyclopédie libre régulièrement mise à jour - - + **Résumé** : Article résumant en large les informations du protocole H.323. + **Avis sur la ressource** : Encyclopédie libre régulièrement mise à jour. -* [Techno-Science.net](https://www.techno-science.net/definition/1369.html), Tecnho-Science/Wikipédia, mis en ligne en 2004, consulté le (8/05/2022) - - Résumé : Ce site explique et définit l'utilisation du protocole H.323 dans ses débuts. - - Avis sur la ressource : c'est un site d'information sur l'actualité des sciences et des technologies édité par l'association Techno-Science.net +* [^5]: [Techno-Science.net](https://www.techno-science.net/definition/1369.html), Tecnho-Science/Wikipédia, mis en ligne en 2004, consulté le (8/05/2022) + **Résumé** : Ce site explique et définit l'utilisation du protocole H.323 dans ses débuts. + **Avis sur la ressource** : C'est un site d'information sur l'actualité des sciences et des technologies édité par l'association Techno-Science.net. + +* [^6]: [3CX-RTCP](https://www.3cx.fr/voip-sip/rtcp/#:~:text=Le%20RTCP%20signifie%20Real%20Time,aux%20participants%20d'un%20appel), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) + **Résumé** : Définition du protole RTCP. + **Avis sur la ressource** : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. + +* [^7]: [IEEE-H.323](https://ieeexplore.ieee.org/document/874981), Equipe IEEE, Date de publication en Octobre 2000 (Le H.323 étant assez ancien). -* [3CX-RTCP](https://www.3cx.fr/voip-sip/rtcp/#:~:text=Le%20RTCP%20signifie%20Real%20Time,aux%20participants%20d'un%20appel), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) - - Résumé : Définition du protole RTCP. - - Avis sur la ressource : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. - + **Résumé** : Définition du H.323 par des experts de l'équipe IEEE + **Avis sur la ressource** : L'IEEE est une oganisation à but non lucratif, c'est une très grande organisation professionnelle technique au monde dédiée à l'avancement de la technologie. + +* [^8]: [Oracle-H.323](https://docs.oracle.com/en/industries/communications/session-border-controller/8.4.0/configuration/sip-and-h-323.html#GUID-D0030405-6A1C-4FFB-8A54-4381BE76E0D6), Equipe Oracle. + **Résumé** : Schéma de communication par des experts de l'équipe Oracle. + **Avis sur la ressource** : Oracle a pour but d'aider les gens à découvrir des informations et à partager celles-ci. + + From 60c5e6185c48324da90a92d8ad43208a28baf43a Mon Sep 17 00:00:00 2001 From: Patson Date: Thu, 19 May 2022 14:52:13 +0200 Subject: [PATCH 062/241] Begin RTP and RTCP --- "R\303\251seaux/asterix.md" | 76 +++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 "R\303\251seaux/asterix.md" diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" new file mode 100644 index 0000000..4f5a269 --- /dev/null +++ "b/R\303\251seaux/asterix.md" @@ -0,0 +1,76 @@ +--- +layout: default +title: INTEGRATION DE FLUX VIDEO DANS UNE INFRASTRUCTURE ASTERIX +parent: Réseaux +--- + +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) + +# ASTERIX + +## Qu'est-ce que ASTERIX ? + +Astérix est une implémentation logicielle d'un autocommutateur privé (PBX) qui +est une centrale téléphonique desservant une organisations privée et permettant +le partage des lignes réseaux d'un bureau central entre les téléphones installés +en interne. + +Chaque Appareil connecté au PBX possède un numéro de téléphone d'extension +désigné qui peut ou non être mappé au plan de numérotation du bureau central. + +Astérisk permet donc le l'etablissement et le contrôle de la communication entre +les différents terminaux tels que les postes téléphonique, les appareils ou +services sur voix sur protocole internet (VoIP). + +Il prend en charge plusieurs fonctionnalités disponible dans les systèmes PBX +notament la messagerie vocale, conférence téléphonique, distribution +automatiqued'appel. Ce qui fait l'une des plus grande force d'Asterisk est que +les utilisateurs peuvent créer de nouvelle fonctionnalités en écrivant des +scripts de plan de numérotation dans plusieurs des propres langages d' +extensions d'Asterisk , en ajoutant des modules chargeables personnalisés écrits +en PHP ou C. Mais qu'en est-il de l'intégration des flux video dans une +infrastructure Asterisk ? + +## Flux video + +Encore appelé streaming, c'est un processus d'envoi de contenu en direct. La +plupart des logiciels de voix sur ip telles que facebook, skype discord intègre +des flux multimédia : appel video. En générale le VoIp est utilisé pour décrire +des communications point à point. Pour ce qui est du flux video par +visioconférence on parle de communication multipoint qui est une diffusion d'un +emetteur vers un groupe de récepteur. + +Pour ce faire, les deux protocoles utilisés dans une infrastructure Astérisk +pour permettre ce flux video sont RTP et RTCP + +### Protocole RTP + +Le principe du protocole RTP (Real-Time Transfert Protocol) consiste à envoyer +les paquets en temps réel sur le réseau. Les paquets sont marqués temporellement +de manière à être réordonnancés par le client afin d’afficher la vidéo de +manière cohérente. Il permet de founir un moyen uniforme pour le transport de +données sur IP soumises à des contraintes de temps réel tels que les flux média, +audio et vidéo. + +- Caractéristiques + +RTP étant utilisé en mode unidirectionnel (d'un emetteur à un récepteur), il +peut être aussi utilisé en mode multicast via satellite. + +Le rôle principale de RTP consiste à numéroter les paquets IP afin de +reconstituer les flux voix ou vidéo de manière fluide et ce, même si le réseau +sous jacent change l'ordre des paquets + +- Utilisation en mode multicast + +La mise en œuvre de RTP en mode multicast requiert la configuration préalable de +routage au niveau du récepteur, qui doit faire lui-même la demande de routage à +ses routeurs hôtes, entre l'émetteur et le récepteur. L'émetteur quant à lui +informe séparément les routeurs de diffusion auxquels il est directement +connecté. + +### Protocole RTCP + +C'est un protocole de contrôle des flux RTP, permettant de récupérer des +informations sur les participants d'une session, et sur la qualité de service en +transmettent périodiquement des paquets de contrôles. From 5f3d49ffc60e496d9c8dc0a3f2ef36d8573481da Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 16:10:50 +0200 Subject: [PATCH 063/241] Update asterix.md --- "R\303\251seaux/asterix.md" | 46 ++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index 4f5a269..18c19a6 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -21,6 +21,9 @@ désigné qui peut ou non être mappé au plan de numérotation du bureau centra Astérisk permet donc le l'etablissement et le contrôle de la communication entre les différents terminaux tels que les postes téléphonique, les appareils ou services sur voix sur protocole internet (VoIP). +###### Fig.1 Schéma d'une infrastructure asterisk +![flux d'appel](https://user-images.githubusercontent.com/74672498/169313118-e214baf6-f8d7-40f4-a8c8-4b757a64b2e8.png) +###### "https://docplayer.fr/508846-Le-support-de-la-video-par-asterisk.html" docplayer.fr Il prend en charge plusieurs fonctionnalités disponible dans les systèmes PBX notament la messagerie vocale, conférence téléphonique, distribution @@ -52,14 +55,25 @@ manière cohérente. Il permet de founir un moyen uniforme pour le transport de données sur IP soumises à des contraintes de temps réel tels que les flux média, audio et vidéo. -- Caractéristiques +#### Caractéristiques RTP étant utilisé en mode unidirectionnel (d'un emetteur à un récepteur), il peut être aussi utilisé en mode multicast via satellite. Le rôle principale de RTP consiste à numéroter les paquets IP afin de reconstituer les flux voix ou vidéo de manière fluide et ce, même si le réseau -sous jacent change l'ordre des paquets +sous jacent change l'ordre des paquets. + +Il est utilisé par SIP, H.323, MGCP et éventuellement d'autres protocoles pour transporter les médias entre les points d'extrémité. + +- Utilisation avec un canal de retour + +RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP(Real Time Streaming Protocol destiné aux système de streaming média). Ce canal de retour peut servir à demander des changements de compression ou de débit + +###### Fig.2 Utilisation de RTP en unicast +![rtp_unicast](https://user-images.githubusercontent.com/74672498/169299420-0e91d1bf-7c4f-429f-99c5-da9a9a9e5b5c.png) + +###### "https://www.iifa.fr/video-ip" iifa.fr - Utilisation en mode multicast @@ -67,7 +81,33 @@ La mise en œuvre de RTP en mode multicast requiert la configuration préalable routage au niveau du récepteur, qui doit faire lui-même la demande de routage à ses routeurs hôtes, entre l'émetteur et le récepteur. L'émetteur quant à lui informe séparément les routeurs de diffusion auxquels il est directement -connecté. +connecté. il n'existe qu'un seul flux qui est dupliqué au niveau de chaque recepteur. + +Pour se connecter au multicast, le client doit télécharger un fichier type SDP(Session Description Protocol) qui contient les informations nécessaires pour recevoir le flux multicast, l'adresse IP du serveur, le numéro de port et les informations de description des flux. +###### Fig.3 Utilisation de RTP en multicast +![rtp_multicast](https://user-images.githubusercontent.com/74672498/169301654-924eb1f4-ccb3-4ee8-aed4-38f244f8cc9f.png) + +###### "https://www.iifa.fr/video-ip" iifa.fr + + #### RTP et la NAT + + Les protocoles de signalisation utilisés pour les échanges multimédia dont H.323 SIP, MGCP et bien d'autres sont dit sensible à la NAT. + + Lors d'une signalisation, ces protocoles ne se contentent pas de mentionner leur adresse IP dans l'entête des paquets qu'ils envoient mais indiquent également dans le corps de leurs messages. Par exemple avec le protocole SIP un message d'invitation INVITE comporte des informations sur l'ip de la source du paquet. Le récepteur ne peut répondre correctement à la requête puisque l'ip source initiale est une adresse privée. Le récepteur envoie donc sa réponse vers l'adresse ip source spécifiée qui ne lui est pas accessible, et le paquet de réponse n'arrive jamais. + + ###### Fig.4 Utilisation de la NAT + ![nat_rtp](https://user-images.githubusercontent.com/74672498/169309816-8f15135e-f6b8-4e7b-8c0c-acfcd0bcd053.png) +###### "https://docs.switzernet.com/3/public/110303-asterisk-nat/" docs.switzernet.com + Le protocole NAT posent donc quelques soucis au niveau d'une infrastructure décentralisée notamment lors de l'échange des paquets voix dans le protocole RTP. RTP étant décentralisé, pour résoudre le problème, tous les paquets RTP seront envoyés de l'interlocuteur au serveur avant d'être redirigés vers le bon client. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de résoudre le problème de la NAT + + + +#### Intégration de RTP dans Asterisk + +La configuration du protocole RTP dans une infrastructure Asterisk passe par le fichier rtp.conf qu'Asterisk utilise pour générer et recevoir le traffic RTP. Par défaut rtp.conf utilise la plage de ports RTP comprise entre 10000 à 20000 + +Pour chaque appel SIP bidirectionnel entre 02 terminaux, cinq ports sont généralement utilisés : 5060 pour la signalisation SIP, Un port pour le flux de données un port pour RTCP dans une direction, 2 ports supplémentaires pour le flux de données et RTCP dans la direction opposée. + ### Protocole RTCP From 58bc7abf77a1e5db9c830cb50eab4b23d3bda270 Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 16:44:37 +0200 Subject: [PATCH 064/241] Update asterix.md --- "R\303\251seaux/asterix.md" | 49 ++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index 18c19a6..cfed850 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -108,9 +108,50 @@ La configuration du protocole RTP dans une infrastructure Asterisk passe par le Pour chaque appel SIP bidirectionnel entre 02 terminaux, cinq ports sont généralement utilisés : 5060 pour la signalisation SIP, Un port pour le flux de données un port pour RTCP dans une direction, 2 ports supplémentaires pour le flux de données et RTCP dans la direction opposée. +Exemple -### Protocole RTCP +``` +; +; Configuration RTP +; +[général] +; +; RTP start et RTP end configurent les adresses de début et de fin +; +rtpstart=10000 +rtpend=20000 +``` -C'est un protocole de contrôle des flux RTP, permettant de récupérer des -informations sur les participants d'une session, et sur la qualité de service en -transmettent périodiquement des paquets de contrôles. +Si vous avez un NAT ou un pare-feu entre Asterisk et le serveur, vous devez les configurer pour gérer le transfert des ports configurés. + +### Intégration de la video dans Asterisk + +Asterisk prend en charge une variété de support audio et vidéo et fournit des modules CODEC pour faciliter l'encodage et le décodage des flux audio. Pour l'instant le transcodage vidéo ou le transcodage d'image n'est pas pris en charge. + +#### Pris en charge des vidéos + +Non | Valeur de configuration | Format Module | Distribué avec Astérisk | +:-: | :-:| :-:| :-: | +H.261 | h261 | n/A | OUI| +H.263 | h263 | format_h263 | OUI| +H.263+ | h263p | format_h263 | OUI| +H.264 | h264 | format_h264 | OUI| + +le fichier produit par les pilotes de format vidéo Asterisk n'est pas dans un format vidéo générique. [Gstreamer](https://gstreamer.freedesktop.org/) prend en charge la production de ces fichiers et la conversion de divers fichiers vidéo en fichiers vidéo + audio Asterisk. + +#### Prise en charge du pilote de canal + +Pilote de canal | Module | Remarque +:-: | :-:| :-:| +siroter|chan_sip.so|Le pilote de canal SIP (chan_sip.so) prend en charge la vidéo| +IAX2|chan_iax2.so|Prend en charge les appels vidéo (sur les troncs aussi)| +Local|chan_local.so|Transfère les appels vidéo en tant que canal proxy| +Agent| chan_agent.so| Transfère les appels vidéo en tant que canal proxy | +oss |chan_oss.so| Prend en charge l'affichage/le décodage vidéo, voir video_console.txt| + +Les applications de plans de numérotation qui sont connus pour gérer la vidéo sont : + +- Messagerie vocole - Stockage de la messagerie vocale vidéo +- Enregistrer - Enregistre les fichiers audio et vidéo +- Lecture - Lit une vidéo tout en étant invité à lire l'audio +- Echo - Renvoie l'audio et la vidéo à l'utilisateur From 063bbd9f1902f7a29d789cfd173ee9cd56aff6e3 Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 17:57:30 +0200 Subject: [PATCH 065/241] Add bibliographie --- "R\303\251seaux/asterix.md" | 84 +++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 18 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index cfed850..0d75a34 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -8,7 +8,7 @@ parent: Réseaux # ASTERIX -## Qu'est-ce que ASTERIX ? +## **Qu'est-ce que ASTERIX ?[^1]** Astérix est une implémentation logicielle d'un autocommutateur privé (PBX) qui est une centrale téléphonique desservant une organisations privée et permettant @@ -34,8 +34,9 @@ extensions d'Asterisk , en ajoutant des modules chargeables personnalisés écri en PHP ou C. Mais qu'en est-il de l'intégration des flux video dans une infrastructure Asterisk ? -## Flux video +## **Flux video** +### Introduction[^2] Encore appelé streaming, c'est un processus d'envoi de contenu en direct. La plupart des logiciels de voix sur ip telles que facebook, skype discord intègre des flux multimédia : appel video. En générale le VoIp est utilisé pour décrire @@ -46,7 +47,7 @@ emetteur vers un groupe de récepteur. Pour ce faire, les deux protocoles utilisés dans une infrastructure Astérisk pour permettre ce flux video sont RTP et RTCP -### Protocole RTP +### **Protocole RTP** Le principe du protocole RTP (Real-Time Transfert Protocol) consiste à envoyer les paquets en temps réel sur le réseau. Les paquets sont marqués temporellement @@ -55,27 +56,48 @@ manière cohérente. Il permet de founir un moyen uniforme pour le transport de données sur IP soumises à des contraintes de temps réel tels que les flux média, audio et vidéo. -#### Caractéristiques +#### **Caractéristiques[^3]** RTP étant utilisé en mode unidirectionnel (d'un emetteur à un récepteur), il -peut être aussi utilisé en mode multicast via satellite. +peut être aussi utilisé en mode multicast via satellite sans garantie de qualité de service (QoS). Les données sont augmentées de l'ajout du protocole de contrôle RTCP. Le rôle principale de RTP consiste à numéroter les paquets IP afin de reconstituer les flux voix ou vidéo de manière fluide et ce, même si le réseau -sous jacent change l'ordre des paquets. +sous jacent change l'ordre des paquets. Par opposition à HTTP et FTP qui fonctionnent au-dessus de TCP, RTP fonctionne au dessus de UDP Il est utilisé par SIP, H.323, MGCP et éventuellement d'autres protocoles pour transporter les médias entre les points d'extrémité. -- Utilisation avec un canal de retour +Exemple de communication via SIP + +###### Fig.2 Schéma d'une converstion via SIP +![utilisation_avec_sip](https://user-images.githubusercontent.com/74672498/169342815-40ec54bf-c03e-4fe1-8dde-2e597c3f5e28.png) + + +- **Utilisation avec un canal de retour[^3]** RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP(Real Time Streaming Protocol destiné aux système de streaming média). Ce canal de retour peut servir à demander des changements de compression ou de débit +Pour améliorer les performances de RTP, un protocole spécifique au streaming permet de contrôler la diffusion du contenu, il s’agit de RTSP (Real Time Streaming Protocol). + +RTPS est un protocole de niveau applicatif qui sert à contrôler les propriétés temps réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. + +- **Utilisation en mode unicast[^2] [^3]** + + Il nécessite l'ouverture d’un flux spécifique entre le serveur et le client.Les protocoles utilisés sont RTSP pour le contrôle du flux et RTP pour l’émission du flux. RTSP utilise TCP alors que RTP utilise UDP. L’intérêt de RTSP par rapport à RTP est d’ajouter un contrôle sur le contenu et de pouvoir par exemple accéder directement à un point donné du contenu sans avoir à le télécharger dans sa globalité. Il améliore ainsi les performances. + +Comment sa se passe : + + 1. Le client contacte le serveur de streaming grâce au protocole RTSP. + 2. le serveur retourne via RTSP une description de la session de streaming qu’il va ouvrir. + 3. Le serveur informe le client du nombre de flux ( Une session étant composé de plusieurs flux : audio, video etc) + 4. Le serveur donne des informations décrivant les flux comme le type du média et le codec de compression + 5. Les flux sont diffusés séparément via le protocole RTP. + ###### Fig.2 Utilisation de RTP en unicast ![rtp_unicast](https://user-images.githubusercontent.com/74672498/169299420-0e91d1bf-7c4f-429f-99c5-da9a9a9e5b5c.png) - ###### "https://www.iifa.fr/video-ip" iifa.fr -- Utilisation en mode multicast +- **Utilisation en mode multicast[^2]** La mise en œuvre de RTP en mode multicast requiert la configuration préalable de routage au niveau du récepteur, qui doit faire lui-même la demande de routage à @@ -83,13 +105,16 @@ ses routeurs hôtes, entre l'émetteur et le récepteur. L'émetteur quant à lu informe séparément les routeurs de diffusion auxquels il est directement connecté. il n'existe qu'un seul flux qui est dupliqué au niveau de chaque recepteur. -Pour se connecter au multicast, le client doit télécharger un fichier type SDP(Session Description Protocol) qui contient les informations nécessaires pour recevoir le flux multicast, l'adresse IP du serveur, le numéro de port et les informations de description des flux. +- Comment sa se passe : + +Pour se connecter au multicast, le client doit télécharger un fichier type SDP(Session Description Protocol) qui contient les informations nécessaires pour recevoir le flux multicast, l'adresse IP du serveur, le numéro de port et les informations de description des flux (même informations que celle envoyées par RTSP dans le cas d'un diffusion unicast). + ###### Fig.3 Utilisation de RTP en multicast ![rtp_multicast](https://user-images.githubusercontent.com/74672498/169301654-924eb1f4-ccb3-4ee8-aed4-38f244f8cc9f.png) ###### "https://www.iifa.fr/video-ip" iifa.fr - #### RTP et la NAT + #### **RTP et la NAT[^7]** Les protocoles de signalisation utilisés pour les échanges multimédia dont H.323 SIP, MGCP et bien d'autres sont dit sensible à la NAT. @@ -100,9 +125,7 @@ Pour se connecter au multicast, le client doit télécharger un fichier type SDP ###### "https://docs.switzernet.com/3/public/110303-asterisk-nat/" docs.switzernet.com Le protocole NAT posent donc quelques soucis au niveau d'une infrastructure décentralisée notamment lors de l'échange des paquets voix dans le protocole RTP. RTP étant décentralisé, pour résoudre le problème, tous les paquets RTP seront envoyés de l'interlocuteur au serveur avant d'être redirigés vers le bon client. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de résoudre le problème de la NAT - - -#### Intégration de RTP dans Asterisk +#### **Intégration de RTP dans Asterisk[^4]** La configuration du protocole RTP dans une infrastructure Asterisk passe par le fichier rtp.conf qu'Asterisk utilise pour générer et recevoir le traffic RTP. Par défaut rtp.conf utilise la plage de ports RTP comprise entre 10000 à 20000 @@ -124,11 +147,11 @@ rtpend=20000 Si vous avez un NAT ou un pare-feu entre Asterisk et le serveur, vous devez les configurer pour gérer le transfert des ports configurés. -### Intégration de la video dans Asterisk +### **Intégration de la video dans Asterisk[^6] [^5]** Asterisk prend en charge une variété de support audio et vidéo et fournit des modules CODEC pour faciliter l'encodage et le décodage des flux audio. Pour l'instant le transcodage vidéo ou le transcodage d'image n'est pas pris en charge. -#### Pris en charge des vidéos +#### **Pris en charge des vidéos[^6]** Non | Valeur de configuration | Format Module | Distribué avec Astérisk | :-: | :-:| :-:| :-: | @@ -139,11 +162,11 @@ H.264 | h264 | format_h264 | OUI| le fichier produit par les pilotes de format vidéo Asterisk n'est pas dans un format vidéo générique. [Gstreamer](https://gstreamer.freedesktop.org/) prend en charge la production de ces fichiers et la conversion de divers fichiers vidéo en fichiers vidéo + audio Asterisk. -#### Prise en charge du pilote de canal +#### **Prise en charge du pilote de canal[^5]** Pilote de canal | Module | Remarque :-: | :-:| :-:| -siroter|chan_sip.so|Le pilote de canal SIP (chan_sip.so) prend en charge la vidéo| +SIP|chan_sip.so|Le pilote de canal SIP (chan_sip.so) prend en charge la vidéo| IAX2|chan_iax2.so|Prend en charge les appels vidéo (sur les troncs aussi)| Local|chan_local.so|Transfère les appels vidéo en tant que canal proxy| Agent| chan_agent.so| Transfère les appels vidéo en tant que canal proxy | @@ -155,3 +178,28 @@ Les applications de plans de numérotation qui sont connus pour gérer la vidéo - Enregistrer - Enregistre les fichiers audio et vidéo - Lecture - Lit une vidéo tout en étant invité à lire l'audio - Echo - Renvoie l'audio et la vidéo à l'utilisateur + + +## Bibliographie + +[^1]: "_Qu'est-ce que ASTERIX ?_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Asterisk_(logiciel) (consulté le 18/05/2022) + ** Résumé : Bref définition d'asterisk ainsi que de ses fonctionnalités + ** Avis sur la ressource : Très leger et pas assez explicite dans certains point +[^2]: "_RTP ?_", iifa.fr, https://www.iifa.fr/video-ip) (consulté le 19/05/2022) + ** Résumé : Détaille les différents mode d'utilisation de RTP + ** Avis sur la ressource : Clair et schématique le meilleur pour comprendre RTP en unicast et multicast +[^3]: "_RTP ?_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Real-time_Transport_Protocol (consulté le 19/05/2022) + ** Résumé : Définition de RTP ainsi que des protocoles associés + ** Avis sur la ressource : Va droit au but : Bonne base pour comprendre le protocole +[^4]: "_Intégration de RTP dans Asterisk_", asteriskdocs.org, http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-APP-D-SECT-37.html (consulté le 18/05/2022) + ** Résumé : Montre une configuration minimaliste de RTP au sein d'astérisk + ** Avis sur la ressource : Clair mais assez leger : insuffisant pour une configuration total +[^5]: "_Prise en charge des pilote de canal_", wiki.asterisk.org, https://wiki.asterisk.org/wiki/display/AST/Video+Telephony (consulté le 19/05/2022) + ** Résumé : Donne les différents pilote de canal ainsi que les format video d'asterisk + ** Avis sur la ressource : Assez concis +[^6]: "_Prise en charge des vidéos_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) + ** Résumé : Document officiel d'asterisk (Prise en charge des médias) + ** Avis sur la ressource : Pas très détaillé concernant les flux videos +[^7]: "_RTP et la NAT_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) + ** Résumé : Fonctionnement d'Asterisk avec un routeur NAT et les problèmes rencontrés + ** Avis sur la ressource : Super explication de comment résoudre le problème de la nat dans une infrastructure Asterisk From 47f72e0d01e63a2711d86e93b782cde534418042 Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 18:50:28 +0200 Subject: [PATCH 066/241] Update asterix.md --- "R\303\251seaux/asterix.md" | 94 +++++++++++++++++++++++++++++-------- 1 file changed, 74 insertions(+), 20 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index 0d75a34..8fb68a7 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -10,7 +10,7 @@ parent: Réseaux ## **Qu'est-ce que ASTERIX ?[^1]** -Astérix est une implémentation logicielle d'un autocommutateur privé (PBX) qui +Astérix est une implémentation logicielle d'un autocommutateur privé PBX qui est une centrale téléphonique desservant une organisations privée et permettant le partage des lignes réseaux d'un bureau central entre les téléphones installés en interne. @@ -18,25 +18,26 @@ en interne. Chaque Appareil connecté au PBX possède un numéro de téléphone d'extension désigné qui peut ou non être mappé au plan de numérotation du bureau central. -Astérisk permet donc le l'etablissement et le contrôle de la communication entre +Astérisk permet donc l'etablissement et le contrôle de la communication entre les différents terminaux tels que les postes téléphonique, les appareils ou -services sur voix sur protocole internet (VoIP). +services de voix sur protocole internet (VoIP). ###### Fig.1 Schéma d'une infrastructure asterisk ![flux d'appel](https://user-images.githubusercontent.com/74672498/169313118-e214baf6-f8d7-40f4-a8c8-4b757a64b2e8.png) ###### "https://docplayer.fr/508846-Le-support-de-la-video-par-asterisk.html" docplayer.fr Il prend en charge plusieurs fonctionnalités disponible dans les systèmes PBX notament la messagerie vocale, conférence téléphonique, distribution -automatiqued'appel. Ce qui fait l'une des plus grande force d'Asterisk est que -les utilisateurs peuvent créer de nouvelle fonctionnalités en écrivant des +automatique d'appel. Ce qui fait l'une des plus grande force d'Asterisk est que +les utilisateurs peuvent créer de nouvelles fonctionnalités en écrivant des scripts de plan de numérotation dans plusieurs des propres langages d' -extensions d'Asterisk , en ajoutant des modules chargeables personnalisés écrits -en PHP ou C. Mais qu'en est-il de l'intégration des flux video dans une +extensions d'Asterisk tout simplement en ajoutant des modules chargeables personnalisés écrits +en PHP ou C. Qu'en est-il réellement de l'intégration des flux video dans une infrastructure Asterisk ? ## **Flux video** ### Introduction[^2] + Encore appelé streaming, c'est un processus d'envoi de contenu en direct. La plupart des logiciels de voix sur ip telles que facebook, skype discord intègre des flux multimédia : appel video. En générale le VoIp est utilisé pour décrire @@ -59,7 +60,7 @@ audio et vidéo. #### **Caractéristiques[^3]** RTP étant utilisé en mode unidirectionnel (d'un emetteur à un récepteur), il -peut être aussi utilisé en mode multicast via satellite sans garantie de qualité de service (QoS). Les données sont augmentées de l'ajout du protocole de contrôle RTCP. +peut être aussi utilisé en mode multicast via satellite sans garantie de qualité de service ([QoS](https://fr.wikipedia.org/wiki/Qualit%C3%A9_de_service)). Les données sont augmentées de l'ajout du protocole de contrôle RTCP. Le rôle principale de RTP consiste à numéroter les paquets IP afin de reconstituer les flux voix ou vidéo de manière fluide et ce, même si le réseau @@ -75,15 +76,15 @@ Exemple de communication via SIP - **Utilisation avec un canal de retour[^3]** -RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP(Real Time Streaming Protocol destiné aux système de streaming média). Ce canal de retour peut servir à demander des changements de compression ou de débit +RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP(Real Time Streaming Protocol destiné aux système de streaming média). Ce canal de retour peut servir à demander des changements de compression ou de débit pour les applications multimedia ou encore informer l'emetteur des propriétés temps-réel du canal. Pour améliorer les performances de RTP, un protocole spécifique au streaming permet de contrôler la diffusion du contenu, il s’agit de RTSP (Real Time Streaming Protocol). -RTPS est un protocole de niveau applicatif qui sert à contrôler les propriétés temps réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. +RTPS est un protocole de niveau applicatif qui sert à contrôler les propriétés temps-réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. - **Utilisation en mode unicast[^2] [^3]** - Il nécessite l'ouverture d’un flux spécifique entre le serveur et le client.Les protocoles utilisés sont RTSP pour le contrôle du flux et RTP pour l’émission du flux. RTSP utilise TCP alors que RTP utilise UDP. L’intérêt de RTSP par rapport à RTP est d’ajouter un contrôle sur le contenu et de pouvoir par exemple accéder directement à un point donné du contenu sans avoir à le télécharger dans sa globalité. Il améliore ainsi les performances. + Ce mode de diffusion nécessite l'ouverture d’un flux spécifique entre le serveur et le client. Les protocoles utilisés sont RTSP pour le contrôle du flux et RTP pour l’émission du flux. RTSP utilise TCP alors que RTP utilise UDP. L’intérêt de RTSP par rapport à RTP est d’ajouter un contrôle sur le contenu et de pouvoir par exemple accéder directement à un point donné du contenu sans avoir à le télécharger dans sa globalité. Il améliore ainsi les performances. Comment sa se passe : @@ -103,7 +104,7 @@ La mise en œuvre de RTP en mode multicast requiert la configuration préalable routage au niveau du récepteur, qui doit faire lui-même la demande de routage à ses routeurs hôtes, entre l'émetteur et le récepteur. L'émetteur quant à lui informe séparément les routeurs de diffusion auxquels il est directement -connecté. il n'existe qu'un seul flux qui est dupliqué au niveau de chaque recepteur. +connecté. il n'existe qu'un seul flux qui est dupliqué au niveau de chaque recepteur. on peut prendre le cas de la diffusion d'une chaine de TV où le flux est partagé entre tous les recepteurs. - Comment sa se passe : @@ -116,18 +117,18 @@ Pour se connecter au multicast, le client doit télécharger un fichier type SDP #### **RTP et la NAT[^7]** - Les protocoles de signalisation utilisés pour les échanges multimédia dont H.323 SIP, MGCP et bien d'autres sont dit sensible à la NAT. + Les protocoles de signalisation utilisés pour les échanges multimédia (H.323 SIP, MGCP etc) sont dit sensible à la NAT! Pourquoi? - Lors d'une signalisation, ces protocoles ne se contentent pas de mentionner leur adresse IP dans l'entête des paquets qu'ils envoient mais indiquent également dans le corps de leurs messages. Par exemple avec le protocole SIP un message d'invitation INVITE comporte des informations sur l'ip de la source du paquet. Le récepteur ne peut répondre correctement à la requête puisque l'ip source initiale est une adresse privée. Le récepteur envoie donc sa réponse vers l'adresse ip source spécifiée qui ne lui est pas accessible, et le paquet de réponse n'arrive jamais. + Lors d'une signalisation, ces protocoles ne se contentent pas de mentionner leur adresse IP dans l'entête des paquets qu'ils envoient mais l'indiquent également dans le corps de leurs messages. Par exemple avec le protocole SIP un message d'invitation INVITE comporte des informations sur l'ip de la source du paquet. Le récepteur ne peut répondre correctement à la requête puisque l'ip source initiale est une adresse privée. Le récepteur envoie donc sa réponse vers l'adresse ip source spécifiée qui ne lui est pas accessible, et le paquet de réponse n'arrive jamais. ###### Fig.4 Utilisation de la NAT ![nat_rtp](https://user-images.githubusercontent.com/74672498/169309816-8f15135e-f6b8-4e7b-8c0c-acfcd0bcd053.png) ###### "https://docs.switzernet.com/3/public/110303-asterisk-nat/" docs.switzernet.com - Le protocole NAT posent donc quelques soucis au niveau d'une infrastructure décentralisée notamment lors de l'échange des paquets voix dans le protocole RTP. RTP étant décentralisé, pour résoudre le problème, tous les paquets RTP seront envoyés de l'interlocuteur au serveur avant d'être redirigés vers le bon client. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de résoudre le problème de la NAT + Le protocole NAT posent donc quelques soucis au niveau d'une infrastructure décentralisée notamment lors de l'échange des paquets voix et video dans le protocole RTP. RTP étant décentralisé, pour résoudre le problème, tous les paquets RTP seront envoyés de l'interlocuteur au serveur avant d'être redirigés vers le bon client. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de résoudre le problème de la NAT. #### **Intégration de RTP dans Asterisk[^4]** -La configuration du protocole RTP dans une infrastructure Asterisk passe par le fichier rtp.conf qu'Asterisk utilise pour générer et recevoir le traffic RTP. Par défaut rtp.conf utilise la plage de ports RTP comprise entre 10000 à 20000 +La configuration du protocole RTP dans une infrastructure Asterisk passe par le fichier rtp.conf qu'Asterisk utilise pour générer et recevoir le traffic RTP. Par défaut rtp.conf utilise la plage de ports RTP comprise entre 10000 à 20000. Pour chaque appel SIP bidirectionnel entre 02 terminaux, cinq ports sont généralement utilisés : 5060 pour la signalisation SIP, Un port pour le flux de données un port pour RTCP dans une direction, 2 ports supplémentaires pour le flux de données et RTCP dans la direction opposée. @@ -145,7 +146,7 @@ rtpstart=10000 rtpend=20000 ``` -Si vous avez un NAT ou un pare-feu entre Asterisk et le serveur, vous devez les configurer pour gérer le transfert des ports configurés. +Si vous avez un NAT ou un pare-feu entre Asterisk et le serveur, vous devez les configurer pour gérer le transfert des ports. ### **Intégration de la video dans Asterisk[^6] [^5]** @@ -160,9 +161,15 @@ H.263 | h263 | format_h263 | OUI| H.263+ | h263p | format_h263 | OUI| H.264 | h264 | format_h264 | OUI| -le fichier produit par les pilotes de format vidéo Asterisk n'est pas dans un format vidéo générique. [Gstreamer](https://gstreamer.freedesktop.org/) prend en charge la production de ces fichiers et la conversion de divers fichiers vidéo en fichiers vidéo + audio Asterisk. +le fichier produit par les pilotes de format vidéo Asterisk n'est pas dans un format vidéo habituel. [Gstreamer](https://gstreamer.freedesktop.org/) prend en charge la production de ces fichiers et la conversion de divers fichiers vidéo en fichiers vidéo + audio Asterisk. + +#### **Prise en charge du pilote de canal[^5] [^8]** + +Dans Asterisk un canal est l'unité atomique qui transporte un appel au sein d'Asterisk. Il peut s'agir d'une connection physique à une ligne téléphonique ou à un poste téléphonique comme il peut s'agir d'une connection logique induite par un appel en provenance d'un réseau de données. Chaque canal est géré par un pilote qui en connaît les moindres détails et qui n'expose que le strict nécessaire à la couche supérieure du PBX. + +Généralement, un pilote de Canal lit dans un fichier de configuration les informations concernant le matériel/protocole qu'il doit gérer puis entre en attente de modification d'états sur les canaux physiques/logiques. Dès qu'un changement d'état survient, (Sonnerie par exemple), le pilote crée une structure de données de type channel et y attache tous les callbacks nécessaires à la communication. -#### **Prise en charge du pilote de canal[^5]** +Les pilotes de canal qui prennent en charge la video dans Asterisk sont: Pilote de canal | Module | Remarque :-: | :-:| :-:| @@ -172,9 +179,50 @@ Local|chan_local.so|Transfère les appels vidéo en tant que canal proxy| Agent| chan_agent.so| Transfère les appels vidéo en tant que canal proxy | oss |chan_oss.so| Prend en charge l'affichage/le décodage vidéo, voir video_console.txt| +Ci-dessous on peut voir un exemple de configuration de base de sip : sip.conf + +```conf +[general] +context=Hell +srvlookup=yes +tos_sip=cs3 +tos_audio=ef +tos_video=af41 +useragent=AUFSIPUA Pwrd by Asterisk PBX +externip = 1.2.3.4 +externhost=foo.baz.bar +localnet=192.168.0.0/255.255.0.0 +localnet=10.0.0.0/255.0.0.0 +localnet=172.16.0.0/12 +localnet=169.254.0.0/255.255.0.0 + +[tom] +type=friend +secret=s3cr3t +qualify=10 +disallow=all +allow=speex +allow=gsm +allow=alaw +nat=no +host=dynamic +canreinvite=no +context=hackers + + + reload chan_sip.so ou sip reload + sip list objects + sip list peers + sip list settings|domains|channels|subscriptions + sip list peers +``` + + +Pour ce qui est des applications, elles rendent des services lorsqu'un appel est traité dans le système. Pour chaque appel, une suite d'applications est exécuté en série dans l'ordre dans lequel elles sont défini dans un diaplan (fichier qui reprend les instructions de traitement d'un l'appel). Certaines applications utilisent un fichier de configuration comme l'application VoiceMail (Messagerie vocale) + Les applications de plans de numérotation qui sont connus pour gérer la vidéo sont : -- Messagerie vocole - Stockage de la messagerie vocale vidéo +- Messagerie vocale - Stockage de la messagerie vocale vidéo - Enregistrer - Enregistre les fichiers audio et vidéo - Lecture - Lit une vidéo tout en étant invité à lire l'audio - Echo - Renvoie l'audio et la vidéo à l'utilisateur @@ -203,3 +251,9 @@ Les applications de plans de numérotation qui sont connus pour gérer la vidéo [^7]: "_RTP et la NAT_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) ** Résumé : Fonctionnement d'Asterisk avec un routeur NAT et les problèmes rencontrés ** Avis sur la ressource : Super explication de comment résoudre le problème de la nat dans une infrastructure Asterisk +[^8]: "_Pilote de canal_", wiki.auf.org, https://wiki.auf.org/wikiteki/Asterisk/QuelquesNotions (consulté le 19/05/2022) + ** Résumé : Détaille les différents cannaux et leurs pilote utilisés par Astérisk + ** Avis sur la ressource : Super article très explicite +[^9]: "_PABX_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Autocommutateur_t%C3%A9l%C3%A9phonique_priv%C3%A9 (consulté le 19/05/2022) + ** Résumé : Bref définition de ce que c'est qu'un PBX et de son evolution + ** Avis sur la ressource : Chouette définition From 856d10187ab7539bc38ac8409c6cda497d738352 Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 18:55:01 +0200 Subject: [PATCH 067/241] update link --- "R\303\251seaux/asterix.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index 8fb68a7..1449f81 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -8,7 +8,7 @@ parent: Réseaux # ASTERIX -## **Qu'est-ce que ASTERIX ?[^1]** +## **Qu'est-ce que ASTERIX ?[^1] [^9]** Astérix est une implémentation logicielle d'un autocommutateur privé PBX qui est une centrale téléphonique desservant une organisations privée et permettant @@ -71,8 +71,8 @@ Il est utilisé par SIP, H.323, MGCP et éventuellement d'autres protocoles pour Exemple de communication via SIP ###### Fig.2 Schéma d'une converstion via SIP -![utilisation_avec_sip](https://user-images.githubusercontent.com/74672498/169342815-40ec54bf-c03e-4fe1-8dde-2e597c3f5e28.png) - +![utilisation_avec_sip](https://user-images.githubusercontent.com/74672498/169355709-eaec4f3c-978d-42bf-8bc2-6c2245cf71ea.png) +###### "https://www.researchgate.net/figure/VoIP-call-setup-based-on-SIP-SDP-RTP-RTCP-protocols-based-on-9_fig3_1924445" researchgate.net - **Utilisation avec un canal de retour[^3]** From 97db3bf1273ea6c30d9751f96093bc358332a704 Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 18:58:39 +0200 Subject: [PATCH 068/241] Update asterix.md --- "R\303\251seaux/asterix.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index 1449f81..b84895a 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -106,13 +106,12 @@ ses routeurs hôtes, entre l'émetteur et le récepteur. L'émetteur quant à lu informe séparément les routeurs de diffusion auxquels il est directement connecté. il n'existe qu'un seul flux qui est dupliqué au niveau de chaque recepteur. on peut prendre le cas de la diffusion d'une chaine de TV où le flux est partagé entre tous les recepteurs. -- Comment sa se passe : +Comment sa se passe : Pour se connecter au multicast, le client doit télécharger un fichier type SDP(Session Description Protocol) qui contient les informations nécessaires pour recevoir le flux multicast, l'adresse IP du serveur, le numéro de port et les informations de description des flux (même informations que celle envoyées par RTSP dans le cas d'un diffusion unicast). ###### Fig.3 Utilisation de RTP en multicast ![rtp_multicast](https://user-images.githubusercontent.com/74672498/169301654-924eb1f4-ccb3-4ee8-aed4-38f244f8cc9f.png) - ###### "https://www.iifa.fr/video-ip" iifa.fr #### **RTP et la NAT[^7]** @@ -124,6 +123,7 @@ Pour se connecter au multicast, le client doit télécharger un fichier type SDP ###### Fig.4 Utilisation de la NAT ![nat_rtp](https://user-images.githubusercontent.com/74672498/169309816-8f15135e-f6b8-4e7b-8c0c-acfcd0bcd053.png) ###### "https://docs.switzernet.com/3/public/110303-asterisk-nat/" docs.switzernet.com + Le protocole NAT posent donc quelques soucis au niveau d'une infrastructure décentralisée notamment lors de l'échange des paquets voix et video dans le protocole RTP. RTP étant décentralisé, pour résoudre le problème, tous les paquets RTP seront envoyés de l'interlocuteur au serveur avant d'être redirigés vers le bon client. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de résoudre le problème de la NAT. #### **Intégration de RTP dans Asterisk[^4]** From 7e016f7f83c12d39e09f2b77150be96b7a6a39e5 Mon Sep 17 00:00:00 2001 From: Patson <74672498+CardinPatson@users.noreply.github.com> Date: Thu, 19 May 2022 22:52:14 +0200 Subject: [PATCH 069/241] Correction des fautes --- "R\303\251seaux/asterix.md" | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index b84895a..4d3e1d6 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -11,21 +11,21 @@ parent: Réseaux ## **Qu'est-ce que ASTERIX ?[^1] [^9]** Astérix est une implémentation logicielle d'un autocommutateur privé PBX qui -est une centrale téléphonique desservant une organisations privée et permettant +est une centrale téléphonique desservant une organisation privée et permettant le partage des lignes réseaux d'un bureau central entre les téléphones installés en interne. Chaque Appareil connecté au PBX possède un numéro de téléphone d'extension désigné qui peut ou non être mappé au plan de numérotation du bureau central. -Astérisk permet donc l'etablissement et le contrôle de la communication entre -les différents terminaux tels que les postes téléphonique, les appareils ou +Astérisk permet donc l'établissement et le contrôle de la communication entre +les différents terminaux tels que les postes téléphoniques, les appareils ou services de voix sur protocole internet (VoIP). ###### Fig.1 Schéma d'une infrastructure asterisk ![flux d'appel](https://user-images.githubusercontent.com/74672498/169313118-e214baf6-f8d7-40f4-a8c8-4b757a64b2e8.png) ###### "https://docplayer.fr/508846-Le-support-de-la-video-par-asterisk.html" docplayer.fr -Il prend en charge plusieurs fonctionnalités disponible dans les systèmes PBX +Il prend en charge plusieurs fonctionnalités disponibles dans les systèmes PBX notament la messagerie vocale, conférence téléphonique, distribution automatique d'appel. Ce qui fait l'une des plus grande force d'Asterisk est que les utilisateurs peuvent créer de nouvelles fonctionnalités en écrivant des @@ -38,9 +38,9 @@ infrastructure Asterisk ? ### Introduction[^2] -Encore appelé streaming, c'est un processus d'envoi de contenu en direct. La +Encore appelé streaming, c'est un processus d'envoie de contenu en direct. La plupart des logiciels de voix sur ip telles que facebook, skype discord intègre -des flux multimédia : appel video. En générale le VoIp est utilisé pour décrire +des flux multimédia : appel video. En générale la VoIP est utilisée pour décrire des communications point à point. Pour ce qui est du flux video par visioconférence on parle de communication multipoint qui est une diffusion d'un emetteur vers un groupe de récepteur. @@ -52,7 +52,7 @@ pour permettre ce flux video sont RTP et RTCP Le principe du protocole RTP (Real-Time Transfert Protocol) consiste à envoyer les paquets en temps réel sur le réseau. Les paquets sont marqués temporellement -de manière à être réordonnancés par le client afin d’afficher la vidéo de +de manière à être réordonnancé par le client afin d’afficher la vidéo de manière cohérente. Il permet de founir un moyen uniforme pour le transport de données sur IP soumises à des contraintes de temps réel tels que les flux média, audio et vidéo. @@ -62,7 +62,7 @@ audio et vidéo. RTP étant utilisé en mode unidirectionnel (d'un emetteur à un récepteur), il peut être aussi utilisé en mode multicast via satellite sans garantie de qualité de service ([QoS](https://fr.wikipedia.org/wiki/Qualit%C3%A9_de_service)). Les données sont augmentées de l'ajout du protocole de contrôle RTCP. -Le rôle principale de RTP consiste à numéroter les paquets IP afin de +Le rôle principal de RTP consiste à numéroter les paquets IP afin de reconstituer les flux voix ou vidéo de manière fluide et ce, même si le réseau sous jacent change l'ordre des paquets. Par opposition à HTTP et FTP qui fonctionnent au-dessus de TCP, RTP fonctionne au dessus de UDP @@ -76,11 +76,11 @@ Exemple de communication via SIP - **Utilisation avec un canal de retour[^3]** -RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP(Real Time Streaming Protocol destiné aux système de streaming média). Ce canal de retour peut servir à demander des changements de compression ou de débit pour les applications multimedia ou encore informer l'emetteur des propriétés temps-réel du canal. +RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP(Real Time Streaming Protocol destiné aux système de streaming média). Ce canal de retour peut servir à demander des changements de compression ou de débit pour les applications multimedias ou encore informer l'émetteur des propriétés temps-réel du canal. Pour améliorer les performances de RTP, un protocole spécifique au streaming permet de contrôler la diffusion du contenu, il s’agit de RTSP (Real Time Streaming Protocol). -RTPS est un protocole de niveau applicatif qui sert à contrôler les propriétés temps-réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. +RTSP est un protocole de niveau applicatif qui sert à contrôler les propriétés temps-réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. - **Utilisation en mode unicast[^2] [^3]** @@ -100,7 +100,7 @@ Comment sa se passe : - **Utilisation en mode multicast[^2]** -La mise en œuvre de RTP en mode multicast requiert la configuration préalable de +La mise en œuvre de RTP en mode multicast requiert une configuration préalable de routage au niveau du récepteur, qui doit faire lui-même la demande de routage à ses routeurs hôtes, entre l'émetteur et le récepteur. L'émetteur quant à lui informe séparément les routeurs de diffusion auxquels il est directement @@ -116,7 +116,7 @@ Pour se connecter au multicast, le client doit télécharger un fichier type SDP #### **RTP et la NAT[^7]** - Les protocoles de signalisation utilisés pour les échanges multimédia (H.323 SIP, MGCP etc) sont dit sensible à la NAT! Pourquoi? + Les protocoles de signalisation utilisés pour les échanges multimédias (H.323 SIP, MGCP etc) sont en effet sensible à la NAT! Pourquoi? Lors d'une signalisation, ces protocoles ne se contentent pas de mentionner leur adresse IP dans l'entête des paquets qu'ils envoient mais l'indiquent également dans le corps de leurs messages. Par exemple avec le protocole SIP un message d'invitation INVITE comporte des informations sur l'ip de la source du paquet. Le récepteur ne peut répondre correctement à la requête puisque l'ip source initiale est une adresse privée. Le récepteur envoie donc sa réponse vers l'adresse ip source spécifiée qui ne lui est pas accessible, et le paquet de réponse n'arrive jamais. @@ -167,7 +167,7 @@ le fichier produit par les pilotes de format vidéo Asterisk n'est pas dans un f Dans Asterisk un canal est l'unité atomique qui transporte un appel au sein d'Asterisk. Il peut s'agir d'une connection physique à une ligne téléphonique ou à un poste téléphonique comme il peut s'agir d'une connection logique induite par un appel en provenance d'un réseau de données. Chaque canal est géré par un pilote qui en connaît les moindres détails et qui n'expose que le strict nécessaire à la couche supérieure du PBX. -Généralement, un pilote de Canal lit dans un fichier de configuration les informations concernant le matériel/protocole qu'il doit gérer puis entre en attente de modification d'états sur les canaux physiques/logiques. Dès qu'un changement d'état survient, (Sonnerie par exemple), le pilote crée une structure de données de type channel et y attache tous les callbacks nécessaires à la communication. +Généralement, un pilote de Canal lit dans un fichier de configuration les informations concernant le matériel/protocole qu'il doit gérer puis entre en attente de modification d'état sur les canaux physiques/logiques. Dès qu'un changement d'état survient, (Sonnerie par exemple), le pilote crée une structure de données de type channel et y attache tous les callbacks nécessaires à la communication. Les pilotes de canal qui prennent en charge la video dans Asterisk sont: From 66c91fc28c39e560925656935be7f359b7125f3f Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Fri, 20 May 2022 11:51:56 +0200 Subject: [PATCH 070/241] Etude de cas sur une compromission de serveur Linux --- .../etude_de_cas_hacking.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 "S\303\251curit\303\251/etude_de_cas_hacking.md" diff --git "a/S\303\251curit\303\251/etude_de_cas_hacking.md" "b/S\303\251curit\303\251/etude_de_cas_hacking.md" new file mode 100644 index 0000000..ed90948 --- /dev/null +++ "b/S\303\251curit\303\251/etude_de_cas_hacking.md" @@ -0,0 +1,65 @@ +# Etude de cas : Compromission d'un VPS + +En mai 2022, un des VPS utilisé dans le cadre de ce cours a été compromis : nous avons reçu un email de notification de la part du fournisseur indiquant que des tentatives d'intrusion sur le port SSH ont été commises depuis cette machine. Suite à cela, nous avons investigué la machine incriminée pour tenter d'en savoir concernant l'attaque subie, en nous inspirant de pistes proposées sur le [site Linux Hint](https://linuxhint.com/determine_if_linux_is_compromised/) [1]. + +## Observation des connexions réseaux + +Pour visualiser les tentatives de connection lançées depuis la machine, le bon vieil outil netstat est toujours utile. Contrairement au débugging de services, nous n'utilisons dans un premier temps pas l'option "l", car ce ne sont pas les ports "en écoute" qui nous intéressent, mais bien les connexions initiées depuis la machine. On peut voir dans l'output ci-dessous qu'il y a énormément de tentatives de connexion sur des ports 22 de machines distantes (ce qui correspond bien à la plainte reçue), et que ces tentatives de connexion ont parfois réussi (état ESTABLISHED). Pour les tentatives réussies, on voit que le coupable est le processus de pid 150510, associé à l'exécutable tsm. + + + $ sudo netstat -antp | more + Active Internet connections (servers and established) + Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 54381/systemd-resol + tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 53106/sshd: /usr/sb + tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 133699/nginx: maste + tcp 0 0 152.228.217.108:41524 94.26.246.51:22 TIME_WAIT - + tcp 0 0 152.228.217.108:41688 45.192.85.204:30945 TIME_WAIT - + tcp 0 0 152.228.217.108:55360 46.4.90.59:22 ESTABLISHED 150510/tsm + tcp 0 0 152.228.217.108:33044 91.121.71.10:22 TIME_WAIT - + tcp 0 0 152.228.217.108:52626 46.254.16.41:22 TIME_WAIT - + tcp 0 0 152.228.217.108:59622 212.122.43.13:22 TIME_WAIT - + tcp 0 0 152.228.217.108:55436 141.79.10.62:22 TIME_WAIT - + (etc.) + + +Nous pourrions également regarder les ports actifs depuis la machine, cette fois avec l'option -l. Cela permettrait de vérifier s'il n'y a pas un service "suspect" à l'écoute, par exemple en attente de commandes depuis la machine contrôlant l'attaque. Ce n'est pas le cas dans la situation analysée. + +Pour vérifier les dernières tentatives de login, on peut consulter le fichier .bash-history, soit directement, soit en utilisant la commande "last". Cependant, les attaquants nettoient souvent ce fichier après l'intrusion. Dans notre cas, aucune information utile n'y figure. + +## Analyse du processus incriminé + +Une fois le processus coupable identifié (dans notre cas, tsm), on peut en savoir plus à son sujet avec un ps -A ou bien un "top", comme le montre l'output ci-dessous. On voit que le processus tsm tourne avec l'utilisateur "node", et qu'il occupe une belle portion du CPU du VPS. Il s'agit donc de l'utilisateur qui a été compromis. On observe également un autre processus lancé par node et utilisant beaucoup de ressources : kswapd0 + + top - 08:53:08 up 3 days, 22:39, 1 user, load average: 43.06, 24.71, 21.26 + Tasks: 114 total, 2 running, 112 sleeping, 0 stopped, 0 zombie + %Cpu(s): 92.4 us, 3.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 4.0 si, 0.0 st + MiB Mem : 1935.3 total, 145.7 free, 618.3 used, 1171.3 buff/cache + MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1125.8 avail Mem + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 152194 node 20 0 4783328 12848 2372 S 81.4 0.6 3:05.02 tsm + 103921 node 20 0 714124 267052 2360 S 16.6 13.5 766:23.31 kswapd0 + 54387 root 19 -1 84148 21452 20232 S 0.3 1.1 0:33.83 systemd-journal + 153042 root 20 0 12172 6964 6144 S 0.3 0.4 0:00.01 sshd + 1 root 20 0 170836 11388 6816 S 0.0 0.6 0:36.37 systemd + 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd + 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp + 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp + + +Quelques recherches Google concernant ces processus nous ont mené à [cet article](https://qastack.fr/ubuntu/1115770/crond64-tsm-virus-in-ubuntu) [2]. Suite à la lecture, nous avons pu vérifier que le compte utilisateur node avait effectivement une clé SSH autorisée dans son .ssh/authorised_keys. Cela permet à l'attaquant de se reconnecter à volonté sans mot de passe. D'autres recherches mènent à l'identification du processus kswapd0 comme dissimulant un malware de mining. + + +A ce stade, les investigations ont été arrêtées et le problème résolu par une réinitialisation complète du VPS, avec demande à l'étudiant de mettre en place directement l'authentification par clé, la désactivation du ssh par pwd, ainsi que Fail2Ban afin d'éviter de nouvelles compromissions. D'autres éléments auraient pu être investiguées sur base des pistes proposées par U. Asad [1], telles que les crontabs ou les logs, entre autres. + +Il aurait été possible de tenter de nettoyer le VPS en supprimant l'utilisateur node ainsi que les traces du malware, mais dans ce cas précis, puisqu'il n'était pas nécessaire de sauver des données, une réinitialiasion est plus simple et plus sûre car plus radicale. + +## Bibliographie +[1] Usama Asad, [How to determined if a linux system is compromised](https://linuxhint.com/determine_if_linux_is_compromised/), 2020, consulté le 20 mai 2022 + - Résumé : Article type "blog" en anglais listant des commandes/procédures permettant d'investiguer une éventuelle compromission sur un serveur Linux. + - Avis sur la ressource : Excellent article détaillant et expliquant de manière claire et assez complète des pistes génériques à suivre en cas de compromission. + +[2] Auteur anonyme [virus crond64 / tsm dans Ubuntu](), forum "QAStack", date du post inconnue, consulté le 20 mai 2022. + - Résumé : Post de forum témoignant de l'analyse d'une infection d'une machine Ubuntu par un processus tsm. + - Avis sur la ressource : Partage d'expérience d'un utilisateur particulier décrivant son cas spécifique. Donne des pistes intéressantes pour investiguer des situations similaires. From ef706d12c5dba713afa17553bbf871f66ec98411 Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Fri, 20 May 2022 11:52:36 +0200 Subject: [PATCH 071/241] Update etude_de_cas_hacking.md --- "S\303\251curit\303\251/etude_de_cas_hacking.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/S\303\251curit\303\251/etude_de_cas_hacking.md" "b/S\303\251curit\303\251/etude_de_cas_hacking.md" index ed90948..8101eac 100644 --- "a/S\303\251curit\303\251/etude_de_cas_hacking.md" +++ "b/S\303\251curit\303\251/etude_de_cas_hacking.md" @@ -1,3 +1,9 @@ +--- +layout: default +title: Etude de cas : Compromission d'un VPS +parent: Sécurité +--- + # Etude de cas : Compromission d'un VPS En mai 2022, un des VPS utilisé dans le cadre de ce cours a été compromis : nous avons reçu un email de notification de la part du fournisseur indiquant que des tentatives d'intrusion sur le port SSH ont été commises depuis cette machine. Suite à cela, nous avons investigué la machine incriminée pour tenter d'en savoir concernant l'attaque subie, en nous inspirant de pistes proposées sur le [site Linux Hint](https://linuxhint.com/determine_if_linux_is_compromised/) [1]. From 07a5b38277ddd2c5bd264a0d87265d8bc6a0e2e9 Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Fri, 20 May 2022 11:53:22 +0200 Subject: [PATCH 072/241] Update securite.md --- securite.md | 1 + 1 file changed, 1 insertion(+) diff --git a/securite.md b/securite.md index cf6469a..e1f261f 100644 --- a/securite.md +++ b/securite.md @@ -8,6 +8,7 @@ has_children: true # Sécurité - [PGP](Sécurité/PGP.md) +- [Etude de cas : Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) # Concepts liés à la sécurité dans d'autres sections : From 073d58b797ad556921a880f6ca35930f47a2610b Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Fri, 20 May 2022 11:53:58 +0200 Subject: [PATCH 073/241] Update index.md --- index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index f8ee560..f879485 100644 --- a/index.md +++ b/index.md @@ -57,4 +57,5 @@ Les informations sont organisées par catégorie : ## Sécurité -- [PGP](Sécurité/PGP.md) \ No newline at end of file +- [PGP](Sécurité/PGP.md) +- [Etude de cas : Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) From 9e5dd1d3a853077adeebb9a8722370b78e6ea567 Mon Sep 17 00:00:00 2001 From: vvandenschrieck Date: Mon, 23 May 2022 11:52:50 +0200 Subject: [PATCH 074/241] Update etude_de_cas_hacking.md --- "S\303\251curit\303\251/etude_de_cas_hacking.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/S\303\251curit\303\251/etude_de_cas_hacking.md" "b/S\303\251curit\303\251/etude_de_cas_hacking.md" index 8101eac..3987288 100644 --- "a/S\303\251curit\303\251/etude_de_cas_hacking.md" +++ "b/S\303\251curit\303\251/etude_de_cas_hacking.md" @@ -1,6 +1,6 @@ --- layout: default -title: Etude de cas : Compromission d'un VPS +title: Etude de cas - Compromission d'un VPS parent: Sécurité --- From f2fcbb58213bdfa79fb989abcae2a10d1c856e6e Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 18:06:32 +0200 Subject: [PATCH 075/241] Create wireshark.md --- "R\303\251seaux/wireshark.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "R\303\251seaux/wireshark.md" diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" new file mode 100644 index 0000000..2664bf0 --- /dev/null +++ "b/R\303\251seaux/wireshark.md" @@ -0,0 +1 @@ +# Wireshark c'est quoi? From 31ddb478df9e725d3404affd6a365bec5d2e8fd9 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:16:39 +0200 Subject: [PATCH 076/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 45 ++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 2664bf0..20f9a7a 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -1 +1,44 @@ -# Wireshark c'est quoi? +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Wireshark + +## Wireshark ? c'est quoi ?[^1][^2][^3][^4] + +Wireshark est un analyseur de paquets réseau créer en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétable par des humains. +Wireshark est utilisé notamment pour : +- L'analyse et le troubleshooting réseau. +- La sécurité réseau. +- Le reverse engineering. +- Le développement et le début de protocoles. +- L’éducation. + +Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ces filtre très nombreux, ces fonctionnalités variés et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia[^2]). +Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. + +## Fonctionalités: [^1][^2][^3] + +### La capture de paquets: + + + + + + + +## Bibliographie + +[^1]* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) + - Résumé : documentation officiel de Wireshark + - Avis sur la ressource : clair et très complet malgré un design un peu rebutant + +[^2]* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) + - Résumé : page wikepedia Wireshark + - Avis sur la ressource : très peu complète mais donnes quelques information de bases + +[^3]* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) + - Résumé : petit guide concis sur wireshark + - Avis sur la ressource : petit guide concis mais clair et agréable à lire + +[^4]* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) + - Résumé : petit guide concis sur wireshark + - Avis sur la ressource : petit guide concis mais clair et agréable à lire + From 4751fc150e7b8750b41dcc16990fa0f8befcc0c2 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:18:07 +0200 Subject: [PATCH 077/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 20f9a7a..18eb961 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -1,7 +1,7 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) # Wireshark -## Wireshark ? c'est quoi ?[^1][^2][^3][^4] +## Wireshark ? c'est quoi ?[^1] [^2] [^3] [^4] Wireshark est un analyseur de paquets réseau créer en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétable par des humains. Wireshark est utilisé notamment pour : @@ -14,7 +14,7 @@ Wireshark est utilisé notamment pour : Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ces filtre très nombreux, ces fonctionnalités variés et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia[^2]). Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. -## Fonctionalités: [^1][^2][^3] +## Fonctionalités: [^1] [^2] [^3] ### La capture de paquets: @@ -26,19 +26,19 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie -[^1]* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +[^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) - Résumé : documentation officiel de Wireshark - Avis sur la ressource : clair et très complet malgré un design un peu rebutant -[^2]* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) +[^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) - Résumé : page wikepedia Wireshark - Avis sur la ressource : très peu complète mais donnes quelques information de bases -[^3]* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) +[^3]:* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) - Résumé : petit guide concis sur wireshark - Avis sur la ressource : petit guide concis mais clair et agréable à lire -[^4]* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) +[^4]:* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) - Résumé : petit guide concis sur wireshark - Avis sur la ressource : petit guide concis mais clair et agréable à lire From 20ec50c5f6392cf9b36afb2dd358a4744e55b0e3 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:19:03 +0200 Subject: [PATCH 078/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 18eb961..760e1e9 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -27,18 +27,18 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie [^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) - - Résumé : documentation officiel de Wireshark - - Avis sur la ressource : clair et très complet malgré un design un peu rebutant +- Résumé : documentation officiel de Wireshark +- Avis sur la ressource : clair et très complet malgré un design un peu rebutant [^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) - - Résumé : page wikepedia Wireshark - - Avis sur la ressource : très peu complète mais donnes quelques information de bases +- Résumé : page wikepedia Wireshark +- Avis sur la ressource : très peu complète mais donnes quelques information de bases [^3]:* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) - - Résumé : petit guide concis sur wireshark - - Avis sur la ressource : petit guide concis mais clair et agréable à lire +- Résumé : petit guide concis sur wireshark +- Avis sur la ressource : petit guide concis mais clair et agréable à lire [^4]:* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) - - Résumé : petit guide concis sur wireshark - - Avis sur la ressource : petit guide concis mais clair et agréable à lire +- Résumé : petit guide concis sur wireshark +- Avis sur la ressource : petit guide concis mais clair et agréable à lire From 97f9150bd0ed213ef74ceb865ed2c9eba0156052 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:19:36 +0200 Subject: [PATCH 079/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 760e1e9..2a0bc65 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -27,8 +27,8 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie [^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -- Résumé : documentation officiel de Wireshark -- Avis sur la ressource : clair et très complet malgré un design un peu rebutant +** Résumé : documentation officiel de Wireshark +** Avis sur la ressource : clair et très complet malgré un design un peu rebutant [^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) - Résumé : page wikepedia Wireshark From 008667f92b1c373ee2b46002439e6cf3e000b15b Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:20:14 +0200 Subject: [PATCH 080/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 2a0bc65..470bc6a 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -26,7 +26,7 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie -[^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +[^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) ** Résumé : documentation officiel de Wireshark ** Avis sur la ressource : clair et très complet malgré un design un peu rebutant From e73e3ebf7e6cf8cc0a8155e47f65fd8e794e4b67 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:21:08 +0200 Subject: [PATCH 081/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 470bc6a..539d3ba 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -27,8 +27,8 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie [^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -** Résumé : documentation officiel de Wireshark -** Avis sur la ressource : clair et très complet malgré un design un peu rebutant +- Résumé : documentation officiel de Wireshark +- Avis sur la ressource : clair et très complet malgré un design un peu rebutant [^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) - Résumé : page wikepedia Wireshark From a97e1ddfa182666b3ba95e28c5d34569e5a1138e Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:22:19 +0200 Subject: [PATCH 082/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 539d3ba..948238b 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -27,8 +27,8 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie [^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -- Résumé : documentation officiel de Wireshark -- Avis sur la ressource : clair et très complet malgré un design un peu rebutant +Résumé : documentation officiel de Wireshark +Avis sur la ressource : clair et très complet malgré un design un peu rebutant [^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) - Résumé : page wikepedia Wireshark From e57cff0128e51ab3e846de278d74d16fee4dbe9b Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 20:22:34 +0200 Subject: [PATCH 083/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 948238b..d43d5d2 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -27,8 +27,8 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Bibliographie [^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -Résumé : documentation officiel de Wireshark -Avis sur la ressource : clair et très complet malgré un design un peu rebutant + Résumé : documentation officiel de Wireshark + Avis sur la ressource : clair et très complet malgré un design un peu rebutant [^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) - Résumé : page wikepedia Wireshark From 3298c872bb01bd0c3a329fb22e3b3d79ac92d896 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 21:02:45 +0200 Subject: [PATCH 084/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index d43d5d2..ccd9a6e 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -16,10 +16,18 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no ## Fonctionalités: [^1] [^2] [^3] -### La capture de paquets: +Voici une liste de fonctionnalités non exhaustif de Wireshark mais suffisante pour commencer. +### La capture de paquets: +La fonctionalisé principal et de base de WireShark est la capture de paquets. Pour commencer une capture ovrez Wireshark et sélectionner un réseau que vous voulez observer en double clicant dessus. +![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) +Lorsque vous souhaiter arrêter la capture appuyer sur le petit carréer rouge en haut à gauche. +Vous pouvez znsuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dant **fichier -> enregistrer sous**. +Pour recommencer une capture clicker sur l'aileron bleu, à gauche du carré rouge. +![image](https://user-images.githubusercontent.com/62069633/170111507-3912c10a-ce96-4149-b715-db2f774c736e.png) +### L'analyse de paquets @@ -30,15 +38,15 @@ Wireshark est disponible sur tous les OS et une version en ligne de commande, no Résumé : documentation officiel de Wireshark Avis sur la ressource : clair et très complet malgré un design un peu rebutant -[^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) -- Résumé : page wikepedia Wireshark -- Avis sur la ressource : très peu complète mais donnes quelques information de bases +[^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) +Résumé : page wikepedia Wireshark +Avis sur la ressource : très peu complète mais donnes quelques information de bases -[^3]:* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) -- Résumé : petit guide concis sur wireshark -- Avis sur la ressource : petit guide concis mais clair et agréable à lire +[^3]:* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) +Résumé : petit guide concis sur wireshark +Avis sur la ressource : petit guide concis mais clair et agréable à lire -[^4]:* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) -- Résumé : petit guide concis sur wireshark -- Avis sur la ressource : petit guide concis mais clair et agréable à lire +[^4]:* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) +Résumé : petit guide concis sur wireshark +Avis sur la ressource : petit guide concis mais clair et agréable à lire From 466f8ab487aab6fdebf75757c89b395278beb7eb Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 23:00:02 +0200 Subject: [PATCH 085/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index ccd9a6e..345730b 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -14,7 +14,7 @@ Wireshark est utilisé notamment pour : Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ces filtre très nombreux, ces fonctionnalités variés et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia[^2]). Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. -## Fonctionalités: [^1] [^2] [^3] +## Fonctionalités: [^1] [^2] [^3] [^5] Voici une liste de fonctionnalités non exhaustif de Wireshark mais suffisante pour commencer. @@ -29,12 +29,42 @@ Pour recommencer une capture clicker sur l'aileron bleu, à gauche du carré rou ### L'analyse de paquets +Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour ce faire nous auron l'aide de trois fenêtres: +1. Le packet list +2. Le packet details +3. Le packet bytes pane +![image](https://user-images.githubusercontent.com/62069633/170119431-f55549da-1adb-4bfb-8e43-2ae49e237546.png) + +### 1. Le packet list + +Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous donnent déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez suprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. +Cependant les colonnes par défault seront généralement emplement suffisante. +- No. : cette colonne numérote les paquets capturés et indique à quel conversation aprtients le paquet: si en clicant sur un paquet vous voyez qu'un ligne pleines apprait sur un autr paquets c'est qu'ils sont dans une même conversation (pa exemple three handshake). +![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) +Les paquets qui n'ont pas de lignes mes des poitillés ne font pas parti de cette conversation. +![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) +- Time : cette colonne indique quand sont arrivé les paquets après le début de la capture. +- Source : indique l'adresse IP qui à envoyé le paquet. +- Destination : indique l'adresse IP qui à ressus le paquet. +- Protocole : indique le protocole utilisé. +- Length : indique la taille du paquet (en octets). +- Info : cette colonne donne des informations différente en fonction du protocole utilisé. + +### 2. Le packet details + +Lorsque vous sélectionner un packet dans Le packet list vous pourrez le retrouvez tous les protocoles utilisé par ce paquet dans cette fenêtre. +Vous pouvez dévlopez un protocol en faisant un clic gauche dessus. +De plus vous pouvez faire ne faire appraitre dans le packet list que les paquets utilisant le même protocoles en faisant un click droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaiter**. + +### 3. Le packet bytes pane + +Ici vous retrouverez le paquet brut au format hexadécimale ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit celà sélectionnera dans le Le packet details à quoi il correspond (et vice versa). ## Bibliographie -[^1]:* [Chapter 1. Introduction](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +[^1]:* [Wireshark User’s Guide](https://www.wireshark.org/docs/wsug_html_chunked/), auteur inconnu, date de création inconnu, consulté le (24/05/2022) Résumé : documentation officiel de Wireshark Avis sur la ressource : clair et très complet malgré un design un peu rebutant @@ -47,6 +77,9 @@ Résumé : petit guide concis sur wireshark Avis sur la ressource : petit guide concis mais clair et agréable à lire [^4]:* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) -Résumé : petit guide concis sur wireshark -Avis sur la ressource : petit guide concis mais clair et agréable à lire - +Résumé : alternatives à Wireshark +Avis sur la ressource : présente bien les alternatives + +[^5]:* [How to Use Wireshark: A Complete Tutorial](https://www.lifewire.com/wireshark-tutorial-4143298), Scott Orgera, 8 juillet 2020, consulté le (24/05/2022) +Résumé : autre guide sur wireshark +Avis sur la ressource : très clair mais trop court From 9ece06b00ad6374e9944ec38db1181ecf44f5bad Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Tue, 24 May 2022 23:01:14 +0200 Subject: [PATCH 086/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 345730b..019e6ce 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -32,14 +32,15 @@ Pour recommencer une capture clicker sur l'aileron bleu, à gauche du carré rou Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour ce faire nous auron l'aide de trois fenêtres: 1. Le packet list 2. Le packet details -3. Le packet bytes pane +3. Le packet bytes pane + ![image](https://user-images.githubusercontent.com/62069633/170119431-f55549da-1adb-4bfb-8e43-2ae49e237546.png) ### 1. Le packet list Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous donnent déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez suprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. Cependant les colonnes par défault seront généralement emplement suffisante. -- No. : cette colonne numérote les paquets capturés et indique à quel conversation aprtients le paquet: si en clicant sur un paquet vous voyez qu'un ligne pleines apprait sur un autr paquets c'est qu'ils sont dans une même conversation (pa exemple three handshake). +- No. : cette colonne numérote les paquets capturés et indique à quel conversation aprtients le paquet: si en clicant sur un paquet vous voyez qu'un ligne pleines apprait sur un autr paquets c'est qu'ils sont dans une même conversation (par exemple three handshake). ![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) Les paquets qui n'ont pas de lignes mes des poitillés ne font pas parti de cette conversation. ![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) From 30a3fd641a756bd15e130750f022b906145c1609 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Wed, 25 May 2022 00:36:01 +0200 Subject: [PATCH 087/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 70 +++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 019e6ce..76ede47 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -36,7 +36,7 @@ Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour ![image](https://user-images.githubusercontent.com/62069633/170119431-f55549da-1adb-4bfb-8e43-2ae49e237546.png) -### 1. Le packet list +#### 1. Le packet list Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous donnent déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez suprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. Cependant les colonnes par défault seront généralement emplement suffisante. @@ -51,17 +51,69 @@ Les paquets qui n'ont pas de lignes mes des poitillés ne font pas parti de cett - Length : indique la taille du paquet (en octets). - Info : cette colonne donne des informations différente en fonction du protocole utilisé. -### 2. Le packet details +#### 2. Le packet details Lorsque vous sélectionner un packet dans Le packet list vous pourrez le retrouvez tous les protocoles utilisé par ce paquet dans cette fenêtre. Vous pouvez dévlopez un protocol en faisant un clic gauche dessus. De plus vous pouvez faire ne faire appraitre dans le packet list que les paquets utilisant le même protocoles en faisant un click droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaiter**. -### 3. Le packet bytes pane +#### 3. Le packet bytes pane Ici vous retrouverez le paquet brut au format hexadécimale ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit celà sélectionnera dans le Le packet details à quoi il correspond (et vice versa). +### Les filtres: [^6][^7] +Il existe deux type de filtre dans Wireshark: les filtres de captures et les filtres d'affichages. Le premier se met avant une capture et permettent de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que caher les paquets qui ne nous intéressent pas. + +#### Filtres de captures: +Pour appliquer un filtre de capture entrer avant la capture le filtre ici: +![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) + +Si vous souhaiter entrer deux filtre utiliser le mot clé: `and` +Si vous shouaiter appliquer un filtre inverser (donc: capturer tous sauf) utiliser le mot clé: `not` + +Wireshark utilise des filtres par défaults si il est utilisé à distance pour ne pas enregistrer se qui est lié à cette connexion (comme ssh). + +##### Exemples utiles (trouver ici [^6]) + +Pour capturer tous se qui vient et sort d'une adresse IP: +`host 172.18.5.4` +Pour capturer tous se qui conserne un range d'ip: +`net 192.168.0.0/24` +Pour capturer tous se qui conserne un port: +`port 53` +Pour ne capturer que du trafic IPv4: +`ip` +Pour ne capturer que du trafic unicast: +`not broadcast and not multicast` + +#### Filtres d'affichages: +Pour appliquer un filtre d'affichage et ainsi cacher se dont vous ne voulez pas entrer ce que vous voulez ici: +![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) + + +Si vous souhaiter afficher que les paquets qui correspondent à deux filtre utiliser le mot clé: `and` ou `&&` +Si vous souhaiter afficher que les paquets qui correspondent à deux filtre utiliser le mot clé: `or` ou `||` + +##### Exemples utiles (trouver ici [^7]) + +Pour n'afficher que les paquets possédant un protocole: +`TCP` +Pour n'afficher que se qui correspond à une adresse IP: +`ip.addr==172.18.5.4` +Pour capturer tous se qui conserne un range d'ip: +`ip.addr==192.168.0.0/24` +Pour capturer tous se qui conserne un port: +`tcp.port==53` +Pour ne capturer que le trafic entre deux machine (par exemple client et serveur): +`ip.src==192.168.18.5 and ip.dst==192.168.2.45` + +### La colorisation: [^8] + +La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark proposent de bases 20 filtres. Pour ajouter ou suprimer des filtres aller dans **vue -> coloring rules**. +![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) + +Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Anisi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisation et vous pourrez aller chercher des règles préffet sur internet pour des cas spécifiques. ## Bibliographie @@ -84,3 +136,15 @@ Avis sur la ressource : présente bien les alternatives [^5]:* [How to Use Wireshark: A Complete Tutorial](https://www.lifewire.com/wireshark-tutorial-4143298), Scott Orgera, 8 juillet 2020, consulté le (24/05/2022) Résumé : autre guide sur wireshark Avis sur la ressource : très clair mais trop court + +[^6]:* [CaptureFilters](https://wiki.wireshark.org/CaptureFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +Résumé : guide sur les filtres de captures +Avis sur la ressource : concis et donne des exemples utiles + +[^7]:* [DisplayFilters](https://wiki.wireshark.org/DisplayFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +Résumé : guide sur les filtres d'affichage +Avis sur la ressource : concis et donne des exemples utiles + +[^7]:* [ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +Résumé : guide sur les la coloration +Avis sur la ressource : concis et donne des exemples utiles From f50816b7df228e79a64a7363375b4ffb861644fa Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Wed, 25 May 2022 00:42:09 +0200 Subject: [PATCH 088/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 93 ++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 46 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 76ede47..9de6a54 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -1,7 +1,7 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) # Wireshark -## Wireshark ? c'est quoi ?[^1] [^2] [^3] [^4] +## Wireshark ? c'est quoi ? [^1] [^2] [^3] [^4] Wireshark est un analyseur de paquets réseau créer en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétable par des humains. Wireshark est utilisé notamment pour : @@ -11,25 +11,25 @@ Wireshark est utilisé notamment pour : - Le développement et le début de protocoles. - L’éducation. -Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ces filtre très nombreux, ces fonctionnalités variés et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia[^2]). +Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ces filtre très nombreux, ces fonctionnalités variés et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia [^2]). Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. -## Fonctionalités: [^1] [^2] [^3] [^5] +## Fonctionnalités : [^1] [^2] [^3] [^5] Voici une liste de fonctionnalités non exhaustif de Wireshark mais suffisante pour commencer. -### La capture de paquets: +### La capture de paquets : -La fonctionalisé principal et de base de WireShark est la capture de paquets. Pour commencer une capture ovrez Wireshark et sélectionner un réseau que vous voulez observer en double clicant dessus. +La Fonctionnalité principal et de base de Wireshark est la capture de paquets. Pour commencer une capture ouvrez Wireshark et sélectionner un réseau que vous voulez observer en double cliquant dessus. ![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) -Lorsque vous souhaiter arrêter la capture appuyer sur le petit carréer rouge en haut à gauche. -Vous pouvez znsuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dant **fichier -> enregistrer sous**. -Pour recommencer une capture clicker sur l'aileron bleu, à gauche du carré rouge. +Lorsque vous souhaiter arrêter la capture appuyer sur le petit carré rouge en haut à gauche. +Vous pouvez ensuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dans **fichier -> enregistrer sous**. +Pour recommencer une capture cliquer sur l'aileron bleu, à gauche du carré rouge. ![image](https://user-images.githubusercontent.com/62069633/170111507-3912c10a-ce96-4149-b715-db2f774c736e.png) ### L'analyse de paquets -Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour ce faire nous auron l'aide de trois fenêtres: +Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour ce faire nous aurons l'aide de trois fenêtres : 1. Le packet list 2. Le packet details 3. Le packet bytes pane @@ -38,92 +38,92 @@ Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour #### 1. Le packet list -Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous donnent déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez suprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. -Cependant les colonnes par défault seront généralement emplement suffisante. -- No. : cette colonne numérote les paquets capturés et indique à quel conversation aprtients le paquet: si en clicant sur un paquet vous voyez qu'un ligne pleines apprait sur un autr paquets c'est qu'ils sont dans une même conversation (par exemple three handshake). +Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous communique déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez supprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. +Cependant les colonnes par défaut seront généralement amplement suffisantes. +- No. : cette colonne numérote les paquets capturés et indique à quel conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'un ligne pleines apparait sur un autre paquets c'est qu'ils sont dans une même conversation (par exemple three handshake). ![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) -Les paquets qui n'ont pas de lignes mes des poitillés ne font pas parti de cette conversation. +Les paquets qui n'ont pas de lignes mes des pointillés ne font pas parti de cette conversation. ![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) - Time : cette colonne indique quand sont arrivé les paquets après le début de la capture. -- Source : indique l'adresse IP qui à envoyé le paquet. -- Destination : indique l'adresse IP qui à ressus le paquet. +- Source : indique l'adresse IP qui à envoyer le paquet. +- Destination : indique l'adresse IP qui à resus le paquet. - Protocole : indique le protocole utilisé. - Length : indique la taille du paquet (en octets). -- Info : cette colonne donne des informations différente en fonction du protocole utilisé. +- Info : cette colonne donne des informations différentes en fonction du protocole utilisé. #### 2. Le packet details -Lorsque vous sélectionner un packet dans Le packet list vous pourrez le retrouvez tous les protocoles utilisé par ce paquet dans cette fenêtre. +Lorsque vous sélectionner un packet dans Le packet list vous pourrez le retrouvez tous les protocoles utilisés par ce paquet dans cette fenêtre. Vous pouvez dévlopez un protocol en faisant un clic gauche dessus. -De plus vous pouvez faire ne faire appraitre dans le packet list que les paquets utilisant le même protocoles en faisant un click droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaiter**. +De plus vous pouvez faire ne faire appraitre dans le packet list que les paquets utilisant le même protocole en faisant un clic droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaiter**. #### 3. Le packet bytes pane -Ici vous retrouverez le paquet brut au format hexadécimale ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit celà sélectionnera dans le Le packet details à quoi il correspond (et vice versa). +Ici vous retrouverez le paquet brut au format hexadécimale ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit cela sélectionnera dans le Le packet détails à quoi il correspond (et vice versa). -### Les filtres: [^6][^7] +### Les filtres : [^6] [^7] -Il existe deux type de filtre dans Wireshark: les filtres de captures et les filtres d'affichages. Le premier se met avant une capture et permettent de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que caher les paquets qui ne nous intéressent pas. +Il existe deux type de filtre dans Wireshark : les filtres de captures et les filtres d'affichages. Le premier se met avant une capture et permettent de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. -#### Filtres de captures: -Pour appliquer un filtre de capture entrer avant la capture le filtre ici: +#### Filtres de captures : +Pour appliquer un filtre de capture entrer avant la capture le filtre ici : ![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) -Si vous souhaiter entrer deux filtre utiliser le mot clé: `and` -Si vous shouaiter appliquer un filtre inverser (donc: capturer tous sauf) utiliser le mot clé: `not` +Si vous souhaiter entrer deux filtres utiliser le mot clé : `and` +Si vous souhaiter appliquer un filtre inverser (donc : capturer tous sauf) utiliser le mot clé: `not` -Wireshark utilise des filtres par défaults si il est utilisé à distance pour ne pas enregistrer se qui est lié à cette connexion (comme ssh). +Wireshark utilise des filtres par défauts s’il est utilisé à distance pour ne pas enregistrer ce qui est lié à cette connexion (comme ssh). ##### Exemples utiles (trouver ici [^6]) -Pour capturer tous se qui vient et sort d'une adresse IP: +Pour capturer tous se qui vient et sort d'une adresse IP : `host 172.18.5.4` -Pour capturer tous se qui conserne un range d'ip: +Pour capturer tous se qui concerne un range d’IP : `net 192.168.0.0/24` -Pour capturer tous se qui conserne un port: +Pour capturer tous se qui concerne un port : `port 53` -Pour ne capturer que du trafic IPv4: +Pour ne capturer que du trafic IPv4 : `ip` -Pour ne capturer que du trafic unicast: +Pour ne capturer que du trafic unicast : `not broadcast and not multicast` -#### Filtres d'affichages: -Pour appliquer un filtre d'affichage et ainsi cacher se dont vous ne voulez pas entrer ce que vous voulez ici: +#### Filtres d’affichages : +Pour appliquer un filtre d'affichage et ainsi cacher se dont vous ne voulez pas entrer ce que vous voulez ici : ![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) -Si vous souhaiter afficher que les paquets qui correspondent à deux filtre utiliser le mot clé: `and` ou `&&` -Si vous souhaiter afficher que les paquets qui correspondent à deux filtre utiliser le mot clé: `or` ou `||` +Si vous souhaiter afficher que les paquets qui correspondent à deux filtres utiliser le mot clé : `and` ou `&&` +Si vous souhaiter afficher que les paquets qui correspondent à deux filtres utiliser le mot clé : `or` ou `||` ##### Exemples utiles (trouver ici [^7]) -Pour n'afficher que les paquets possédant un protocole: +Pour n'afficher que les paquets possédant un protocole : `TCP` -Pour n'afficher que se qui correspond à une adresse IP: +Pour n'afficher que ce qui correspond à une adresse IP : `ip.addr==172.18.5.4` -Pour capturer tous se qui conserne un range d'ip: +Pour capturer tous se qui concerne un range d’IP : `ip.addr==192.168.0.0/24` -Pour capturer tous se qui conserne un port: +Pour capturer tous se qui concerne un port : `tcp.port==53` Pour ne capturer que le trafic entre deux machine (par exemple client et serveur): `ip.src==192.168.18.5 and ip.dst==192.168.2.45` -### La colorisation: [^8] +### La colorisation : [^8] -La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark proposent de bases 20 filtres. Pour ajouter ou suprimer des filtres aller dans **vue -> coloring rules**. +La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose de bases 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. ![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) -Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Anisi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisation et vous pourrez aller chercher des règles préffet sur internet pour des cas spécifiques. +Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Ainsi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisations et vous pourrez aller chercher des règles préfet sur internet pour des cas spécifiques. ## Bibliographie [^1]:* [Wireshark User’s Guide](https://www.wireshark.org/docs/wsug_html_chunked/), auteur inconnu, date de création inconnu, consulté le (24/05/2022) - Résumé : documentation officiel de Wireshark + Résumé : documentation officielle de Wireshark Avis sur la ressource : clair et très complet malgré un design un peu rebutant [^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) -Résumé : page wikepedia Wireshark -Avis sur la ressource : très peu complète mais donnes quelques information de bases +Résumé : page Wikipédia Wireshark +Avis sur la ressource : très peu complète mais donnes quelques informations de bases [^3]:* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) Résumé : petit guide concis sur wireshark @@ -147,4 +147,5 @@ Avis sur la ressource : concis et donne des exemples utiles [^7]:* [ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) Résumé : guide sur les la coloration -Avis sur la ressource : concis et donne des exemples utiles +Avis sur la ressource : concis et donne des exemples utiles + From 1eefe6e5ecc18d21b97046593661bc5e8fb45b6e Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Wed, 25 May 2022 00:43:12 +0200 Subject: [PATCH 089/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 9de6a54..bcb7fc9 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -21,7 +21,7 @@ Voici une liste de fonctionnalités non exhaustif de Wireshark mais suffisante p ### La capture de paquets : La Fonctionnalité principal et de base de Wireshark est la capture de paquets. Pour commencer une capture ouvrez Wireshark et sélectionner un réseau que vous voulez observer en double cliquant dessus. -![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) +![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) Lorsque vous souhaiter arrêter la capture appuyer sur le petit carré rouge en haut à gauche. Vous pouvez ensuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dans **fichier -> enregistrer sous**. Pour recommencer une capture cliquer sur l'aileron bleu, à gauche du carré rouge. @@ -40,10 +40,10 @@ Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous communique déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez supprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. Cependant les colonnes par défaut seront généralement amplement suffisantes. -- No. : cette colonne numérote les paquets capturés et indique à quel conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'un ligne pleines apparait sur un autre paquets c'est qu'ils sont dans une même conversation (par exemple three handshake). -![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) -Les paquets qui n'ont pas de lignes mes des pointillés ne font pas parti de cette conversation. -![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) +- No. : cette colonne numérote les paquets capturés et indique à quel conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'un ligne pleines apparait sur un autre paquets c'est qu'ils sont dans une même conversation (par exemple three handshake). +![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) +Les paquets qui n'ont pas de lignes mes des pointillés ne font pas parti de cette conversation. +![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) - Time : cette colonne indique quand sont arrivé les paquets après le début de la capture. - Source : indique l'adresse IP qui à envoyer le paquet. - Destination : indique l'adresse IP qui à resus le paquet. From 2723ebfc3a4d889c1bc42de2a61cdc0ded89bbfa Mon Sep 17 00:00:00 2001 From: HE201916 <71373221+HE201916@users.noreply.github.com> Date: Wed, 25 May 2022 10:57:44 +0200 Subject: [PATCH 090/241] Create Les protocoles VPN.md --- "R\303\251seaux/Les protocoles VPN.md" | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 "R\303\251seaux/Les protocoles VPN.md" diff --git "a/R\303\251seaux/Les protocoles VPN.md" "b/R\303\251seaux/Les protocoles VPN.md" new file mode 100644 index 0000000..2989b5d --- /dev/null +++ "b/R\303\251seaux/Les protocoles VPN.md" @@ -0,0 +1,26 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# + +## Sous-titre 1 + +Texte + + + +## Sous-titre 2 + +Texte + + + + + + +## Bibliographie + +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... + + + From 39c785c5b0785a7c410fe85cb21246bac470dd41 Mon Sep 17 00:00:00 2001 From: HE201916 <71373221+HE201916@users.noreply.github.com> Date: Wed, 25 May 2022 14:45:56 +0200 Subject: [PATCH 091/241] Update Les protocoles VPN.md --- "R\303\251seaux/Les protocoles VPN.md" | 173 +++++++++++++++++++++++-- 1 file changed, 165 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/Les protocoles VPN.md" "b/R\303\251seaux/Les protocoles VPN.md" index 2989b5d..4c04097 100644 --- "a/R\303\251seaux/Les protocoles VPN.md" +++ "b/R\303\251seaux/Les protocoles VPN.md" @@ -1,26 +1,183 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) -# +# Les protocoles VPN -## Sous-titre 1 -Texte +## Introduction : +Les connexions VPN (Virutal Private Network) permettent de créer un lien sécurisé entre deux points, il existe deux types de connexions VPN : -## Sous-titre 2 +1- Site to Site VPN => entre deux réseaux d’entreprise -Texte +![image](https://user-images.githubusercontent.com/71373221/170224719-ced5e30a-1cfd-4f00-965d-46d7571269c3.png) +2- Client to Site VPN => entre un équipement client et un réseau d’entreprise. + +![image](https://user-images.githubusercontent.com/71373221/170224768-f54321ea-6297-4615-ac02-bba596431bf8.png) + + + + + +Le lien créé est appelé un Tunnel VPN, les données qui sont envoyés à travers ce lien sont chiffrés. +Le choix du protocole VPN à utiliser se base sur trois facteurs: + +1- Les algorithmes de chiffrement utilisés donc le niveau de sécurité et de cryptage offert + +2- La vitesse de navigation + +3- La facilité de mise en place + + + + + + +## Les protocoles VPN + + + + +### PPTP signifie Point-to-Point Protocol + +C’est le protocole VPN le plus ancien, ses plus gros avantages sont la vitesse qu’il offre et la facilité de configuration. Son cryptage est faible (128 bits) donc facilement piratable + +• Ce protocole est compatible avec toutes les plateformes : Windows, Linux, macOS, iOS, Android, Tomato, DD-WRT et d’autres systèmes d’exploitation et appareils. + +• Pour établir une connexion PPTP il faut l’adresse du serveur, un nom d’utilisateur et un mot de passe. + +• Utilisation des clés de cryptage jusqu’à 128 bits. + +• Utilise le chiffrement MPPE (Microsoft Point-to-Point Encryption). + + + + +### L2TP/ Ipsec + +L2TP ou Layer 2 Tunneling Protocol fusionne les meilleures fonctionnalités des deux protocoles de tunneling PPTP (Point-to-Point Tunneling Protocol) et L2F (Layer 2 Forwarding Protocol). Il est compatible avec plusieurs plateformes. +Il encapsule les données deux fois, ce qui peut ralentir la connexion. Cependant, il compense cela en fournissant le processus de cryptage/décryptage dans le noyau et en permettant le multithreading. + +• Très sécurisée - fonctionne avec les algorithmes de cryptage AES et 3DES (clé 256 bits) + +• Prend en charge une large gamme de systèmes d'exploitation et mobiles + +• L2TP utilise IPSec pour une sécurité supplémentaire + +• Établissement de liaison fiable - utilise le port UDP 1701, le port 500 et le port 4500 + +• L2TP est une bonne option si la sécurité est plus importante pour la connexion VPN que la vitesse. + +• Très facile à configurer + + + + +### IKEv2/IPsec : Internet Key Exchange version 2 with IPsec + +IKEv2 est un protocole de tunnellisation. Il est associé à IPsec pour assurer la sécurité du trafic internet. Il est plus rapide que les autres protocoles grâce à la prise en charge de MOBIIKE. +• Très sécurisée - Prend en charge plusieurs versions d’AES. + +• IKEv2 est pris en charge par moins de systèmes et de logiciels que L2TP/IPSec + + +• IKEv2 utilise le port 500 du protocole UDP, donc peut être bloqué par un pare-feu. + +• Connexion stable et cohérente + + + +### OpenVPN + +C’est le protocole VPN le plus utilisé, il est compatible avec plusieurs équipements. Il offre une forte sécurité et ne ralentit pas la connexion internet, il est open source donc fiable. +• Bien adapté aux appareils mobiles et toutes les plateformes. + +• Très sécurisée - Il crypte les données avec un chiffrement complexe, notamment AES et Camellia, des algorithmes de chiffrement 256 bits. + + +• Il s’appuie sur SSL/TLS pour l’authentification et le cryptage. + +• Utilisation du chiffrement AES-256 et n’importe quel port. + + +• Open source, ce qui le rend plus fiable + +• Possibilité d’améliorer la Vitesse en utilisant UDP. + + +• La configuration est complexe. + + + + +### WireGuard + +C’est un protocole récent, développé en 2017 pour Linux, son principal avantage est sa vitesse ultra-rapide. + +• Il est compatible avec windows, macOS, iOS et Android. + +• Il utilise deux clefs une publique et une privée pour gérer l’authentification du serveur et des différents clients. + +• Utilise le protocole UDP, donc peut être bloqué par un pare-feu. + +• Simple et facile à configurer + +• Utilise ChaCha20 pour le chiffrement et Poly1305 pour l'authentification. Il utilise aussi Curve25519 pour l'échange de clé Diffie-Hellman à courbe elliptique (ECDH) ; BLAKE2s pour le hachage; et un handshake 1.5 Round Trip Time (1.5-RTT) + + + + +## Conclusion + +![image](https://user-images.githubusercontent.com/71373221/170264587-6f1faf76-f84a-4282-a497-f8bf6d074df9.png) + +Le PPTP est un ancien protocole vulnérable actuellement, il est conseillé de ne plus l’utiliser. + +L2TP est une bonne option si la sécurité est plus importante pour la connexion VPN que la vitesse. IKEv2/IPsec est le plus rapide, plus que L2TP et PPTP, Il est plus léger et plus stable qu'OpenVPN. Il offre le même niveau de sécurité que L2TP et OpenVPN. + +WireGuard peut être bloqué par les pare-feux car il utilise UDP, comme IKEv2. Il est toujours en cours de développement et doit encore faire l'objet d’audits de sécurité. + +OpenVPN est cependant moins susceptible d'être bloqué par les pare-feux lorsque vous vous connectez via TCP. Il est le protocole le plus fiable vue qu’il est opensource. + + + + ## Bibliographie -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... + +* IPSec Overview Part Four: Internet Key Exchange (IKE) +https://www.ciscopress.com/articles/article.asp?p=25474&seqNum=7 + +Consulté le 21 mai 2022 + +Résumé : Article écrit par Cisco et décrit les protocoles IPSec et IKE1&2. +Avis sur la resource : Excellent article, il donne des détails technique approfondis sur les protocoles IPSec et IKE1&2. + +* Les différents protocoles utilisées par les fournisseurs VPN +https://www.vpnmonde.com/les-differents-protocoles-pour-les-vpn/ + +Consulté le 20 mai 2022 + +Résumé : Article écrit par des bénévoles en sécurité informatique, il analyse et compare les différents protocoles VPN du marché. + +Avis sur la resource : Excellent article, il explique en détails les protocoles VPN et donne les avantages et inconvénients de chaque protocole. + + +* Understanding VPN Protocols: Which One is Best? | CyberNews +https://cybernews.com/what-is-vpn/vpn-protocols/ + +Consulté le 13 mai 2022 + +Résumé : Cet article explique les protocoles VPN, il compare aussi les différents protocoles utilisés. + +Avis sur la resource : ce document décrit bien les protocoles VPN et fait une comparaison détaillée. + + From df6943b043f8218168871932e370db4bb64aad50 Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Wed, 25 May 2022 17:09:36 +0200 Subject: [PATCH 092/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 73 +++++++++++++++++------------------ 1 file changed, 36 insertions(+), 37 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index bcb7fc9..801a68c 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -1,9 +1,9 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) # Wireshark -## Wireshark ? c'est quoi ? [^1] [^2] [^3] [^4] +## Wireshark ? C'est quoi ? [^1] [^2] [^3] [^4] -Wireshark est un analyseur de paquets réseau créer en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétable par des humains. +Wireshark est un analyseur de paquets réseau créé en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétables par des humains. Wireshark est utilisé notamment pour : - L'analyse et le troubleshooting réseau. - La sécurité réseau. @@ -11,25 +11,25 @@ Wireshark est utilisé notamment pour : - Le développement et le début de protocoles. - L’éducation. -Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ces filtre très nombreux, ces fonctionnalités variés et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia [^2]). +Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ses très nombreux filtres , ses fonctionnalités variées et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia [^2]). Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. ## Fonctionnalités : [^1] [^2] [^3] [^5] -Voici une liste de fonctionnalités non exhaustif de Wireshark mais suffisante pour commencer. +Voici une liste de fonctionnalités non exhaustive de Wireshark mais suffisante pour commencer. ### La capture de paquets : -La Fonctionnalité principal et de base de Wireshark est la capture de paquets. Pour commencer une capture ouvrez Wireshark et sélectionner un réseau que vous voulez observer en double cliquant dessus. +La fonctionnalité principale et de base de Wireshark est la capture de paquets. Pour commencer une capture, ouvrez Wireshark et sélectionnez un réseau que vous voulez observer en double cliquant dessus. ![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) -Lorsque vous souhaiter arrêter la capture appuyer sur le petit carré rouge en haut à gauche. +Lorsque vous souhaitez arrêter la capture, appuyez sur le petit carré rouge en haut à gauche. Vous pouvez ensuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dans **fichier -> enregistrer sous**. -Pour recommencer une capture cliquer sur l'aileron bleu, à gauche du carré rouge. +Pour recommencer une capture, cliquez sur l'aileron bleu, à gauche du carré rouge. ![image](https://user-images.githubusercontent.com/62069633/170111507-3912c10a-ce96-4149-b715-db2f774c736e.png) ### L'analyse de paquets -Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour ce faire nous aurons l'aide de trois fenêtres : +Maintenant que nous avons une capture Wireshark, cela nous permet de l'analyser. Pour ce faire nous aurons l'aide de trois fenêtres : 1. Le packet list 2. Le packet details 3. Le packet bytes pane @@ -38,62 +38,62 @@ Maintenant que nous avons une capture Wireshark nous permet de l'analyser. Pour #### 1. Le packet list -Le packet list nous permets de voir tous les paquets enregistrer dans cette capture. Cette fenêtre vous communique déjà des informations sur général classés dans différentes colonnes. Vous pouvez si vous le souhaitez supprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. +Le packet list nous permet de voir tous les paquets enregistrés dans cette capture. Cette fenêtre vous communique déjà des informations générales classées dans différentes colonnes. Vous pouvez si vous le souhaitez supprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. Cependant les colonnes par défaut seront généralement amplement suffisantes. -- No. : cette colonne numérote les paquets capturés et indique à quel conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'un ligne pleines apparait sur un autre paquets c'est qu'ils sont dans une même conversation (par exemple three handshake). +- No. : cette colonne numérote les paquets capturés et indique à quelle conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'une ligne pleine apparait sur un autre paquet, c'est qu'ils sont dans une même conversation (par exemple three handshake). ![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) -Les paquets qui n'ont pas de lignes mes des pointillés ne font pas parti de cette conversation. +Les paquets qui n'ont pas de lignes mais des pointillés ne font pas partie de cette conversation. ![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) -- Time : cette colonne indique quand sont arrivé les paquets après le début de la capture. -- Source : indique l'adresse IP qui à envoyer le paquet. -- Destination : indique l'adresse IP qui à resus le paquet. +- Time : cette colonne indique quand sont arrivés les paquets après le début de la capture. +- Source : indique l'adresse IP qui a envoyé le paquet. +- Destination : indique l'adresse IP qui a reçu le paquet. - Protocole : indique le protocole utilisé. - Length : indique la taille du paquet (en octets). - Info : cette colonne donne des informations différentes en fonction du protocole utilisé. #### 2. Le packet details -Lorsque vous sélectionner un packet dans Le packet list vous pourrez le retrouvez tous les protocoles utilisés par ce paquet dans cette fenêtre. -Vous pouvez dévlopez un protocol en faisant un clic gauche dessus. -De plus vous pouvez faire ne faire appraitre dans le packet list que les paquets utilisant le même protocole en faisant un clic droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaiter**. +Lorsque vous sélectionnez un packet dans le packet list, vous pourrez retrouver tous les protocoles utilisés par ce paquet dans cette fenêtre. +Vous pouvez développer un protocole en faisant un clic gauche dessus. +De plus, vous pouvez, dans le packet list, ne faire apparaitre que les paquets utilisant le même protocole en faisant un clic droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaité**. #### 3. Le packet bytes pane -Ici vous retrouverez le paquet brut au format hexadécimale ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit cela sélectionnera dans le Le packet détails à quoi il correspond (et vice versa). +Ici, vous retrouverez le paquet brut au format hexadécimal ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit cela sélectionnera dans le packet détails ce à quoi il correspond (et vice versa). ### Les filtres : [^6] [^7] -Il existe deux type de filtre dans Wireshark : les filtres de captures et les filtres d'affichages. Le premier se met avant une capture et permettent de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. +Il existe deux types de filtre dans Wireshark : les filtres de capture et les filtres d'affichage. Le premier se met avant une capture et permet de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. -#### Filtres de captures : -Pour appliquer un filtre de capture entrer avant la capture le filtre ici : +#### Filtres de capture : +Pour appliquer un filtre de capture, entrez, avant la capture, le filtre ici : ![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) -Si vous souhaiter entrer deux filtres utiliser le mot clé : `and` -Si vous souhaiter appliquer un filtre inverser (donc : capturer tous sauf) utiliser le mot clé: `not` +Si vous souhaitez entrer deux filtres, utilisez le mot clé : `and` +Si vous souhaitez appliquer un filtre inversé (donc : capturer tous sauf), utilisez le mot clé: `not` -Wireshark utilise des filtres par défauts s’il est utilisé à distance pour ne pas enregistrer ce qui est lié à cette connexion (comme ssh). +Wireshark utilise des filtres par défaut s’il est utilisé à distance pour ne pas enregistrer ce qui est lié à cette connexion (comme ssh). ##### Exemples utiles (trouver ici [^6]) -Pour capturer tous se qui vient et sort d'une adresse IP : +Pour capturer tout se qui vient et sort d'une adresse IP : `host 172.18.5.4` -Pour capturer tous se qui concerne un range d’IP : +Pour capturer tout ce qui concerne un range d’IP : `net 192.168.0.0/24` -Pour capturer tous se qui concerne un port : +Pour capturer tout ce qui concerne un port : `port 53` Pour ne capturer que du trafic IPv4 : `ip` Pour ne capturer que du trafic unicast : `not broadcast and not multicast` -#### Filtres d’affichages : -Pour appliquer un filtre d'affichage et ainsi cacher se dont vous ne voulez pas entrer ce que vous voulez ici : +#### Filtres d’affichage : +Pour appliquer un filtre de capture, entrez, le filtre ici : ![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) -Si vous souhaiter afficher que les paquets qui correspondent à deux filtres utiliser le mot clé : `and` ou `&&` -Si vous souhaiter afficher que les paquets qui correspondent à deux filtres utiliser le mot clé : `or` ou `||` +Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `and` ou `&&` +Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `or` ou `||` ##### Exemples utiles (trouver ici [^7]) @@ -101,19 +101,19 @@ Pour n'afficher que les paquets possédant un protocole : `TCP` Pour n'afficher que ce qui correspond à une adresse IP : `ip.addr==172.18.5.4` -Pour capturer tous se qui concerne un range d’IP : +Pour capturer tout ce qui concerne un range d’IP : `ip.addr==192.168.0.0/24` -Pour capturer tous se qui concerne un port : +Pour capturer tout ce qui concerne un port : `tcp.port==53` -Pour ne capturer que le trafic entre deux machine (par exemple client et serveur): +Pour ne capturer que le trafic entre deux machines (par exemple client et serveur): `ip.src==192.168.18.5 and ip.dst==192.168.2.45` ### La colorisation : [^8] -La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose de bases 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. +La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose, de base, 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. ![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) -Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Ainsi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisations et vous pourrez aller chercher des règles préfet sur internet pour des cas spécifiques. +Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Ainsi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisations et vous pourrez aller chercher des règles préfaites sur internet pour des cas spécifiques. ## Bibliographie @@ -148,4 +148,3 @@ Avis sur la ressource : concis et donne des exemples utiles [^7]:* [ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) Résumé : guide sur les la coloration Avis sur la ressource : concis et donne des exemples utiles - From c4dfe19cff2ad67947ee2fffe600070282016459 Mon Sep 17 00:00:00 2001 From: RaphaelMarto <92374387+RaphaelMarto@users.noreply.github.com> Date: Wed, 25 May 2022 17:48:32 +0200 Subject: [PATCH 093/241] Create XMPP.md --- "R\303\251seaux/XMPP.md" | 130 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 "R\303\251seaux/XMPP.md" diff --git "a/R\303\251seaux/XMPP.md" "b/R\303\251seaux/XMPP.md" new file mode 100644 index 0000000..68694c8 --- /dev/null +++ "b/R\303\251seaux/XMPP.md" @@ -0,0 +1,130 @@ +--- +layout: default +title: XMPP +parent: Réseaux +--- + +# XMPP + +## Qu'est-ce que XMPP ?[^1] [^2] [^3] [^4] [^5] + +XMPP (Extensible Messaging and Presence Protocol) est un protocole connu principalement pour la messagerie instantanée en cross-platform, +mais il est aussi utilisé bien que cela soit moins connu pour de l'échange de données entre applications systèmes, mais également pour de la supervision système et réseau ou du cloud computing.
+ +XMPP est connus pour avoir défini les standards pour la communication en message instantanée en 1999 et début des années 2000. + +Au jour d'aujourd'hui il est encore utilisé principalement par WhatsApp, mais également google , GNOME, IBM, ...
+Ce protocole est construit en language XML (Extensible Markup Language) parfois appeler "Jabber" alors que celui-ci est un service baser sur XMPP. +XMPP utilise TCP/IP avec une architecture client-server transmettant ces informations avec des paquets XML. + +X: Pour extensible car c'est un projet open source qui est tout le temps modifier et améliorer.
+M: Pour messages car il a très bon mécanisme d'envoi de messages.
+P: Pour presences car il détecte l'état d'une personne si elle est en ligne , déconnecter ou occuper.
+P: Pour protocole car c'est un protocole de communication tout simplement.
+ +## Histoire[^1] [^2] [^3] + +En 1998 Jeremie Miller invente Jabber un protocole de message instantané utilisant le XML. Mais il manquait un framework pour le faire fonctionner et c'est pour +trouver une alternative Open Source au protocole propriétaire existant que XMPP va etre développé.
Il va être dévoloppé par la communauté Jabber et dans un premier temps +etre nommée Jabber protocole (un alias encore utilisé par certain).
Il va être reconnus en 2004 par l'IETF et adopter le nom de XMPP.
+Il va être adopté successivement par Apple en 2005 et google de 2005 à 2013 puis par Facebook de 2008 à 2015 puis par Skype en 2011 puis par WLM en 2011.
+La dernière release de l'IETF est le RFC7622 avec la version la plus moderne de XMPP en 2015. + +## Fonction principale[^3] [^4] + +* Recevoir et envoyer des messages en direct entre utilisateurs +* Blocker un utilisateur +* Gérer ses contacts +* Gérer les fils de discussion suivit ou non +* Transmettre le status de l'utilisateur (En ligne, occuper, ...) + +## Comment cela fonctionne ? +XMPP est divisé en plusieurs parties au milieu de tout cela se trouve XMPP Core: +### XMPP Core +le coeur est composé des features suivantes: +* un flux d'envoi de données XML +* un canal sécurisé avec TLS +* Authentification avec SASL +* utilisation de l'UTF-8 +* Autorisation pour une discussion bidirectionnelle +* Des infromations sur la disponibilité & la présence + +### Jingle +Jingle est la version XMPP de transmission VoIP. Il transmettra leur paquet au travers de XMPP mais utilise tout de même les protocoles RTP(Real-time Transport Protocol).
+Jingle a été développer pour supporter SIP (Session Initiation Protocol) et SDP (Session Description Protocol) ce qui permet de passer facilement des réseaux XMPP à des réseaux SIP. + +### Multi-User-Chat (MUC) +Comme son nom l'indique c'est une extension qui permet de créé des conversations avec plusieurs utilisateurs ainsi que de crée des cannals de discussion. Dans ces features nous retrouvons : +* Inviter des utilisateurs +* Exclure des utilisateurs +* bannir des utilisateurs +* Mettre en place des mots de pass +* Donner des droits au modérateur + +### BOSH + +BOSH (Bidirectional-streams Over Synchronous HTTP) c'est en soi une version plus efficace du protocole TCP.
Il est néanmoins uniquement utilisé pour la communication entre XMPP serveur et client. + +![](https://i.goopics.net/mr699q.png) + +### Client-server + +Comme vous venez de le voir sur le schéma au-dessus XMPP est basé sur un architecture server-client.
+Vous envoyer donc vos donner XML de votre client vers le serveur et le serveur va rediriger vers le client destinataire de données.
+Chaque client est représenté par un identifiant unique que le serveur va utiliser pour transmettre les messages à bonne destination.
+XMPP utilise des gateways quand il doit envoyer des informations ou recevoir des informations d'un réseau qui n'est pas XMPP (Ex: SMS, SMTP, IRC). + +### Connexion TCP + +En temps normal XMPP va établir une connexion TCP persiste pour ne pas devoir en refaire une à chaque message envoyé.
+Dans les versions plus récentes XMPP utilise des WebSockets et/ou TLS pour une communication sécurisée. + +### Envoie de messages + +XMPP utilise l'envoi de messages Asynchrones pour permettre aux utilisateurs d'envoyer autant de message qu'ils le désirent sans attendre de réponse.
+Et les 2 utilisateurs n'ont pas besoin d'être connecté en même temps pour envoyer des messages.
+XMPP contrairement aux autres offres une expérience de discussion presque instantanée car contrairement aux autres qui vont ping le serveur toutes les x secondes (processus appellé "polling") pour récupérer des data.
+XMMP lui va directement envoyer tout nouveau message de l'utilisateur vers le serveur et du serveur vers le destinataire. + +### Décentraliser + +XMPP n'as pas de serveur officiel c'est-à-dire que n'importe qui peut créé son serveur et faire ce qu'il veut avec. + +## Avantages et Inconvénients[^1] [^3] +
+ +|Avantages|Inconvénients| +|---|---| +|Open Source le code et document officiel sont accessibles gratuitement| Il est difficil de transferer ces utilisteur d'un autre réseau (MSN, AIM, etc), mauvaise migration | +|Base validée par l'IETF et continue d'être mis à jour et il est stable | Fonctionalité incomplet présente comme Jingle qui n'est pas exploitable en l'état| +|Décentraliser|| +|Sécurité disponible (ex:TLS, SASL)|| +|Flexible il peut être utilisé pour autre chose que les messages instantanés|| +|Confidentiallité: peut mettre en place OMEMO, OpenPGP, ... || +|Supporte beaucoup de language ( C, C++, C#, Ruby, Java, ...)|| + +## Conclusion + +XMPP est la base des protocoles de message instantané et cela vaut donc la peine de l'étudier pour le comprendre et choisir quel chemin emprunté dans le cas où l'ont +voudrais développer une app avec de la messagerie instantanée.
+Il est bien sur aussi tout à fait exploitable et à beaucoup d'espace pour pouvoir grandir la team XSF travail sur le développement de l'encryptage pour une communication plus sécurisé.
+Dans le futur que ce soit du coté VoIP ou encore dans le domaine de l'IoT.
+Car je le rappelle il n'est pas limité qu'a la messagerie instantanée XMPP c'est plus que ça.
+ +## Bibliographie +[^1]: "XMPP", xmpp.org, https://xmpp.org/about/technology-overview/ (consulté le 25/05/2022) + ** Résumé : Explication détaillée sur XMPP et ces features + ** Avis sur la ressource : Très bonne ressource et fiable car c'est le site officiel +[^2]: "Extensible Messaging and Presence Protocol", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol (consulté le 25/05/2022) + ** Résumé : Histoire de XMPP et présentation technique + ** Avis sur la ressource : Certains points sont légers mais en général très complet +[^3]: "XMPP Refresher: The Open Instant Messaging Protocol Then & Now", getstream.io, https://getstream.io/blog/xmpp-extensible-messaging-presence-protocol/ (consulté le 25/05/2022) + ** Résumé : Explication détaillé sur XMPP , ces features , coté technique et perspective pour le futur + ** Avis sur la ressource : Très Complet +[^4]: "XMPP Protocol", www.geeksforgeeks.org, https://www.geeksforgeeks.org/xmpp-protocol/ (consulté le 25/05/2022) + ** Résumé : Bref explication sur XMPP et ce qu'il représente + ** Avis sur la ressource : Très léger et pas assez d'explication +[^5]: "Extensible Messaging and Presence Protocol (XMPP)", www.techopedia.com, https://www.techopedia.com/definition/396/extensible-messaging-and-presence-protocol-xmpp (consulté le 25/05/2022) + ** Résumé : Explication de ce qu'est XMPP + ** Avis sur la ressource : Pas complet et très léger + From e80f6ec5c308806cf557fcb208abd00f6fc809b6 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Wed, 25 May 2022 17:57:03 +0200 Subject: [PATCH 094/241] Create MQTT --- "R\303\251seaux/MQTT" | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 "R\303\251seaux/MQTT" diff --git "a/R\303\251seaux/MQTT" "b/R\303\251seaux/MQTT" new file mode 100644 index 0000000..8b8c458 --- /dev/null +++ "b/R\303\251seaux/MQTT" @@ -0,0 +1,26 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) + +# MQTT + +## Un peu d'histoire + +Le protocole MQTT est issue d'une collaboration entre Andy Stanford-Clark et Arlen Nipper + + + +## Sous-titre 2 + +Texte + + + + + + +## Bibliographie + +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... + + From 9523343ac0fd7f49e1628e818651a3027e4f1b20 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Wed, 25 May 2022 18:04:04 +0200 Subject: [PATCH 095/241] Delete MQTT --- "R\303\251seaux/MQTT" | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 "R\303\251seaux/MQTT" diff --git "a/R\303\251seaux/MQTT" "b/R\303\251seaux/MQTT" deleted file mode 100644 index 8b8c458..0000000 --- "a/R\303\251seaux/MQTT" +++ /dev/null @@ -1,26 +0,0 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) - -# MQTT - -## Un peu d'histoire - -Le protocole MQTT est issue d'une collaboration entre Andy Stanford-Clark et Arlen Nipper - - - -## Sous-titre 2 - -Texte - - - - - - -## Bibliographie - -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... - - From def87e33c06c478385c811403788b68cc882c2ff Mon Sep 17 00:00:00 2001 From: Lopidurs <62069633+Lopidurs@users.noreply.github.com> Date: Thu, 26 May 2022 15:02:51 +0200 Subject: [PATCH 096/241] Update wireshark.md --- "R\303\251seaux/wireshark.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index 801a68c..c0157b7 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -24,7 +24,7 @@ La fonctionnalité principale et de base de Wireshark est la capture de paquets. ![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) Lorsque vous souhaitez arrêter la capture, appuyez sur le petit carré rouge en haut à gauche. Vous pouvez ensuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dans **fichier -> enregistrer sous**. -Pour recommencer une capture, cliquez sur l'aileron bleu, à gauche du carré rouge. +Pour recommencer une capture, cliquez sur l'aileron bleu, à gauche du carré rouge. ![image](https://user-images.githubusercontent.com/62069633/170111507-3912c10a-ce96-4149-b715-db2f774c736e.png) ### L'analyse de paquets @@ -66,8 +66,8 @@ Ici, vous retrouverez le paquet brut au format hexadécimal ou binaire (click dr Il existe deux types de filtre dans Wireshark : les filtres de capture et les filtres d'affichage. Le premier se met avant une capture et permet de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. #### Filtres de capture : -Pour appliquer un filtre de capture, entrez, avant la capture, le filtre ici : -![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) +Pour appliquer un filtre de capture, entrez, avant la capture, le filtre ici : +![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) Si vous souhaitez entrer deux filtres, utilisez le mot clé : `and` Si vous souhaitez appliquer un filtre inversé (donc : capturer tous sauf), utilisez le mot clé: `not` @@ -88,8 +88,8 @@ Pour ne capturer que du trafic unicast : `not broadcast and not multicast` #### Filtres d’affichage : -Pour appliquer un filtre de capture, entrez, le filtre ici : -![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) +Pour appliquer un filtre de capture, entrez, le filtre ici : +![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `and` ou `&&` @@ -110,8 +110,8 @@ Pour ne capturer que le trafic entre deux machines (par exemple client et serveu ### La colorisation : [^8] -La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose, de base, 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. -![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) +La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose, de base, 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. +![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Ainsi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisations et vous pourrez aller chercher des règles préfaites sur internet pour des cas spécifiques. From 664772762b94960b74e19620e8adc255236c6d50 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Thu, 26 May 2022 17:39:19 +0200 Subject: [PATCH 097/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 158f53e..bb0b8ab 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -8,5 +8,61 @@ parent : Réseaux ## Un peu d'histoire +En informatique et plus particulièrement en réseau, les paquets sont les éléments principaux pour communiquer des données. On y distingue deux grands types de paquets, ceux pour les données et ceux contenant l’adresse de l’expéditeur et du destinataire. +Le point négatif de cette communication est l’absence de sécurité en effet les données ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité des paquets également. +C’est un gros problème vu que lors de cet échange de données, les paquets passe par différents routeurs. Elles peuvent donc être interceptées, lues, manipulées, modifiées à tout moment par une personne mal intentionnée. + +Pour faire face à cette situation et ainsi permettre un transfert de paquets de données sécurisés sur des réseaux publics, l’Internet Protocol Security ou IPsec a été développé. + +## IPsec + +« Internet Protocol Security » (IPSec) est une suite de protocoles conçue pour le protocole Internet TCP-IP standardisé par l’IETF (Internet Engineering Task Force) pour l’IPv4 mais aussi l’IPv6. Permettant une communication sécurisée avec des réseaux IP qui ne sont pas dignes de confiance. La confidentialité, l’authenticité et l’intégrité de la circulation des données sont assurées par un système d'authentification et de cryptage . + +On peut répartir suite des protocles IPSec en 3 groupes : + + - Protocoles de transfert : + + - AH ( Authentication Header ) + - ESP ( Encapsulating Security Payload ) + + - Gestion des clés : + + - ISAKMP ( Internet Security Association and Key Management Protocol ) + - IKE ( Internet Key Exchange ) + + - Base de données : + + - SAD ( Security Association Database ) + - SPD ( Security Policy Database ) + +### Protocoles de transfert ESP + +ESP ou Encapsulating Security Payload est utilisé pour la sécurité et l’intégrité des données. Il assure l’intégrité des données et l'authentification de la source mais aussi crypte les données. ESP possède deux mode de fonctionnnemnt, le mode `Transport` où machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. + +![Untitled-Page-2](https://user-images.githubusercontent.com/43784062/170521567-bba84658-9275-4fcb-b2ed-45c1b68d3029.jpg) + +- Fonctionnement en mode Transport : + +Ce mode ne peut être utiliser qu’entre deux machines. + + - Il commence par crypter les données + - Ensuite il rajoute un entête intermédiaire sans modifier l’entête du paquet + +![mode transport](https://user-images.githubusercontent.com/43784062/170522344-5ca1b9d9-67f9-483d-a710-d765e58d9b34.jpg) + + +- Fonctionnement en mode Tunnel : + + - Il commence par crypter le paquet contenant les données + - Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre +l’expéditeur et le destinataire. + + +![mode tunel](https://user-images.githubusercontent.com/43784062/170522375-ec2addef-bcf3-47ca-8e9e-dbe29e728458.jpg) + + +### IKE + +IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. From 79946f55e94ad77f7117a0fcdd155844b91b12d9 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 09:36:02 +0200 Subject: [PATCH 098/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index bb0b8ab..2c79b14 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -41,11 +41,11 @@ On peut répartir suite des protocles IPSec en 3 groupes : ESP ou Encapsulating Security Payload est utilisé pour la sécurité et l’intégrité des données. Il assure l’intégrité des données et l'authentification de la source mais aussi crypte les données. ESP possède deux mode de fonctionnnemnt, le mode `Transport` où machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. -![Untitled-Page-2](https://user-images.githubusercontent.com/43784062/170521567-bba84658-9275-4fcb-b2ed-45c1b68d3029.jpg) - - Fonctionnement en mode Transport : Ce mode ne peut être utiliser qu’entre deux machines. +![Mode transport-1](https://user-images.githubusercontent.com/43784062/170652551-5507034c-ea74-4219-bbcf-73dcdcd0af5f.jpg) + - Il commence par crypter les données - Ensuite il rajoute un entête intermédiaire sans modifier l’entête du paquet @@ -54,6 +54,11 @@ Ce mode ne peut être utiliser qu’entre deux machines. - Fonctionnement en mode Tunnel : + + Ce mode permet de connectées d"uc réseaux entre eux. + + ![Mode tunel-1](https://user-images.githubusercontent.com/43784062/170652643-d34f760a-1580-47cc-bca2-3de177f9d8bf.jpg) + - Il commence par crypter le paquet contenant les données - Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre From ea47c54f4b1d523790ac82a806d8377d25d31c94 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 09:39:52 +0200 Subject: [PATCH 099/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 2c79b14..aaa09e3 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -71,3 +71,6 @@ l’expéditeur et le destinataire. ### IKE IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. + +- On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun +- Une fois les routeurs d’accord sur le type de sécurité, IKE ouvre un tunnel sécurisé From 62389bc1ca8133ca9be5d64188e78453567f7e25 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 09:48:56 +0200 Subject: [PATCH 100/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index aaa09e3..7a86d3d 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -1,10 +1,10 @@ --- layout: default -title: LDAP +title: IPSec parent : Réseaux --- -# IPsec ( Internet Protocol Security ) +# IPSec ( Internet Protocol Security ) ## Un peu d'histoire From 7f72ecbca9326aad18104e32e871da1de616d77f Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 11:28:42 +0200 Subject: [PATCH 101/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 7a86d3d..05292b7 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -16,7 +16,7 @@ C’est un gros problème vu que lors de cet échange de données, les paquets p Pour faire face à cette situation et ainsi permettre un transfert de paquets de données sécurisés sur des réseaux publics, l’Internet Protocol Security ou IPsec a été développé. -## IPsec +## IPSec « Internet Protocol Security » (IPSec) est une suite de protocoles conçue pour le protocole Internet TCP-IP standardisé par l’IETF (Internet Engineering Task Force) pour l’IPv4 mais aussi l’IPv6. Permettant une communication sécurisée avec des réseaux IP qui ne sont pas dignes de confiance. La confidentialité, l’authenticité et l’intégrité de la circulation des données sont assurées par un système d'authentification et de cryptage . @@ -44,33 +44,42 @@ ESP ou Encapsulating Security Payload est utilisé pour la sécurité et l’int - Fonctionnement en mode Transport : Ce mode ne peut être utiliser qu’entre deux machines. -![Mode transport-1](https://user-images.githubusercontent.com/43784062/170652551-5507034c-ea74-4219-bbcf-73dcdcd0af5f.jpg) +![mode transport](https://user-images.githubusercontent.com/43784062/170671693-7d0c304d-b17b-475f-8b17-69aee9f934fc.jpeg) - Il commence par crypter les données - Ensuite il rajoute un entête intermédiaire sans modifier l’entête du paquet -![mode transport](https://user-images.githubusercontent.com/43784062/170522344-5ca1b9d9-67f9-483d-a710-d765e58d9b34.jpg) +![mode transport-1 (1)](https://user-images.githubusercontent.com/43784062/170671717-796d871d-dcfe-45f1-a1ec-e915cb5f8160.jpg) - Fonctionnement en mode Tunnel : Ce mode permet de connectées d"uc réseaux entre eux. - ![Mode tunel-1](https://user-images.githubusercontent.com/43784062/170652643-d34f760a-1580-47cc-bca2-3de177f9d8bf.jpg) +![mode tunnel](https://user-images.githubusercontent.com/43784062/170671822-316aeaa2-8785-4c66-943a-b0c8b0f8742d.jpg) - Il commence par crypter le paquet contenant les données - Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre l’expéditeur et le destinataire. - -![mode tunel](https://user-images.githubusercontent.com/43784062/170522375-ec2addef-bcf3-47ca-8e9e-dbe29e728458.jpg) +![mode tunnel -1](https://user-images.githubusercontent.com/43784062/170671863-06d7e744-6ceb-4831-9136-4cb51cbb58c2.jpg) ### IKE IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. -- On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun -- Une fois les routeurs d’accord sur le type de sécurité, IKE ouvre un tunnel sécurisé +- 1. On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun +- 2. Une fois les routeurs d’accord sur le type de sécurité, IKE ouvre un tunnel sécurisé + +![IKE](https://user-images.githubusercontent.com/43784062/170671902-771c40ec-7197-4f2e-8774-54dab0226f26.jpeg) + +## Les forces et faiblesses d'IPSec + +Les avantages d’IPSec sont indéniables en matière de performance et de fiabilité. +Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. + +IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. +IPsec complique la traversée des NAT et Pare-Feu. From 58e707e63fd3ac143fe065b0d9400a3d308e7b03 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 12:12:37 +0200 Subject: [PATCH 102/241] =?UTF-8?q?Points=20n=C3=A9gatifs/positif=20+=20So?= =?UTF-8?q?urces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/IPsec.md" | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 05292b7..f064b69 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -37,25 +37,30 @@ On peut répartir suite des protocles IPSec en 3 groupes : - SAD ( Security Association Database ) - SPD ( Security Policy Database ) -### Protocoles de transfert ESP +### Protocoles de transfert AH et ESP -ESP ou Encapsulating Security Payload est utilisé pour la sécurité et l’intégrité des données. Il assure l’intégrité des données et l'authentification de la source mais aussi crypte les données. ESP possède deux mode de fonctionnnemnt, le mode `Transport` où machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. +Le protocole d'en-tête d'authentification (AH) fournit l'authentification de l'origine des données ainsi que l'intégrité de celles-ci[3] .Néanmoins, AH n'assure pas la confidentialité des données, celle-ci sont transmissent en claire ! +c'est pourquoi AH est utilisé en combinaison avec ESP. +Le protocoles ESP ou Encapsulating Security Payload est utilisé pour la confidentialité des données en les chiffrants. + +La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode `Transport` où machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. - Fonctionnement en mode Transport : -Ce mode ne peut être utiliser qu’entre deux machines. +Le mode transport a possède un temps de traitement rapide, mais ne sécurise que les données de l'utilisateur, les adresses source et cible restent non protégées c'est pourquoi ce mode ce mode ne peut être utilisé qu’entre deux machines, par exemple routeur à routeur. ![mode transport](https://user-images.githubusercontent.com/43784062/170671693-7d0c304d-b17b-475f-8b17-69aee9f934fc.jpeg) - Il commence par crypter les données - - Ensuite il rajoute un entête intermédiaire sans modifier l’entête du paquet + - Ensuite il rajoute un entête intermédiaire entre l’entête du paquet et les données. ![mode transport-1 (1)](https://user-images.githubusercontent.com/43784062/170671717-796d871d-dcfe-45f1-a1ec-e915cb5f8160.jpg) - Fonctionnement en mode Tunnel : - Ce mode permet de connectées d"uc réseaux entre eux. + Le paquet recoit une nouvelle en-tête IP contenant les adresse source et cible ainsi que les données. + Ce mode permet de connectées deux réseaux entre eux. ![mode tunnel](https://user-images.githubusercontent.com/43784062/170671822-316aeaa2-8785-4c66-943a-b0c8b0f8742d.jpg) @@ -67,19 +72,32 @@ l’expéditeur et le destinataire. ![mode tunnel -1](https://user-images.githubusercontent.com/43784062/170671863-06d7e744-6ceb-4831-9136-4cb51cbb58c2.jpg) -### IKE +### Gestion des clés IKE & ISAKMP -IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. +IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . +ISAKMP ou Internet Security Association and Key Management Protocol est un protocole défini par RFC 2408 pour établir une association de sécurité (SA) et des clés cryptographiques dans un environnement Internet.[4] - 1. On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun - 2. Une fois les routeurs d’accord sur le type de sécurité, IKE ouvre un tunnel sécurisé ![IKE](https://user-images.githubusercontent.com/43784062/170671902-771c40ec-7197-4f2e-8774-54dab0226f26.jpeg) -## Les forces et faiblesses d'IPSec +### Base de données SAD & SDP + +Les informations nécessaires au transfert des paquets sont stockées dans deux bases de données en local, SPD et SAD. +Dans la base de donnée SDP on va retrouver les information permettant de déterminer le ou les protocoles à utiliser à savoir AH, ESP ou la combinaison des deux. +Tant dit que dans la base de donnée SAD, on va retrouver les informations essentiels pour le protocole IKE à savoir les différentes clés de chiffrement. + +## Les points positifs et négatif d'IPSec Les avantages d’IPSec sont indéniables en matière de performance et de fiabilité. Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. IPsec complique la traversée des NAT et Pare-Feu. + +## Sources : +[1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec +[2] https://www.frameip.com/vpn/, consulté le 26/05/2022, date article : /, auteur : /, Affiliation : frameip.com, titre artcile : RÉSEAU PRIVÉ VIRTUEL VPN +[3] https://www.ibm.com/docs/en/i/7.1?topic=protocols-authentication-header, consulté le 28/05/2022, date article : 31/08/2021, auteur : / , Affiliation : ibm.com , titre article : Authentication Header +[4] https://en.wikipedia.org/wiki/Internet_Security_Association_and_Key_Management_Protocol, consulté le 28/05/2022, date article : 25/05/2022, auteur : /, Affiliation : wikipedia.org, titre article : Association de sécurité Internet et protocole de gestion de clés From 704003cd61b4157466127d2d8621a43cb6c5baf2 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 12:14:11 +0200 Subject: [PATCH 103/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index f064b69..7db0e5c 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -98,6 +98,9 @@ IPsec complique la traversée des NAT et Pare-Feu. ## Sources : [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec + [2] https://www.frameip.com/vpn/, consulté le 26/05/2022, date article : /, auteur : /, Affiliation : frameip.com, titre artcile : RÉSEAU PRIVÉ VIRTUEL VPN + [3] https://www.ibm.com/docs/en/i/7.1?topic=protocols-authentication-header, consulté le 28/05/2022, date article : 31/08/2021, auteur : / , Affiliation : ibm.com , titre article : Authentication Header + [4] https://en.wikipedia.org/wiki/Internet_Security_Association_and_Key_Management_Protocol, consulté le 28/05/2022, date article : 25/05/2022, auteur : /, Affiliation : wikipedia.org, titre article : Association de sécurité Internet et protocole de gestion de clés From 44684131e0d4924aa0562f66910c419c3b24ad31 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Fri, 27 May 2022 12:26:03 +0200 Subject: [PATCH 104/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 7db0e5c..9fc8e5e 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -94,7 +94,7 @@ Les avantages d’IPSec sont indéniables en matière de performance et de fiabi Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. -IPsec complique la traversée des NAT et Pare-Feu. +Deplus IPSec complique la traversée des NAT et Pare-Feu. ## Sources : [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec From 36ea417485f58e6840cbeec4cf3bf32e0443c817 Mon Sep 17 00:00:00 2001 From: simonNolf Date: Fri, 27 May 2022 15:45:18 +0200 Subject: [PATCH 105/241] >SPF --- "R\303\251seaux/spf.md" | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 "R\303\251seaux/spf.md" diff --git "a/R\303\251seaux/spf.md" "b/R\303\251seaux/spf.md" new file mode 100644 index 0000000..4ca7e71 --- /dev/null +++ "b/R\303\251seaux/spf.md" @@ -0,0 +1,44 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) + +--- + +layout: default +title: SPF +parent: Réseaux +--- + +# SPF + +## Qu'est ce que c'est? + +SPF, acronyme de Sender Policy Framework, permet d'empêcher les envois de message par des spammeur au nom de votre domaine au moyn d'un système de validation. Spf permet a une organisation de publier des servurs de messagerie autorisée. ce framework fonctionne de paire avec DMARK. il donne a ceux qui recoivent l'information les différentes information par rapport a la fiabilité de l'origine du mail. [1] + +Il s'agit donc d'un moyen d'autentification par email. Pour cela, il a beoin du DNS. Ainsi tout expéditeurs peux spécifié quel serveurs peuvent envoyé des e-mail au nom de votre domaine. + +## Histoire + +Les premières mention de SPF remontent au environ de 2000. la spécification de ce dernier se sont fait dans les années suivantes au moyen de plusieurs version. le nom original de SPF était tout d'abord "Sender Permitted Form". ce dernier a donc évolué durant les premières versions. [1] + +En 2006, une tentative de combinaison de SPF avec la proposition CallerId de Microsoft a été réalisée par un groupe de travail de l'IETF. cette expérience aura perté ses fruits en 2014 et est maintenant connue sous le nom de RFC 7208.[1] + +Actuellement, les techniques d'autentification privilègient DKIM et DMARC par rapport a SPF. Cependatn, il determine toujours si un mail est conforme au DMARC.[1] + +## Dans la pratique + +POur configurer SPF, il faut au préalable ajouter un SPF record dans la zone DNA du domaine. Celui-ci permet la spécification des différentes addresses ips qui sont authorisés a envoyé des mails au nm du domain.[1] + +Lors de la reception, la machine destinataire utilisera l'adresse "enveloppe de" du mail afin de vérifier l'authorisation de l'adresse IP source. Lors de l'affichag complet du mail, cela sera déjà fait. si l'addresse IP source ne figure pas dans le SPF record alors, l'e-mail sera désigné comme suspect et peux eventuellement être rejeté.[1] + + + +## Limitation + +* la validation se fait uniquement sur "enveloppe de" et donc l'"en-tête de" n'est pas validée.[1] +* lors du transfert d'un mail, la personne qui transfert deviens de nouvel expéditeur et don, les vérification SPF plante.[1] +* Le maintien est plus difficiel du au manque de rapports.[1] +* SPF vérifie uniquement le nom de domaine, mais pas l'utilisateur mail(avant le`@`')[2] + +## sources + +* [1] Qu'est-ce que le SPF ? - DMARC Analyzer. (s. d.). DMARC Analyzer. https://www.dmarcanalyzer.com/fr/spf-4/ consulter le 27-05-2022 +* [2] https://fr.wikipedia.org/w/index.php?title=Sender_Policy_Framework&oldid=193547601 consulter le 27-05-2022 From 5187774e97514ea90f1c457b0555a90454647386 Mon Sep 17 00:00:00 2001 From: MagnesSimon <55548308+MagnesSimon@users.noreply.github.com> Date: Fri, 27 May 2022 16:43:06 +0200 Subject: [PATCH 106/241] Update Analyse Zabbix.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voici mon analyse Zabbix corrigée en fonction de vos commentaires --- "R\303\251seaux/Analyse Zabbix.md" | 31 +++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/Analyse Zabbix.md" "b/R\303\251seaux/Analyse Zabbix.md" index 6248677..11074a3 100644 --- "a/R\303\251seaux/Analyse Zabbix.md" +++ "b/R\303\251seaux/Analyse Zabbix.md" @@ -6,34 +6,47 @@ Zabbix est un logiciel de monitoring open source. Projet démarré en tant que l ## 2. Fonctionnement L’outil de supervision Zabbix fonctionne avec une partie coté serveur qui s’installe sur un environnement Linux et un coté agent qui peut s’installer sur n’importe quelle plateforme. [2] -Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix, c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]
+Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix (container dans lequel nos données sont envoyées)[9], c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]
Il existe aussi le cas de figure où c’est le serveur qui initie la communication via des requêtes grâce à un agent Zabbix et des paramètres utilisateur. Les paramètres utilisateur vont permettre de définir les éléments à monitorer et les données qui devront être récoltée par l’agent Zabbix. Comme pour le trappeur, les données récoltées vont être récoltées et traitées par le serveur. [2] [4]
-Pour assurer la sécurité des communications entre le serveur et les machines clientes, Zabbix va appliquer un système de cryptage. De cette manière, toutes les données transmissent sont protégées lorsqu’elles circulent sur des réseaux non sécurisés. [5]
- + +Une fois arrivées sur le serveur, les données doivent être stockées. Pour cela, Zabbix utilise une base de données relationnelle sous MySQL ou PostgreSQL. Les données ainsi stockées pourront alors être utilisée par une interface web afin de visualiser le monitoring de nos machines. [5] Zabbix va permettre ainsi de construire des graphes sur tout un tas de paramètres que l’on décide de monitorer : L’espace disque libre sur un serveur, le taux d’utilisation de la RAM d’une machine, la chaleur du processeur, etc.
+![Architecture Zabbix Agent et trappeur](http://www.kjkoster.org/zapcat/Architecture_files/zabbix%20arch.png). + Afin de mieux gérer les comportement non désiré ou état critique d’une infrastructure IT, Zabbix propose un système d’envoi de notification. L’utilisateur installant et paramétrant l’outil de monitoring, va pouvoir définir des seuils pour un élément que l’on veut surveiller. Ainsi lorsque, par exemple, l’espace libre sur le disque de stockage X : de notre serveur sera inférieur à la valeur définie, Zabbix va envoyer une notification par mail, messagerie instantanée ou SMS selon ce qui a été définit. [6]
## 3. Avantages et Inconvénients ### 3.1. Avantages : -* Découverte automatique [2] +* Découverte automatique du réseau[10] * Intégration SNMP [7] * Très complet * Monitoring distribué * Hautement configurable [8] +Le protocole SNMP permet à une application de gestion (ici Zabbix) de demander des informations provenant d'une unité gérée. L'unité gérée contient un logiciel qui envoie et reçoit des informations SNMP. Ce module logiciel est généralement appelé agent SNMP. [11] + ### 3.2. Inconvénients * Interface très encombrée [8] * La configuration demande une très grande maitrise de l’outil [8] * Gourmand en ressources [8] -## 4. Conclusion +## 4. Concurrent +Même si Zabbix est un outil de monitoring très populaires à l'heure actuelle, il existe de nombreux autres logiciels de supervision qui ont chacun leurs spécificités. [12] +* Nagios: un de premiers logiciel de ce type ayant vu le jour en 1999 sous le nom de NetSaint. +* DataDog: outil de surveillance prévu plus spécifiquement pour les équipes de développement afin de mettre sous forme de graphes les différentes données récoltées par leurs applications. +* Microsoft System Center: l'outil de surveillance proposé par Microsoft +* Netdata: Conçu et optimisé pour les systèmes Linux +* Chekmk: Extrèmement simple à mettre en place + + +## 5. Conclusion Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration qu’ont apportés toutes les versions, Zabbix est maintenant une référence connue dans le monde entier en ce qui concerne le monitoring de système informatique. Malgré la forte concurrence dans ce domaine, Zabbix a réussi à innover et à se différencier des autres outils de monitoring existant.
-J’avais personnellement choisi ce sujet car je suis amené à utiliser quotidiennement l’outil Zabbix dans le travail étudiant que j’occupe en attendant de terminer mes études. Mais malgré mon utilisation quotidienne de cet outil afin de monitorer les infrastructures informatiques de client, je ne savais rien du fonctionnement et de l’implémentation de cet outil. Cet article m’a permis de mieux comprendre un outil que de nombreux administrateurs systèmes et réseaux utilisent quotidiennement.
## Sources * https://stringfixer.com/fr/Zabbix [1] @@ -43,4 +56,8 @@ J’avais personnellement choisi ce sujet car je suis amené à utiliser quotidi * https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] * https://www.syloe.com/glossaire/logiciel-zabbix/ [6] * https://www.zabbix.com/fr/release_notes [7] -* https://www.axelit.fr/technologies/zabbix/ [8] \ No newline at end of file +* https://www.axelit.fr/technologies/zabbix/ [8] +* https://ungeek.fr/zabbix-trapper-custom-graph/#1-cr%C3%A9er-le-trapper [9] +* https://www.zabbix.com/documentation/current/fr/manual/discovery/network_discovery/rule [10] +* https://www.ibm.com/docs/fr/spectrum-control/5.3.7?topic=standards-simple-network-management-protocol [11] +* https://www.g2.com/products/zabbix/competitors/alternatives [12] From 6e468bef22c20b574fda5233ebba6c32b70786b0 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Fri, 27 May 2022 18:14:37 +0200 Subject: [PATCH 107/241] Create POP.md --- "R\303\251seaux/POP.md" | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 "R\303\251seaux/POP.md" diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" new file mode 100644 index 0000000..874e0b5 --- /dev/null +++ "b/R\303\251seaux/POP.md" @@ -0,0 +1,36 @@ +--- +layout: default +title: POP +parent: Réseaux +--- + +# POP + +## qu'est ce que POP + +Le protocole POP (Post Office Protocol) est un protole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on pourra les lires via un client de messagerie telle que Outlook, Thunderbird, Gmail, etc. Après avoir télécharger un mail avec POP, celui-ci ne se trouvera plus sur le serveur. + +Le gros point négatif de POP vient de la. Après avoir consulter ses mails sur une machine il est alors impossible pour l'utilisateur de consulter ce même mail sur une autre machine + +Le protocole Imap, sont concurent, quand à lui permet de télécharger ses mail à partir d'un serveur mail mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. + +Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite au lettres lorsque nous y accèdons et empêche alors toutes autre connexion + +[[https://www.kalanda.net/images/faq/imap/pop-ou-imap.png]] + +* LIST : donne le nombre de courriers présents sur le serveur avec leur numéro +* RETR numéro : récupère le courrier numéro en attente sur votre serveur +* DELE numéro : détruit le courrier numéro +* NOOP : vérifie la connexion +* LAST : récupère le dernier message arrivé sur le serveur +* QUIT : quitte la session et en autorise une autre + +## Ou est-il utilisé ? + +## Qu'elle est le futur du protocole POP + +## Source + +* Fonctionnement du protocole POP et IMAP - Base de connaissances - KALANDA. (2019). Kalanda.Net. Consulté le 27 mai 2022, à l’adresse https://www.kalanda.net/apps/index.php/knowledgebase/27/Fonctionnement-du-protocole-POP-et-IMAP.html#:%7E:text=Le%20protocole%20POP%20permet%20de,les%20voir%20sur%20mon%20smartphone). + +* Arobase.org. (2018, 25 septembre). Le protocole POP. Consulté le 25 mai 2022, à l’adresse https://www.arobase.org/fonctionnement/pop.htm#:%7E:text=Le%20protocole%20POP%20g%C3%A8re%20l,m%C3%AAme%20temps%20%C3%A0%20votre%20courrier. \ No newline at end of file From d1f4724b6e7eeaf9344b1fa4d9aec2c79f5afd71 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Fri, 27 May 2022 18:22:36 +0200 Subject: [PATCH 108/241] sources --- "R\303\251seaux/POP.md" | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 874e0b5..a2fbc31 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -19,8 +19,8 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d [[https://www.kalanda.net/images/faq/imap/pop-ou-imap.png]] * LIST : donne le nombre de courriers présents sur le serveur avec leur numéro -* RETR numéro : récupère le courrier numéro en attente sur votre serveur -* DELE numéro : détruit le courrier numéro +* RETR [numéro] : récupère le courrier numéro en attente sur votre serveur +* DELE [numéro] : détruit le courrier numéro * NOOP : vérifie la connexion * LAST : récupère le dernier message arrivé sur le serveur * QUIT : quitte la session et en autorise une autre @@ -29,8 +29,14 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ## Qu'elle est le futur du protocole POP +## Quand utilisé POP + ## Source * Fonctionnement du protocole POP et IMAP - Base de connaissances - KALANDA. (2019). Kalanda.Net. Consulté le 27 mai 2022, à l’adresse https://www.kalanda.net/apps/index.php/knowledgebase/27/Fonctionnement-du-protocole-POP-et-IMAP.html#:%7E:text=Le%20protocole%20POP%20permet%20de,les%20voir%20sur%20mon%20smartphone). -* Arobase.org. (2018, 25 septembre). Le protocole POP. Consulté le 25 mai 2022, à l’adresse https://www.arobase.org/fonctionnement/pop.htm#:%7E:text=Le%20protocole%20POP%20g%C3%A8re%20l,m%C3%AAme%20temps%20%C3%A0%20votre%20courrier. \ No newline at end of file +* Arobase.org. (2018, 25 septembre). Le protocole POP. Consulté le 25 mai 2022, à l’adresse https://www.arobase.org/fonctionnement/pop.htm#:%7E:text=Le%20protocole%20POP%20g%C3%A8re%20l,m%C3%AAme%20temps%20%C3%A0%20votre%20courrier. + +* Questiaux, J. (2021, 18 juin). Mon compte email : choisir POP ou IMAP ? Better Web. Consulté le 20 mai 2022, à l’adresse https://www.betterweb.fr/blog/mon-compte-email-choisir-pop-ou-imap + +* A. (2020, 31 décembre). POP3, Post Office Protocol : de quoi s’agit-il, à quoi sert-il et en quoi est-il différent d’IMAP? Informatique Mania. https://www.informatique-mania.com/en/courriers-electroniques/bureau-de-protocole-de-messagerie-pop3/ \ No newline at end of file From 86fd83131f45a24ffdc32edc24a11c8f399a612c Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Fri, 27 May 2022 19:03:14 +0200 Subject: [PATCH 109/241] Update POP.md --- "R\303\251seaux/POP.md" | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index a2fbc31..e1f1841 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -12,12 +12,16 @@ Le protocole POP (Post Office Protocol) est un protole beaucoup utiliser dans le Le gros point négatif de POP vient de la. Après avoir consulter ses mails sur une machine il est alors impossible pour l'utilisateur de consulter ce même mail sur une autre machine +Il est est possible de conserver ses mails sur le serveur POP mais pendant une durée limité qui doit être configurer sur le client mail de l'utilisateur. + Le protocole Imap, sont concurent, quand à lui permet de télécharger ses mail à partir d'un serveur mail mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite au lettres lorsque nous y accèdons et empêche alors toutes autre connexion [[https://www.kalanda.net/images/faq/imap/pop-ou-imap.png]] +### Le protocole POP gère les commandes suivantes : + * LIST : donne le nombre de courriers présents sur le serveur avec leur numéro * RETR [numéro] : récupère le courrier numéro en attente sur votre serveur * DELE [numéro] : détruit le courrier numéro @@ -27,9 +31,25 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ## Ou est-il utilisé ? +Tous les clients mail peuvent être parametrés afin d'utiliser POP + ## Qu'elle est le futur du protocole POP -## Quand utilisé POP +POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. +Cependant, son développement n'a pas progressé depuis 2003. + +De l'autre coté, son concurent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourdhui + +## L'avantage du protocole POP + +* POP est plus simple à utilisé, plus simple à configurer et éfficace +* Permet la gestion de ses emails en local ce qui facilite et augmente la vitesse de recherche et de tri. +* Il néssecite un quantité minimale de ressources afin de fonctionner. + +## Ld"saventage du protocole POP + +* Nécessite une connexion constante a internet. +* Oblige l'utilisateur à sauvegarder ses mails afin de ne pas les perdre en cas de problème. ## Source @@ -39,4 +59,8 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d * Questiaux, J. (2021, 18 juin). Mon compte email : choisir POP ou IMAP ? Better Web. Consulté le 20 mai 2022, à l’adresse https://www.betterweb.fr/blog/mon-compte-email-choisir-pop-ou-imap -* A. (2020, 31 décembre). POP3, Post Office Protocol : de quoi s’agit-il, à quoi sert-il et en quoi est-il différent d’IMAP? Informatique Mania. https://www.informatique-mania.com/en/courriers-electroniques/bureau-de-protocole-de-messagerie-pop3/ \ No newline at end of file +* A. (2020, 31 décembre). POP3, Post Office Protocol : de quoi s’agit-il, à quoi sert-il et en quoi est-il différent d’IMAP? Informatique Mania. https://www.informatique-mania.com/en/courriers-electroniques/bureau-de-protocole-de-messagerie-pop3/ + +* Wikipedia contributors. (2022c, mai 16). Post Office Protocol. Wikipedia. https://en.wikipedia.org/wiki/Post_Office_Protocol + +* POP et IMAP : différences, avantages et inconvénients. (2010, 17 mars). L’Orient-Le Jour. https://www.lorientlejour.com/article/650498/POP_et_IMAP%2B%253A_differences%252C__avantages_et_inconvenients.html#:%7E:text=Parmi%20les%20avantages%20du%20compte,enfin%20une%20utilisation%20minimale%20des \ No newline at end of file From 67005ef5a5ec009e5df324dc334faa930b0f3553 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Fri, 27 May 2022 19:10:52 +0200 Subject: [PATCH 110/241] Update POP.md --- "R\303\251seaux/POP.md" | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index e1f1841..26ff7f3 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -8,47 +8,47 @@ parent: Réseaux ## qu'est ce que POP -Le protocole POP (Post Office Protocol) est un protole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on pourra les lires via un client de messagerie telle que Outlook, Thunderbird, Gmail, etc. Après avoir télécharger un mail avec POP, celui-ci ne se trouvera plus sur le serveur. +Le protocole POP (Post Office Protocol) est un protocole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on ne pourra les lires via un client de messagerie telle qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus sur le serveur. -Le gros point négatif de POP vient de la. Après avoir consulter ses mails sur une machine il est alors impossible pour l'utilisateur de consulter ce même mail sur une autre machine +Le gros point négatif de POP vient de là. Après avoir consulté ses mails sur une machine, il est alors impossible pour l'utilisateur de consulter ce même mail sur une autre machine. -Il est est possible de conserver ses mails sur le serveur POP mais pendant une durée limité qui doit être configurer sur le client mail de l'utilisateur. +Il est est possible de conserver ses mails sur le serveur POP, mais pendant une durée limitée qui doit être configuré sur le client mail de l'utilisateur. -Le protocole Imap, sont concurent, quand à lui permet de télécharger ses mail à partir d'un serveur mail mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. +Le protocole Imap, son concurrant, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. -Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite au lettres lorsque nous y accèdons et empêche alors toutes autre connexion +Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite aux lettres lorsque nous y accédons et empêche alors toute autre connexion. [[https://www.kalanda.net/images/faq/imap/pop-ou-imap.png]] ### Le protocole POP gère les commandes suivantes : -* LIST : donne le nombre de courriers présents sur le serveur avec leur numéro -* RETR [numéro] : récupère le courrier numéro en attente sur votre serveur -* DELE [numéro] : détruit le courrier numéro -* NOOP : vérifie la connexion -* LAST : récupère le dernier message arrivé sur le serveur -* QUIT : quitte la session et en autorise une autre +* LIST : donne le nombre de courriers présents sur le serveur avec leur numéro. +* RETR [numéro] : récupère le courrier numéro en attente sur votre serveur. +* DELE [numéro] : détruit le courrier numéro. +* NOOP : vérifie la connexion. +* LAST : récupère le dernier message arrivé sur le serveur. +* QUIT : quitte la session et en autorise une autre. ## Ou est-il utilisé ? -Tous les clients mail peuvent être parametrés afin d'utiliser POP +Tous les clients mails peuvent être paramètrés afin d'utiliser POP ## Qu'elle est le futur du protocole POP POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. Cependant, son développement n'a pas progressé depuis 2003. -De l'autre coté, son concurent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourdhui +De l'autre côté, son concurent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourd'hui. ## L'avantage du protocole POP -* POP est plus simple à utilisé, plus simple à configurer et éfficace +* POP est plus simple à utilisé, plus simple à configurer et efficace * Permet la gestion de ses emails en local ce qui facilite et augmente la vitesse de recherche et de tri. -* Il néssecite un quantité minimale de ressources afin de fonctionner. +* Il nécessite une quantité minimale de ressources afin de fonctionner. -## Ld"saventage du protocole POP +## Désaventage du protocole POP -* Nécessite une connexion constante a internet. +* Nécessite une connexion constante à internet. * Oblige l'utilisateur à sauvegarder ses mails afin de ne pas les perdre en cas de problème. ## Source From b76514c190c48fc3a7398d725c20a6ec301baa40 Mon Sep 17 00:00:00 2001 From: RaphaelMarto <92374387+RaphaelMarto@users.noreply.github.com> Date: Sun, 29 May 2022 19:32:52 +0200 Subject: [PATCH 111/241] Update XMPP.md --- "R\303\251seaux/XMPP.md" | 74 ++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git "a/R\303\251seaux/XMPP.md" "b/R\303\251seaux/XMPP.md" index 68694c8..d9eb9b9 100644 --- "a/R\303\251seaux/XMPP.md" +++ "b/R\303\251seaux/XMPP.md" @@ -11,23 +11,22 @@ parent: Réseaux XMPP (Extensible Messaging and Presence Protocol) est un protocole connu principalement pour la messagerie instantanée en cross-platform, mais il est aussi utilisé bien que cela soit moins connu pour de l'échange de données entre applications systèmes, mais également pour de la supervision système et réseau ou du cloud computing.
-XMPP est connus pour avoir défini les standards pour la communication en message instantanée en 1999 et début des années 2000. +XMPP est connu pour avoir défini les standards pour la communication en message instantané en 1999 et début des années 2000. -Au jour d'aujourd'hui il est encore utilisé principalement par WhatsApp, mais également google , GNOME, IBM, ...
+Au jour d'aujourd'hui, il est encore utilisé principalement par WhatsApp, mais également google , GNOME, IBM, ...
Ce protocole est construit en language XML (Extensible Markup Language) parfois appeler "Jabber" alors que celui-ci est un service baser sur XMPP. XMPP utilise TCP/IP avec une architecture client-server transmettant ces informations avec des paquets XML. -X: Pour extensible car c'est un projet open source qui est tout le temps modifier et améliorer.
-M: Pour messages car il a très bon mécanisme d'envoi de messages.
-P: Pour presences car il détecte l'état d'une personne si elle est en ligne , déconnecter ou occuper.
+X: Pour extensible car c'est un projet open source qui est tout le temps modifié et amélioré.
+M: Pour messages car il a un très bon mécanisme d'envoi de messages.
+P: Pour présence car il détecte l'état d'une personne si elle est en ligne , déconnectée ou occupée.
P: Pour protocole car c'est un protocole de communication tout simplement.
## Histoire[^1] [^2] [^3] -En 1998 Jeremie Miller invente Jabber un protocole de message instantané utilisant le XML. Mais il manquait un framework pour le faire fonctionner et c'est pour -trouver une alternative Open Source au protocole propriétaire existant que XMPP va etre développé.
Il va être dévoloppé par la communauté Jabber et dans un premier temps -etre nommée Jabber protocole (un alias encore utilisé par certain).
Il va être reconnus en 2004 par l'IETF et adopter le nom de XMPP.
-Il va être adopté successivement par Apple en 2005 et google de 2005 à 2013 puis par Facebook de 2008 à 2015 puis par Skype en 2011 puis par WLM en 2011.
+En 1998 Jérémie Miller invente Jabber un protocole de message instantané utilisant le XML. Mais il manquait un framework pour le faire fonctionner et c'est pour +trouver une alternative Open Source au protocole propriétaire existant que XMPP va être développé.
Il sera développé par la communauté Jabber et dans un premier temps être nommé Jabber protocole (un alias encore utilisé par certain).
Il sera reconnu en 2004 par l'IETF et il adopte le nom de XMPP.
+Il sera utilisé successivement par Apple en 2005 , google de 2005 à 2013 ensuite par Facebook de 2008 à 2015 puis par Skype en 2011 et enfin par WLM en 2011.
La dernière release de l'IETF est le RFC7622 avec la version la plus moderne de XMPP en 2015. ## Fonction principale[^3] [^4] @@ -35,43 +34,39 @@ La dernière release de l'IETF est le RFC7622 avec la version la plus moderne de * Recevoir et envoyer des messages en direct entre utilisateurs * Blocker un utilisateur * Gérer ses contacts -* Gérer les fils de discussion suivit ou non -* Transmettre le status de l'utilisateur (En ligne, occuper, ...) +* Gérer les fils de discussion qui sont suivis ou non +* Transmettre le status de l'utilisateur (En ligne, occupé, ...) ## Comment cela fonctionne ? XMPP est divisé en plusieurs parties au milieu de tout cela se trouve XMPP Core: -### XMPP Core +### XMPP Core[^6] [^7] le coeur est composé des features suivantes: * un flux d'envoi de données XML * un canal sécurisé avec TLS * Authentification avec SASL * utilisation de l'UTF-8 * Autorisation pour une discussion bidirectionnelle -* Des infromations sur la disponibilité & la présence +* Des informations sur la disponibilité & la présence ### Jingle Jingle est la version XMPP de transmission VoIP. Il transmettra leur paquet au travers de XMPP mais utilise tout de même les protocoles RTP(Real-time Transport Protocol).
-Jingle a été développer pour supporter SIP (Session Initiation Protocol) et SDP (Session Description Protocol) ce qui permet de passer facilement des réseaux XMPP à des réseaux SIP. +Jingle a été développé pour supporter SIP (Session Initiation Protocol) et SDP (Session Description Protocol) ce qui permet de passer facilement des réseaux XMPP à des réseaux SIP. ### Multi-User-Chat (MUC) -Comme son nom l'indique c'est une extension qui permet de créé des conversations avec plusieurs utilisateurs ainsi que de crée des cannals de discussion. Dans ces features nous retrouvons : +Comme son nom l'indique c'est une extension qui permet de créé des conversations avec plusieurs utilisateurs ainsi que de créer des canaux de discussion. Dans ces features nous retrouvons : * Inviter des utilisateurs * Exclure des utilisateurs * bannir des utilisateurs -* Mettre en place des mots de pass +* Mettre en place des mots de passe * Donner des droits au modérateur -### BOSH - -BOSH (Bidirectional-streams Over Synchronous HTTP) c'est en soi une version plus efficace du protocole TCP.
Il est néanmoins uniquement utilisé pour la communication entre XMPP serveur et client. - ![](https://i.goopics.net/mr699q.png) ### Client-server -Comme vous venez de le voir sur le schéma au-dessus XMPP est basé sur un architecture server-client.
-Vous envoyer donc vos donner XML de votre client vers le serveur et le serveur va rediriger vers le client destinataire de données.
-Chaque client est représenté par un identifiant unique que le serveur va utiliser pour transmettre les messages à bonne destination.
+Comme vous venez de le voir sur le schéma au-dessus XMPP est basé sur une architecture server-client.
+Vous envoyez donc vos données XML de votre client vers le serveur et le serveur redirige vers le client destinataire de données.
+Chaque client est représenté par un identifiant unique que le serveur utilisera pour transmettre les messages à bonne destination.
XMPP utilise des gateways quand il doit envoyer des informations ou recevoir des informations d'un réseau qui n'est pas XMPP (Ex: SMS, SMTP, IRC). ### Connexion TCP @@ -82,9 +77,9 @@ Dans les versions plus récentes XMPP utilise des WebSockets et/ou TLS pour une ### Envoie de messages XMPP utilise l'envoi de messages Asynchrones pour permettre aux utilisateurs d'envoyer autant de message qu'ils le désirent sans attendre de réponse.
-Et les 2 utilisateurs n'ont pas besoin d'être connecté en même temps pour envoyer des messages.
-XMPP contrairement aux autres offres une expérience de discussion presque instantanée car contrairement aux autres qui vont ping le serveur toutes les x secondes (processus appellé "polling") pour récupérer des data.
-XMMP lui va directement envoyer tout nouveau message de l'utilisateur vers le serveur et du serveur vers le destinataire. +Et les 2 utilisateurs n'ont pas besoin d'être connectés en même temps pour envoyer des messages.
+XMPP contrairement aux autres, offre une expérience de discussion presque instantanée car contrairement aux autres qui vont ping le serveur toutes les x secondes (processus appellé "polling") pour récupérer des data.
+XMMP lui enverra directement tout nouveau message de l'utilisateur vers le serveur et du serveur vers le destinataire. ### Décentraliser @@ -95,9 +90,9 @@ XMPP n'as pas de serveur officiel c'est-à-dire que n'importe qui peut créé so |Avantages|Inconvénients| |---|---| -|Open Source le code et document officiel sont accessibles gratuitement| Il est difficil de transferer ces utilisteur d'un autre réseau (MSN, AIM, etc), mauvaise migration | -|Base validée par l'IETF et continue d'être mis à jour et il est stable | Fonctionalité incomplet présente comme Jingle qui n'est pas exploitable en l'état| -|Décentraliser|| +|Open Source le code et document officiel sont accessibles gratuitement| Il est difficile de transférer ces utilisteurs d'un autre réseau (MSN, AIM, etc), mauvaise migration | +|Base validée par l'IETF et continue d'être mis à jour et il est stable | Fonctionalité incomplète présente comme Jingle qui n'est pas exploitable en l'état| +|Décentralisé|| |Sécurité disponible (ex:TLS, SASL)|| |Flexible il peut être utilisé pour autre chose que les messages instantanés|| |Confidentiallité: peut mettre en place OMEMO, OpenPGP, ... || @@ -105,11 +100,11 @@ XMPP n'as pas de serveur officiel c'est-à-dire que n'importe qui peut créé so ## Conclusion -XMPP est la base des protocoles de message instantané et cela vaut donc la peine de l'étudier pour le comprendre et choisir quel chemin emprunté dans le cas où l'ont -voudrais développer une app avec de la messagerie instantanée.
-Il est bien sur aussi tout à fait exploitable et à beaucoup d'espace pour pouvoir grandir la team XSF travail sur le développement de l'encryptage pour une communication plus sécurisé.
-Dans le futur que ce soit du coté VoIP ou encore dans le domaine de l'IoT.
-Car je le rappelle il n'est pas limité qu'a la messagerie instantanée XMPP c'est plus que ça.
+XMPP est la base des protocoles de messages instantanés et cela vaut donc la peine de l'étudier pour le comprendre et choisir quel chemin emprunté dans le cas où l'on +voudrait développer une app avec de la messagerie instantanée.
+Il est bien sûr tout à fait exploitable. Il a beaucoup d'espace pour pouvoir grandir. La team XSF travaille sur le développement de l'encryptage pour une communication plus sécurisée.
+Dans le futur,il sera développé que ce soit du côté VoIP ou encore dans le domaine de l'IoT.
+Car je le rappelle il n'est pas limité qu'à la messagerie instantanée XMPP c'est plus que ça.
## Bibliographie [^1]: "XMPP", xmpp.org, https://xmpp.org/about/technology-overview/ (consulté le 25/05/2022) @@ -119,12 +114,17 @@ Car je le rappelle il n'est pas limité qu'a la messagerie instantanée XMPP c'e ** Résumé : Histoire de XMPP et présentation technique ** Avis sur la ressource : Certains points sont légers mais en général très complet [^3]: "XMPP Refresher: The Open Instant Messaging Protocol Then & Now", getstream.io, https://getstream.io/blog/xmpp-extensible-messaging-presence-protocol/ (consulté le 25/05/2022) - ** Résumé : Explication détaillé sur XMPP , ces features , coté technique et perspective pour le futur + ** Résumé : Explication détaillée sur XMPP , ces features , côté technique et perspective pour le futur ** Avis sur la ressource : Très Complet [^4]: "XMPP Protocol", www.geeksforgeeks.org, https://www.geeksforgeeks.org/xmpp-protocol/ (consulté le 25/05/2022) ** Résumé : Bref explication sur XMPP et ce qu'il représente - ** Avis sur la ressource : Très léger et pas assez d'explication + ** Avis sur la ressource : Très léger et pas assez d'explications [^5]: "Extensible Messaging and Presence Protocol (XMPP)", www.techopedia.com, https://www.techopedia.com/definition/396/extensible-messaging-and-presence-protocol-xmpp (consulté le 25/05/2022) ** Résumé : Explication de ce qu'est XMPP ** Avis sur la ressource : Pas complet et très léger - +[^6]: "RFC 6120 (Ancien version 3920)", www.techopedia.com, https://xmpp.org/rfcs/ (consulté le 29/05/2022) + ** Résumé : Explication du RFC core de XMPP + ** Avis sur la ressource : Fiable car site officiel +[^7]: "RFC 6121 (Ancien version 3921)", www.techopedia.com, https://xmpp.org/rfcs/ (consulté le 29/05/2022) + ** Résumé : Explication du RFC IM (Instant Messaging) XMPP + ** Avis sur la ressource : Fiable car site officiel From df10df31b2095d18d73fcfeb6074557c1cf384b3 Mon Sep 17 00:00:00 2001 From: louislombaert <71373079+LouisLombaert@users.noreply.github.com> Date: Mon, 30 May 2022 16:42:21 +0200 Subject: [PATCH 112/241] Create HTTP2.md article sur le protocole http/2 --- "R\303\251seaux/HTTP2.md" | 63 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 "R\303\251seaux/HTTP2.md" diff --git "a/R\303\251seaux/HTTP2.md" "b/R\303\251seaux/HTTP2.md" new file mode 100644 index 0000000..f6ed452 --- /dev/null +++ "b/R\303\251seaux/HTTP2.md" @@ -0,0 +1,63 @@ +# Article Http2 + +## Qu’est que HTTP/2 ? + +HTTP/2 est une révision majeure du protocole HTTP, qui est le protocole de couche applicative utilisé dans le web. La première version de HTTP fut HTTP/0.9, qui proposait uniquement de faire des requêtes GET. Il est ensuite suivi de HTTP/1 puis HTTP/1.1 (1997) puis vient HTTP/2. + +## Histoire + +Google a développé un protocole de remplacement à HTTP/1.1 nommé SPDY (speedy) qui avait pour objectif d’augmenter la vitesse par rapport à celui-ci. En 2012, le projet initial de HTTP/2 est développé et se base directement sur SPDY. En 2015, l’IESG (Internet Engineering Steering Group) qui est chargé des standards d’internet approuve la norme HTTP/2. Par la suite, le navigateur Google Chrome annonce l'abandon progressif de SPDY au profit d’HTTP/2. + +## Objectif + + +Le principale objectif de HTTP/2 est de réduire la latence (c’est pour ça que celui-ci a pris comme base le protocole SPDY). En effet, les pages web d’aujourd’hui ont grandement évolué par rapport à celles qu’on trouvait au début de HTTP/1.1, celles-ci devant générer des centaines de requêtes. Hors, HTTP/1.1 ne supporte qu’une requête par connexion.Pour corriger ce problème, HTTP/2 autorise lui qu’une connexion par site mais il permet de transmettre plusieurs requêtes par messages (pipeline). + + +## Changement par rapport à HTTP/1.1 + +Une connexion TCP multiplexé: Comme précisé au dessus, HTTP/2 ne permet qu’une connexion TCP car celle-ci prend beaucoup de temps à s’établir, mais permet de faire une requête sur cette même connexion. +Compression d’en-tête HTTP: Contrairement à HTTP/1.1, HTTP/2 compresse les en-têtes. De plus, il ne place un en-tête que s' il y a un changement d’état par rapport à la requête précédente, réduisant ainsi la répétition. +Serveur Push: Au lieu de lire la page HTML et de déterminer les ressources nécessaires à partir de celle-ci (exemple: page de style css), le serveur se charge de les envoyés directement, évitant ainsi d'attendre que le serveur lise la page HTML + +![image](https://i.goopics.net/jof53p.png) + +source: https://www.infoq.com/fr/articles/http2-les-details/ + + +## Avantages de HTTP/2 + +Performance: le multiplexage permet de transmettre plus de données en même temps. +Performances du web mobiles: le multiplexage et la compression d’en-tête permet de diminuer la latence sur les réseaux mobiles. +Diminution des coûts: l’augmentation du débit obtenue avec HTTP/2 permettra aux services de télécommunication de réduire leur dépense, réduisant ainsi les tarifs proposés par les fournisseurs. +Sécurité: L'algorithme HPACK (pris en charge par HTTP/2) permet de contrer les menaces de sécurité. + +## Place de HTTP/2 aujourd’hui: +En 2021, 47% des sites webs les plus connus utilisaient HTTP/2. 97% des navigateurs pouvaient prendre en charge HTTP/2 fin 2015. + +## Conclusion +Le web ne cesse d’évoluer ces dernières années, à mesure que les utilisateurs et les sites se font de plus en plus nombreux. Le protocole applicatif HTTP se doit donc d’évoluer pour répondre à l'expansion du web. HTTP/2 est une grande évolution de ce protocole qui permettra aux utilisateurs d’internet d’avoir une meilleure expérience avec un web plus rapide, moins coûteux et sécurisé. + + + + + + + +Bibliographie + +https://en.wikipedia.org/wiki/HTTP/2 + +https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP + +https://fr.wikipedia.org/wiki/Internet_Engineering_Steering_Group + +https://web.dev/performance-http2/ + +https://stileex.xyz/pourquoi-internet-rapide-http2/ + +https://boowiki.info/art/hypertext-transfer-protocol/http-2.html#Obiettivi + +https://blog.dareboost.com/fr/2016/11/http2-changements-bonnes-pratiques-http1-front-end/ + +https://kinsta.com/fr/apprendre/http2/#main_benefits_of_http2 From dafa0039a6432a0355f11e656a93f6c16e1a7c1a Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 31 May 2022 18:54:18 +0200 Subject: [PATCH 113/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 9fc8e5e..0928463 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -18,9 +18,9 @@ Pour faire face à cette situation et ainsi permettre un transfert de paquets de ## IPSec -« Internet Protocol Security » (IPSec) est une suite de protocoles conçue pour le protocole Internet TCP-IP standardisé par l’IETF (Internet Engineering Task Force) pour l’IPv4 mais aussi l’IPv6. Permettant une communication sécurisée avec des réseaux IP qui ne sont pas dignes de confiance. La confidentialité, l’authenticité et l’intégrité de la circulation des données sont assurées par un système d'authentification et de cryptage . +« Internet Protocol Security » (IPSec) est une suite de protocoles conçue pour la suite de protocoles Internet TCP-IP standardisé par l’IETF (Internet Engineering Task Force) pour l’IPv4 mais aussi l’IPv6 permettant une communication sécurisée avec des réseaux IP qui ne sont pas dignes de confiance. La confidentialité, l’authenticité et l’intégrité de la circulation des données sont assurées par un système d'authentification et de cryptage . -On peut répartir suite des protocles IPSec en 3 groupes : +On peut répartir la suite des protocles IPSec en 3 groupes : - Protocoles de transfert : @@ -39,7 +39,7 @@ On peut répartir suite des protocles IPSec en 3 groupes : ### Protocoles de transfert AH et ESP -Le protocole d'en-tête d'authentification (AH) fournit l'authentification de l'origine des données ainsi que l'intégrité de celles-ci[3] .Néanmoins, AH n'assure pas la confidentialité des données, celle-ci sont transmissent en claire ! +Le protocole d'en-tête d'authentification (AH) fournit l'authentification de l'origine des données ainsi que l'intégrité de celles-ci[3] . Néanmoins, AH n'assure pas la confidentialité des données, celle-ci sont transmisses en claire ! c'est pourquoi AH est utilisé en combinaison avec ESP. Le protocoles ESP ou Encapsulating Security Payload est utilisé pour la confidentialité des données en les chiffrants. @@ -84,9 +84,8 @@ ISAKMP ou Internet Security Association and Key Management Protocol est un prot ### Base de données SAD & SDP -Les informations nécessaires au transfert des paquets sont stockées dans deux bases de données en local, SPD et SAD. -Dans la base de donnée SDP on va retrouver les information permettant de déterminer le ou les protocoles à utiliser à savoir AH, ESP ou la combinaison des deux. -Tant dit que dans la base de donnée SAD, on va retrouver les informations essentiels pour le protocole IKE à savoir les différentes clés de chiffrement. +Les informations nécessaires au transfert des paquets sont stockées dans deux bases de données en local à savoir SPD ( Security Policy Database ) et SAD ( Security Association Database ). +Dans la base de donnée SDP on va retrouver les information permettant de déterminer le ou les protocoles à utiliser à savoir AH, ESP ou la combinaison des deux tant dit que dans la base de donnée SAD, on va retrouver les informations essentielles pour le protocole IKE à savoir les différentes clés de chiffrement. ## Les points positifs et négatif d'IPSec @@ -94,7 +93,7 @@ Les avantages d’IPSec sont indéniables en matière de performance et de fiabi Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. -Deplus IPSec complique la traversée des NAT et Pare-Feu. +Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5] ## Sources : [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec @@ -104,3 +103,5 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu. [3] https://www.ibm.com/docs/en/i/7.1?topic=protocols-authentication-header, consulté le 28/05/2022, date article : 31/08/2021, auteur : / , Affiliation : ibm.com , titre article : Authentication Header [4] https://en.wikipedia.org/wiki/Internet_Security_Association_and_Key_Management_Protocol, consulté le 28/05/2022, date article : 25/05/2022, auteur : /, Affiliation : wikipedia.org, titre article : Association de sécurité Internet et protocole de gestion de clés + +[5] https://www.sstic.org/media/SSTIC2006/SSTIC-actes/Faiblesses_d_IPSec_en_deploiements_reels/SSTIC2006-Article-Faiblesses_d_IPSec_en_deploiements_reels-vanhullebus.pdf, consulté le 31/05/2022, auteur :Yvan Vanhullebus , Affiliation : Netasq, titre article : Faiblesses d’IPSec en déploiements réels From e27f397b614165953a0c8049c5c81a67d62852dd Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 31 May 2022 19:21:47 +0200 Subject: [PATCH 114/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 0928463..2ab5df0 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -75,7 +75,7 @@ l’expéditeur et le destinataire. ### Gestion des clés IKE & ISAKMP IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . -ISAKMP ou Internet Security Association and Key Management Protocol est un protocole défini par RFC 2408 pour établir une association de sécurité (SA) et des clés cryptographiques dans un environnement Internet.[4] +ISAKMP ou Internet Security Association and Key Management Protocol est un protocole défini par RFC 2408 pour établir une association de sécurité (SA) et des clés cryptographiques dans un environnement Internet.[6] - 1. On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun - 2. Une fois les routeurs d’accord sur le type de sécurité, IKE ouvre un tunnel sécurisé @@ -93,7 +93,7 @@ Les avantages d’IPSec sont indéniables en matière de performance et de fiabi Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. -Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5] +Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5 - 7 - 8] ## Sources : [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec @@ -105,3 +105,9 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence [4] https://en.wikipedia.org/wiki/Internet_Security_Association_and_Key_Management_Protocol, consulté le 28/05/2022, date article : 25/05/2022, auteur : /, Affiliation : wikipedia.org, titre article : Association de sécurité Internet et protocole de gestion de clés [5] https://www.sstic.org/media/SSTIC2006/SSTIC-actes/Faiblesses_d_IPSec_en_deploiements_reels/SSTIC2006-Article-Faiblesses_d_IPSec_en_deploiements_reels-vanhullebus.pdf, consulté le 31/05/2022, auteur :Yvan Vanhullebus , Affiliation : Netasq, titre article : Faiblesses d’IPSec en déploiements réels + +[6] https://www.rfc-editor.org/rfc/rfc2408.html + +[7] https://www.rfc-editor.org/rfc/rfc3947.html + +[8] https://www.rfc-editor.org/rfc/rfc3948.html From 1ea060a56bb33d8c4185cbc7d52000e80ccf70ac Mon Sep 17 00:00:00 2001 From: MagnesSimon <55548308+MagnesSimon@users.noreply.github.com> Date: Tue, 31 May 2022 19:39:07 +0200 Subject: [PATCH 115/241] =?UTF-8?q?Pr=C3=A9cision=20au=20niveau=20des=20so?= =?UTF-8?q?urces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/Analyse Zabbix.md" | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/R\303\251seaux/Analyse Zabbix.md" "b/R\303\251seaux/Analyse Zabbix.md" index 11074a3..00a03d0 100644 --- "a/R\303\251seaux/Analyse Zabbix.md" +++ "b/R\303\251seaux/Analyse Zabbix.md" @@ -49,15 +49,15 @@ Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration q ## Sources -* https://stringfixer.com/fr/Zabbix [1] -* https://www.syloe.com/supervision-et-metrologie-zabbix [2] -* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] -* https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] -* https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] -* https://www.syloe.com/glossaire/logiciel-zabbix/ [6] -* https://www.zabbix.com/fr/release_notes [7] -* https://www.axelit.fr/technologies/zabbix/ [8] -* https://ungeek.fr/zabbix-trapper-custom-graph/#1-cr%C3%A9er-le-trapper [9] -* https://www.zabbix.com/documentation/current/fr/manual/discovery/network_discovery/rule [10] -* https://www.ibm.com/docs/fr/spectrum-control/5.3.7?topic=standards-simple-network-management-protocol [11] -* https://www.g2.com/products/zabbix/competitors/alternatives [12] +*Zabbix. (n.d.). Download million images for free. https://stringfixer.com/fr/Zabbix [1] +* Supervision et métrologie Zabbix : principes et fonctionnement - Syloe. (n.d.). Syloe. https://www.syloe.com/supervision-et-metrologie-zabbix [2] +* Elément trapper. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] +* Paramètres utilisateur. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] +* Kalsin, V. (2020, July 30). Comment installer et configurer Zabbix et configurer des serveurs à distance sur Ubuntu 20.04. DigitalOcean – The developer cloud. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] +* Logiciel zabbix open source | Glossaire Syloé Experts Devops & Cloud. (n.d.). Syloe. https://www.syloe.com/glossaire/logiciel-zabbix/ [6] +* Notes de publication. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/fr/release_notes [7] +* Solution ultime de Supervision d'Entreprise - Zabbix. (n.d.). AxelIt. https://www.axelit.fr/technologies/zabbix/ [8] +* Zabbix : Utiliser les Trappers pour faire des Graphs customs - UnGeek.Fr. (n.d.). UnGeek.Fr. https://ungeek.fr/zabbix-trapper-custom-graph/#1-créer-le-trapper [9] +* Configuration d'une règle de découverte réseau. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/documentation/current/fr/manual/discovery/network_discovery/rule [10] +* IBM Docs. (n.d.). IBM - Deutschland | IBM. https://www.ibm.com/docs/fr/spectrum-control/5.3.7?topic=standards-simple-network-management-protocol [11] +* Alternatives Zabbix. G2 https://www.g2.com/products/zabbix/competitors/alternatives [12] From b288f0764bef375ed1b4051df38cab2636fa00f8 Mon Sep 17 00:00:00 2001 From: MagnesSimon <55548308+MagnesSimon@users.noreply.github.com> Date: Tue, 31 May 2022 19:41:37 +0200 Subject: [PATCH 116/241] =?UTF-8?q?Pr=C3=A9cision=20des=20sources?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/Analyse Zabbix.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/Analyse Zabbix.md" "b/R\303\251seaux/Analyse Zabbix.md" index 00a03d0..6de8258 100644 --- "a/R\303\251seaux/Analyse Zabbix.md" +++ "b/R\303\251seaux/Analyse Zabbix.md" @@ -49,11 +49,11 @@ Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration q ## Sources -*Zabbix. (n.d.). Download million images for free. https://stringfixer.com/fr/Zabbix [1] +* Zabbix. (n.d.). Download million images for free. https://stringfixer.com/fr/Zabbix [1] * Supervision et métrologie Zabbix : principes et fonctionnement - Syloe. (n.d.). Syloe. https://www.syloe.com/supervision-et-metrologie-zabbix [2] * Elément trapper. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] * Paramètres utilisateur. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] -* Kalsin, V. (2020, July 30). Comment installer et configurer Zabbix et configurer des serveurs à distance sur Ubuntu 20.04. DigitalOcean – The developer cloud. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] +* Kalsin, V. (2020, July 30). Comment installer et configurer Zabbix et configurer des serveurs à distance sur Ubuntu 20.04. DigitalOcean The developer cloud. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] * Logiciel zabbix open source | Glossaire Syloé Experts Devops & Cloud. (n.d.). Syloe. https://www.syloe.com/glossaire/logiciel-zabbix/ [6] * Notes de publication. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/fr/release_notes [7] * Solution ultime de Supervision d'Entreprise - Zabbix. (n.d.). AxelIt. https://www.axelit.fr/technologies/zabbix/ [8] From a396626621f811b16f8fbd5f484cf4de16bf2ade Mon Sep 17 00:00:00 2001 From: Arnaud Meunier <71312671+ChaosArnhug@users.noreply.github.com> Date: Tue, 31 May 2022 21:05:18 +0200 Subject: [PATCH 117/241] [ADD] article ICMP --- Assets/Images/ICMP.md | 88 ++++++++++++++++++++++++++ "Assets/Images/Mod\303\250le_OSI.png" | Bin 0 -> 103091 bytes Assets/Images/Paquet_IPv4_ICMP.png | Bin 0 -> 31292 bytes 3 files changed, 88 insertions(+) create mode 100644 Assets/Images/ICMP.md create mode 100644 "Assets/Images/Mod\303\250le_OSI.png" create mode 100644 Assets/Images/Paquet_IPv4_ICMP.png diff --git a/Assets/Images/ICMP.md b/Assets/Images/ICMP.md new file mode 100644 index 0000000..6e53272 --- /dev/null +++ b/Assets/Images/ICMP.md @@ -0,0 +1,88 @@ +--- +layout: default +title: ICMP +parent: Réseaux +--- + +# ICMP + +## Qu'est ce que le protocole ICMP ? +--- + +ICMP ou Internet Control Message Protocol est un protocole faisant parti de l'ensemble des protocoles TCP/IP et sert à la transmission de messages de contôle et d'erreur. + +A ce jour, il existe 2 versions : une pour l'Ipv4, décrite dans l'RFC 792 en 1981, et une pour l'Ipv6, décrite dans l'RFC 4443 en 2006. + +## Pourquoi utiliser ICMP ? +--- + +Le but d'ICMP est de signaler et contrôler les problèmes lors d'une transmission. Par exemple, c'est grâce à lui qu'on sait que la destination n'est pas atteignable ou qu'il y a eu une redirection. De ce faite, il doit être implémenter dans chaque module IP. +Il faut également savoir qu'aucun message ICMP n'est envoyé pour répondre à la reception d'une autre message ICMP et ce, afin d'éviter des problèmes de bouclage sans fin. + +Pour finir, faite attention, son but n'est pas de rendre le protcole IP (Internet Protocol) fiable. Il ne garanti en rien l'arrivée d'un paquet de données à sa destination et ne signale pas la perte d'un paquet lors de sa transmission. + + +## ICMP et le modèle OSI +--- + +Le protocole ICMP est un protocole de couche 3 sur le modèle OSI mais est traité comme un se situant sur une couche supérieur lors de son encapsulation dans le protocole IP. +

+ Modèle OSI +

+ +## Fonctionnement d'ICMP +--- + +ICMP utilise un système de types et de codes qui permet d'identifier le type de message et l'état de ce-dis type. + +### Les types et leurs codes +--- +Les types sont différenciés à l'aide d'un numéro allant de 0 à 255 qui leur est propre et sont accompagnés par un ou plusieurs codes permettant d'identifier le problème/contrôle. + +Exemples en IPv4 : +Type | Code | Description +---- | ---- | ----------- +0 - Réponse d'écho | 0 | Réponse d'echo +3 - Destinataire innaccessible | 0 | Réseau innaccessible +3 - Destinataire innaccessible | 1 | Machine innaccessible +3 - Destinataire innaccessible | 2 | Protocole innaccessible +3 - Destinataire innaccessible | 3 | Port innaccessible +8 - Demande d'écho | 0 | Demande d'écho + +Il faut également savoir que les numéros de types sont différents suivant la version d'ICMP qu'on utilise. Ainsi, le type 1 en IPv6 n'est pas forcement le même qu'en IPv4. + +Si vous voulez plus de détails sur ces numéros et codes, voici la documentation de L'IANA à ce sujet :
IPv6 et IPv4 + + +### Format d'un paquet ICMP +--- + +Même si le protocole ICMP se trouve sur la même couche que le protocole IP, il ne dispose pas d'un paquet propre. En effet, il est directement encapsulé dans un paquet IP. De ce faite, ICMP est traité par IP comme étant un protocole de couche supérieur. + +Le format en IPv4 contient : + +

+ Paquet IPv4 avec ICMP +

+ +- un en-tête IPv4 (en vert). La valeur de _Protocole_ est 1 et celle de _Type de Service_ est 0. +- un en-tête ICMP (en bleu) : + - Type : le numéro du type de message + - Code : le code décrivant l'état du type + - Somme de contrôle : permet de vérifier que les données n'ont pas été corrompu en chemin. + +Le format en IPv6 est sembable à celui en IPv4 mais sont en-tête IP est adapté à la version 6. + +## Bibliographie + +1. [Qu'est-ce que le protocole ICMP ?](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/), Digital Guide IONOS, le 05/03/2019, consulté le 31/05/2022 + +2. [RFC 792](https://datatracker.ietf.org/doc/html/rfc792), J.Postel, septembre 1981, consulté le 31/05/2022 + +3. [RFC 4443](https://datatracker.ietf.org/doc/html/rfc4443), A.Conta & S.Deering & M.Gupta, mars 2003, consulté le 31/05/2022 + +4. [Internet Control Message Protocol](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5), Wikipedia, 27/12/2021, consulté le 31/05/2022 + +5. [Internet Control Message Protocol V6](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6), Wikipedia, 10/10/2017, consulté le 31/05/2022 + +6. [ICMP](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394), Cisco, consulté le 31/05/2022 diff --git "a/Assets/Images/Mod\303\250le_OSI.png" "b/Assets/Images/Mod\303\250le_OSI.png" new file mode 100644 index 0000000000000000000000000000000000000000..322f82cd16d51d86df0d3d16db53eb0244d42377 GIT binary patch literal 103091 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 P98Q~_H^HB{diQ?;TfTG` literal 0 HcmV?d00001 From c36e58fcbdfd626f86815ce200aa3d8ed1ecfdbf Mon Sep 17 00:00:00 2001 From: Arnaud Meunier <71312671+ChaosArnhug@users.noreply.github.com> Date: Tue, 31 May 2022 21:05:58 +0200 Subject: [PATCH 118/241] Delete ICMP.md --- Assets/Images/ICMP.md | 88 ------------------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 Assets/Images/ICMP.md diff --git a/Assets/Images/ICMP.md b/Assets/Images/ICMP.md deleted file mode 100644 index 6e53272..0000000 --- a/Assets/Images/ICMP.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -layout: default -title: ICMP -parent: Réseaux ---- - -# ICMP - -## Qu'est ce que le protocole ICMP ? ---- - -ICMP ou Internet Control Message Protocol est un protocole faisant parti de l'ensemble des protocoles TCP/IP et sert à la transmission de messages de contôle et d'erreur. - -A ce jour, il existe 2 versions : une pour l'Ipv4, décrite dans l'RFC 792 en 1981, et une pour l'Ipv6, décrite dans l'RFC 4443 en 2006. - -## Pourquoi utiliser ICMP ? ---- - -Le but d'ICMP est de signaler et contrôler les problèmes lors d'une transmission. Par exemple, c'est grâce à lui qu'on sait que la destination n'est pas atteignable ou qu'il y a eu une redirection. De ce faite, il doit être implémenter dans chaque module IP. -Il faut également savoir qu'aucun message ICMP n'est envoyé pour répondre à la reception d'une autre message ICMP et ce, afin d'éviter des problèmes de bouclage sans fin. - -Pour finir, faite attention, son but n'est pas de rendre le protcole IP (Internet Protocol) fiable. Il ne garanti en rien l'arrivée d'un paquet de données à sa destination et ne signale pas la perte d'un paquet lors de sa transmission. - - -## ICMP et le modèle OSI ---- - -Le protocole ICMP est un protocole de couche 3 sur le modèle OSI mais est traité comme un se situant sur une couche supérieur lors de son encapsulation dans le protocole IP. -

- Modèle OSI -

- -## Fonctionnement d'ICMP ---- - -ICMP utilise un système de types et de codes qui permet d'identifier le type de message et l'état de ce-dis type. - -### Les types et leurs codes ---- -Les types sont différenciés à l'aide d'un numéro allant de 0 à 255 qui leur est propre et sont accompagnés par un ou plusieurs codes permettant d'identifier le problème/contrôle. - -Exemples en IPv4 : -Type | Code | Description ----- | ---- | ----------- -0 - Réponse d'écho | 0 | Réponse d'echo -3 - Destinataire innaccessible | 0 | Réseau innaccessible -3 - Destinataire innaccessible | 1 | Machine innaccessible -3 - Destinataire innaccessible | 2 | Protocole innaccessible -3 - Destinataire innaccessible | 3 | Port innaccessible -8 - Demande d'écho | 0 | Demande d'écho - -Il faut également savoir que les numéros de types sont différents suivant la version d'ICMP qu'on utilise. Ainsi, le type 1 en IPv6 n'est pas forcement le même qu'en IPv4. - -Si vous voulez plus de détails sur ces numéros et codes, voici la documentation de L'IANA à ce sujet :
IPv6 et IPv4 - - -### Format d'un paquet ICMP ---- - -Même si le protocole ICMP se trouve sur la même couche que le protocole IP, il ne dispose pas d'un paquet propre. En effet, il est directement encapsulé dans un paquet IP. De ce faite, ICMP est traité par IP comme étant un protocole de couche supérieur. - -Le format en IPv4 contient : - -

- Paquet IPv4 avec ICMP -

- -- un en-tête IPv4 (en vert). La valeur de _Protocole_ est 1 et celle de _Type de Service_ est 0. -- un en-tête ICMP (en bleu) : - - Type : le numéro du type de message - - Code : le code décrivant l'état du type - - Somme de contrôle : permet de vérifier que les données n'ont pas été corrompu en chemin. - -Le format en IPv6 est sembable à celui en IPv4 mais sont en-tête IP est adapté à la version 6. - -## Bibliographie - -1. [Qu'est-ce que le protocole ICMP ?](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/), Digital Guide IONOS, le 05/03/2019, consulté le 31/05/2022 - -2. [RFC 792](https://datatracker.ietf.org/doc/html/rfc792), J.Postel, septembre 1981, consulté le 31/05/2022 - -3. [RFC 4443](https://datatracker.ietf.org/doc/html/rfc4443), A.Conta & S.Deering & M.Gupta, mars 2003, consulté le 31/05/2022 - -4. [Internet Control Message Protocol](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5), Wikipedia, 27/12/2021, consulté le 31/05/2022 - -5. [Internet Control Message Protocol V6](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6), Wikipedia, 10/10/2017, consulté le 31/05/2022 - -6. [ICMP](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394), Cisco, consulté le 31/05/2022 From 1ea2886fcdd0711b43fe8ae2014a05e6fa1f7a72 Mon Sep 17 00:00:00 2001 From: Arnaud Meunier <71312671+ChaosArnhug@users.noreply.github.com> Date: Tue, 31 May 2022 21:06:30 +0200 Subject: [PATCH 119/241] [ADD] article ICMP --- "R\303\251seaux/ICMP.md" | 88 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 "R\303\251seaux/ICMP.md" diff --git "a/R\303\251seaux/ICMP.md" "b/R\303\251seaux/ICMP.md" new file mode 100644 index 0000000..6e53272 --- /dev/null +++ "b/R\303\251seaux/ICMP.md" @@ -0,0 +1,88 @@ +--- +layout: default +title: ICMP +parent: Réseaux +--- + +# ICMP + +## Qu'est ce que le protocole ICMP ? +--- + +ICMP ou Internet Control Message Protocol est un protocole faisant parti de l'ensemble des protocoles TCP/IP et sert à la transmission de messages de contôle et d'erreur. + +A ce jour, il existe 2 versions : une pour l'Ipv4, décrite dans l'RFC 792 en 1981, et une pour l'Ipv6, décrite dans l'RFC 4443 en 2006. + +## Pourquoi utiliser ICMP ? +--- + +Le but d'ICMP est de signaler et contrôler les problèmes lors d'une transmission. Par exemple, c'est grâce à lui qu'on sait que la destination n'est pas atteignable ou qu'il y a eu une redirection. De ce faite, il doit être implémenter dans chaque module IP. +Il faut également savoir qu'aucun message ICMP n'est envoyé pour répondre à la reception d'une autre message ICMP et ce, afin d'éviter des problèmes de bouclage sans fin. + +Pour finir, faite attention, son but n'est pas de rendre le protcole IP (Internet Protocol) fiable. Il ne garanti en rien l'arrivée d'un paquet de données à sa destination et ne signale pas la perte d'un paquet lors de sa transmission. + + +## ICMP et le modèle OSI +--- + +Le protocole ICMP est un protocole de couche 3 sur le modèle OSI mais est traité comme un se situant sur une couche supérieur lors de son encapsulation dans le protocole IP. +

+ Modèle OSI +

+ +## Fonctionnement d'ICMP +--- + +ICMP utilise un système de types et de codes qui permet d'identifier le type de message et l'état de ce-dis type. + +### Les types et leurs codes +--- +Les types sont différenciés à l'aide d'un numéro allant de 0 à 255 qui leur est propre et sont accompagnés par un ou plusieurs codes permettant d'identifier le problème/contrôle. + +Exemples en IPv4 : +Type | Code | Description +---- | ---- | ----------- +0 - Réponse d'écho | 0 | Réponse d'echo +3 - Destinataire innaccessible | 0 | Réseau innaccessible +3 - Destinataire innaccessible | 1 | Machine innaccessible +3 - Destinataire innaccessible | 2 | Protocole innaccessible +3 - Destinataire innaccessible | 3 | Port innaccessible +8 - Demande d'écho | 0 | Demande d'écho + +Il faut également savoir que les numéros de types sont différents suivant la version d'ICMP qu'on utilise. Ainsi, le type 1 en IPv6 n'est pas forcement le même qu'en IPv4. + +Si vous voulez plus de détails sur ces numéros et codes, voici la documentation de L'IANA à ce sujet : IPv6 et IPv4 + + +### Format d'un paquet ICMP +--- + +Même si le protocole ICMP se trouve sur la même couche que le protocole IP, il ne dispose pas d'un paquet propre. En effet, il est directement encapsulé dans un paquet IP. De ce faite, ICMP est traité par IP comme étant un protocole de couche supérieur. + +Le format en IPv4 contient : + +

+ Paquet IPv4 avec ICMP +

+ +- un en-tête IPv4 (en vert). La valeur de _Protocole_ est 1 et celle de _Type de Service_ est 0. +- un en-tête ICMP (en bleu) : + - Type : le numéro du type de message + - Code : le code décrivant l'état du type + - Somme de contrôle : permet de vérifier que les données n'ont pas été corrompu en chemin. + +Le format en IPv6 est sembable à celui en IPv4 mais sont en-tête IP est adapté à la version 6. + +## Bibliographie + +1. [Qu'est-ce que le protocole ICMP ?](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/), Digital Guide IONOS, le 05/03/2019, consulté le 31/05/2022 + +2. [RFC 792](https://datatracker.ietf.org/doc/html/rfc792), J.Postel, septembre 1981, consulté le 31/05/2022 + +3. [RFC 4443](https://datatracker.ietf.org/doc/html/rfc4443), A.Conta & S.Deering & M.Gupta, mars 2003, consulté le 31/05/2022 + +4. [Internet Control Message Protocol](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5), Wikipedia, 27/12/2021, consulté le 31/05/2022 + +5. [Internet Control Message Protocol V6](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6), Wikipedia, 10/10/2017, consulté le 31/05/2022 + +6. [ICMP](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394), Cisco, consulté le 31/05/2022 From e9ebd29a6fd53169466687b8f7030b31318d53ec Mon Sep 17 00:00:00 2001 From: Debongnie Nathan Date: Wed, 1 Jun 2022 11:11:33 +0200 Subject: [PATCH 120/241] Update kubernetes.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modification du schéma --- "R\303\251seaux/kubernetes.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/kubernetes.md" "b/R\303\251seaux/kubernetes.md" index cf37192..430b88b 100644 --- "a/R\303\251seaux/kubernetes.md" +++ "b/R\303\251seaux/kubernetes.md" @@ -52,7 +52,7 @@ Un Ingress permet d'exposer des applications au travers de règles de routage. C Une entreprise possède 2 serveurs pour héberger des applications Web. Ces applications nécessitant une très haute disponibilité, une faible latence et pouvoir supporter beaucoup de requêtes, l'entreprise à décidé de mettre en ligne ces applications à l'aide de Kubernetes. Le schéma ci-dessous représente l'infrastructure Kubernetes de l'entreprise. Les 2 serveurs de l'entreprise font office de Master Node, ce qui permet d'assurer une haute disponibilité des services de gestion du Cluster Kubernetes. -Chaque application est mise en ligne à l'aide d'un Deployment. Chaque déploiement assure que 4 répliques de l'application soient en ligne dans toutes les circonstances. Les outils des Master Nodes permettent d'équilibrer la charge sur les différentes machines du Cluster. +Chaque application est mise en ligne à l'aide d'un Deployment. Chaque Déploiement assure que 2 répliques de l'application soient en ligne dans toutes les circonstances. Ces 2 répliques sont donc des Pods gérés par le Déploiement. Les outils des Master Nodes permettent d'équilibrer la charge sur les différentes machines du Cluster. L'application App 2 nécessite une base de données à laquelle toutes les répliques doivent avoir accès. La base de données doit être déployée dans l'environnement Kubernetes à l'aide d'un Persistant Volume (PV). Chaque réplique d'App 2 y accède à l'aide du label indiqué lors de la création du PV, ou de son adresse IP interne au Cluster. Etant donné que c'est un persistant volume, les données ne disparaitrons si un Pod cesse de fonctionner. @@ -60,7 +60,8 @@ Pour permettre aux utilisateurs (User 1 et User 2) d'accéder à l'application A Acccèder à l'application au travers de l'adresse IP des Nodes n'est pas une bonne pratique. Cela réduit l'efficacité de l'équilibrage de charge et expose les adresses IP de tous les Nodes du Cluster. Pour pallier à cela, un Ingress est créé. L'Ingress récupère les Services des 2 applications et leur attribue une route. Lorsqu'un utilisateur désire accèder à l'application, celui-ci doit indiquer l'adresse IP (ou le nom de domaine si un [DNS est mis en place](https://kubernetes.io/fr/docs/concepts/services-networking/dns-pod-service/)) qui lui est attribué par le Ingress Controller et la route définie pour l'accès à l'application. -![Infrastructure Kubernetes](https://user-images.githubusercontent.com/56077782/168284673-0240a527-f302-4835-8311-9c6a074cc591.png) +![Infrastructure Kubernetes](https://user-images.githubusercontent.com/56077782/171189387-2a83fdad-00d5-44b8-bd10-0d934cab1eb0.png) + User 1 et User 2 désirent accéder à l'application App 2 en utilisant l'URL suivante: /app2. Les requêtes sont alors renvoyées par l'Ingress vers le Service de l'App 2. Celui-ci accède ensuite à l'un des Pods lié au Service de l'App 2. From fac5600a772f736c60c1c26e63cf4e629b0e0c47 Mon Sep 17 00:00:00 2001 From: Arnaud Meunier <71312671+ChaosArnhug@users.noreply.github.com> Date: Wed, 1 Jun 2022 14:26:14 +0200 Subject: [PATCH 121/241] [UDPATE] correction ortho + biblio --- "R\303\251seaux/ICMP.md" | 68 ++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git "a/R\303\251seaux/ICMP.md" "b/R\303\251seaux/ICMP.md" index 6e53272..f1a74ce 100644 --- "a/R\303\251seaux/ICMP.md" +++ "b/R\303\251seaux/ICMP.md" @@ -6,26 +6,26 @@ parent: Réseaux # ICMP -## Qu'est ce que le protocole ICMP ? +## Qu'est-ce que le protocole ICMP ? [[1]](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/) [[2]](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5) [[3]](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394) --- -ICMP ou Internet Control Message Protocol est un protocole faisant parti de l'ensemble des protocoles TCP/IP et sert à la transmission de messages de contôle et d'erreur. +ICMP ou Internet Control Message Protocol est un protocole faisant parti de l'ensemble des protocoles TCP/IP et sert à la transmission de messages de contrôle et d'erreur. -A ce jour, il existe 2 versions : une pour l'Ipv4, décrite dans l'RFC 792 en 1981, et une pour l'Ipv6, décrite dans l'RFC 4443 en 2006. +A ce jour, il existe 2 versions : une pour l'Ipv4, décrite dans l'RFC 792 [[4]](https://datatracker.ietf.org/doc/html/rfc792) en 1981, et une pour l'Ipv6 [[5]](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6), décrite dans l'RFC 4443 [[6]](https://datatracker.ietf.org/doc/html/rfc4443) en 2006. -## Pourquoi utiliser ICMP ? +## Pourquoi utiliser ICMP ? [[2]](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5) [[4]](https://datatracker.ietf.org/doc/html/rfc792) --- -Le but d'ICMP est de signaler et contrôler les problèmes lors d'une transmission. Par exemple, c'est grâce à lui qu'on sait que la destination n'est pas atteignable ou qu'il y a eu une redirection. De ce faite, il doit être implémenter dans chaque module IP. -Il faut également savoir qu'aucun message ICMP n'est envoyé pour répondre à la reception d'une autre message ICMP et ce, afin d'éviter des problèmes de bouclage sans fin. +Le but d'ICMP est de signaler et contrôler les problèmes lors d'une transmission. Par exemple, c'est grâce à lui qu'on sait que la destination n'est pas atteignable ou qu'il y a eu une redirection. De ce fait, il doit être implémenté dans chaque module IP. +Il faut également savoir qu'aucun message ICMP n'est envoyé pour répondre à la réception d'une autre message ICMP et ce, afin d'éviter des problèmes de bouclage sans fin. -Pour finir, faite attention, son but n'est pas de rendre le protcole IP (Internet Protocol) fiable. Il ne garanti en rien l'arrivée d'un paquet de données à sa destination et ne signale pas la perte d'un paquet lors de sa transmission. +Pour finir, faite attention, son but n'est pas de rendre le protocole IP (Internet Protocol) fiable. Il ne garantit en rien l'arrivée d'un paquet de données à sa destination et ne signale pas la perte d'un paquet lors de sa transmission. -## ICMP et le modèle OSI +## ICMP et le modèle OSI [[2]](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5) [[3]](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394) --- -Le protocole ICMP est un protocole de couche 3 sur le modèle OSI mais est traité comme un se situant sur une couche supérieur lors de son encapsulation dans le protocole IP. +Le protocole ICMP est un protocole de couche 3 sur le modèle OSI mais est traité comme un se situant sur une couche supérieure lors de son encapsulation dans le protocole IP.

Modèle OSI

@@ -33,9 +33,9 @@ Le protocole ICMP est un protocole de couche 3 sur le modèle OSI mais est trait ## Fonctionnement d'ICMP --- -ICMP utilise un système de types et de codes qui permet d'identifier le type de message et l'état de ce-dis type. +ICMP utilise un système de types et de codes qui permet d'identifier le type de message et l'état de ce dit type. -### Les types et leurs codes +### Les types et leurs codes [[7]](https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml#icmpv6-parameters-2) [[8]](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) --- Les types sont différenciés à l'aide d'un numéro allant de 0 à 255 qui leur est propre et sont accompagnés par un ou plusieurs codes permettant d'identifier le problème/contrôle. @@ -43,21 +43,21 @@ Exemples en IPv4 : Type | Code | Description ---- | ---- | ----------- 0 - Réponse d'écho | 0 | Réponse d'echo -3 - Destinataire innaccessible | 0 | Réseau innaccessible -3 - Destinataire innaccessible | 1 | Machine innaccessible -3 - Destinataire innaccessible | 2 | Protocole innaccessible -3 - Destinataire innaccessible | 3 | Port innaccessible +3 - Destinataire inaccessible | 0 | Réseau inaccessible +3 - Destinataire inaccessible | 1 | Machine inaccessible +3 - Destinataire inaccessible | 2 | Protocole inaccessible +3 - Destinataire inaccessible | 3 | Port inaccessible 8 - Demande d'écho | 0 | Demande d'écho -Il faut également savoir que les numéros de types sont différents suivant la version d'ICMP qu'on utilise. Ainsi, le type 1 en IPv6 n'est pas forcement le même qu'en IPv4. +Il faut également savoir que les numéros de types sont différents suivants la version d'ICMP qu'on utilise. Ainsi, le type 1 en IPv6 n'est pas forcément le même qu'en IPv4. Si vous voulez plus de détails sur ces numéros et codes, voici la documentation de L'IANA à ce sujet : IPv6 et IPv4 -### Format d'un paquet ICMP +### Format d'un paquet ICMP [[1]](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/) [[2]](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5) [[3]](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394) [[5]](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6) --- -Même si le protocole ICMP se trouve sur la même couche que le protocole IP, il ne dispose pas d'un paquet propre. En effet, il est directement encapsulé dans un paquet IP. De ce faite, ICMP est traité par IP comme étant un protocole de couche supérieur. +Même si le protocole ICMP se trouve sur la même couche que le protocole IP, il ne dispose pas d'un paquet propre. En effet, il est directement encapsulé dans un paquet IP. De ce fait, ICMP est traité par IP comme étant un protocole de couche supérieure. Le format en IPv4 contient : @@ -71,18 +71,40 @@ Le format en IPv4 contient : - Code : le code décrivant l'état du type - Somme de contrôle : permet de vérifier que les données n'ont pas été corrompu en chemin. -Le format en IPv6 est sembable à celui en IPv4 mais sont en-tête IP est adapté à la version 6. +Le format en IPv6 est semblable à celui en IPv4 mais son en-tête IP est adapté à la version 6. ## Bibliographie 1. [Qu'est-ce que le protocole ICMP ?](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/), Digital Guide IONOS, le 05/03/2019, consulté le 31/05/2022 + - _Résumé : Explication générale d'ICMP_ + - _Avis sur la ressource : Permet de se faire une idée en gros du sujet_ -2. [RFC 792](https://datatracker.ietf.org/doc/html/rfc792), J.Postel, septembre 1981, consulté le 31/05/2022 +2. [Internet Control Message Protocol](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5), Wikipedia, 27/12/2021, consulté le 31/05/2022 + - _Résumé : Explication générale d'ICMPv4_ + - _Avis sur la ressource : Fiable et permet d'étoffer quelques détails_ -3. [RFC 4443](https://datatracker.ietf.org/doc/html/rfc4443), A.Conta & S.Deering & M.Gupta, mars 2003, consulté le 31/05/2022 +3. [ICMP](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394), Cisco, consulté le 31/05/2022 + - _Résumé : Extrait du livre de Cisco sur les notions de base en sur les réseaux_ + - _Avis sur la ressource : Fiable et résume en quelque ligne et de manière suffisante (pour cet article) ICMP_ -4. [Internet Control Message Protocol](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#cite_note-5), Wikipedia, 27/12/2021, consulté le 31/05/2022 +4. [RFC 792](https://datatracker.ietf.org/doc/html/rfc792), J.Postel, septembre 1981, consulté le 31/05/2022 + - _Résumé : RFC détaillant l'implémentation d'ICMPv4_ + - _Avis sur la ressource : Fiable et explique de manière détailler ICMPv4_ 5. [Internet Control Message Protocol V6](https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol_V6), Wikipedia, 10/10/2017, consulté le 31/05/2022 + - _Résumé : Explication générale d'ICMPv6_ + - _Avis sur la ressource : Fiable et permet d'étoffer quelques détails_ + +6. [RFC 4443](https://datatracker.ietf.org/doc/html/rfc4443), A.Conta & S.Deering & M.Gupta, mars 2003, consulté le 31/05/2022 + - _Résumé : RFC détaillant l'implémentation d'ICMPv6_ + - _Avis sur la ressource : Fiable et reprenant l'implémentation d'ICMPv4 mise à jour pour ICMPv6_ + +7. [Internet Control Message Protocol version 6 (ICMPv6) Parameters](https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml#icmpv6-parameters-2), Iana, 27/04/2022, consulté le 31/05/2022 + - _Résumé : Document de l'Iana regroupant tous les codes et types d'ICMPv6_ + - _Avis sur la ressource : Fiable et permet d'avoir la liste complète et expliquée de tous les paramètres d'ICMPv6_ + +8. [Internet Control Message Protocol (ICMP) Parameters](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml), Iana, 25/09/2020, consulté le 31/05/2022 + - _Résumé : Document de l'Iana regroupant tous les codes et types d'ICMPv4_ + - _Avis sur la ressource : Fiable et permet d'avoir la liste complète et expliquée de tous les paramètres d'ICMPv4_ + -6. [ICMP](https://www.editions-eni.fr/open/mediabook.aspx?idR=769233a055093dd8a2a414361a469394), Cisco, consulté le 31/05/2022 From 2a844fd7ffacd3d220eeb89409b55bdf54001efd Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Thu, 2 Jun 2022 14:49:30 +0200 Subject: [PATCH 122/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 2ab5df0..85d70ae 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -8,9 +8,12 @@ parent : Réseaux ## Un peu d'histoire -En informatique et plus particulièrement en réseau, les paquets sont les éléments principaux pour communiquer des données. On y distingue deux grands types de paquets, ceux pour les données et ceux contenant l’adresse de l’expéditeur et du destinataire. +En informatique et plus particulièrement en réseau, les paquets sont les éléments principaux pour communiquer des données entre deux machines. +Dans ces paquets on y distingue deux grands types d'éléments à savoir, ceux pour les données et ceux contenant l’adresse de l’expéditeur et du destinataire. -Le point négatif de cette communication est l’absence de sécurité en effet les données ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité des paquets également. + + +Le point négatif de cette communication est l’absence de sécurité en effet les données ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité de celles-ci également. C’est un gros problème vu que lors de cet échange de données, les paquets passe par différents routeurs. Elles peuvent donc être interceptées, lues, manipulées, modifiées à tout moment par une personne mal intentionnée. From fa0c713aa35eda424b346cdaae74b7da6fceb411 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Thu, 2 Jun 2022 15:00:28 +0200 Subject: [PATCH 123/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 85d70ae..0bd73ed 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -11,9 +11,10 @@ parent : Réseaux En informatique et plus particulièrement en réseau, les paquets sont les éléments principaux pour communiquer des données entre deux machines. Dans ces paquets on y distingue deux grands types d'éléments à savoir, ceux pour les données et ceux contenant l’adresse de l’expéditeur et du destinataire. +Screenshot 2022-06-02 at 14 59 04 -Le point négatif de cette communication est l’absence de sécurité en effet les données ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité de celles-ci également. +Le point négatif de cette communication est l’absence de sécurité en effet les données des paquets ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité de celles-ci également. C’est un gros problème vu que lors de cet échange de données, les paquets passe par différents routeurs. Elles peuvent donc être interceptées, lues, manipulées, modifiées à tout moment par une personne mal intentionnée. From e387df93bf8f40ab4370025bf01d4c18e9f9557e Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 00:30:39 +0200 Subject: [PATCH 124/241] =?UTF-8?q?[ADD]=20Cr=C3=A9ation=20du=20fichier=20?= =?UTF-8?q?.md=20docker=20swarm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Début de la rédaction de l'article sur le docker swarm et les réseaux overlay. --- "R\303\251seaux/docker_swarm.md" | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 "R\303\251seaux/docker_swarm.md" diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" new file mode 100644 index 0000000..f44bc39 --- /dev/null +++ "b/R\303\251seaux/docker_swarm.md" @@ -0,0 +1,50 @@ +# Docker swarm et réseaux overlay + +## Docker swarm +Un docker swarm est un ensemble ("cluster") d'hôtes Docker ("Docker hosts"). Un docker host est une instance Docker Engine. Il est possible d'en avoir plusieurs sur une même machine hôte. On appelles "nodes" les docker hosts faisant partie d'un swarm. Ces nodes peuvent avoir deux rôles : + +- manager : gère l'adhésion des hôtes et la délégation des taches. +- worker : fait tourner un service swarm. + +Par défaut les nodes manager font aussi tourner des services comme des nodes worker. On peut les configurer pour qu'elles gèrent uniquement des taches de manager. + +Le principe d'un docker swarm est de déployer les services sur un seule node, le manager. On fournit une définition de service au node manager et celui-ci s'occupera de départager les unités de travail, les taches ("tasks"), entre les différents worker nodes. + +### Créer un docker swarm et le rejoindre +On initialise sur un docker host le swarm. Ce docker host deviendra un manager. +``` +docker swarm init --advertise-addr= +``` +\ est ... + +La commande renvoie un message indiquant la commande à taper pour qu'un autre docker host puisse rejoindre le swarm en tant que worker ou manager. Elle ressemblera à : +``` +docker swarm join --token :2377 +``` +On peut obtenir ces commandes en utilisant sur un node manager : +``` +docker swarm join-token [worker/manager] +``` + + +On peut également changer changer le mode d'un node avec les commandes +``` +docker node promote +docker node demote +``` + La première transforme un worker en manager et la seconde fait l'inverse. + +### Services et tasks +Un services est la définition des tasks à exécuter sur les nodes worker ou manager. En définissant un service on indique quelle image utiliser et les commandes à exécuter dans les tasks. On définit pour ce service un état optimal que Docker essaiera de maintenir. On peut définir le nombre de répliques, ressources de stockage, ressources de réseau, ports exposés vers l'extérieur, etc. Le manager distribuera les tasks en fonction de l'état optimal. + +Les tasks, en opposition aux "standalone containers", sont des containers faisant partie d'un service swarm et étant gérés par un swarm manager. Le type de service qu'on définit dans l'état optimal permets de déterminer le nombre de tasks qui seront distribuées par le manager entre les workers. + +- Replicated service : le manager distribue un nombre précis de tasks à travers les workers. +- Global service : le manager distribue une task à chaque node disponible dans le cluster. + +### Tolérance aux pannes et Load balancing +Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De cette manière le manager peut maintenir l'état désiré. Par exemple, dans le cas où un worker tombe en panne et n'est plus disponible le manager redistribue une nouvelle Task à un autre worker pour respecter le nombre de répliques qu'on doit avoir. + +Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DNS pour chaque service dans le swarm. Le manager fait du load balancing pour distribuer les requêtes entre les service disponibles en fonction du nom DNS du service. Il utilise le load balancing également pour rendre les services accessibles à l'extérieur du swarm si on le souhaite. Il peut assigner automatiquement un "Published Port", un port extérieur, à un service (entre 30 000 et 32 767). On peut aussi choisir nous même un port non utilisé. + +## Réseaux overlay From eb5b59f1b14de4661003f6434c8cd99eb70381d1 Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 00:56:01 +0200 Subject: [PATCH 125/241] =?UTF-8?q?[EDIT]=20Ajout=20section=20cr=C3=A9atio?= =?UTF-8?q?n=20de=20services?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/docker_swarm.md" | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index f44bc39..aa54a68 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -15,7 +15,7 @@ On initialise sur un docker host le swarm. Ce docker host deviendra un manager. ``` docker swarm init --advertise-addr= ``` -\ est ... +\ est l'adresse IP de la machine abritant le manager. La commande renvoie un message indiquant la commande à taper pour qu'un autre docker host puisse rejoindre le swarm en tant que worker ou manager. Elle ressemblera à : ``` @@ -42,6 +42,32 @@ Les tasks, en opposition aux "standalone containers", sont des containers faisan - Replicated service : le manager distribue un nombre précis de tasks à travers les workers. - Global service : le manager distribue une task à chaque node disponible dans le cluster. +### Création de services +La parmétrisation d'un service peut être très complète. Voyons les points basiques. Pour plus d'informations, n'hésitez pas à consulter la documentation [Docker](https://docs.docker.com/engine/swarm/services/#create-a-service). + +La commande de base pour créer un service swarm est la suivante. \ est l'image qu'utiliserons les containers (tasks) et \ est la commande qui sera exécutée dans le container après sa création. +``` +docker service create +``` + +On peut bien sûr compléter cette commande avec une multitude de flags : + +- ```--name ``` permets de donner un nom au service. +- ```--p / --publish ``` permets de choisir un Published Port, un port externe sur lequel on accède au service. +- ```--env =``` permets de définir des variables d'environnement. +- ```--workdir ``` permets de définir un working directory. +- ```--user ``` permets de définir un utilisateur. +- ```--mode ``` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flan un service sera replicated par défaut. +- ```--replicas ``` permets d'indiquer le nombre de répliques qu'on veut avoir. +- etc. + +On peut également définir le comportement de mise à jour du service (délai avant mise à jour automatique, que faire lors d'une erreur de mise à jour, ...), définir une façon de revenir à une version antérieure du service en cas de problème avec la version actuelle du service. + +++ named volumes, bind mounts + +++ réseaux overlays + + ### Tolérance aux pannes et Load balancing Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De cette manière le manager peut maintenir l'état désiré. Par exemple, dans le cas où un worker tombe en panne et n'est plus disponible le manager redistribue une nouvelle Task à un autre worker pour respecter le nombre de répliques qu'on doit avoir. From 09a30c16eebb4e3586e24a2111ded76d7edec19e Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 11:31:37 +0200 Subject: [PATCH 126/241] =?UTF-8?q?[EDIT]=20r=C3=A9seau=20overlay=20et=20c?= =?UTF-8?q?r=C3=A9ation=20d'overlay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de la partie sur explication d'un réseau overlay et partie sur la création d'un réseau overlay. --- "R\303\251seaux/docker_swarm.md" | 41 ++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index aa54a68..59a55ab 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -57,7 +57,7 @@ On peut bien sûr compléter cette commande avec une multitude de flags : - ```--env =``` permets de définir des variables d'environnement. - ```--workdir ``` permets de définir un working directory. - ```--user ``` permets de définir un utilisateur. -- ```--mode ``` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flan un service sera replicated par défaut. +- ```--mode ``` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flag un service sera replicated par défaut. - ```--replicas ``` permets d'indiquer le nombre de répliques qu'on veut avoir. - etc. @@ -65,7 +65,6 @@ On peut également définir le comportement de mise à jour du service (délai a ++ named volumes, bind mounts -++ réseaux overlays ### Tolérance aux pannes et Load balancing @@ -74,3 +73,41 @@ Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DNS pour chaque service dans le swarm. Le manager fait du load balancing pour distribuer les requêtes entre les service disponibles en fonction du nom DNS du service. Il utilise le load balancing également pour rendre les services accessibles à l'extérieur du swarm si on le souhaite. Il peut assigner automatiquement un "Published Port", un port extérieur, à un service (entre 30 000 et 32 767). On peut aussi choisir nous même un port non utilisé. ## Réseaux overlay +On peut aussi préciser à la création d'un service un réseau overlay. Le but d'un réseau overlay est de permettre la communication entre des containers sur des docker hosts/machines différentes. Tous les containers peuvent participer à un réseau overlay, peu importe si ce sont des tasks définis par un service ou des standalone containers. Dès qu'un container rejoindra le réseau une adresse ip du réseau lui sera attribué. + +### Création d'un réseau overlay +On doit créer le réseau overlay sur un manager. Ce dernier fera savoir aux autres nodes que le réseau existe. +``` +docker network create -d overlay +``` + +Quelques flags à utiliser : + +- ```--attachable```permets d'attacher manuellement des containers au réseau et donc à des standalone containers d'utiliser le réseau overlay. +- ``` -d / --driver``` indique le driver qui gèrera le réseau (bridge, overlay, ...). Bridge est mis par défaut, il faut donc préciser que c'est un réseau overlay dans notre cas avec ``` --d overlay```. +- ``` --gateway ``` définit une Gateway pour le réseau. +- ```--internal ```empêche l'accès au réseau depuis l'exterieur. +- ```--ipv6 ```active l'IPv6. +- ``` --subnet ``` définit le sous-réseau dans lequel Docker va piocher les adresses à attribuer. Docker attribue par défaut des subnets aux différents réseaux et fait en sorte qu'il ne se superposent pas. Ce flag nous permets de choisir le subnet d'adresses. +- ``` --ip-range ``` permets de définir un sous-ensemble d'adresses ip dans le subnet que Docker utilisera pour l'attributaion des ip. +- etc. + +Exemple : +``` + docker network create + --d overlay \ + --attachable \ + --subnet=172.28.0.0/16 \ + --ip-range=172.28.5.0/24 \ + --gateway=172.28.5.254 \ + my_overlay +``` + + +Pour plus d'infos ou exemples consultez la documentation [Docker](https://docs.docker.com/engine/reference/commandline/network_create/) ou la commande ``` docker network create --help```. + +### Attribuer un réseau overlay à un service + +### Attribuer un réseau overlay à un standalone container + +### Ports utilisés From b5573768855c460a4967d64b1869398516c31273 Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 11:51:31 +0200 Subject: [PATCH 127/241] [EDIT] volumes, bind mounts, exemples services MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de l'explication des data volumes et bind mounts. Ajout d'exemples pour la création de services. --- "R\303\251seaux/docker_swarm.md" | 37 +++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index 59a55ab..ea57140 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -52,20 +52,41 @@ docker service create On peut bien sûr compléter cette commande avec une multitude de flags : -- ```--name ``` permets de donner un nom au service. -- ```--p / --publish ``` permets de choisir un Published Port, un port externe sur lequel on accède au service. -- ```--env =``` permets de définir des variables d'environnement. -- ```--workdir ``` permets de définir un working directory. -- ```--user ``` permets de définir un utilisateur. -- ```--mode ``` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flag un service sera replicated par défaut. -- ```--replicas ``` permets d'indiquer le nombre de répliques qu'on veut avoir. +- ```--name ``` permets de donner un nom au service. +- ```--p/--publish ``` permets de choisir un Published Port, un port externe sur lequel on accède au service. +- ```--env ``` permets de définir des variables d'environnement. +- ```--workdir``` permets de définir un working directory. +- ```--user``` permets de définir un utilisateur. +- ```--mode``` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flag un service sera replicated par défaut. +- ```--replicas``` permets d'indiquer le nombre de répliques qu'on veut avoir. - etc. On peut également définir le comportement de mise à jour du service (délai avant mise à jour automatique, que faire lors d'une erreur de mise à jour, ...), définir une façon de revenir à une version antérieure du service en cas de problème avec la version actuelle du service. -++ named volumes, bind mounts +Pour avoir des données persistantes on peut utiliser le flag ``` --mount ``` pour définir des data volumes ou bind mounts [(documentation docker)](https://docs.docker.com/engine/swarm/services/#give-a-service-access-to-volumes-or-bind-mounts). Le principe est similaire aux [bind mounts](https://docs.docker.com/storage/bind-mounts/) et [named volumes](https://docs.docker.com/storage/volumes/) utilisés pour avoir des données persistantes sur des standalone containers. +Quelques exemples issus de la documentation Docker : +``` +docker service create --name helloworld \ + --env MYVAR=myvalue \ + --workdir /tmp \ + --user my_user \ + alpine ping docker.com +``` +``` + docker service create --name my_web \ + --replicas 3 \ + --publish published=8080,target=80 \ + nginx +``` +``` +docker service create \ + --mode global \ + --publish mode=host,target=80,published=8080 \ + --name=nginx \ + nginx:latest +``` ### Tolérance aux pannes et Load balancing Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De cette manière le manager peut maintenir l'état désiré. Par exemple, dans le cas où un worker tombe en panne et n'est plus disponible le manager redistribue une nouvelle Task à un autre worker pour respecter le nombre de répliques qu'on doit avoir. From d52e1542fb1bf88689a8cd88cf809199a3feabf3 Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 11:52:39 +0200 Subject: [PATCH 128/241] Update docker_swarm.md --- "R\303\251seaux/docker_swarm.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index ea57140..e800767 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -69,10 +69,10 @@ Quelques exemples issus de la documentation Docker : ``` docker service create --name helloworld \ - --env MYVAR=myvalue \ - --workdir /tmp \ - --user my_user \ - alpine ping docker.com + --env MYVAR=myvalue \ + --workdir /tmp \ + --user my_user \ + alpine ping docker.com ``` ``` docker service create --name my_web \ @@ -82,10 +82,10 @@ docker service create --name helloworld \ ``` ``` docker service create \ - --mode global \ - --publish mode=host,target=80,published=8080 \ - --name=nginx \ - nginx:latest + --mode global \ + --publish mode=host,target=80,published=8080 \ + --name=nginx \ + nginx:latest ``` ### Tolérance aux pannes et Load balancing From 8ba1367f250f23b4425a7c0e97464b3fc5fca561 Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 12:04:32 +0200 Subject: [PATCH 129/241] =?UTF-8?q?[EDIT]=20Attribution=20r=C3=A9seau=20ov?= =?UTF-8?q?erlay,=20ports=20utilis=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de la partie expliquant comment attribuer un réseau overlay à un service swarm ou un standalone container. Ajout des ports utilisés par les réseaux overlays. --- "R\303\251seaux/docker_swarm.md" | 38 ++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index e800767..763cfe6 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -1,6 +1,4 @@ -# Docker swarm et réseaux overlay - -## Docker swarm +# Docker swarm Un docker swarm est un ensemble ("cluster") d'hôtes Docker ("Docker hosts"). Un docker host est une instance Docker Engine. Il est possible d'en avoir plusieurs sur une même machine hôte. On appelles "nodes" les docker hosts faisant partie d'un swarm. Ces nodes peuvent avoir deux rôles : - manager : gère l'adhésion des hôtes et la délégation des taches. @@ -10,7 +8,7 @@ Par défaut les nodes manager font aussi tourner des services comme des nodes wo Le principe d'un docker swarm est de déployer les services sur un seule node, le manager. On fournit une définition de service au node manager et celui-ci s'occupera de départager les unités de travail, les taches ("tasks"), entre les différents worker nodes. -### Créer un docker swarm et le rejoindre +## Créer un docker swarm et le rejoindre On initialise sur un docker host le swarm. Ce docker host deviendra un manager. ``` docker swarm init --advertise-addr= @@ -34,7 +32,7 @@ docker node demote ``` La première transforme un worker en manager et la seconde fait l'inverse. -### Services et tasks +## Services et tasks Un services est la définition des tasks à exécuter sur les nodes worker ou manager. En définissant un service on indique quelle image utiliser et les commandes à exécuter dans les tasks. On définit pour ce service un état optimal que Docker essaiera de maintenir. On peut définir le nombre de répliques, ressources de stockage, ressources de réseau, ports exposés vers l'extérieur, etc. Le manager distribuera les tasks en fonction de l'état optimal. Les tasks, en opposition aux "standalone containers", sont des containers faisant partie d'un service swarm et étant gérés par un swarm manager. Le type de service qu'on définit dans l'état optimal permets de déterminer le nombre de tasks qui seront distribuées par le manager entre les workers. @@ -42,7 +40,7 @@ Les tasks, en opposition aux "standalone containers", sont des containers faisan - Replicated service : le manager distribue un nombre précis de tasks à travers les workers. - Global service : le manager distribue une task à chaque node disponible dans le cluster. -### Création de services +## Création de services La parmétrisation d'un service peut être très complète. Voyons les points basiques. Pour plus d'informations, n'hésitez pas à consulter la documentation [Docker](https://docs.docker.com/engine/swarm/services/#create-a-service). La commande de base pour créer un service swarm est la suivante. \ est l'image qu'utiliserons les containers (tasks) et \ est la commande qui sera exécutée dans le container après sa création. @@ -88,15 +86,18 @@ docker service create \ nginx:latest ``` -### Tolérance aux pannes et Load balancing +## Tolérance aux pannes et Load balancing Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De cette manière le manager peut maintenir l'état désiré. Par exemple, dans le cas où un worker tombe en panne et n'est plus disponible le manager redistribue une nouvelle Task à un autre worker pour respecter le nombre de répliques qu'on doit avoir. Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DNS pour chaque service dans le swarm. Le manager fait du load balancing pour distribuer les requêtes entre les service disponibles en fonction du nom DNS du service. Il utilise le load balancing également pour rendre les services accessibles à l'extérieur du swarm si on le souhaite. Il peut assigner automatiquement un "Published Port", un port extérieur, à un service (entre 30 000 et 32 767). On peut aussi choisir nous même un port non utilisé. -## Réseaux overlay + + + +# Réseaux overlay On peut aussi préciser à la création d'un service un réseau overlay. Le but d'un réseau overlay est de permettre la communication entre des containers sur des docker hosts/machines différentes. Tous les containers peuvent participer à un réseau overlay, peu importe si ce sont des tasks définis par un service ou des standalone containers. Dès qu'un container rejoindra le réseau une adresse ip du réseau lui sera attribué. -### Création d'un réseau overlay +## Création d'un réseau overlay On doit créer le réseau overlay sur un manager. Ce dernier fera savoir aux autres nodes que le réseau existe. ``` docker network create -d overlay @@ -127,8 +128,21 @@ Exemple : Pour plus d'infos ou exemples consultez la documentation [Docker](https://docs.docker.com/engine/reference/commandline/network_create/) ou la commande ``` docker network create --help```. -### Attribuer un réseau overlay à un service +## Attribuer un réseau overlay à un service ou un standalone container +Attribuer un réseau overlay à un service ou standalone container ce fait à sa création avec le flag ``` --network ``` . +``` +docker service create ... --network ... +``` +Dans le cas du standalone container il faut veiller à ce que le réseau ai été créé avec le flag ```--attachable ```. Sans ça on ne pourra tout simplement pas attribuer le réseau overlay. +``` +docker run ... --network ... +``` + +## Ports utilisés +Un réseau overlay utilise plusieurs ports pour communiquer : -### Attribuer un réseau overlay à un standalone container +- 2377/tcp : communications pour la gestion du cluster +- 7946/tcp, 7946/udp : communications entre nodes +- 4789/udp : traffic du réseau overlay -### Ports utilisés +Il faut donc veiller à ouvrir ces ports sur chaque Docker host participant à un réseau overlay. From fbad07af23db7ea1c67592d5913c2b4309a8c0fa Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 12:14:15 +0200 Subject: [PATCH 130/241] [EDIT] Ajout image swarm nodes Ajout d'une image venant de la documentation docker "How nodes work". --- "R\303\251seaux/docker_swarm.md" | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index 763cfe6..8ea5c6f 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -6,7 +6,13 @@ Un docker swarm est un ensemble ("cluster") d'hôtes Docker ("Docker hosts"). Un Par défaut les nodes manager font aussi tourner des services comme des nodes worker. On peut les configurer pour qu'elles gèrent uniquement des taches de manager. -Le principe d'un docker swarm est de déployer les services sur un seule node, le manager. On fournit une définition de service au node manager et celui-ci s'occupera de départager les unités de travail, les taches ("tasks"), entre les différents worker nodes. +Le principe d'un docker swarm est de déployer les services sur un seule node, le manager. On fournit une définition de service au node manager et celui-ci s'occupera de départager les unités de travail, les taches ("tasks"), entre les différents worker nodes. Il est tout a fait possible d'avoir plusieurs manager dans un même swarm. + +![swarm-diagram](https://user-images.githubusercontent.com/94830560/172141105-e2b8a7b0-d8eb-4889-9fd9-a0f2d0ece97a.png) + +

+ Docker swarm contenant plusieurs nodes manager et worker. [7] +

## Créer un docker swarm et le rejoindre On initialise sur un docker host le swarm. Ce docker host deviendra un manager. From 283a5f5e8ae4f832c0d2e10d0820580b94ea46fc Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 12:40:15 +0200 Subject: [PATCH 131/241] [EDIT] Ajout d'une bibliographie Ajout bibliographie --- "R\303\251seaux/docker_swarm.md" | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index 8ea5c6f..9d234c1 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -152,3 +152,25 @@ Un réseau overlay utilise plusieurs ports pour communiquer : - 4789/udp : traffic du réseau overlay Il faut donc veiller à ouvrir ces ports sur chaque Docker host participant à un réseau overlay. + + +# Bibliographie +| N° | Auteur | Date de rédaction | Date de consultation | Titre | Lien | +|---|---|---|---|---|---| +| 1 |Docker| - | 1 Juin 2022 | Swarm mode key concepts | https://docs.docker.com/engine/swarm/key-concepts/ | +|2|Docker| - |1 Juin 2022| Getting started with swarm mode |https://docs.docker.com/engine/swarm/swarm-tutorial/| +|3|Docker| - |1 Juin 2022| How nodes work |https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/| +|4|Docker| - |1 Juin 2022| Create a swarm |https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/| +|5|Docker| - |3 Juin 2022|Deploy services to a swarm|https://docs.docker.com/engine/swarm/services/| +|6|Docker| - |3 Juin 2022|Use overlay networks|https://docs.docker.com/network/overlay/| +|7|Docker| - |3 Juin 2022|Networking with overlay networks|https://docs.docker.com/network/network-tutorial-overlay/| +|8|Docker| - |3 Juin 2022|Networking with standalone containers|https://docs.docker.com/network/network-tutorial-standalone/| +|9|Docker| - |1 Juin 2022|docker node promote|https://docs.docker.com/engine/reference/commandline/node_promote/| +|10|Docker| - |1 Juin 2022|docker node demote|https://docs.docker.com/engine/reference/commandline/node_demote/ | +|11|Docker| - |3 Juin 2022|docker network create|https://docs.docker.com/engine/reference/commandline/network_create/| +|12|Docker| - |6 Juin 2022|Use volumes|https://docs.docker.com/storage/volumes/| +|13|Docker| - |6 Juin 2022|Use bind mounts|https://docs.docker.com/storage/bind-mounts/| +|14|Sandip Bhowmik|15 Novembre 2018|1 Juin 2022|How to Configure Docker Swarm with multiple Docker Nodes on Ubuntu 18.04|https://linuxconfig.org/how-to-configure-docker-swarm-with-multiple-docker-nodes-on-ubuntu-18-04| +|15|BMitch|19 Février 2018|1 Juin 2022|What is the difference between docker host and node?|https://stackoverflow.com/questions/48801206/what-is-the-difference-between-docker-host-and-node| +|16|Simplilearn - Matthew|26 Octobre 2018|1 Juin 2022|Docker Swarm | Docker Swarm Tutorial | What Is Docker Swarm? | Docker Swarm Example | Simplilearn|https://www.youtube.com/watch?v=Tm0Q5zr3FL4| + From 4442b102edaacba0e48d6943807044072d37a294 Mon Sep 17 00:00:00 2001 From: HE201916 <71373221+HE201916@users.noreply.github.com> Date: Mon, 6 Jun 2022 15:23:18 +0200 Subject: [PATCH 132/241] [UPD] les protocoles VPN --- "R\303\251seaux/Les protocoles VPN.md" | 87 +++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 9 deletions(-) diff --git "a/R\303\251seaux/Les protocoles VPN.md" "b/R\303\251seaux/Les protocoles VPN.md" index 4c04097..edb65fd 100644 --- "a/R\303\251seaux/Les protocoles VPN.md" +++ "b/R\303\251seaux/Les protocoles VPN.md" @@ -5,7 +5,12 @@ ## Introduction : -Les connexions VPN (Virutal Private Network) permettent de créer un lien sécurisé entre deux points, il existe deux types de connexions VPN : +Les connexions VPN (Virutal Private Network) permettent de créer un lien sécurisé entre deux points, elles sont utilisées par les entreprises pour fournir à leurs employés un moyen d'accéder au réseau interne ou à des ressources internes depuis un ordinateur ou un réseau distant. Les connexions VPN sont chiffrées ce qui rend le trafic opaque pour les personnes non autorisées. Il existe aussi des connexions VPN commerciaux destinés aux internautes pour chiffrer leurs trafic et garantir leurs anonymat ainsi que contourner la censure. + +La première connexion VPN a été développé par un employé de Microsoft en 1996. Il a développé le “point-to-point tunneling protocol” (PPTP). + +Il existe trois types de connexions VPN : + 1- Site to Site VPN => entre deux réseaux d’entreprise @@ -19,11 +24,12 @@ Les connexions VPN (Virutal Private Network) permettent de créer un lien sécur ![image](https://user-images.githubusercontent.com/71373221/170224768-f54321ea-6297-4615-ac02-bba596431bf8.png) - + 3- SSL-VPN: Les entreprises utilisent des VPN SSL pour permettre aux utilisateurs distants d'accéder en toute sécurité aux services offert , ainsi que pour sécuriser les sessions Internet des utilisateurs qui accèdent à Internet depuis l'extérieur du réseau de l'entreprise. + +![image](https://user-images.githubusercontent.com/71373221/172167250-c4a129a1-8677-4987-a332-770f594a8b81.png) -Le lien créé est appelé un Tunnel VPN, les données qui sont envoyés à travers ce lien sont chiffrés. Le choix du protocole VPN à utiliser se base sur trois facteurs: 1- Les algorithmes de chiffrement utilisés donc le niveau de sécurité et de cryptage offert @@ -33,10 +39,6 @@ Le choix du protocole VPN à utiliser se base sur trois facteurs: 3- La facilité de mise en place - - - - ## Les protocoles VPN @@ -54,6 +56,10 @@ C’est le protocole VPN le plus ancien, ses plus gros avantages sont la vitesse • Utilise le chiffrement MPPE (Microsoft Point-to-Point Encryption). +PPTP est un protocole de niveau 2, le principe de ce protocole est de crypter et compresser des trames PPP et de les encapsuler dans un datagramme IP. Les données du réseau local sont encapsulées dans un message PPP, qui est lui-même encapsulé dans un message IP. +Le schéma suivant montre comment un paquet PPTP est assemblé. + +![image](https://user-images.githubusercontent.com/71373221/172167318-0a443f0d-833c-4158-bf44-e4ae609382c6.png) @@ -74,8 +80,31 @@ Il encapsule les données deux fois, ce qui peut ralentir la connexion. Cependan • Très facile à configurer +L2TP est un protocole de niveau 2, le principe de ce protocole est de crypter des trames PPP et de les encapsuler dans un datagramme IP qui est crypté avec IPsec. +IPsec permet de sécuriser les échanges au niveau de la couche réseau. +Le schéma suivant montre comment un paquet L2TP/IPsec est assemblé. + +![image](https://user-images.githubusercontent.com/71373221/172167379-f74de74f-d68d-41e8-a7b7-a07404487c39.png) + +### SSTP (Secure Socket Tunneling Protocol): + +SSTP est un protocole VPN développé par Microsoft pour remplacer PPTP et L2TP/IPSec. Il a été introduit pour améliorer la sécurité des transferts de données et éviter les blocages des pare-feu. Il utilise SSL/TLS, des négociations de clés sécurisées et des transferts cryptés. +Lorsqu'un client établit une connexion VPN basée sur SSTP, il établit d'abord une connexion TCP au serveur SSTP via le port TCP 443. L'établissement de liaison SSL/TLS se produit via cette connexion TCP. + +• Disponible sur Linux et Mac OS X mais il est utilisé principalement sur Windows. + +• SSTP utilise le chiffrement AES-256 (Advanced Encryption Standard) + +• Facile à installer et à configurer + +• Utilise TCP sur le port 443 ce qui le rend difficile à bloquer + +SSTP est un protocole de niveau transport , les paquets IP sont chiffrés, encapsulés puis transportés dans un canal SSL. +Le schéma suivant montre comment un paquet SSTP est assemblé. +![image](https://user-images.githubusercontent.com/71373221/172168007-9ef2bcdf-a25c-4acf-98d2-f666cbda1b03.png) + ### IKEv2/IPsec : Internet Key Exchange version 2 with IPsec @@ -89,6 +118,15 @@ IKEv2 est un protocole de tunnellisation. Il est associé à IPsec pour assurer • Connexion stable et cohérente +IKEv2 est un protocole de niveau application, il permet l’échange de clés secrètes de façon sécurisée. Le principe de ce protocole est de chiffrer des messages en utilisant des clés pré-partagées. IPsec permet de sécuriser les échanges au niveau de la couche réseau. +IKE combine des éléments issus de protocoles différents : +- ISAKMP : Internet Security Association and Key Management Protocol (RFC 2408) +- OAKLEY : Oakley Key Determination Protocol (RFC 2412) +- DOI : IPSec Domain of Interpretation (RFC 2407) + +Le schéma suivant montre l’emplacement de IKE et IPsec dans les couches TCP/IP. + +![image](https://user-images.githubusercontent.com/71373221/172167414-8ffaa2f6-dc8e-4c1b-b80c-b58e895b7f19.png) ### OpenVPN @@ -111,6 +149,10 @@ C’est le protocole VPN le plus utilisé, il est compatible avec plusieurs équ • La configuration est complexe. +Le transfert de données démarre après l'échange de la clé symétrique en utilisant la connexion TLS déjà établie. OpenVPN utilise un tunnel UDP sans connexion où il n'y a pas de mécanisme de retransmission et ACK. La structure de paquet ainsi que l'encapsulation de la couche réseau peuvent être vues dans l’image ci-dessous. +L'en-tête de paquet se compose uniquement d'opcode et d'ID de clé. L'opcode est utilisé pour identifier le type de paquet, l'ID de clé est utilisé pour identifier l'état TLS local associé. + +![image](https://user-images.githubusercontent.com/71373221/172167457-f08c2733-d506-41a2-b0d6-cdaff62bb6be.png) @@ -128,12 +170,13 @@ C’est un protocole récent, développé en 2017 pour Linux, son principal avan • Utilise ChaCha20 pour le chiffrement et Poly1305 pour l'authentification. Il utilise aussi Curve25519 pour l'échange de clé Diffie-Hellman à courbe elliptique (ECDH) ; BLAKE2s pour le hachage; et un handshake 1.5 Round Trip Time (1.5-RTT) - +Le protocole WireGuard fournit un tunnel réseau sécurisé entre deux terminaux en utilisant le protocole UDP (User Datagram Protocol) comme protocole de transport. Il utilise un protocole cryptographique de handshake appelé Noise pour fournir une authentification mutuelle et l’accord sur la clé. Les données de transport telles que les paquets IP encapsulés dans les tunnels WireGuard sont protégées à l'aide du chiffrement authentifié avec données supplémentaires (AEAD). ## Conclusion -![image](https://user-images.githubusercontent.com/71373221/170264587-6f1faf76-f84a-4282-a497-f8bf6d074df9.png) +![image](https://user-images.githubusercontent.com/71373221/172167603-14fd30d6-0057-47b3-8cc6-dc9a989246bc.png) + Le PPTP est un ancien protocole vulnérable actuellement, il est conseillé de ne plus l’utiliser. @@ -143,6 +186,7 @@ WireGuard peut être bloqué par les pare-feux car il utilise UDP, comme IKEv2. OpenVPN est cependant moins susceptible d'être bloqué par les pare-feux lorsque vous vous connectez via TCP. Il est le protocole le plus fiable vue qu’il est opensource. +SSTP est un protocole propriétaire de Microsoft, s’il faut choisir entre PPTP, L2TP et SSTP, pour un ordinateur Windows, il vaut mieux utiliser SSTP car il peut contourner les pares-feux et il est plus sécurisé que PPTP. @@ -154,6 +198,9 @@ OpenVPN est cependant moins susceptible d'être bloqué par les pare-feux lorsqu https://www.ciscopress.com/articles/article.asp?p=25474&seqNum=7 Consulté le 21 mai 2022 +Date de publication : Feb 22, 2002. +L'article est écrit par Cisco Press . + Résumé : Article écrit par Cisco et décrit les protocoles IPSec et IKE1&2. Avis sur la resource : Excellent article, il donne des détails technique approfondis sur les protocoles IPSec et IKE1&2. @@ -177,6 +224,28 @@ Résumé : Cet article explique les protocoles VPN, il compare aussi les différ Avis sur la resource : ce document décrit bien les protocoles VPN et fait une comparaison détaillée. +* Secure Socket Tunneling Protocol (SSTP).: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-sstp/70adc1df-c4fe-4b02-8872-f1d8b9ad806a + +Consulté le 5 Juin 2022 + +Date de publication: 06/24/2021. + +L'article est écrit par Microsoft. + +Résumé : Article écrit par Microsoft et décrit le protocole SSTP. +Avis sur la ressource : Excellent article, il donne des détails technique approfondis sur le protocole SSTP. + +* Les VPNs et les protocoles SLIP, PPP, PPTP, L2F, L2TP, LCP, IPSec, MPLS, NAT: http://wapiti.enic.fr/commun/ens/peda/options/ST/RIO/pub/exposes/exposesrio2001ttv02/Roudel_Maroc/index.htm + +Consulté le 6 Juin 2022 + +Date de publication: Janvier 2002. + +L'article est écrit par Philippe Roudel et Alain Maroc ENIC. + +Résumé : Cet article décrit les protocoles suivants: SLIP, PPP, PPTP, L2F, L2TP, LCP, IPSec, MPLS, NAT. +Avis sur la ressource : Excellent article, il donne des détails technique approfondis sur tous les protocoles abordés. + From 6a069b3deb558e596f0f67d7ccddd398912b8612 Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 16:15:20 +0200 Subject: [PATCH 133/241] [EDIT] Ajout des liens vers bibliographie Ajout des liens vers la bibliographie --- "R\303\251seaux/docker_swarm.md" | 37 +++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index 9d234c1..a6d4c27 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -11,10 +11,11 @@ Le principe d'un docker swarm est de déployer les services sur un seule node, l ![swarm-diagram](https://user-images.githubusercontent.com/94830560/172141105-e2b8a7b0-d8eb-4889-9fd9-a0f2d0ece97a.png)

- Docker swarm contenant plusieurs nodes manager et worker. [7] + Docker swarm contenant plusieurs nodes manager et worker. [3]

+[1][2][3] -## Créer un docker swarm et le rejoindre +## Créer un docker swarm et le rejoindre [4][14] On initialise sur un docker host le swarm. Ce docker host deviendra un manager. ``` docker swarm init --advertise-addr= @@ -36,9 +37,9 @@ On peut également changer changer le mode d'un node avec les commandes docker node promote docker node demote ``` - La première transforme un worker en manager et la seconde fait l'inverse. + La première transforme un worker en manager et la seconde fait l'inverse. [9][10] -## Services et tasks +## Services et tasks [1][2][3] Un services est la définition des tasks à exécuter sur les nodes worker ou manager. En définissant un service on indique quelle image utiliser et les commandes à exécuter dans les tasks. On définit pour ce service un état optimal que Docker essaiera de maintenir. On peut définir le nombre de répliques, ressources de stockage, ressources de réseau, ports exposés vers l'extérieur, etc. Le manager distribuera les tasks en fonction de l'état optimal. Les tasks, en opposition aux "standalone containers", sont des containers faisant partie d'un service swarm et étant gérés par un swarm manager. Le type de service qu'on définit dans l'état optimal permets de déterminer le nombre de tasks qui seront distribuées par le manager entre les workers. @@ -46,7 +47,7 @@ Les tasks, en opposition aux "standalone containers", sont des containers faisan - Replicated service : le manager distribue un nombre précis de tasks à travers les workers. - Global service : le manager distribue une task à chaque node disponible dans le cluster. -## Création de services +## Création de services [5] La parmétrisation d'un service peut être très complète. Voyons les points basiques. Pour plus d'informations, n'hésitez pas à consulter la documentation [Docker](https://docs.docker.com/engine/swarm/services/#create-a-service). La commande de base pour créer un service swarm est la suivante. \ est l'image qu'utiliserons les containers (tasks) et \ est la commande qui sera exécutée dans le container après sa création. @@ -67,9 +68,9 @@ On peut bien sûr compléter cette commande avec une multitude de flags : On peut également définir le comportement de mise à jour du service (délai avant mise à jour automatique, que faire lors d'une erreur de mise à jour, ...), définir une façon de revenir à une version antérieure du service en cas de problème avec la version actuelle du service. -Pour avoir des données persistantes on peut utiliser le flag ``` --mount ``` pour définir des data volumes ou bind mounts [(documentation docker)](https://docs.docker.com/engine/swarm/services/#give-a-service-access-to-volumes-or-bind-mounts). Le principe est similaire aux [bind mounts](https://docs.docker.com/storage/bind-mounts/) et [named volumes](https://docs.docker.com/storage/volumes/) utilisés pour avoir des données persistantes sur des standalone containers. +Pour avoir des données persistantes on peut utiliser le flag ``` --mount ``` pour définir des data volumes ou bind mounts [[5]](https://docs.docker.com/engine/swarm/services/#give-a-service-access-to-volumes-or-bind-mounts). Le principe est similaire aux [bind mounts [12]](https://docs.docker.com/storage/bind-mounts/) et [named volumes [13]](https://docs.docker.com/storage/volumes/) utilisés pour avoir des données persistantes sur des standalone containers. -Quelques exemples issus de la documentation Docker : +Quelques exemples issus de la documentation Docker [5] : ``` docker service create --name helloworld \ @@ -92,18 +93,22 @@ docker service create \ nginx:latest ``` -## Tolérance aux pannes et Load balancing +Il est facile de modifier un service avec la commande ``` docker service update ... ```. Elle vient, tout comme la commande de création, avec beaucoup de flags. [5] + +## Tolérance aux pannes et Load balancing [1] Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De cette manière le manager peut maintenir l'état désiré. Par exemple, dans le cas où un worker tombe en panne et n'est plus disponible le manager redistribue une nouvelle Task à un autre worker pour respecter le nombre de répliques qu'on doit avoir. Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DNS pour chaque service dans le swarm. Le manager fait du load balancing pour distribuer les requêtes entre les service disponibles en fonction du nom DNS du service. Il utilise le load balancing également pour rendre les services accessibles à l'extérieur du swarm si on le souhaite. Il peut assigner automatiquement un "Published Port", un port extérieur, à un service (entre 30 000 et 32 767). On peut aussi choisir nous même un port non utilisé. +  +  # Réseaux overlay -On peut aussi préciser à la création d'un service un réseau overlay. Le but d'un réseau overlay est de permettre la communication entre des containers sur des docker hosts/machines différentes. Tous les containers peuvent participer à un réseau overlay, peu importe si ce sont des tasks définis par un service ou des standalone containers. Dès qu'un container rejoindra le réseau une adresse ip du réseau lui sera attribué. +On peut aussi préciser à la création d'un service un réseau overlay. Le but d'un réseau overlay est de permettre la communication entre des containers sur des docker hosts/machines différentes. Tous les containers peuvent participer à un réseau overlay, peu importe si ce sont des tasks définis par un service ou des standalone containers. Dès qu'un container rejoindra le réseau une adresse ip du réseau lui sera attribué. [6] -## Création d'un réseau overlay +## Création d'un réseau overlay [7][11] On doit créer le réseau overlay sur un manager. Ce dernier fera savoir aux autres nodes que le réseau existe. ``` docker network create -d overlay @@ -120,7 +125,7 @@ Quelques flags à utiliser : - ``` --ip-range ``` permets de définir un sous-ensemble d'adresses ip dans le subnet que Docker utilisera pour l'attributaion des ip. - etc. -Exemple : +Exemple de la documentation Docker [11] : ``` docker network create --d overlay \ @@ -132,9 +137,9 @@ Exemple : ``` -Pour plus d'infos ou exemples consultez la documentation [Docker](https://docs.docker.com/engine/reference/commandline/network_create/) ou la commande ``` docker network create --help```. +Pour plus d'infos ou exemples consultez la documentation [Docker [11]](https://docs.docker.com/engine/reference/commandline/network_create/) ou la commande ``` docker network create --help```. -## Attribuer un réseau overlay à un service ou un standalone container +## Attribuer un réseau overlay à un service ou un standalone container [7][8] Attribuer un réseau overlay à un service ou standalone container ce fait à sa création avec le flag ``` --network ``` . ``` docker service create ... --network ... @@ -144,7 +149,7 @@ Dans le cas du standalone container il faut veiller à ce que le réseau ai ét docker run ... --network ... ``` -## Ports utilisés +## Ports utilisés [6][7] Un réseau overlay utilise plusieurs ports pour communiquer : - 2377/tcp : communications pour la gestion du cluster @@ -153,6 +158,8 @@ Un réseau overlay utilise plusieurs ports pour communiquer : Il faut donc veiller à ouvrir ces ports sur chaque Docker host participant à un réseau overlay. +  +  # Bibliographie | N° | Auteur | Date de rédaction | Date de consultation | Titre | Lien | @@ -172,5 +179,5 @@ Il faut donc veiller à ouvrir ces ports sur chaque Docker host participant à u |13|Docker| - |6 Juin 2022|Use bind mounts|https://docs.docker.com/storage/bind-mounts/| |14|Sandip Bhowmik|15 Novembre 2018|1 Juin 2022|How to Configure Docker Swarm with multiple Docker Nodes on Ubuntu 18.04|https://linuxconfig.org/how-to-configure-docker-swarm-with-multiple-docker-nodes-on-ubuntu-18-04| |15|BMitch|19 Février 2018|1 Juin 2022|What is the difference between docker host and node?|https://stackoverflow.com/questions/48801206/what-is-the-difference-between-docker-host-and-node| -|16|Simplilearn - Matthew|26 Octobre 2018|1 Juin 2022|Docker Swarm | Docker Swarm Tutorial | What Is Docker Swarm? | Docker Swarm Example | Simplilearn|https://www.youtube.com/watch?v=Tm0Q5zr3FL4| +|16|Simplilearn - Matthew|26 Octobre 2018|1 Juin 2022|Docker Swarm - Docker Swarm Tutorial - What Is Docker Swarm? - Docker Swarm Example - Simplilearn|https://www.youtube.com/watch?v=Tm0Q5zr3FL4| From d151067988db86565044267ea3c2364644f7b6ec Mon Sep 17 00:00:00 2001 From: AlexandreDoneux <94830560+AlexandreDoneux@users.noreply.github.com> Date: Mon, 6 Jun 2022 17:04:27 +0200 Subject: [PATCH 134/241] =?UTF-8?q?[EDIT]=20Ajout=20sch=C3=A9mas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de schémas pour expliquer les types de services et le Load balancing. --- "R\303\251seaux/docker_swarm.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index a6d4c27..d9d86d1 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -47,6 +47,9 @@ Les tasks, en opposition aux "standalone containers", sont des containers faisan - Replicated service : le manager distribue un nombre précis de tasks à travers les workers. - Global service : le manager distribue une task à chaque node disponible dans le cluster. +![docker_swarm](https://user-images.githubusercontent.com/94830560/172188028-a8e5dc46-8b43-4404-bc66-99b7c880394c.png) + + ## Création de services [5] La parmétrisation d'un service peut être très complète. Voyons les points basiques. Pour plus d'informations, n'hésitez pas à consulter la documentation [Docker](https://docs.docker.com/engine/swarm/services/#create-a-service). @@ -100,6 +103,7 @@ Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DNS pour chaque service dans le swarm. Le manager fait du load balancing pour distribuer les requêtes entre les service disponibles en fonction du nom DNS du service. Il utilise le load balancing également pour rendre les services accessibles à l'extérieur du swarm si on le souhaite. Il peut assigner automatiquement un "Published Port", un port extérieur, à un service (entre 30 000 et 32 767). On peut aussi choisir nous même un port non utilisé. +![docker_swarm load_balancing](https://user-images.githubusercontent.com/94830560/172187969-31d75f97-e232-4a06-a702-186753e36e9d.png)     From ede0cc5ea2e2c1e3c1511240220b97d8ea390183 Mon Sep 17 00:00:00 2001 From: M-Momin Date: Tue, 7 Jun 2022 20:39:30 +0200 Subject: [PATCH 135/241] =?UTF-8?q?MQTT=20-=20Premi=C3=A8re=20version=20sa?= =?UTF-8?q?ns=20conclusion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MQTT_publish-subscribe_sh\303\251ma.png" | Bin 0 -> 30350 bytes "R\303\251seaux/MQTT.md" | 164 ++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 "Assets/Images/MQTT_publish-subscribe_sh\303\251ma.png" create mode 100644 "R\303\251seaux/MQTT.md" diff --git "a/Assets/Images/MQTT_publish-subscribe_sh\303\251ma.png" "b/Assets/Images/MQTT_publish-subscribe_sh\303\251ma.png" new file mode 100644 index 0000000000000000000000000000000000000000..23805d2a6ec8551308ed5bb9c496ea5175da7fc5 GIT binary patch literal 30350 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 literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" new file mode 100644 index 0000000..6fbd7ce --- /dev/null +++ "b/R\303\251seaux/MQTT.md" @@ -0,0 +1,164 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Article Wiki MQTT - Momin Maxime 2TL2 + + +## Introduction [1][2] + +MQTT est un protocole basé sur TCP-IP au niveau de la couche applicative. Celui-ci appartient aux protocoles de messagerie dit de type **publish-subscribe**. +Il a vu le jour avec une première version en 1999 et est né de la collaboration de Andy Stanford-Clark (IBM¹) et Arlen Nipper (Eurotech²). +MQTT a été conçu dans le but d'étre utilisé dans les zones où la bande passante est tout d'abord limitée. Ensuite, ces principaux objectifs étaient d'être efficace en therme de bande passante, d'être léger et également de posséder un faible dépense en énergie. + +Ce protocole, possédant une moindre surcharge en therme d'en-têtes que d'autres protocoles comme HTTP³, excelle au niveau du transfert de données comparés à d'autres protocoles de communication. Un point important à spécifier est que celui-ci est décrit comme être facile à mettre en oeuvre coté client et convient très bien à des environnements possédants des ressources limitées. Etant donné que ce critère était également l'un des objectifs initiaux du protocole, il est important de le souligner. + +Il n'est pas rare de voir MQTT qualifié de protocole de file d'attente. Cette qualification est trompeuse étant donnée que MQTT ne présente pas de file d'attente comparable aux différentes solutions plus traditionnelles de communication. + + +*IBM¹: Société multinationale américaine présent dans le domaine informatique* +*Eurotech²: Société italienne dans le secteur de l'informatique* +*HTTP³: Protocole de communication client-serveur* + + +## Qu'est-ce qu'un protocole "publish-subscribe"? [1][3][4] + +Pour comprendre MQTT, il est impératif de comprendre ce qu'est un protocole que l'on qualifie de "publish-subscribe". + +Tout d'abord, il faut savoir que ce protocole utilise un mécanisme particulier pour transférer les données et est composé de deux types "d'acteurs" et d'un domaine de donnée: + +- Le domaine de donnée est appelé le **broker**. +- Le premier type d'acteur est le **diffuseur** ou plus communément qualifié le **publisher**. +*-> Les acteurs publiant des données sur le broker sont qualifiés de diffuseurs.* +- Le second type est le **destinataire** ou **subscriber**. +*-> Les acteurs récupèrant les informations publiées sur le broker sont qualifiés de destinataires.* + +Un diffuseur n'envoie des messages/données pour, à priori, aucun distanateur bien spécifique. A la place, les messages sont envoyé à une catégorie bien spécifique présente sur un broker. *Il peut, bien entendu, il y avoir une multitude de catégories différentes présentes sur le broker.* + +Mais comment recevoir les données dans ces circonstances vous demandez-vous ? Et bien tout simplement par principe d'abonnement. Un destinataire souhaitant recevoir des données s'abonnera à la ou les catégories souhaitées et recevra donc les données présentes dans celles-ci. + +Bien entendu, un diffuseur ne peut donc pas savoir si ses messages envoyés au brokers seront lus ou non par un destinataire quelconque. Idem pour les destinataires qui pourront s'abonner aux catégories souhaitées mais n'aurons pas connaissance de l'existance d'un diffuseur lié à cette catégorie. Seul le broker est connu des différents diffuseurs et destinataires. + + + +*Shéma réalisé via draw.io* + +### Dissociation ? [1] + +Un des élément fondamentale spécifique à ce modèle est la dissociation complète entre les diffuseurs et les destinataires et ce sur plusieurs plans. + +- La **dissociation spatiale**: Les acteurs n'ont pas besoin de connaitre les informations de l'autre tel que l'adresse IP ou encore le port. +- La **dissociation temporelle**: Le diffuseur ainsi que le destinataire ne doivent pas nécessairement fonctionner au même instant pour communiquer. +- La **dissociation de synchronisation**: Se traduit par le fait que l'envoie ou la réception d'un élèment n'interrompt pas les opérations s'exécutant sur les deux acteurs. + +### Filtrage ? [1][5] + +Il est également interressant de savoir, qu'avec l'aide d'un filtrage, les messages peuvent être reçu seulement par certains destanataires bien spécifiques. + +Il existe 4 types de filtrage différents dans le cas du modèle "pub-sub": + +1. **Filtrage par sujet**: +Les messages envoyés sont reçus et stockés dans des catégories logiques plus communément appelés "sujets". Les différents destinataires d'un système, qui sont abonnés aux différents sujets visés, auront accès à toutes les informations envoyés et stockés dans ces catégories logiques spécifiques. + +2. **Filtrage basé sur le contenu**: +Ici, les messages sont filtrés selon leurs attributs et/ou leur contenu. Un abonné recevra donc uniquement les messages correspondant aux différentes contraintes qu'il a spécifié. Il est important de préciser que cette méthode possède un inconvénient qui est que le contenu doit être connu avant toutes choses par l'abonné ainsi que par l'émetteur pour fonctionner correctement. + +3. **Filtrage par type**: +Dans ce cas-ci, le filtrage se fait en fonction de l'évènement ou du type. Il est coutume d'utiliser cette méthode dans les languages qualifiés d'orientés objet. + +4. **Filtrage hybride** +Dans certaines situations, la combinaison du filtrage par sujet et de celui basé sur le contenu est d'application. Dans un premier temps, des messages sont publiés dans des sujets spécifiques (Filtrage par sujet). Par la suite, les abonnés récupèrent des messages basés sur le contenu de différents sujets correspondant à leurs spécifications ultérieures (Filtrage basé sur le contenu). + +### Points importants à savoir [1] + +Dans le modèle pub/sub, il est important de connaitre, au préalable, les différents détails et aspects qui définissent la structuration des données établies (Différents contenus, attributs, sujets ...). Comme nous avons pu le constater dans le cas du filtrage basé sur le contenu, les 2 acteurs doivent connaitre les différents sujets avant quoi que ce soit. +Ensuite, il faut bien comprendre que les messages envoyés par un diffuseur ne seront peut-être jamais reçus/lus par un destinataire. + + +## Et MQTT dans tout ça ? + +### MQTT - Modèle pub/sub [1][2] + +MQTT découpe l'espace en 2 parties distinctes composées de l'émetteur (publisher) et du destinataire (subscriber). Ceux-ci doivent uniquement avoir pris connaissance de l'adresse ip et du port du broker afin de pouvoir, dans le cas de l'émetteur, envoyer des messages et, dans le cas du destinataire, s'abonner afin d'avoir la possibilité de recevoir des messages spécifiques. MQTT se dissocie donc d'une certaine manière spatialement. + +Généralement, l'utilisation de MQTT concerne une conversation quasi instantannée entre le diffuseur et le destinataire. Quand ce n'est pas le cas, une solution de repli existe car MQTT se dissocie temporellement. Le broker peut donc stockés les informations afin qu'elles soient accessibles plus tard pour les distanataires qui ne sont pas actuellement connectés. Pour que cela se fasse, il faut respecter deux conditions: +1. Le destinataire s'est déja connecté une fois avec une session persistante. +2. Le destinataire possède sur la catégorie spécifique une QoS¹ de 1 ou 2. + +MQTT peut également faire de la dissocation de synchronisation. Une bonne partie des bibliothèques clientes fonctionnent, à ce jour, de manière asynchrone à l'aide de fonction de rappels. Cela signifie que MQTT n'empêchera aucune tâches s'exécutant pendant la publication ou l'attente d'un message. + +MQTT fonctionne avec un filtrage par sujet. Chaque message émis par un diffuseur au broker contient donc un sujet. Le broker utilise ce sujet afin de vérifier si oui ou non un destinataire peut recevoir ce message spécifique. + +*QoS¹: la qualité de service décrit la capacité de transmettre des informations dans de bonnes et certaines conditions (les QoS concernant MQTT seront vues plus tard dans l'article.* + +### MQTT - Qualités de services [6][7] + +Il existe trois différents qualités de services différents pour le protocole MQTT. A savoir que chaque connexion au broker est spécifiée par une valeur allant de 0 à 2. + +1. QoS = 0 +**Au plus une fois** qui signifie que le message sera envoyé uniquement envoyé une fois au destinataire sans accusé de réception. Si le destinataire n'est pas en ligne ou que le message se perd, il ne sera jamais renvoyé et sera donc perdu. A savoir que le message ne requiert donc pas d'être stocké dans le broker. Ce mode de transfert est le plus rapide des 3. + +2. QoS = 1 +**Au moins une fois** spécifie que le message sera envoyé jusqu'à ce qu'un accusé de réception soit reçu par l'émetteur du message. Le message doit donc pouvoir être stocké temporairement par l'émetteur pour pouvoir être renvoyé si jamais. Le message pourra, dans ce cas-ci, être envoyé plusieurs fois. + +3. QoS = 2 +**Exactement une fois** est le niveau le plus important, le plus sûr et le plus lent dans MQTT. Il est défini par l'utilisation d'une négociation à deux niveaux entre le client expéditeur et le client destinataire. Ce procédé permet de garantir la réception d'une unique copie du message. + +
+ + +## Avantages et Inconvénients ? + + +
+ +## Conclusion + + +## Bibliographie : + +1) - Lien: https://iot.goffinet.org/iot_protocole_mqtt.html, +Nom du site: goffinet, +Nom de l'auteur: /, +Date de consultation: 25/05/2022, +Dernière date de modification: / + +
+2) - Lien: https://fr.wikipedia.org/wiki/MQTT, +Nom du site: wikipedia, +Nom de l'auteur: /, +Date de consultation: 25/05/2022, +Dernière date de modification: 28/01/2022 +
+ +3) - Lien: https://fr.wikipedia.org/wiki/Publish-subscribe +Nom du site: wikipedia, +Nom de l'auteur: /, +Date de consultation: 25/05/2022, +Dernière date de modification: 31/03/2021 +
+ +4) - Lien: https://ably.com/topic/pub-sub +Nom du site: ably, +Nom de l'auteur: Matthew O’Riordan, +Date de consultation: 25/05/2022, +Dernière date de modification: 17/07/2020 +
+ +5) - Lien: https://stringfixer.com/fr/Publish/subscribe +Nom du site: stringfixer.com, +Nom de l'auteur: /, +Date de consultation: 03/06/2022, +Dernière date de modification: / +
+ +6) - Lien: https://www.ibm.com/docs/fr/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mm-tc-doc-tc60340--htm +Nom du site: ibm.com, +Nom de l'auteur: /, +Date de consultation: 03/06/2022, +Dernière date de modification: 20/04/2021 +
+ +7) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/ +Nom du site: hivemq.com, +Nom de l'auteur: The HiveMQ Team, +Date de consultation: 04/06/2022, +Dernière date de modification: 16/02/2015 +
From 5a201a2b8728fa51171986f24c2405ab08d7068d Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 22:07:07 +0200 Subject: [PATCH 136/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 6fbd7ce..64f421a 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -36,7 +36,7 @@ Mais comment recevoir les données dans ces circonstances vous demandez-vous ? E Bien entendu, un diffuseur ne peut donc pas savoir si ses messages envoyés au brokers seront lus ou non par un destinataire quelconque. Idem pour les destinataires qui pourront s'abonner aux catégories souhaitées mais n'aurons pas connaissance de l'existance d'un diffuseur lié à cette catégorie. Seul le broker est connu des différents diffuseurs et destinataires. - +[](https://github.com/M-Momin/Wiki-TI/blob/main/Assets/Images/MQTT_publish-subscribe_sh%C3%A9ma.png) *Shéma réalisé via draw.io* From 3bfc526509dbf62408b4be5f6f532b17cf1f5907 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 22:07:30 +0200 Subject: [PATCH 137/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 64f421a..723ece4 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -36,7 +36,7 @@ Mais comment recevoir les données dans ces circonstances vous demandez-vous ? E Bien entendu, un diffuseur ne peut donc pas savoir si ses messages envoyés au brokers seront lus ou non par un destinataire quelconque. Idem pour les destinataires qui pourront s'abonner aux catégories souhaitées mais n'aurons pas connaissance de l'existance d'un diffuseur lié à cette catégorie. Seul le broker est connu des différents diffuseurs et destinataires. -[](https://github.com/M-Momin/Wiki-TI/blob/main/Assets/Images/MQTT_publish-subscribe_sh%C3%A9ma.png) +![](https://github.com/M-Momin/Wiki-TI/blob/main/Assets/Images/MQTT_publish-subscribe_sh%C3%A9ma.png) *Shéma réalisé via draw.io* From 22e6d287f2f2b3422ea950d472175b5a08c9aa4c Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 22:09:03 +0200 Subject: [PATCH 138/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 723ece4..4077738 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -13,9 +13,9 @@ Ce protocole, possédant une moindre surcharge en therme d'en-têtes que d'autre Il n'est pas rare de voir MQTT qualifié de protocole de file d'attente. Cette qualification est trompeuse étant donnée que MQTT ne présente pas de file d'attente comparable aux différentes solutions plus traditionnelles de communication. -*IBM¹: Société multinationale américaine présent dans le domaine informatique* -*Eurotech²: Société italienne dans le secteur de l'informatique* -*HTTP³: Protocole de communication client-serveur* +*IBM¹: Société multinationale américaine présent dans le domaine informatique* +*Eurotech²: Société italienne dans le secteur de l'informatique* +*HTTP³: Protocole de communication client-serveur* ## Qu'est-ce qu'un protocole "publish-subscribe"? [1][3][4] From 2bce17117d1263114e45c535b6fed9ee3fd8b6fd Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 22:12:11 +0200 Subject: [PATCH 139/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 4077738..af592ad 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -22,7 +22,7 @@ Il n'est pas rare de voir MQTT qualifié de protocole de file d'attente. Cette q Pour comprendre MQTT, il est impératif de comprendre ce qu'est un protocole que l'on qualifie de "publish-subscribe". -Tout d'abord, il faut savoir que ce protocole utilise un mécanisme particulier pour transférer les données et est composé de deux types "d'acteurs" et d'un domaine de donnée: +Tout d'abord, il faut savoir que ce protocole utilise un mécanisme particulier pour transférer les données et est composé de deux types d'acteurs et d'un domaine de donnée: - Le domaine de donnée est appelé le **broker**. - Le premier type d'acteur est le **diffuseur** ou plus communément qualifié le **publisher**. @@ -48,9 +48,9 @@ Un des élément fondamentale spécifique à ce modèle est la dissociation comp - La **dissociation temporelle**: Le diffuseur ainsi que le destinataire ne doivent pas nécessairement fonctionner au même instant pour communiquer. - La **dissociation de synchronisation**: Se traduit par le fait que l'envoie ou la réception d'un élèment n'interrompt pas les opérations s'exécutant sur les deux acteurs. -### Filtrage ? [1][5] +### Le filtrage [1][5] -Il est également interressant de savoir, qu'avec l'aide d'un filtrage, les messages peuvent être reçu seulement par certains destanataires bien spécifiques. +Il est également interressant de savoir, qu'avec l'aide d'un filtrage bien défini, les messages peuvent être reçus seulement par certains destanataires bien spécifiques. Il existe 4 types de filtrage différents dans le cas du modèle "pub-sub": @@ -72,7 +72,7 @@ Dans le modèle pub/sub, il est important de connaitre, au préalable, les diff Ensuite, il faut bien comprendre que les messages envoyés par un diffuseur ne seront peut-être jamais reçus/lus par un destinataire. -## Et MQTT dans tout ça ? +## MQTT dans tout ça ? ### MQTT - Modèle pub/sub [1][2] @@ -90,7 +90,7 @@ MQTT fonctionne avec un filtrage par sujet. Chaque message émis par un diffuseu ### MQTT - Qualités de services [6][7] -Il existe trois différents qualités de services différents pour le protocole MQTT. A savoir que chaque connexion au broker est spécifiée par une valeur allant de 0 à 2. +Il existe trois types différents de qualités de services pour le protocole MQTT. A savoir que chaque connexion au broker est spécifiée par une valeur allant de 0 à 2. 1. QoS = 0 **Au plus une fois** qui signifie que le message sera envoyé uniquement envoyé une fois au destinataire sans accusé de réception. Si le destinataire n'est pas en ligne ou que le message se perd, il ne sera jamais renvoyé et sera donc perdu. A savoir que le message ne requiert donc pas d'être stocké dans le broker. Ce mode de transfert est le plus rapide des 3. From 8d1f86cff9b64be57fb35e0f9a52f0a52889dd65 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 22:13:40 +0200 Subject: [PATCH 140/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index af592ad..93d5b2f 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -118,47 +118,47 @@ Il existe trois types différents de qualités de services pour le protocole MQT Nom du site: goffinet, Nom de l'auteur: /, Date de consultation: 25/05/2022, -Dernière date de modification: / - +Dernière date de modification: /
+ 2) - Lien: https://fr.wikipedia.org/wiki/MQTT, Nom du site: wikipedia, Nom de l'auteur: /, -Date de consultation: 25/05/2022, +Date de consultation: 25/05/2022, Dernière date de modification: 28/01/2022
3) - Lien: https://fr.wikipedia.org/wiki/Publish-subscribe Nom du site: wikipedia, Nom de l'auteur: /, -Date de consultation: 25/05/2022, -Dernière date de modification: 31/03/2021 +Date de consultation: 25/05/2022, +Dernière date de modification: 31/03/2021
-4) - Lien: https://ably.com/topic/pub-sub +4) - Lien: https://ably.com/topic/pub-sub Nom du site: ably, -Nom de l'auteur: Matthew O’Riordan, -Date de consultation: 25/05/2022, +Nom de l'auteur: Matthew O’Riordan, +Date de consultation: 25/05/2022, Dernière date de modification: 17/07/2020
-5) - Lien: https://stringfixer.com/fr/Publish/subscribe +5) - Lien: https://stringfixer.com/fr/Publish/subscribe Nom du site: stringfixer.com, Nom de l'auteur: /, -Date de consultation: 03/06/2022, -Dernière date de modification: / +Date de consultation: 03/06/2022, +Dernière date de modification: /
-6) - Lien: https://www.ibm.com/docs/fr/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mm-tc-doc-tc60340--htm +6) - Lien: https://www.ibm.com/docs/fr/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mm-tc-doc-tc60340--htm Nom du site: ibm.com, Nom de l'auteur: /, -Date de consultation: 03/06/2022, -Dernière date de modification: 20/04/2021 +Date de consultation: 03/06/2022, +Dernière date de modification: 20/04/2021
-7) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/ +7) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/ Nom du site: hivemq.com, Nom de l'auteur: The HiveMQ Team, -Date de consultation: 04/06/2022, -Dernière date de modification: 16/02/2015 +Date de consultation: 04/06/2022, +Dernière date de modification: 16/02/2015
From 29088a31ab1bd14001373b1f23fd0ec53ebd2978 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 23:11:03 +0200 Subject: [PATCH 141/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 91 +++++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 24 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 93d5b2f..ce62b76 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -24,28 +24,28 @@ Pour comprendre MQTT, il est impératif de comprendre ce qu'est un protocole que Tout d'abord, il faut savoir que ce protocole utilise un mécanisme particulier pour transférer les données et est composé de deux types d'acteurs et d'un domaine de donnée: -- Le domaine de donnée est appelé le **broker**. -- Le premier type d'acteur est le **diffuseur** ou plus communément qualifié le **publisher**. -*-> Les acteurs publiant des données sur le broker sont qualifiés de diffuseurs.* -- Le second type est le **destinataire** ou **subscriber**. -*-> Les acteurs récupèrant les informations publiées sur le broker sont qualifiés de destinataires.* +- Le domaine de donnée est appelé le **courtier** ou **broker**. +- Le premier type de client est **l'éditeur** ou plus communément qualifié le **publisher**. +*-> Les clients publiant des données sur le courtier sont qualifiés d'éditeurs.* +- Le second type sont les **abonnés** ou **subscriber**. +*-> Les clients récupèrant les informations publiées sur le courtier sont qualifiés d'abonnés.* -Un diffuseur n'envoie des messages/données pour, à priori, aucun distanateur bien spécifique. A la place, les messages sont envoyé à une catégorie bien spécifique présente sur un broker. *Il peut, bien entendu, il y avoir une multitude de catégories différentes présentes sur le broker.* +Un éditeur n'envoie des messages/données pour, à priori, aucun distanateur bien spécifique. A la place, les messages sont envoyé à une catégorie bien spécifique présente sur un courtier. *Il peut, bien entendu, il y avoir une multitude de catégories différentes présentes sur le courtiers.* -Mais comment recevoir les données dans ces circonstances vous demandez-vous ? Et bien tout simplement par principe d'abonnement. Un destinataire souhaitant recevoir des données s'abonnera à la ou les catégories souhaitées et recevra donc les données présentes dans celles-ci. +Mais comment recevoir les données dans ces circonstances vous demandez-vous ? Et bien tout simplement par principe d'abonnement. Un dabonné souhaitant recevoir des données s'abonnera à la ou les catégories souhaitées et recevra donc les données présentes dans celles-ci. -Bien entendu, un diffuseur ne peut donc pas savoir si ses messages envoyés au brokers seront lus ou non par un destinataire quelconque. Idem pour les destinataires qui pourront s'abonner aux catégories souhaitées mais n'aurons pas connaissance de l'existance d'un diffuseur lié à cette catégorie. Seul le broker est connu des différents diffuseurs et destinataires. +Bien entendu, un éditeur ne peut donc pas savoir si ses messages envoyés au courtier seront lus ou non par un abonné quelconque. Idem pour les abonnés qui pourront s'abonner aux catégories souhaitées mais n'aurons pas connaissance de l'existance d'un éditeur lié à cette catégorie. Seul le courtier est connu des différents éditeurs et abonnés. ![](https://github.com/M-Momin/Wiki-TI/blob/main/Assets/Images/MQTT_publish-subscribe_sh%C3%A9ma.png) *Shéma réalisé via draw.io* -### Dissociation ? [1] +### Dissociation ? [1][8] -Un des élément fondamentale spécifique à ce modèle est la dissociation complète entre les diffuseurs et les destinataires et ce sur plusieurs plans. +Un des élément fondamentale spécifique à ce modèle est la dissociation complète entre les éditeurs et les abonnés et ce sur plusieurs plans. - La **dissociation spatiale**: Les acteurs n'ont pas besoin de connaitre les informations de l'autre tel que l'adresse IP ou encore le port. -- La **dissociation temporelle**: Le diffuseur ainsi que le destinataire ne doivent pas nécessairement fonctionner au même instant pour communiquer. +- La **dissociation temporelle**: L'éditeur ainsi que l'abonné ne doivent pas nécessairement fonctionner au même instant pour communiquer. - La **dissociation de synchronisation**: Se traduit par le fait que l'envoie ou la réception d'un élèment n'interrompt pas les opérations s'exécutant sur les deux acteurs. ### Le filtrage [1][5] @@ -55,7 +55,7 @@ Il est également interressant de savoir, qu'avec l'aide d'un filtrage bien déf Il existe 4 types de filtrage différents dans le cas du modèle "pub-sub": 1. **Filtrage par sujet**: -Les messages envoyés sont reçus et stockés dans des catégories logiques plus communément appelés "sujets". Les différents destinataires d'un système, qui sont abonnés aux différents sujets visés, auront accès à toutes les informations envoyés et stockés dans ces catégories logiques spécifiques. +Les messages envoyés sont reçus et stockés dans des catégories logiques plus communément appelés "sujets". Les différents abonnés d'un système, qui sont abonnés aux différents sujets visés, auront accès à toutes les informations envoyés et stockés dans ces catégories logiques spécifiques. 2. **Filtrage basé sur le contenu**: Ici, les messages sont filtrés selon leurs attributs et/ou leur contenu. Un abonné recevra donc uniquement les messages correspondant aux différentes contraintes qu'il a spécifié. Il est important de préciser que cette méthode possède un inconvénient qui est que le contenu doit être connu avant toutes choses par l'abonné ainsi que par l'émetteur pour fonctionner correctement. @@ -69,46 +69,72 @@ Dans certaines situations, la combinaison du filtrage par sujet et de celui bas ### Points importants à savoir [1] Dans le modèle pub/sub, il est important de connaitre, au préalable, les différents détails et aspects qui définissent la structuration des données établies (Différents contenus, attributs, sujets ...). Comme nous avons pu le constater dans le cas du filtrage basé sur le contenu, les 2 acteurs doivent connaitre les différents sujets avant quoi que ce soit. -Ensuite, il faut bien comprendre que les messages envoyés par un diffuseur ne seront peut-être jamais reçus/lus par un destinataire. +Ensuite, il faut bien comprendre que les messages envoyés par un éditeur ne seront peut-être jamais reçus/lus par un abonné. ## MQTT dans tout ça ? -### MQTT - Modèle pub/sub [1][2] +### MQTT - Modèle pub/sub [1][2][8] -MQTT découpe l'espace en 2 parties distinctes composées de l'émetteur (publisher) et du destinataire (subscriber). Ceux-ci doivent uniquement avoir pris connaissance de l'adresse ip et du port du broker afin de pouvoir, dans le cas de l'émetteur, envoyer des messages et, dans le cas du destinataire, s'abonner afin d'avoir la possibilité de recevoir des messages spécifiques. MQTT se dissocie donc d'une certaine manière spatialement. +MQTT découpe l'espace en 2 parties distinctes composées de l'émetteur (publisher) et de l'abonné (subscriber). Ceux-ci doivent uniquement avoir pris connaissance de l'adresse ip et du port du courtier afin de pouvoir, dans le cas de l'émetteur, envoyer des messages et, dans le cas de l'abonné, s'abonner afin d'avoir la possibilité de recevoir des messages spécifiques. MQTT se dissocie donc d'une certaine manière spatialement. -Généralement, l'utilisation de MQTT concerne une conversation quasi instantannée entre le diffuseur et le destinataire. Quand ce n'est pas le cas, une solution de repli existe car MQTT se dissocie temporellement. Le broker peut donc stockés les informations afin qu'elles soient accessibles plus tard pour les distanataires qui ne sont pas actuellement connectés. Pour que cela se fasse, il faut respecter deux conditions: -1. Le destinataire s'est déja connecté une fois avec une session persistante. -2. Le destinataire possède sur la catégorie spécifique une QoS¹ de 1 ou 2. +Généralement, l'utilisation de MQTT concerne une conversation quasi instantannée entre l'éditeur et l'abonné. Quand ce n'est pas le cas, une solution de repli existe car MQTT se dissocie temporellement. Le courtier peut donc stockés les informations afin qu'elles soient accessibles plus tard pour les distanataires qui ne sont pas actuellement connectés. Pour que cela se fasse, il faut respecter deux conditions: +1. L'abonné s'est déja connecté une fois avec une session persistante. +2. L'abonné possède sur la catégorie spécifique une QoS¹ de 1 ou 2. MQTT peut également faire de la dissocation de synchronisation. Une bonne partie des bibliothèques clientes fonctionnent, à ce jour, de manière asynchrone à l'aide de fonction de rappels. Cela signifie que MQTT n'empêchera aucune tâches s'exécutant pendant la publication ou l'attente d'un message. -MQTT fonctionne avec un filtrage par sujet. Chaque message émis par un diffuseur au broker contient donc un sujet. Le broker utilise ce sujet afin de vérifier si oui ou non un destinataire peut recevoir ce message spécifique. +MQTT fonctionne avec un filtrage par sujet. Chaque message émis par un éditeur au courtier contient donc un sujet. Le courtier utilise ce sujet afin de vérifier si oui ou non un abonné peut recevoir ce message spécifique. *QoS¹: la qualité de service décrit la capacité de transmettre des informations dans de bonnes et certaines conditions (les QoS concernant MQTT seront vues plus tard dans l'article.* ### MQTT - Qualités de services [6][7] -Il existe trois types différents de qualités de services pour le protocole MQTT. A savoir que chaque connexion au broker est spécifiée par une valeur allant de 0 à 2. +Il existe trois types différents de qualités de services pour le protocole MQTT. A savoir que chaque connexion au courtier est spécifiée par une valeur allant de 0 à 2. 1. QoS = 0 -**Au plus une fois** qui signifie que le message sera envoyé uniquement envoyé une fois au destinataire sans accusé de réception. Si le destinataire n'est pas en ligne ou que le message se perd, il ne sera jamais renvoyé et sera donc perdu. A savoir que le message ne requiert donc pas d'être stocké dans le broker. Ce mode de transfert est le plus rapide des 3. +**Au plus une fois** qui signifie que le message sera envoyé uniquement envoyé une fois à l'abonné sans accusé de réception. Si l'abonné n'est pas en ligne ou que le message se perd, il ne sera jamais renvoyé et sera donc perdu. A savoir que le message ne requiert donc pas d'être stocké dans le courtier. Ce mode de transfert est le plus rapide des 3. 2. QoS = 1 **Au moins une fois** spécifie que le message sera envoyé jusqu'à ce qu'un accusé de réception soit reçu par l'émetteur du message. Le message doit donc pouvoir être stocké temporairement par l'émetteur pour pouvoir être renvoyé si jamais. Le message pourra, dans ce cas-ci, être envoyé plusieurs fois. -3. QoS = 2 -**Exactement une fois** est le niveau le plus important, le plus sûr et le plus lent dans MQTT. Il est défini par l'utilisation d'une négociation à deux niveaux entre le client expéditeur et le client destinataire. Ce procédé permet de garantir la réception d'une unique copie du message. +3. QoS = 2 +**Exactement une fois** est le niveau le plus important, le plus sûr et le plus lent dans MQTT. Il est défini par l'utilisation d'une négociation à deux niveaux entre le client expéditeur et le client abonné. Ce procédé permet de garantir la réception d'une unique copie du message.
-## Avantages et Inconvénients ? +## MQTT & MQ ? +MQTT est bien différent d'un simple protocole de messagerie par file d'attente. Contrairement à ce dernier, en MQTT, le principe est de pouvoir partager un message à tout abonnés s'étant abonné au préalable au sujet et non pas juste à un seul consomateur. Les sujets sont également bien plus flexibles qu'une simple liste d'attente étant donné que ceux-ci peuvent être créés au fur et à mesure.
+## Connexion MQTT via NAT + +Généralement un client MQTT, éditeur ou abonné, est placé derrière un routeur qui s'occupera de transformer son ip privée en une ip publique. Le client va tout d'abord initié la connexion en envoyant, au courtier, un message de type CONNECT. Le courtier, possédant une ip publique, maintient la connexion active après le premier CONNECT si aucun problème ne survient. Ceci permet l'envoi et la réception de messages. + +## Messages MQTT + +### CONNECT (Se connecter) +Si le message d'initiation de connexion CONNECT envoyé au courtier ne respecte pas les spécifications MQTT ou génère un temps trop important entre l'ouverture du socket réseau et l'envoi du message CONNECT, le courtier se charge de mettre fin à la connexion. Ce procéder permet d'éviter toutes tentatives de ralentissement du courtier. + +### PUBLISH (Publier) +Dés que le client a établi la connexion avec le courtier, celui-ci peut publier des messages. Comme dit précédemment, le protocole MQTT utilise un filtrage basé sur les sujets des différents messages. Il est impératif que chaque messages contienne une rubrique que le courtier pourra utiliser pour envoyer les messages aux clients abonnés à celles-ci. Dans MQTT, c'est l'éditeur qui choisit le type de structure de donnée a envoyer. Par exemple, celui-ci peut décider d'expédier des données textes, binaires ou encore JSON. + +### SUBSCRIBE (S'abonner) +Comme dit plus haut, si aucune personne n'est abonné à un sujet, aucune donnée ne sera jamais transmise. Il est donc indispensable de pouvoir s'abonner. Pour cela, le client voulant s'abonné doit envoyé un SUBSCRIBE au courtier. + +### SUBACK (Accusé d'abonnement) +Pour confirmer à l'abonné qu'il s'est bien abonné à un sujet, le courtier (après avoir bien reçu un message SUBSCRIBE par l'abonné) lui envoie un message d'accusé de réception SUBACK. +Quand l'envoi du SUBSCRIBE et la réception d'un message SUBACK est réalisé avec succès par l'abonné, celui-ci obtient et obtiendra chaque messages publiés qui correspond aux rubriques liées à ses abonnements qui étaient contenus dans son précédent message SUBSCRIBE. + +### UNSUBSRIBE (Se désabonner) +Bien entendu, qui dit abonnement dit désabonnement. Ce message a pour but de supprimer les abonnements qu'à client abonné a chez un courtier. + +### UNSUBACK (Accusé de désabonnement) +Pour confirmer le désabonnemnt de l'abonné, le courtier envoie à nouveau un accusé de réception mais UNSUBACK cette fois-ci. + ## Conclusion @@ -162,3 +188,20 @@ Nom de l'auteur: The HiveMQ Team, Date de consultation: 04/06/2022, Dernière date de modification: 16/02/2015
+ + +8) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part2-publish-subscribe +Nom du site: hivemq.com, +Nom de l'auteur: The HiveMQ Team, +Date de consultation: 04/06/2022, +Dernière date de modification: 19/01/2015 +
+ + +8) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ +Nom du site: hivemq.com, +Nom de l'auteur: The HiveMQ Team, +Date de consultation: 06/06/2015, +Dernière date de modification: 02/02/2015 +
+ From 91a48209b95b2d05c4f94e4ca585ecf6431fdf38 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 23:13:00 +0200 Subject: [PATCH 142/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index ce62b76..56f477c 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -17,6 +17,7 @@ Il n'est pas rare de voir MQTT qualifié de protocole de file d'attente. Cette q *Eurotech²: Société italienne dans le secteur de l'informatique* *HTTP³: Protocole de communication client-serveur* +
## Qu'est-ce qu'un protocole "publish-subscribe"? [1][3][4] @@ -71,6 +72,7 @@ Dans certaines situations, la combinaison du filtrage par sujet et de celui bas Dans le modèle pub/sub, il est important de connaitre, au préalable, les différents détails et aspects qui définissent la structuration des données établies (Différents contenus, attributs, sujets ...). Comme nous avons pu le constater dans le cas du filtrage basé sur le contenu, les 2 acteurs doivent connaitre les différents sujets avant quoi que ce soit. Ensuite, il faut bien comprendre que les messages envoyés par un éditeur ne seront peut-être jamais reçus/lus par un abonné. +
## MQTT dans tout ça ? @@ -114,25 +116,32 @@ MQTT est bien différent d'un simple protocole de messagerie par file d'attente. Généralement un client MQTT, éditeur ou abonné, est placé derrière un routeur qui s'occupera de transformer son ip privée en une ip publique. Le client va tout d'abord initié la connexion en envoyant, au courtier, un message de type CONNECT. Le courtier, possédant une ip publique, maintient la connexion active après le premier CONNECT si aucun problème ne survient. Ceci permet l'envoi et la réception de messages. +
+ ## Messages MQTT -### CONNECT (Se connecter) +#### CONNECT (Se connecter) Si le message d'initiation de connexion CONNECT envoyé au courtier ne respecte pas les spécifications MQTT ou génère un temps trop important entre l'ouverture du socket réseau et l'envoi du message CONNECT, le courtier se charge de mettre fin à la connexion. Ce procéder permet d'éviter toutes tentatives de ralentissement du courtier. -### PUBLISH (Publier) +#### PUBLISH (Publier) + Dés que le client a établi la connexion avec le courtier, celui-ci peut publier des messages. Comme dit précédemment, le protocole MQTT utilise un filtrage basé sur les sujets des différents messages. Il est impératif que chaque messages contienne une rubrique que le courtier pourra utiliser pour envoyer les messages aux clients abonnés à celles-ci. Dans MQTT, c'est l'éditeur qui choisit le type de structure de donnée a envoyer. Par exemple, celui-ci peut décider d'expédier des données textes, binaires ou encore JSON. -### SUBSCRIBE (S'abonner) +#### SUBSCRIBE (S'abonner) + Comme dit plus haut, si aucune personne n'est abonné à un sujet, aucune donnée ne sera jamais transmise. Il est donc indispensable de pouvoir s'abonner. Pour cela, le client voulant s'abonné doit envoyé un SUBSCRIBE au courtier. -### SUBACK (Accusé d'abonnement) +#### SUBACK (Accusé d'abonnement) + Pour confirmer à l'abonné qu'il s'est bien abonné à un sujet, le courtier (après avoir bien reçu un message SUBSCRIBE par l'abonné) lui envoie un message d'accusé de réception SUBACK. Quand l'envoi du SUBSCRIBE et la réception d'un message SUBACK est réalisé avec succès par l'abonné, celui-ci obtient et obtiendra chaque messages publiés qui correspond aux rubriques liées à ses abonnements qui étaient contenus dans son précédent message SUBSCRIBE. -### UNSUBSRIBE (Se désabonner) +#### UNSUBSRIBE (Se désabonner) + Bien entendu, qui dit abonnement dit désabonnement. Ce message a pour but de supprimer les abonnements qu'à client abonné a chez un courtier. -### UNSUBACK (Accusé de désabonnement) +#### UNSUBACK (Accusé de désabonnement) + Pour confirmer le désabonnemnt de l'abonné, le courtier envoie à nouveau un accusé de réception mais UNSUBACK cette fois-ci. ## Conclusion From ae5a254ca99e8cce20216101edabf7be453e33d1 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 23:15:12 +0200 Subject: [PATCH 143/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 56f477c..b2d0bb3 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -207,7 +207,7 @@ Dernière date de modification: 19/01/2015
-8) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ +8) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ Nom du site: hivemq.com, Nom de l'auteur: The HiveMQ Team, Date de consultation: 06/06/2015, From f07f3312ef9600c185b4648559caf44afaf6c980 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 23:24:36 +0200 Subject: [PATCH 144/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index b2d0bb3..61ae914 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -118,7 +118,7 @@ Généralement un client MQTT, éditeur ou abonné, est placé derrière un rout
-## Messages MQTT +## Messages MQTT [9] #### CONNECT (Se connecter) Si le message d'initiation de connexion CONNECT envoyé au courtier ne respecte pas les spécifications MQTT ou génère un temps trop important entre l'ouverture du socket réseau et l'envoi du message CONNECT, le courtier se charge de mettre fin à la connexion. Ce procéder permet d'éviter toutes tentatives de ralentissement du courtier. @@ -144,7 +144,13 @@ Bien entendu, qui dit abonnement dit désabonnement. Ce message a pour but de su Pour confirmer le désabonnemnt de l'abonné, le courtier envoie à nouveau un accusé de réception mais UNSUBACK cette fois-ci. -## Conclusion +
+ +## Ses usages pour l'IoT [10] + +Les possibilités sont vaste et variées allant de sondes de température au controle de volets mécaniques. L'intérêt de celui-ci est qu'il soit rapide et peu énergivore. Il n'a également besoin que de très peu de ressources et peut être utiliser sur de petits microcontroleurs. +Au niveau de la sécurité, MQTT est également très interressant permettant une faciliter de chiffrement via SSL/TLS. Il permet également la gestion de l'authentification des clients + ## Bibliographie : @@ -207,10 +213,17 @@ Dernière date de modification: 19/01/2015
-8) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ +9) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ Nom du site: hivemq.com, Nom de l'auteur: The HiveMQ Team, Date de consultation: 06/06/2015, Dernière date de modification: 02/02/2015
+10) - Lien: https://www.planete-domotique.com/blog/2021/03/17/protocole-mqtt-iot-domotique/ +Nom du site: planete-domotique.com, +Nom de l'auteur: Lucas, +Date de consultation: 06/06/2015, +Dernière date de modification: / +
+ From 410ec9a57238e21bc4937fe822b7646e078e6a23 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 23:26:41 +0200 Subject: [PATCH 145/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 61ae914..8d4fa4c 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -148,8 +148,8 @@ Pour confirmer le désabonnemnt de l'abonné, le courtier envoie à nouveau un a ## Ses usages pour l'IoT [10] -Les possibilités sont vaste et variées allant de sondes de température au controle de volets mécaniques. L'intérêt de celui-ci est qu'il soit rapide et peu énergivore. Il n'a également besoin que de très peu de ressources et peut être utiliser sur de petits microcontroleurs. -Au niveau de la sécurité, MQTT est également très interressant permettant une faciliter de chiffrement via SSL/TLS. Il permet également la gestion de l'authentification des clients +Les possibilités sont vaste et variées allant de sondes de température au controle de volets mécaniques. L'intérêt de celui-ci est qu'il soit rapide et peu énergivore. Il n'a également besoin que de très peu de ressources et peut être utilisé sur de petits microcontroleurs peu puissants. +Au niveau de la sécurité, MQTT est également très interressant permettant une facilité de chiffrement via SSL/TLS et la gestion de l'authentification des clients From 32f9d4993b4248000909f66bfdb36d5c0e5c3966 Mon Sep 17 00:00:00 2001 From: M-Momin <94617640+M-Momin@users.noreply.github.com> Date: Tue, 7 Jun 2022 23:27:13 +0200 Subject: [PATCH 146/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 8d4fa4c..a383e3a 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -151,7 +151,7 @@ Pour confirmer le désabonnemnt de l'abonné, le courtier envoie à nouveau un a Les possibilités sont vaste et variées allant de sondes de température au controle de volets mécaniques. L'intérêt de celui-ci est qu'il soit rapide et peu énergivore. Il n'a également besoin que de très peu de ressources et peut être utilisé sur de petits microcontroleurs peu puissants. Au niveau de la sécurité, MQTT est également très interressant permettant une facilité de chiffrement via SSL/TLS et la gestion de l'authentification des clients - +
## Bibliographie : From 396fcded5e97b12afa6b8b4309a2724b9e100044 Mon Sep 17 00:00:00 2001 From: simonNolf Date: Wed, 8 Jun 2022 11:24:53 +0200 Subject: [PATCH 147/241] refonte + ajout d'image pour l'explication en cas pratique --- "R\303\251seaux/domaineauthorise.jpg" | Bin 0 -> 21922 bytes "R\303\251seaux/domainusurpe.jpg" | Bin 0 -> 20173 bytes .../mailtransf\303\251r\303\251.jpg" | Bin 0 -> 33323 bytes "R\303\251seaux/spf.md" | 60 +++++++++++++++--- 4 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 "R\303\251seaux/domaineauthorise.jpg" create mode 100644 "R\303\251seaux/domainusurpe.jpg" create mode 100644 "R\303\251seaux/mailtransf\303\251r\303\251.jpg" diff --git "a/R\303\251seaux/domaineauthorise.jpg" "b/R\303\251seaux/domaineauthorise.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..0835e8fc43942c28bbf7dc417217effcf5ca80c2 GIT binary patch literal 21922 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 literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/domainusurpe.jpg" "b/R\303\251seaux/domainusurpe.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..2b67536e749fe6f0fc58193b1d93b273811088d9 GIT binary patch literal 20173 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 bM3M_F=@ESfO*)7 consulté le 27-05-2022 +* [2] consulté le 27-05-2022 +* [3] Qu'est-ce qu'un SPF record? - DMARC Analyzer. (n.d.). DMARC Analyzer. consulté le 05-06-2022 +* [RFC SPF] RFC 7208 +* [RFC Dmark] RFC 7489 +* [4] consulté le 05-06-2022 From 369ec08cf694fb8a19fd633c9425ec0b422add30 Mon Sep 17 00:00:00 2001 From: simonNolf Date: Wed, 8 Jun 2022 11:32:46 +0200 Subject: [PATCH 148/241] relecture --- "R\303\251seaux/spf.md" | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git "a/R\303\251seaux/spf.md" "b/R\303\251seaux/spf.md" index aaae14f..39f60a7 100644 --- "a/R\303\251seaux/spf.md" +++ "b/R\303\251seaux/spf.md" @@ -12,37 +12,40 @@ parent: Réseaux ## Qu'est ce que c'est? -SPF, acronyme de Sender Policy Framework, permet d'empêcher les envois de message par des spammeurs au nom de votre domaine au moyen d'un système de validation. Spf permet a une organisation de publier des servers de messagerie autorisée. ce framework fonctionne de pair avec DMARK. Il donne à ceux qui recoivent l'information les différentes informations par rapport à la fiabilité de l'origine du mail. [1] +SPF, acronyme de Sender Policy Framework, permet d'empêcher les envois de message par des spammeurs au nom de votre domaine au moyen d'un système de validation. Spf permet a une organisation de publier des servers de messagerie autorisée. Ce framework fonctionne de pair avec DMARK. Il donne à ceux qui recoivent l'information les différentes informations par rapport à la fiabilité de l'origine du mail. [1] -Il s'agit donc d'un moyen d'autentification par nom de domaine pour éviter l'usurpation d'identité. Pour cela, il a besoin du DNS. Ainsi tout expéditeurs peux spécifier quels serveurs peuvent envoyer des e-mails au nom de leur domaine. +Il s'agit donc d'un moyen d'autentification par nom de domaine pour éviter l'usurpation d'identité. Pour cela, il a besoin du DNS. Ainsi, tout expéditeurs peux spécifier quels serveurs peuvent envoyer des e-mails au nom de leur domaine. ## Histoire -Les premières mentions de SPF remontent au environ de 2000. La spécification de ce dernier se sont fait dans les années suivantes au moyen de plusieurs versions. Le nom original de SPF était tout d'abord "Sender Permitted Form". Ce dernier a donc évolué durant les premières versions. [1] +Les premières mentions de SPF remontent au environ de 2000. La spécification de ce dernier s'est faite dans les années suivantes au moyen de plusieurs versions. Le nom original de SPF était tout d'abord "Sender Permitted Form". Ce dernier a donc évolué durant les premières versions. [1] -En 2006, une tentative de combinaison de SPF avec la proposition CallerId de Microsoft a été réalisée par un groupe de travail de l'IETF. Cette expérience aura porté ses fruits en 2014 et est maintenant connue sous le nom de RFC 7208.[1] +En 2006, une tentative de combinaison de SPF avec la proposition CallerId de Microsoft a été réalisée par un groupe de travail de l'[IETF](https://www.ietf.org/). Cette expérience aura porté ses fruits en 2014 et est maintenant connue sous le nom de RFC 7208.[1] Actuellement, les techniques d'autentification privilègient DKIM et DMARC par rapport à SPF. Cependant, il détermine toujours si un mail est conforme au DMARC.[1] ## Dans la pratique -Pour configurer SPF, il faut au préalable ajouter un SPF record dans la zone DNA du domaine. Celui-ci permet la spécification des différentes adresses ips qui sont authorisées a envoyer des mails au nom du domain.[1] +Pour configurer SPF, il faut au préalable ajouter un SPF record dans la zone DNA du domaine. Celui-ci permet la spécification des différentes adresses ips qui sont authorisées à envoyer des mails au nom du domaine.[1] -SPF vérifie qu'un expéditeur peux envoyé des message avec ce nom de domaine. si pas, (la vérification a échouée) le serveur récepteur détermine ce qu'il faut faire du message en fonction de la stratégie configurée.[4] +SPF vérifie qu'un expéditeur peux envoyé des message avec ce nom de domaine. Si pas (la vérification a échouée), le serveur récepteur détermine ce qu'il faut faire du message en fonction de la stratégie configurée.[4] Voyons 3 cas de figures ![mail authorisé](./\domaineauthorise.jpg) -dans ce premier cas, l'adresse ip se trouve dans l'enregistrement.[4] + +* Dans ce premier cas, l'adresse ip se trouve dans l'enregistrement.[4] Le mail est donc valide. ![mail non authorisé](./domainusurpe.jpg) -dans ce cas présent, le domaine expéditeur a été usurpé car l'adresse ip dne se trouve pas dans l'enregitrement.[4] + +* Dans ce cas présent, le domaine expéditeur a été usurpé car l'adresse ip dne se trouve pas dans l'enregitrement.[4] Le mail sera donc traité selon la stratégie configurée. ![mail tranféré](./mailtransf%C3%A9r%C3%A9.jpg) -Dans ce dernier cas, le mail a été transféré la vérification SPF lors de la première réception est valide mais pas lors de la 2 ème car, l'adresse ip de domaine2.com ne se trouve pas dans l'enregistrement[4] + +* Dans ce dernier cas, le mail a été transféré. La vérification SPF lors de la première réception est valide mais pas lors de la 2 ème car, l'adresse ip de domaine2.com ne se trouve pas dans l'enregistrement SPF de domaine1.[4] ## SPF record -le SPF record est composé de plusieurs parties. il commence par un numéro de version, suivi par les différents mécanismes qui permettent de de définir les expéditeurs valides.[3] +le SPF record est composé de plusieurs parties. Il commence par un numéro de version, suivi par les différents mécanismes qui permettent de de définir les expéditeurs valides.[3] * numéro de version : `v=spf1` From e58063bd9c5d8b3e3f430210f820189a83e848a8 Mon Sep 17 00:00:00 2001 From: simonNolf Date: Wed, 8 Jun 2022 11:34:20 +0200 Subject: [PATCH 149/241] Update spf.md --- "R\303\251seaux/spf.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/spf.md" "b/R\303\251seaux/spf.md" index 39f60a7..e12958f 100644 --- "a/R\303\251seaux/spf.md" +++ "b/R\303\251seaux/spf.md" @@ -12,7 +12,7 @@ parent: Réseaux ## Qu'est ce que c'est? -SPF, acronyme de Sender Policy Framework, permet d'empêcher les envois de message par des spammeurs au nom de votre domaine au moyen d'un système de validation. Spf permet a une organisation de publier des servers de messagerie autorisée. Ce framework fonctionne de pair avec DMARK. Il donne à ceux qui recoivent l'information les différentes informations par rapport à la fiabilité de l'origine du mail. [1] +SPF, acronyme de Sender Policy Framework, permet d'empêcher les envois de message par des spammeurs au nom de votre domaine au moyen d'un système de validation. Spf permet a une organisation de publier des servers de messagerie autorisés. Ce framework fonctionne de pair avec DMARK. Il donne à ceux qui recoivent l'information les différentes informations par rapport à la fiabilité de l'origine du mail. [1] Il s'agit donc d'un moyen d'autentification par nom de domaine pour éviter l'usurpation d'identité. Pour cela, il a besoin du DNS. Ainsi, tout expéditeurs peux spécifier quels serveurs peuvent envoyer des e-mails au nom de leur domaine. From b25b4e1630c4300170ed452d1e75ed59edad99a8 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:04:41 +0200 Subject: [PATCH 150/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 0bd73ed..5c37f48 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -115,3 +115,7 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence [7] https://www.rfc-editor.org/rfc/rfc3947.html [8] https://www.rfc-editor.org/rfc/rfc3948.html + +[9] https://www.rfc-editor.org/rfc/rfc2402.html + +[10] https://www.rfc-editor.org/rfc/rfc2406.html From e68ce7da6c5856026b29390c5da9c8c9ec547aca Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 15:07:52 +0200 Subject: [PATCH 151/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 5c37f48..e26da63 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -97,7 +97,7 @@ Les avantages d’IPSec sont indéniables en matière de performance et de fiabi Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. -Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5 - 7 - 8] +Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5 - 7 - 8 - 9] ## Sources : [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec @@ -114,8 +114,7 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence [7] https://www.rfc-editor.org/rfc/rfc3947.html -[8] https://www.rfc-editor.org/rfc/rfc3948.html +[8] https://www.rfc-editor.org/rfc/rfc2406.html [9] https://www.rfc-editor.org/rfc/rfc2402.html -[10] https://www.rfc-editor.org/rfc/rfc2406.html From 0ffd72d6656be3f1708b25e69634367f7c4add56 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 16:06:08 +0200 Subject: [PATCH 152/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index e26da63..36d0cfb 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -97,7 +97,23 @@ Les avantages d’IPSec sont indéniables en matière de performance et de fiabi Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. -Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5 - 7 - 8 - 9] +Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence de notion de ports source/destination pou résoudre ceci, IPSec utilise une extension "Nat-Traversal, RFC 3947 et RFC 3948" [10 - 11] cette dernière propose d'encapsuler le protocoles ESP ou AH dans un paquet UDP afin de pouvoir plus facilement traverser NAT et Par-Feu.[5 - 7 - 8 - 9] + +## Exemple utilisation d'IPSec + +Voici un exemple d'utilisation IPSec en mode tunnel : + +Prennons par exemple une entreprise qui possède deux sites, celles-ci aimerait que ses deux sites puissent communiquer sur le même réseau de mainère sécurisée. Pour répondre à ce besoin elle va mettre en place un VPN pour relier les deux sites et utiliser la suite de protocoles IPSec afin de créer un tunnel sécursié entre les deux sites. + +![Screenshot 2022-06-08 at 15 47 43](https://user-images.githubusercontent.com/43784062/172632849-84ae322a-aad7-4681-88c0-fdca4b8bc8fc.png) + + +Voici un exemple d'utilisation IPSec en mode transport : + +Prennons par exemple, une connexion bureau à distance sécurisée où une personne sur une machine A se connecte sur une seconde machine B ( ex : Teamviwer ). Pour établir une communication sécurisé entre sa machine et la seconde elle va devoir utiliser le mode Transport d'IPSec. + +![Screenshot 2022-06-08 at 16 05 18](https://user-images.githubusercontent.com/43784062/172637123-97c61f83-8cf4-43bc-b970-0802fd97307b.png) + ## Sources : [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec @@ -118,3 +134,6 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence [9] https://www.rfc-editor.org/rfc/rfc2402.html +[10] https://www.rfc-editor.org/rfc/rfc3947.html + +[11] https://www.rfc-editor.org/rfc/rfc3948.html From 42cbb85a4f98b9fd8b457438992313874b5985ef Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 16:18:23 +0200 Subject: [PATCH 153/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 36d0cfb..a1e9d76 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -124,16 +124,18 @@ Prennons par exemple, une connexion bureau à distance sécurisée où une perso [4] https://en.wikipedia.org/wiki/Internet_Security_Association_and_Key_Management_Protocol, consulté le 28/05/2022, date article : 25/05/2022, auteur : /, Affiliation : wikipedia.org, titre article : Association de sécurité Internet et protocole de gestion de clés -[5] https://www.sstic.org/media/SSTIC2006/SSTIC-actes/Faiblesses_d_IPSec_en_deploiements_reels/SSTIC2006-Article-Faiblesses_d_IPSec_en_deploiements_reels-vanhullebus.pdf, consulté le 31/05/2022, auteur :Yvan Vanhullebus , Affiliation : Netasq, titre article : Faiblesses d’IPSec en déploiements réels +[5] https://www.sstic.org/media/SSTIC2006/SSTIC-actes/Faiblesses_d_IPSec_en_deploiements_reels/SSTIC2006-Article-Faiblesses_d_IPSec_en_deploiements_reels-vanhullebus.pdf, consulté le 31/05/2022, auteusr :Yvan Vanhullebus , Affiliation : Netasq, titre article : Faiblesses d’IPSec en déploiements réels -[6] https://www.rfc-editor.org/rfc/rfc2408.html -[7] https://www.rfc-editor.org/rfc/rfc3947.html -[8] https://www.rfc-editor.org/rfc/rfc2406.html +[6] https://www.rfc-editor.org/rfc/rfc2408.html, consulté le 31/05/2022 , date article : Novembre 1998 ,auteurs : D. Maughan & M. Schertler & M. Schneider & J. Turner , Affiliation : RFC, titre article : Internet Security Association and Key Management Protocol (ISAKMP) -[9] https://www.rfc-editor.org/rfc/rfc2402.html +[7] https://www.rfc-editor.org/rfc/rfc3947.html, consulté le 31/05/2022, date article : Janvier 2005, auteurs :T. Kivinen & B. Swander & A. Huttunen & V. Volpe , Affiliation : RFC, titre article : Negotiation of NAT-Traversal in the IKE -[10] https://www.rfc-editor.org/rfc/rfc3947.html +[8] https://www.rfc-editor.org/rfc/rfc2406.html, consulté le 31/05/2022, date article : Novembre 1998 , auteurs :S. Kent & R. Atkinson , Affiliation : RFC, titre article : IP Encapsulating Security Payload (ESP) -[11] https://www.rfc-editor.org/rfc/rfc3948.html +[9] https://www.rfc-editor.org/rfc/rfc2402.html, consulté le 31/05/2022, date article : Novembre 1998 , auteurs :S. Kent & R. Atkinson, Affiliation : RFC, titre article : IP Authentication Header + +[10] https://www.rfc-editor.org/rfc/rfc3947.html, consulté le 31/05/2022, date article : Janvier 2005 , auteurs : T. Kivinen & B. Swander & A. Huttunen & V. Volpe , Affiliation : RFC, titre article : Negotiation of NAT-Traversal in the IKE + +[11] https://www.rfc-editor.org/rfc/rfc3948.html, consulté le 31/05/2022, date article : Janvier 2005 , auteurs :A. Huttunen & B. Swander & V. Volpe & L. DiBurro & M. Stenberg, Affiliation : RFC, titre article : UDP Encapsulation of IPsec ESP Packets From b79dda24a609183fde26ea70bcfab03db51470e2 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 16:19:39 +0200 Subject: [PATCH 154/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index a1e9d76..d768a61 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -112,7 +112,7 @@ Voici un exemple d'utilisation IPSec en mode transport : Prennons par exemple, une connexion bureau à distance sécurisée où une personne sur une machine A se connecte sur une seconde machine B ( ex : Teamviwer ). Pour établir une communication sécurisé entre sa machine et la seconde elle va devoir utiliser le mode Transport d'IPSec. -![Screenshot 2022-06-08 at 16 05 18](https://user-images.githubusercontent.com/43784062/172637123-97c61f83-8cf4-43bc-b970-0802fd97307b.png) +![Screenshot 2022-06-08 at 16 19 19](https://user-images.githubusercontent.com/43784062/172640127-7c37ab62-fd3b-436b-b80e-e88c07368373.png) ## Sources : From cf268da3b80da3a1c5587e06e4b02dd2fcd007f8 Mon Sep 17 00:00:00 2001 From: Arnaud Meunier <71312671+ChaosArnhug@users.noreply.github.com> Date: Wed, 8 Jun 2022 16:21:58 +0200 Subject: [PATCH 155/241] [UPDATE] ajout cas pratique ping + alternative Commit qui prend en compte cet avis : https://github.com/EphecLLN/Wiki-TI/pull/23#issuecomment-1144810066 --- "R\303\251seaux/ICMP.md" | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git "a/R\303\251seaux/ICMP.md" "b/R\303\251seaux/ICMP.md" index f1a74ce..c8e6824 100644 --- "a/R\303\251seaux/ICMP.md" +++ "b/R\303\251seaux/ICMP.md" @@ -73,6 +73,37 @@ Le format en IPv4 contient : Le format en IPv6 est semblable à celui en IPv4 mais son en-tête IP est adapté à la version 6. +## Ping et ICMP [[9]](https://linux.die.net/man/8/ping) +--- + +Ping est une commande très connue qui utilise des paquets ICMP (plus précisément des _ECHO_REQUEST ICMP_ et des _ECHO_RESPONSE ICMP_) afin d'obtenir plusieurs informations sur le réseau. + +Pour effectuer une requête ping, il faut saisir, au minimum, ceci : `ping adresseIP/nomHôte` + +Par exemple : + +Taper `ping canopus` donnera ceci : +``` +PING canopus.austin.century.com: (128.116.1.5): 56 data bytes +64 bytes from 128.116.1.5: icmp_seq=0 ttl=255 time=2 ms +64 bytes from 128.116.1.5: icmp_seq=1 ttl=255 time=2 ms +64 bytes from 128.116.1.5: icmp_seq=2 ttl=255 time=3 ms +64 bytes from 128.116.1.5: icmp_seq=3 ttl=255 time=2 ms + +----canopus.austin.century.com PING Statistics---- +4 packets transmitted, 4 packets received, 0% packet loss +round-trip min/avg/max = 2/2/3 ms +``` +Une réponse standard contient différentes informations : le nombre de bytes envoyé par paquet, la destination, le numéro du paquet, le TTL nécessaire pour atteindre la destination, le temps que cela a nécessité et le nombre de paquets perdus et réceptionnés . D'autres informations peuvent être obtenues en fonction des paramètres que l'on choisit. Plus de détails [ici](https://linux.die.net/man/8/ping). + +## Alternative à ICMP et à PING [[10]](https://linux.die.net/man/1/echoping) [[11]](https://linux.die.net/man/8/arping) [[12]](https://curl.se/) +--- + +Le problème avec la commande ping et ICMP en général, est qu'une grande partie du trafic ICMP est bloquée par les pare-feu des réseaux pour diverses raisons de sécurité. Dans ce cas, voici plusieurs alternatives : +- echoping [[10]](https://linux.die.net/man/1/echoping) : fonctionne de manière similaire à ping. Sa grande différence est qu'il utilise TCP au lieu d'ICMP. +- arping [[11]](https://linux.die.net/man/8/arping) : fonctionne de manière similaire à ping. Il utilise des paquets ARP pour vérifier l'état de la destination. On peut également utiliser des adresses MAC avec cette commande. +- curl [[12]](https://curl.se/) : alternative majoritairement utilisée pour tester la connectivité d'un site. + ## Bibliographie 1. [Qu'est-ce que le protocole ICMP ?](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-que-le-protocole-icmp/), Digital Guide IONOS, le 05/03/2019, consulté le 31/05/2022 @@ -106,5 +137,19 @@ Le format en IPv6 est semblable à celui en IPv4 mais son en-tête IP est adapt 8. [Internet Control Message Protocol (ICMP) Parameters](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml), Iana, 25/09/2020, consulté le 31/05/2022 - _Résumé : Document de l'Iana regroupant tous les codes et types d'ICMPv4_ - _Avis sur la ressource : Fiable et permet d'avoir la liste complète et expliquée de tous les paramètres d'ICMPv4_ +9. [ping(8) - Linux man page](https://linux.die.net/man/8/ping), Linux.die.net, consulté le 08/06/22 + - _Résumé : Page MAN de la commande ping_ + - _Avis sur la ressource : Fiable car il s'agit de la documentation provenant des pages MAN_ + +10. [echoping(1) - Linux man page](https://linux.die.net/man/1/echoping),Linux.die.net, consulté le 08/06/22 + - _Résumé : Page MAN de la commande echoping_ + - _Avis sur la ressource : Fiable car il s'agit de la documentation provenant des pages MAN_ + +11. [arping(8) - Linux man page](https://linux.die.net/man/8/arping),Linux.die.net, consulté le 08/06/22 + - _Résumé : Page MAN de la commande arping_ + - _Avis sur la ressource : Fiable car il s'agit de la documentation provenant des pages MAN_ +12. [CURL://](https://curl.se/), curl, consulté le 08/06/22 + - _Résumé : Site web de CURL et sa documentation_ + - _Avis sur la ressource : Fiable car il s'agit du site officiel de curl_ From 0cd0226b6fef15e9247764423db925888e058f0b Mon Sep 17 00:00:00 2001 From: quentinrld <71373028+quentinrld@users.noreply.github.com> Date: Wed, 8 Jun 2022 20:00:20 +0200 Subject: [PATCH 156/241] Create SMB.md --- "R\303\251seaux/SMB.md" | 148 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 "R\303\251seaux/SMB.md" diff --git "a/R\303\251seaux/SMB.md" "b/R\303\251seaux/SMB.md" new file mode 100644 index 0000000..88c6478 --- /dev/null +++ "b/R\303\251seaux/SMB.md" @@ -0,0 +1,148 @@ +--- +layout: default +title: SMB +parent: Réseaux +--- + +# SMB (Server Message Block) + +Dans une époque où les réseaux informatiques sont partout, aussi bien chez soi qu’au travail ou bien même dans la rue, la création +d’un réseau local comme alternative à Internet fait l’unanimité. Ceci permet au membre du réseau d’échanger toute sorte d’information +et donnée entre eux, mais également, offre la possibilité de gérer des serveurs, des imprimantes ou des routeurs par exemple. Pour +gérer tout ça, de nombreuses règles sont mise en œuvre par le billet de protocoles, l’un d’entre eux est le SMB.¹ + +## Qu’est-ce que le SMB ? ¹ + +Le SMB ou Server Message Block est un protocole développé en 1983 par IBM et en constante évolution depuis lors. Ce dernier est un +protocole serveur-client gérant l’accès à des fichiers, à des répertoires complets et à d’autres ressources du réseau tel que des +imprimantes ou des interfaces partagées sur le réseau, de plus ce dernier a également été créer dans le but d’échanger des +informations avec les autres protocoles, c’est la communication inter-processus. + +Mis à disposition d’un large public dans le cadre de l’implémentation du système d’exploitation réseau OS/2 LAN Manager ainsi que de +son successeur LAN Server, ce protocole majoritairement utilisé sous Windows qui supporte la rétrocompatibilité (compatible avec +d’anciennes versions du système d’exploitation) pour le SMB. Certains logiciels permettent par ailleurs d’utiliser le Server Message +Block avec les systèmes d’exploitation Linux et Unix grâce à Samba par exemple et ainsi de permettre la communication +multi-plateforme. ² + +## Comment fonctionne SMB ? + +Le protocole SMB permet à des membres d’un même réseau ayant également le protocole d’implémenté d’accéder à des fichiers et services +partagés à ces fins sur celui-ci. Pour commencer une connexion entre les différent parti doit être mise en place, SMB utilise, pour +ce faire le Transmission Control Protocol (TCP) prévu avec un handshaking en trois temps entre le client et le serveur avant +l’établissement de la connexion, pour la suite du transfert de données les spécifications de TCP sont également maintenue durant +l’échange de données.¹ + +![image](https://user-images.githubusercontent.com/71373028/172682323-972f15e0-cfb7-4aee-ad37-0288bee85706.png) + +Lors d’une connexion SMB via un protocole TCP, des demandes par messages sont effectuées du côté serveur et client pour mettre des +fichiers ou service à disposition sur le réseau.² + +## Comment le SMB a-t-il évolué depuis sa création ?¹ + +Publié en 1983, SMB a subi de nombreuses modifications par rapport à sa première version, partant de la première version, SMB 1.0, +nous sommes maintenant et depuis l’arrivée de Windows 10 à SMB 3.1.1. +Voici les grandes étapes qui ont fait évoluer ce protocole : +- SMB 1.0 (CIFS) : +Assimilé dans un premier temps à la modification Common Internet File System (CIFS), ce n’est qu’une partie de la première édition de +SMB. En effet, cet aspect du protocole n’était porté que sur les machines équipées de Windows NT 4.0 et ne communiquait uniquement +via l’interface NetBIOS grâce aux port UDP 137 et 138 respectivement utiliser pour la résolution de nom et la transmission de paquet, +mais aussi en TCP via le port 139 utilisé pour l’établissement de la connexion et du transfert. Il nous faudra donc attendre +l’arrivée de Windows 2000 pour voir disparaître la dépendance de NetBIOS, mais aussi une connexion directe via le port TCP 445, +encore utiliser aujourd’hui. + +- SMB 2.0¹ : +Arrivé en 2006 avec Windows Vista, il apporte, avec lui d’importante réforme sur le protocole précédant. Les principales +améliorations du système étant les suivantes : +- la réduction drastique du nombre de commandes +- l’optimisation des performances grâce à une file d’attente des requêtes +- la compatibilité avec les liens symboliques +- amélioration des signatures des messages +- plus de modularité avec un accroissement du nombre de clients +En plus de ça, Microsoft permet malgré tout de continuer la communication avec les versions précédente, mais également avec d’autres +systèmes d’exploitation différente. + +- SMB 2.1¹ : +Cette version, liée à Windows 7 propose une révision du système précédant dès 2007, en plus des légères améliorations apporté par +celui-ci, il implémente une nouvelle méthode de verrouillage afin de réguler plus facilement l’accès aux fichiers. + +- SMB 3.0¹ : +Arrivé en 2012 avec Windows 8 le server message block se voit aussi attribuer une nouvelle version. Avec cette dernière version, +l’accent est porté sur la performance et la sécurité des connexions. Celle-ci apporte aussi avec elle la possibilité d’accéder au +stockage des fichiers à distance grâce à RDMA (Remote Direct Memory Access). Avec sa refonte, des nouvelles fonctionnalités sont +mises en place telle que la possibilité d’établir des connexion multi channels, mais aussi un chiffrement de bout en bout lors du +transfert de fichier. + +- SMB 3.1.1¹ : +Publier en 2015 avec Windows 10 cette version augmente la sécurité avec un contrôle de l’intégrité avant l’authentification grâce à +un hachage SHA 512, elle oblige également à sécuriser la connexion des appareils communiquant avec le protocole SMB 2.0. +Microsoft viendra par la suite stopper la communication par défaut vers le SMB 1 pour des raisons de sécurité, cette option est +toutefois possible à activer pour permettre la rétrocompatibilité. + +## Comment se protéger lors de l’utilisation d’un SMB ?² + +Étant donné que Microsoft a accordé énormément d’importance au fait de maintenir la communication entre les différentes version du +protocole, mais ceci s’accompagne d’énormément de risques. Effectivement, la communication entre les vieilles et les nouvelles +versions engendre de nombreuses failles de sécurité rendant les utilisateurs vulnérable notamment aux attaques DoS. +Les risques sont d’autant plus élevés pour les attaques via SMB dans les réseaux ou tous les protocoles du protocole sont +généralement activés afin de permettre son utilisation par les appareils qui y ont recours comme les imprimantes ou autres appareils +en réseaux. Si malgré tous les utilisateurs classiques n’utilise plus les anciennes versions de SMB, les hackers, eux, se voient leur +travail facilité par les failles laisser dans les premières versions, c’est pour ça que Windows 10 permet de désactiver le suivi des +premières versions. + +## Quelques cas d’utilisation et d’implémentation des Server Message Block¹ ² + +L’utilisation la plus fréquente est bien entendu la connexion client-serveur entre les ordinateurs et les serveurs de fichiers, mais +pas que, car le protocole est également capable de communiqué avec d’autres processus et comprend un simple échange de données entre +deux appareils aussi. +En-dehors de son utilisation classique sous Windows, de nombreux logiciels ont fini par intégrer le Protocole de Server Message Block +dans leurs projets afin de permettre son utilisation sur des systèmes indépendants à Windows tel que Linux, Unix ou encore Mac en +voici quelques exemples : +- Samba : sans aucun doute l’une des implémentations de SMB parmi les plus connues et rependue en dehors de Windows. Ce logiciel +libre a permis la communication Server Message Block sur les systèmes Unix et Linux dès 1991.³ ⁶ +- Netsmb : développé pour les systèmes d’exploitation BSD, il est une implémentation du client et du serveur SMB directement sur le +noyau de celui-ci. Premièrement exploiter sur le système FreeBSD 4.4, il est, à ce jour, disponible sur un bon nombre de systèmes BSD +tel que NetBSD et macOS.¹ +- YNQ : précédemment appeler NQ, utilisé dans les systèmes non dotés de Windows, il implémente le Server Message Block et permet de +ce fait la communication avec les appareils équipés de Windows. Il est développé par l’entreprise Visuality Systèms Ltd, une +entreprise spécialisée dans les logiciels.⁴ +- ConnectedNas : développée spécialement pour les appareils Android par Connected Way, cette application permet au utilisateur +d’appareil mobile d’échanger facilement des données avec des appareils SMB. +Pour des raisons de sécurité, tous les protocoles cités utilisent des versions avancées du service SMB afin de garantir la sécurité +des utilisateurs.⁵ + + +## Bibliographie + +* [^1] : INOS, (https://www.ionos.fr/digitalguide/serveur/know-how/server-message-block-smb/#:~:text=SMB%20(Server%20Message%20Block)%20est,interfaces%20partag%C3%A9es%20dans%20le%20r%C3%A9seau), 24/09/2020, consulté le 14/05/2022 + + **Résumé** : Présentation globale des SMB + **Avis sur la ressource** : Il s'agit d'un article détaillant le protocole SMB datant de 2020, mais je n'ai pas vu de mise à + jour plus récent. + +* [^2] : Article communautaire, MICROSOFT, (https://docs.microsoft.com/en-us/windows-server/storage/file-server/smb-security), 17/02/2022,consulté le 15/05/2022 + + **Résumé** : Description générale de SMB + **Avis sur la ressource** : Il s'agit d'un article communautaire mis à jour régulièrement et surveiller par Microsoft pour + assurer la fiabilité de la ressource. + +* [^3] : Article communautaire, WIKIPEDIA, (https://fr.wikipedia.org/w/index.php?title=Samba_(informatique)&oldid=193049431), 21/04/2022, 25/05/2022 + + **Résumé** : Description de Samba + **Avis sur la ressource** : Cet article reprend les grandes lignes de samba, il faut toutefois se méfier de certains articles Wikipédia qui peuvent être modifiés par tout le monde. + +* [^4] : VISUALITYNQ, (https://visualitynq.com/products/ynq/), 2022, consulté le 27/05/2022 + + **Résumé** : Description et explication de YNQ + **Avis sur la ressource** : C'est un article officiel sur le protocole permettant de comprendre grâce a des exemples de son fonctionnement + +* [^5] : Article communautaire, TRUENAS, (https://www.truenas.com/docs/core/coretutorials/sharing/smb/smbshare/), 22/05/2022, consulté le 06/06/2002 + + **Résumé** : Description du protocole et sur quoi il se base + **Avis sur la ressource** : C'est un article mis à jour régulièrement avec comme dernière version le 22/05 + +* [^6] : SAMBA, (https://www.samba.org/),02/05/2022, Consulté le 25/05/2022 + + **Résumé** : Documentation officiel Samba + **Avis sur la ressource** : Documentation très intéressante aussi bien pour ce renseigner que pour configurer Samba, il est en plus mis à jour régulièrement + + From 61680739d01100bee4be9b35a82411156c0419c7 Mon Sep 17 00:00:00 2001 From: HE201916 <71373221+HE201916@users.noreply.github.com> Date: Wed, 8 Jun 2022 21:39:16 +0200 Subject: [PATCH 157/241] [UPD] Introduction avec MPLS --- "R\303\251seaux/Les protocoles VPN.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/Les protocoles VPN.md" "b/R\303\251seaux/Les protocoles VPN.md" index edb65fd..18dcf49 100644 --- "a/R\303\251seaux/Les protocoles VPN.md" +++ "b/R\303\251seaux/Les protocoles VPN.md" @@ -5,7 +5,7 @@ ## Introduction : -Les connexions VPN (Virutal Private Network) permettent de créer un lien sécurisé entre deux points, elles sont utilisées par les entreprises pour fournir à leurs employés un moyen d'accéder au réseau interne ou à des ressources internes depuis un ordinateur ou un réseau distant. Les connexions VPN sont chiffrées ce qui rend le trafic opaque pour les personnes non autorisées. Il existe aussi des connexions VPN commerciaux destinés aux internautes pour chiffrer leurs trafic et garantir leurs anonymat ainsi que contourner la censure. +Les connexions VPN (Virutal Private Network) permettent de créer un lien sécurisé entre deux points, elles sont utilisées par les entreprises pour fournir à leurs employés un moyen d'accéder au réseau interne ou à des ressources internes depuis un ordinateur ou un réseau distant. Les connexions VPN sont chiffrées ce qui rend le trafic opaque pour les personnes non autorisées. Il existe aussi des connexions VPN commerciaux destinés aux internautes pour chiffrer leurs trafic et garantir leurs anonymat ainsi que contourner la censure. Cet article est consacré aux VPN qui passent à travers internet, donc n'abordera pas les VPN privés tel que les VPN MPLS. La première connexion VPN a été développé par un employé de Microsoft en 1996. Il a développé le “point-to-point tunneling protocol” (PPTP). @@ -14,7 +14,7 @@ Il existe trois types de connexions VPN : 1- Site to Site VPN => entre deux réseaux d’entreprise -![image](https://user-images.githubusercontent.com/71373221/170224719-ced5e30a-1cfd-4f00-965d-46d7571269c3.png) +![image](https://user-images.githubusercontent.com/71373221/172702429-810763b1-7064-47d3-82c4-985e9d6fa493.png) @@ -22,7 +22,7 @@ Il existe trois types de connexions VPN : 2- Client to Site VPN => entre un équipement client et un réseau d’entreprise. -![image](https://user-images.githubusercontent.com/71373221/170224768-f54321ea-6297-4615-ac02-bba596431bf8.png) +![image](https://user-images.githubusercontent.com/71373221/172702490-6885a770-2e6d-4a71-a2a5-700b60072871.png) 3- SSL-VPN: Les entreprises utilisent des VPN SSL pour permettre aux utilisateurs distants d'accéder en toute sécurité aux services offert , ainsi que pour sécuriser les sessions Internet des utilisateurs qui accèdent à Internet depuis l'extérieur du réseau de l'entreprise. From b029262908989206d756d3a67e38d731afd11cad Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 22:43:37 +0200 Subject: [PATCH 158/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index d768a61..e04a381 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -8,7 +8,7 @@ parent : Réseaux ## Un peu d'histoire -En informatique et plus particulièrement en réseau, les paquets sont les éléments principaux pour communiquer des données entre deux machines. +En informatique et plus particulièrement en réseau, les paquets IP sont les éléments principaux pour communiquer des données entre deux machines. Dans ces paquets on y distingue deux grands types d'éléments à savoir, ceux pour les données et ceux contenant l’adresse de l’expéditeur et du destinataire. Screenshot 2022-06-02 at 14 59 04 @@ -16,7 +16,7 @@ Dans ces paquets on y distingue deux grands types d'éléments à savoir, ceux p Le point négatif de cette communication est l’absence de sécurité en effet les données des paquets ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité de celles-ci également. -C’est un gros problème vu que lors de cet échange de données, les paquets passe par différents routeurs. Elles peuvent donc être interceptées, lues, manipulées, modifiées à tout moment par une personne mal intentionnée. +C’est un gros problème vu que lors de cet échange de données, les paquets passent par différents routeurs. Elles peuvent donc être interceptées, lues, manipulées, modifiées à tout moment par une personne mal intentionnée. Pour faire face à cette situation et ainsi permettre un transfert de paquets de données sécurisés sur des réseaux publics, l’Internet Protocol Security ou IPsec a été développé. @@ -43,11 +43,11 @@ On peut répartir la suite des protocles IPSec en 3 groupes : ### Protocoles de transfert AH et ESP -Le protocole d'en-tête d'authentification (AH) fournit l'authentification de l'origine des données ainsi que l'intégrité de celles-ci[3] . Néanmoins, AH n'assure pas la confidentialité des données, celle-ci sont transmisses en claire ! +Le protocole d'en-tête d'authentification (AH) fournit l'authentification de l'origine des données ainsi que l'intégrité de celles-ci[3] . Néanmoins, AH n'assure pas la confidentialité des données, celles-ci sont transmisses en claire ! c'est pourquoi AH est utilisé en combinaison avec ESP. Le protocoles ESP ou Encapsulating Security Payload est utilisé pour la confidentialité des données en les chiffrants. -La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode `Transport` où machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. +La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode `Transport` où les machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. - Fonctionnement en mode Transport : @@ -78,8 +78,8 @@ l’expéditeur et le destinataire. ### Gestion des clés IKE & ISAKMP -IKE ou Internet Key Exchange est un procédé de gestion de clé utilisé pour gérer la connexion entre deux routeurs. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . -ISAKMP ou Internet Security Association and Key Management Protocol est un protocole défini par RFC 2408 pour établir une association de sécurité (SA) et des clés cryptographiques dans un environnement Internet.[6] +IKE ou Internet Key Exchange est un procédé de gestion de clés utilisé pour gérer la connexion entre deux routeurs. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . +ISAKMP ou Internet Security Association and Key Management Protocol est un protocole défini par RFC 2408 pour établir une association de sécurité (SA) et des clés cryptographiques dans un environnement Internet.[6] - 1. On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun - 2. Une fois les routeurs d’accord sur le type de sécurité, IKE ouvre un tunnel sécurisé @@ -89,7 +89,8 @@ ISAKMP ou Internet Security Association and Key Management Protocol est un prot ### Base de données SAD & SDP Les informations nécessaires au transfert des paquets sont stockées dans deux bases de données en local à savoir SPD ( Security Policy Database ) et SAD ( Security Association Database ). -Dans la base de donnée SDP on va retrouver les information permettant de déterminer le ou les protocoles à utiliser à savoir AH, ESP ou la combinaison des deux tant dit que dans la base de donnée SAD, on va retrouver les informations essentielles pour le protocole IKE à savoir les différentes clés de chiffrement. + +Dans la base de données SDP on va retrouver les information permettant de déterminer le ou les protocoles à utiliser à savoir AH, ESP ou la combinaison des deux tant dit que dans la base de donnée SAD, on va retrouver les informations essentielles pour le protocole IKE à savoir les différentes clés de chiffrement. ## Les points positifs et négatif d'IPSec @@ -103,14 +104,14 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence Voici un exemple d'utilisation IPSec en mode tunnel : -Prennons par exemple une entreprise qui possède deux sites, celles-ci aimerait que ses deux sites puissent communiquer sur le même réseau de mainère sécurisée. Pour répondre à ce besoin elle va mettre en place un VPN pour relier les deux sites et utiliser la suite de protocoles IPSec afin de créer un tunnel sécursié entre les deux sites. +Prennons par exemple une entreprise qui possède deux sites, celle-ci aimerait que ses deux sites puissent communiquer sur le même réseau de mainère sécurisée. Pour répondre à ce besoin elle va mettre en place un VPN pour relier les deux sites et utiliser la suite de protocoles IPSec afin de créer un tunnel sécursié entre les deux sites. ![Screenshot 2022-06-08 at 15 47 43](https://user-images.githubusercontent.com/43784062/172632849-84ae322a-aad7-4681-88c0-fdca4b8bc8fc.png) Voici un exemple d'utilisation IPSec en mode transport : -Prennons par exemple, une connexion bureau à distance sécurisée où une personne sur une machine A se connecte sur une seconde machine B ( ex : Teamviwer ). Pour établir une communication sécurisé entre sa machine et la seconde elle va devoir utiliser le mode Transport d'IPSec. +Prennons par exemple, une connexion bureau à distance sécurisée où une personne sur une machine A se connecte sur une seconde machine B ( ex : Teamviewer ). Pour établir une communication sécurisé entre sa machine et la seconde elle va devoir utiliser le mode Transport d'IPSec. ![Screenshot 2022-06-08 at 16 19 19](https://user-images.githubusercontent.com/43784062/172640127-7c37ab62-fd3b-436b-b80e-e88c07368373.png) From 808b96bf3dc4197104a770bdfdd40a793ac7410e Mon Sep 17 00:00:00 2001 From: vbrichant <56791491+vbrichant@users.noreply.github.com> Date: Wed, 8 Jun 2022 21:58:42 +0100 Subject: [PATCH 159/241] V1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit manque les sources indiquées dans le texte + bibliographie complète --- "R\303\251seaux/Future_d'http.md" | 262 ++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 "R\303\251seaux/Future_d'http.md" diff --git "a/R\303\251seaux/Future_d'http.md" "b/R\303\251seaux/Future_d'http.md" new file mode 100644 index 0000000..ab8fdcf --- /dev/null +++ "b/R\303\251seaux/Future_d'http.md" @@ -0,0 +1,262 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# L’avenir de HTTP + +## Définition + +L’Hypertext Transfer Protocol, généralement abrégé HTTP, littéralement « protocole de transfert hypertexte », est un protocole de communication client-serveur développé pour le web. +Le protocole HTTP est devenu un standard de l’IETF en 1997. + +## Evolution des versions du protocole HTTP + +Plusieurs versions de ce protocole se sont succédées depuis l’origine : HTTP/0.9, HTTP/1.0, HTTP/1.1 et HTTP/2. +Les versions successives du protocole vont progressivement corriger les problèmes des versions précédentes + +## HTTP/2 + +La version HTTP/2 est toujours la version majoritaire actuellement. +Par rapport à ses prédécesseurs, elle a introduit le concept de multiplexage de plusieurs transactions HTTP dans une seule connexion TCP. +Ce concept visait à résoudre le problème du blocage de Head Of Line (HOL), qui est l’un des principaux problèmes de performance rencontrés. +Ce multiplexage est malheureusement inefficace s’il existe des pertes de paquets. + +De plus, les pages web reprennent des contenus de plus en plus lourds (vidéos 4K, images, rendus 3D etc.), et le trafic ne cesse d’augmenter. + +C’est dans ce contexte que HTTP/3 a été démarré pour aider à améliorer les performances du web. + + +## Vers l’avenir de HTTP +Sans disposer de boule de cristal, on peut raisonnablement penser que l’avenir de HTTP va se baser sur plusieurs normes qui correspondent à des avancées +majeures depuis la première version de HTTP. +Il s’agit des normes suivantes : + +- HTTPS : [RFC 2818] +- HSTS : [RFC 6797] +- QUIC : [RFC 9000] est la norme principale, décrivant le socle de base de QUIC +- HTTP/3 [Toujours En cours de standardisation par l’IETF : dernier draft date du 11 mars 2022 : Hypertext Transfer Protocol Version 3 (HTTP/3)] +- HTTPA : hors norme actuellement + +Ces différentes normes seront détaillées ci-dessus + +## HTTP/3 + +Un certain nombre de différences importantes existent entre HTTP/2 et HTTP/3. + +![image](https://user-images.githubusercontent.com/56791491/172709717-23d03c0a-e536-4685-b266-cf3d1f0bf79d.png) + +### TCP vs UDP +Contrairement à HTTP/2, HTTP/3 n'utilise pas le protocole de contrôle de transmission (TCP) comme le faisaient ses prédécesseurs. +Au lieu de cela, il utilise le protocole de connexion Internet rapide UDP. + +Actuellement, le HTTP/2 embarque en effet un protocole de transport TCP orienté “connexion”. +En résumé, lorsqu'une machine A envoie des données à une machine B, cette dernière est prévenue de l'arrivée des données et envoie un accusé de réception. +Ce protocole présente un avantage : il renforce la sécurité. En revanche, il rend le transport des données relativement lent, puisqu'il nécessite plusieurs allers-retours. + +![image](https://user-images.githubusercontent.com/56791491/172709855-94af9cca-4e25-457a-9751-ec33d0987ce9.png) + +Le protocole QUIC utilise UDP, qui est un protocole de transport orienté “non connexion”. +Lorsqu'une machine A envoie des paquets à une machine B, le flux est unidirectionnel. +La machine B n'est pas prévenue de l'arrivée des données et les reçoit sans envoyer d'accusé de réception. + +QUIC garantit la livraison des flux dans l'ordre, mais pas entre les flux. +Cela signifie que chaque flux enverra des données et maintiendra l’ordre des données, +mais chaque flux pourra atteindre la destination dans un ordre différent de celui que l’application a envoyé. + +### TLS 1.3 + +Dans les faits, ce protocole UDP n’est pas un transport fiable. Pour éviter ce problème, QUIC ajoute une couche au-dessus d'UDP qui introduit la fiabilité. +L’objectif est de garantir la même fiabilité des communications, contrôle de flux et gestion de la congestion similaires à TCP. + +Ainsi QUIC peut envoyer d’un seul coup à un serveur les requêtes de connexion et de chiffrement, ce qui réduit de moitié la latence des nouvelles connexions. + +En résumé, QUIC accélère la navigation web tout en améliorant la sécurité. HTTP/3 ne prend en charge que les connexions cryptées grâce au cryptage TSL 1.3 intégré. + + +### Avantages de l’HTTP/3 + +Les avantages de HTTP/3 sont une meilleure vitesse de transmission, des temps de chargement plus courts et une connexion plus stable. +S'appuyant sur UDP, HTTP/3 contourne les points faibles de TCP et utilise tous les avantages de HTTP/2 et HTTP sur QUIC. + +#### Résolution du problème de la latence due au TCP + +Lorsqu’une session TCP est établie, elle déclenche généralement l’algorithme de contrôle de congestion TCP. +Il évalue la quantité de trafic qui peut être envoyée avant que la congestion ne se produise par le biais du processus de démarrage lent TCP (Slow Start). + +En s’appuyant sur le protocole UDP et en prenant en charge les flux de première classe, QUIC résout ce problème de latence lié au démarrage lent de la connexion. + + +#### Le problème de blocage de HOL est résolu + +QUIC offre un support au multiplexage, de sorte que différents flux HTTP peuvent utiliser différents flux de transport QUIC tout en partageant la même connexion QUIC. +Ainsi, l’état de congestion est partagé. +Les flux QUIC sont transmis indépendamment et, dans la plupart des cas, la perte de paquets affectant un flux n’affecte pas les autres. + +### Quels problèmes HTTP/3 pourrait-il poser ? + +De nombreux critiques indiquent que HTTP/3 arrive trop tôt après le protocole HTTP/2. Les problèmes suivants sont souvent cités. + +#### Ossification + +L’Internet est rempli d’équipements divers comme des routeurs ou pare-feu, qui exécutent généralement des logiciels pour gérer le trafic réseau et qui sont rarement mis à jour. + +Ce phénomène est souvent appelé « ossification ». Cela signifie que beaucoup de ces éléments ne sont pas encore adaptés au protocole QUIC. + +#### Problèmes de sécurité + +La sécurité des applications et des données est au centre des critiques. +Grâce à une réglementation claire des requêtes et des réponses, TCP était considéré comme un protocole fiable et orienté connexion. + +Or, puisque les contrôles de sécurité et le cryptage n'ont plus lieu via TLS, mais directement via UDP, les fournisseurs ont peur d’un impact sur la sécurisation du trafic de données en raison du manque d'authentification TLS. En conséquence, certains réseaux bloquent sciemment QUIC ! + + +#### Performances + +Bien que les performances soient théoriquement améliorées par le passage à HTTP/3, certains maillons risquent de poser problème dans la chaîne et devront être adaptés pour procurer les avancées espérées. + +Ainsi, pour l’optimisation des performances, beaucoup d’appareils prennent en charge la fonction de déchargement TCP (“TCP offloading”) au niveau de leurs cartes d’interface réseau, mais peu d’entre eux le prennent en charge pour UDP. + +Par rapport à son homologue TCP, UDP souffre également d’un manque de support des API. C’est également le cas pour les bibliothèques TLS sur QUIC. + +TCP est le protocole courant depuis des années, alors que UDP ne l’est pas, de sorte que les systèmes d’exploitation et la pile logicielle ne sont généralement pas aussi optimisées. +Par conséquent, il y a beaucoup plus de charge/besoins CPU avec QUIC : selon certaines estimations, deux fois plus qu’avec HTTP/2. + + +### Usage de HTTP/3 + +Les motivations pour introduire le nouveau protocole sont donc nombreux : +- Amélioration de performances +- Meilleur temps de réponse +- Meilleur comportement lors de pertes de paquets +- Amélioration de la confidentialité +Bien que HTTP/3 soit déjà disponible actuellement, son usage reste minoritaire, comme on peut le consulter sur le site https://w3techs.com/technologies/comparison/ce-http2,ce-http3 + +![image](https://user-images.githubusercontent.com/56791491/172710600-7cd1777e-57bb-49cf-83cc-314544a62687.png) + +Pourtant, de nombreux browsers permettent maintenant d’utiliser HTTP/3 ( voir la liste via l’URL suivante https://caniuse.com/http3) : + +![image](https://user-images.githubusercontent.com/56791491/172710586-cd925436-1f5b-4f18-b59f-a8dcd13e2418.png) + +Et de nombreux sites l’utilisent déjà comme google (évidement) mais aussi Youtube ou Facebook + +![image](https://user-images.githubusercontent.com/56791491/172710551-471dea08-50e9-45d5-908a-35e68e5f94ea.png) + + + +## HTTPS + +L'HyperText Transfer Protocol Secure HTTPS signifie « protocole de transfert hypertextuel sécurisé ») est la combinaison du HTTP avec une couche de chiffrement comme SSL ou TLS. + +HTTPS permet au visiteur de vérifier l'identité du site web auquel il accède, grâce à un certificat d'authentification émis par une autorité tierce, réputée fiable. +Il garantit théoriquement la confidentialité et l'intégrité des données envoyées par l'utilisateur (notamment des informations entrées dans les formulaires) et reçues du serveur. +Il peut permettre de valider l'identité du visiteur, si celui-ci utilise également un certificat d'authentification client. + +Les parties prenantes sont +- le client — par exemple le navigateur Web — contacte un serveur — par exemple Wikipédia — et demande une connexion sécurisée, en lui présentant un certain nombre de méthodes de chiffrement de la connexion (des suites cryptographiques) ; +- le serveur répond en confirmant pouvoir dialoguer de manière sécurisée et en choisissant dans cette liste une méthode de chiffrement et surtout, en produisant un certificat garantissant qu'il est bien le serveur en question et pas un serveur pirate déguisé (on parle de l'homme du milieu). +- Ces certificats électroniques sont délivrés par une autorité tierce (autorité de certification) à laquelle le client comme le serveur ont choisi de faire confiance, un peu comme un notaire dans la vie courante, et le client peut vérifier, grâce à la signature de cette autorité sur le certificat présenté par le serveur, que celui-ci est authentique. Le client s’assure par ailleurs que le certificat n’est pas périmé et aussi éventuellement que l’autorité de certification ne l’a pas révoqué. + +Le certificat contient aussi une clé dite publique qui permet de chiffrer un message pour le rendre secret et uniquement déchiffrable par le serveur grâce à une clé dite privée que seul le serveur détient, on parle de chiffrement asymétrique. +Cela permet au client d'envoyer de manière secrète un code aléatoire qu’il invente (une clé symétrique dite clef de session) qui sera mélangé à tous les échanges entre le serveur et le client de façon à ce que tous les contenus de la communication soient chiffrés. Pour cela, on mélange le contenu avec le code, ce qui donne un message indéchiffrable, et à l'arrivée refaire l’opération symétrique avec ce message redonne le contenu en clair. + +En bref : serveur et client se sont reconnus, ont choisi une manière de chiffrer la communication et se sont passés de manière chiffrée un code (clé de chiffrement symétrique) pour dialoguer de manière secrète. + +HTTP/3 n'existe pas dans une version non sécurisée ou non chiffrée. + + +## HSTS + +Une autre avancée pour sécuriser un site web est d’utiliser le HSTS « HTTP Strict Transport Security ». + +HTTP Strict Transport Security (HSTS) est un mécanisme de politique de sécurité proposé pour HTTP, permettant à un serveur web de déclarer à un navigateur web qu'il doit interagir avec lui en utilisant une connexion sécurisée (comme HTTPS). +Elle est communiquée au client via la réponse HTTP, et plus précisément dans le champ d'en-tête nommé « Strict-Transport-Security ». Elle spécifie une période de temps durant laquelle l'utilisateur doit accéder au Serveur informatique uniquement de façon sécurisée. + +Le HSTS force les navigateurs et les applications à utiliser — si cela est possible — le HTTPS pour se connecter. + +Facebook, Google, Gmail, Twitter et PayPal ne sont que quelques-uns des grands réseaux sociaux et portails de paiement à déployer une politique de sécurité HSTS aujourd’hui. + + +## HTTPA + +Cette nouvelle avancée est beaucoup moins aboutie. Elle permet d’ajouter à HTTPS qui sécurise le transport des données un protocole pour garantir également leur protection lors du traitement en protégeant le calcul en cours d'exécution. + +« HTTPS est actuellement le principal protocole pour les applications Web. Il fournit une connexion rapide et sécurisée avec un certain niveau de confidentialité et d'intégrité. +Cependant, HTTPS ne peut pas fournir de garanties de sécurité sur les données d'application dans le calcul, de sorte que l'environnement informatique présente des risques et des vulnérabilités. + +Compte tenu de cela, Gordon King et Hans Wang, deux employés d'Intel pensent que les services Web peuvent être rendus plus sûrs non seulement en effectuant des calculs dans des environnements d'exécution à distance de confiance, ou TEE, mais également en vérifiant pour les clients que cela a été fait. + +Dans un article intitulé : « HTTPA : HTTPS Attestable Protocol », récemment publié sur ArXiv, ils décrivent un protocole HTTP appelé HTTPS Attestable (HTTPA) pour améliorer la sécurité en ligne grâce à la certification à distance. + +HTTPA est conçu pour fournir une certification à distance et des garanties informatiques confidentielles entre un client et un serveur lors de l'utilisation du Web sur Internet. +Dans le cas de HTTPA, nous supposons que le client est digne de confiance et que le serveur ne l'est pas. L'utilisateur client peut vérifier ces garanties pour décider s'il peut faire confiance et exécuter les traitements informatiques sur le serveur ou non. Cependant, HTTPA n'offre aucune garantie que le serveur est digne de confiance. Elle comporte deux parties : la sécurisation des communications et des traitements + +- Concernant la sécurité des communications, HTTPA reprend toutes les hypothèses de HTTPS pour la sécurité des communications, y compris l'utilisation de TLS et la communication sécurisée, notamment l'utilisation de TLS et la vérification de l'identité de la personne. +- En ce qui concerne la sécurité informatique, le protocole HTTPA nécessite de fournir un état d'assurance supplémentaire d'attestation à distance pour que les traitements informatiques se produisent dans un espace sécurisé, afin que l'utilisateur client puisse exécuter les calculs dans une mémoire chiffrée. + +Quant à savoir si ou quand HTTPA pourrait être adopté, il n'est pas clair. +Lorsqu'on leur a demandé s'il était prévu de soumettre la spécification sous forme de RFC ou d'entreprendre une autre forme de normalisation, +ils ont répondu : « Nous avons des discussions en cours qui doivent être examinées par l'équipe juridique d'Intel avant de pouvoir adopter HTTPA ». + + +## Bibliographie + +[^1] [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... + +### HTTP/3 +[^1] https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP/3 + - +[^1] https://en.wikipedia.org/wiki/HTTP/3 + - +[^1] https://blog.cloudflare.com/fr-fr/http-3-from-root-to-tip-fr-fr/ + - +[^1] https://www.silicon.fr/http3-protocole-262163.html + - +[^1] https://kinsta.com/fr/blog/http3/#http3-coming + - +[^1] https://www.kadiska.com/fr/blog-protocole-http-3-lavenir-pour-une-meilleure-performance-web/ + - +[^1] https://www.phonandroid.com/http-3-tout-savoir-sur-le-nouveau-protocole-qui-va-accelerer-le-web.html + - +[^1] https://www.csoonline.com/article/3564253/6-ways-http-3-benefits-security-and-7-serious-concerns.html + - +[^1] https://www.ionos.com/digitalguide/hosting/technical-matters/http3-explained/ + - +[^1] https://www.f5.com/company/blog/http3-will-bring-significant-changes-and-challenges + - +[^1] https://azurplus.fr/comment-http-3-et-quic-accelereront-votre-navigation-web/ + - +[^1] https://www.fasterize.com/fr/blog/protocole-http3/ + - +[^1] https://blog.ilearned.eu/http3.html + - +[^1] https://blog.cloudflare.com/fr-fr/http3-the-past-present-and-future-fr-fr/ + - +[^1] https://stringfixer.com/fr/HTTP_3 + - +[^1] https://w3techs.com/technologies/details/ce-http3 + - +[^1] https://caniuse.com/http3 + - + +### HTTPS +[^1] https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure + - +[^1] https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure#HTTPS + - + +### HSTS +[^1] https://www.globalsign.com/fr/blog/qu-est-ce-que-le-hsts-comment-le-mettre-en-uvre + - +[^1] https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security + - + +### HTTPA +[^1] https://www.silicon.fr/httpa-attestation-integrite-tls-418933.html + - test +[^1] https://blog.desdelinux.net/en/Http-a-protocol-for-web-services-in-trusted-environments/ + - +* https://arxiv-org.translate.goog/abs/2205.01052?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc + - +* https://securite.developpez.com/actu/328186/Vous-avez-entendu-parler-de-HTTPS-Decouvrez-maintenant-HTTPA-des-services-Web-dans-des-environnements-de-confiance-avec-Intel-SGX-un-outil-qui-fournit-le-chiffrement-en-memoire/ + - + + From 4d60be53ea49e1e42e3162fa5b14961f10c33699 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 23:08:00 +0200 Subject: [PATCH 160/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index e04a381..e1c4dfc 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -47,7 +47,7 @@ Le protocole d'en-tête d'authentification (AH) fournit l'authentification de l' c'est pourquoi AH est utilisé en combinaison avec ESP. Le protocoles ESP ou Encapsulating Security Payload est utilisé pour la confidentialité des données en les chiffrants. -La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode `Transport` où les machines sont connectées directement et le mode `Tunel` qui permet de crée une connexion sécurisée entre deux réseaux IP. +La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode `Transport` où les machines sont connectées directement et le mode `Tunnel` qui permet de crée une connexion sécurisée entre deux réseaux IP. - Fonctionnement en mode Transport : From a1bda3706c36230d8cb2294e899630f2b57e4d82 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 23:10:57 +0200 Subject: [PATCH 161/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index e1c4dfc..8b7a507 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -51,9 +51,7 @@ La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode ` - Fonctionnement en mode Transport : -Le mode transport a possède un temps de traitement rapide, mais ne sécurise que les données de l'utilisateur, les adresses source et cible restent non protégées c'est pourquoi ce mode ce mode ne peut être utilisé qu’entre deux machines, par exemple routeur à routeur. - -![mode transport](https://user-images.githubusercontent.com/43784062/170671693-7d0c304d-b17b-475f-8b17-69aee9f934fc.jpeg) +Le mode transport a possède un temps de traitement rapide, mais ne sécurise que les données de l'utilisateur, les adresses source et cible restent non protégées c'est pourquoi ce mode ce mode ne peut être utilisé qu’entre deux machines, par exemple routeur à routeur ou ordinateur à ordinateur. - Il commence par crypter les données - Ensuite il rajoute un entête intermédiaire entre l’entête du paquet et les données. @@ -65,9 +63,6 @@ Le mode transport a possède un temps de traitement rapide, mais ne sécurise qu Le paquet recoit une nouvelle en-tête IP contenant les adresse source et cible ainsi que les données. Ce mode permet de connectées deux réseaux entre eux. - -![mode tunnel](https://user-images.githubusercontent.com/43784062/170671822-316aeaa2-8785-4c66-943a-b0c8b0f8742d.jpg) - - Il commence par crypter le paquet contenant les données - Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre From 21fcca6aa1f89aad1fe0a4c4680e658b25ece460 Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Wed, 8 Jun 2022 23:25:49 +0200 Subject: [PATCH 162/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 8b7a507..91ff8fa 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -73,7 +73,8 @@ l’expéditeur et le destinataire. ### Gestion des clés IKE & ISAKMP -IKE ou Internet Key Exchange est un procédé de gestion de clés utilisé pour gérer la connexion entre deux routeurs. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . +IKE ou Internet Key Exchange est un procédé de gestion de clés permettant d'assurer la négociation entre deux entités afin de mettre en place un canal de communication sécurisé entre celles-ci. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . + ISAKMP ou Internet Security Association and Key Management Protocol est un protocole défini par RFC 2408 pour établir une association de sécurité (SA) et des clés cryptographiques dans un environnement Internet.[6] - 1. On établit une connexion sécurisée en utilisant, soit les certificats de chaque partie, soit un mot de passe commun From a60841ab29bd91135936cefb882ceb44ebf4bb02 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Wed, 8 Jun 2022 23:43:17 +0200 Subject: [PATCH 163/241] correction article pop --- Assets/Images/conversation POP3.PNG | Bin 0 -> 71000 bytes "R\303\251seaux/POP.md" | 51 +++++++++++++++++++++------- 2 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 Assets/Images/conversation POP3.PNG diff --git a/Assets/Images/conversation POP3.PNG b/Assets/Images/conversation POP3.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ae3b5fe9b63d9b9674d06e78e3d856dab4d50e5e GIT binary patch literal 71000 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 v*m6PUcnH?D&ArSMbo0HMWSkve_J|Ss+th` literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 26ff7f3..76bb0d4 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -6,7 +6,7 @@ parent: Réseaux # POP -## qu'est ce que POP +## qu'est ce que POP [1] [2] Le protocole POP (Post Office Protocol) est un protocole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on ne pourra les lires via un client de messagerie telle qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus sur le serveur. @@ -18,9 +18,11 @@ Le protocole Imap, son concurrant, quant à lui permet de télécharger ses mail Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite aux lettres lorsque nous y accédons et empêche alors toute autre connexion. -[[https://www.kalanda.net/images/faq/imap/pop-ou-imap.png]] +## conversation POP [9] -### Le protocole POP gère les commandes suivantes : +[](!https://github.com/EphecLLN/Wiki-TI/blob/main/Assets/Images/conversation-POP3.png) + +### Le protocole POP gère les commandes suivantes [5] : * LIST : donne le nombre de courriers présents sur le serveur avec leur numéro. * RETR [numéro] : récupère le courrier numéro en attente sur votre serveur. @@ -33,34 +35,59 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d Tous les clients mails peuvent être paramètrés afin d'utiliser POP -## Qu'elle est le futur du protocole POP +## Qu'elle est le futur du protocole POP [5] POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. Cependant, son développement n'a pas progressé depuis 2003. De l'autre côté, son concurent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourd'hui. -## L'avantage du protocole POP +## L'avantage du protocole POP [3][4] * POP est plus simple à utilisé, plus simple à configurer et efficace * Permet la gestion de ses emails en local ce qui facilite et augmente la vitesse de recherche et de tri. * Il nécessite une quantité minimale de ressources afin de fonctionner. -## Désaventage du protocole POP +## Désaventage du protocole POP [3][4] * Nécessite une connexion constante à internet. * Oblige l'utilisateur à sauvegarder ses mails afin de ne pas les perdre en cas de problème. +## sécurisation du protocole POP [10] + +La sécurisation du protocole POP, peut-être fais de deux manière +différente. + +Premièrement, on peut sécuriser les échanges au niveau du protocole grâce +à un certificat SSL ou TLS. Cette technique permet aux serveurs et aux +clients de s'authentifier mutuellement. Les échanges de messages peuvent +alors être chiffré. + +Ensuite, il est possible d'ajouter une couche de sécurité PGP et S/MIME. +Ces 2 outils sécurisent le dialogue entre les utilisateurs de la +messagerie électronique et sur des échanges de bout en bout. +Pour garder l'intégrité et la confidentialité des échanges PGP et S/MIME +fonctionne à l'aide d'un mécanisme de signature numérique et de +chiffrement. + ## Source -* Fonctionnement du protocole POP et IMAP - Base de connaissances - KALANDA. (2019). Kalanda.Net. Consulté le 27 mai 2022, à l’adresse https://www.kalanda.net/apps/index.php/knowledgebase/27/Fonctionnement-du-protocole-POP-et-IMAP.html#:%7E:text=Le%20protocole%20POP%20permet%20de,les%20voir%20sur%20mon%20smartphone). +* [1] Fonctionnement du protocole POP et IMAP - Base de connaissances - KALANDA. (2019). Kalanda.Net. Consulté le 27 mai 2022, à l’adresse https://www.kalanda.net/apps/index.php/knowledgebase/27/Fonctionnement-du-protocole-POP-et-IMAP.html#:%7E:text=Le%20protocole%20POP%20permet%20de,les%20voir%20sur%20mon%20smartphone). + +* [2] Arobase.org. (2018, 25 septembre). Le protocole POP. Consulté le 25 mai 2022, à l’adresse https://www.arobase.org/fonctionnement/pop.htm#:%7E:text=Le%20protocole%20POP%20g%C3%A8re%20l,m%C3%AAme%20temps%20%C3%A0%20votre%20courrier. + +* [3] Questiaux, J. (2021, 18 juin). Mon compte email : choisir POP ou IMAP ? Better Web. Consulté le 20 mai 2022, à l’adresse https://www.betterweb.fr/blog/mon-compte-email-choisir-pop-ou-imap + +* [4] A. (2020, 31 décembre). POP3, Post Office Protocol : de quoi s’agit-il, à quoi sert-il et en quoi est-il différent d’IMAP? Informatique Mania. https://www.informatique-mania.com/en/courriers-electroniques/bureau-de-protocole-de-messagerie-pop3/ + +* [5] Wikipedia contributors. (2022c, mai 16). Post Office Protocol. Wikipedia. https://en.wikipedia.org/wiki/Post_Office_Protocol -* Arobase.org. (2018, 25 septembre). Le protocole POP. Consulté le 25 mai 2022, à l’adresse https://www.arobase.org/fonctionnement/pop.htm#:%7E:text=Le%20protocole%20POP%20g%C3%A8re%20l,m%C3%AAme%20temps%20%C3%A0%20votre%20courrier. +* [6] POP et IMAP : différences, avantages et inconvénients. (2010, 17 mars). L’Orient-Le Jour. https://www.lorientlejour.com/article/650498/POP_et_IMAP%2B%253A_differences%252C__avantages_et_inconvenients.html#:%7E:text=Parmi%20les%20avantages%20du%20compte,enfin%20une%20utilisation%20minimale%20des -* Questiaux, J. (2021, 18 juin). Mon compte email : choisir POP ou IMAP ? Better Web. Consulté le 20 mai 2022, à l’adresse https://www.betterweb.fr/blog/mon-compte-email-choisir-pop-ou-imap +* [7] POP3 - RFCs 1939 : https://www.ietf.org/rfc/rfc1939.txt -* A. (2020, 31 décembre). POP3, Post Office Protocol : de quoi s’agit-il, à quoi sert-il et en quoi est-il différent d’IMAP? Informatique Mania. https://www.informatique-mania.com/en/courriers-electroniques/bureau-de-protocole-de-messagerie-pop3/ +* [8] IMAP4 - RFCs 3501 : https://datatracker.ietf.org/doc/html/rfc3501 -* Wikipedia contributors. (2022c, mai 16). Post Office Protocol. Wikipedia. https://en.wikipedia.org/wiki/Post_Office_Protocol +* [9] POP3-Client-Server-Procedure. (2009). Researchgate. https://www.researchgate.net/figure/POP3-Client-Server-Procedure_fig2_251917023 -* POP et IMAP : différences, avantages et inconvénients. (2010, 17 mars). L’Orient-Le Jour. https://www.lorientlejour.com/article/650498/POP_et_IMAP%2B%253A_differences%252C__avantages_et_inconvenients.html#:%7E:text=Parmi%20les%20avantages%20du%20compte,enfin%20une%20utilisation%20minimale%20des \ No newline at end of file +* [10] Problématique. (2003). Techniques de l’Ingénieur. https://www.techniques-ingenieur.fr/base-documentaire/technologies-de-l-information-th9/securite-des-si-services-et-applications-42315210/securite-des-e-mails-pgp-et-s-mime-h5330/problematique-h5330niv10001.html \ No newline at end of file From 024f806b88eae8cf4c86b8abc61b225189eaf6a6 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Wed, 8 Jun 2022 23:44:15 +0200 Subject: [PATCH 164/241] Update POP.md --- "R\303\251seaux/POP.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 76bb0d4..ae87ff7 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -20,7 +20,7 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ## conversation POP [9] -[](!https://github.com/EphecLLN/Wiki-TI/blob/main/Assets/Images/conversation-POP3.png) +[[https://github.com/EphecLLN/Wiki-TI/blob/main/Assets/Images/conversation-POP3.png]] ### Le protocole POP gère les commandes suivantes [5] : From 390bae5daaf4499f4d53e5e990c54f96f54ff53a Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Wed, 8 Jun 2022 23:45:58 +0200 Subject: [PATCH 165/241] Update POP.md --- "R\303\251seaux/POP.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index ae87ff7..9e62a39 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -20,7 +20,7 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ## conversation POP [9] -[[https://github.com/EphecLLN/Wiki-TI/blob/main/Assets/Images/conversation-POP3.png]] +![](https://github.com/EphecLLN/Wiki-TI/blob/main/Assets/Images/conversation-POP3.png) ### Le protocole POP gère les commandes suivantes [5] : From cfa6cc7fbfbd4a895e74ad172ba9d21b201c6b86 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Wed, 8 Jun 2022 23:46:35 +0200 Subject: [PATCH 166/241] Update POP.md --- "R\303\251seaux/POP.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 9e62a39..58ce7c1 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -20,7 +20,7 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ## conversation POP [9] -![](https://github.com/EphecLLN/Wiki-TI/blob/main/Assets/Images/conversation-POP3.png) +![](https://github.com/WassimBouhdid/Wiki-TI/blob/main/Assets/Images/conversation%20POP3.PNG) ### Le protocole POP gère les commandes suivantes [5] : From 4247d700ff0a1558a1a881831f506b90da65d92d Mon Sep 17 00:00:00 2001 From: vbrichant <56791491+vbrichant@users.noreply.github.com> Date: Wed, 8 Jun 2022 22:52:14 +0100 Subject: [PATCH 167/241] Finalisation de la bibliographie --- .../Futur_http.md" | 126 ++++++++---------- 1 file changed, 55 insertions(+), 71 deletions(-) rename "R\303\251seaux/Future_d'http.md" => "R\303\251seaux/Futur_http.md" (77%) diff --git "a/R\303\251seaux/Future_d'http.md" "b/R\303\251seaux/Futur_http.md" similarity index 77% rename from "R\303\251seaux/Future_d'http.md" rename to "R\303\251seaux/Futur_http.md" index ab8fdcf..9bbde7b 100644 --- "a/R\303\251seaux/Future_d'http.md" +++ "b/R\303\251seaux/Futur_http.md" @@ -1,17 +1,17 @@ [Accueil Wiki](https://epheclln.github.io/Wiki-TI/) # L’avenir de HTTP -## Définition +## Définition [^1]** L’Hypertext Transfer Protocol, généralement abrégé HTTP, littéralement « protocole de transfert hypertexte », est un protocole de communication client-serveur développé pour le web. Le protocole HTTP est devenu un standard de l’IETF en 1997. -## Evolution des versions du protocole HTTP +## Evolution des versions du protocole HTTP [^2] Plusieurs versions de ce protocole se sont succédées depuis l’origine : HTTP/0.9, HTTP/1.0, HTTP/1.1 et HTTP/2. Les versions successives du protocole vont progressivement corriger les problèmes des versions précédentes -## HTTP/2 +## HTTP/2 [^3]** La version HTTP/2 est toujours la version majoritaire actuellement. Par rapport à ses prédécesseurs, elle a introduit le concept de multiplexage de plusieurs transactions HTTP dans une seule connexion TCP. @@ -23,7 +23,7 @@ De plus, les pages web reprennent des contenus de plus en plus lourds (vidéos 4 C’est dans ce contexte que HTTP/3 a été démarré pour aider à améliorer les performances du web. -## Vers l’avenir de HTTP +## Vers l’avenir de HTTP [^4]** Sans disposer de boule de cristal, on peut raisonnablement penser que l’avenir de HTTP va se baser sur plusieurs normes qui correspondent à des avancées majeures depuis la première version de HTTP. Il s’agit des normes suivantes : @@ -36,7 +36,7 @@ Il s’agit des normes suivantes : Ces différentes normes seront détaillées ci-dessus -## HTTP/3 +## HTTP/3 [^3] [^5] [^6] [^7] [^8] [^9]** Un certain nombre de différences importantes existent entre HTTP/2 et HTTP/3. @@ -89,7 +89,7 @@ QUIC offre un support au multiplexage, de sorte que différents flux HTTP peuven Ainsi, l’état de congestion est partagé. Les flux QUIC sont transmis indépendamment et, dans la plupart des cas, la perte de paquets affectant un flux n’affecte pas les autres. -### Quels problèmes HTTP/3 pourrait-il poser ? +### Quels problèmes HTTP/3 pourrait-il poser ? [^7] De nombreux critiques indiquent que HTTP/3 arrive trop tôt après le protocole HTTP/2. Les problèmes suivants sont souvent cités. @@ -119,7 +119,7 @@ TCP est le protocole courant depuis des années, alors que UDP ne l’est pas, d Par conséquent, il y a beaucoup plus de charge/besoins CPU avec QUIC : selon certaines estimations, deux fois plus qu’avec HTTP/2. -### Usage de HTTP/3 +### Usage de HTTP/3 [^10] [^11]** Les motivations pour introduire le nouveau protocole sont donc nombreux : - Amélioration de performances @@ -140,7 +140,7 @@ Et de nombreux sites l’utilisent déjà comme google (évidement) mais aussi Y -## HTTPS +## HTTPS [^12]** L'HyperText Transfer Protocol Secure HTTPS signifie « protocole de transfert hypertextuel sécurisé ») est la combinaison du HTTP avec une couche de chiffrement comme SSL ou TLS. @@ -161,7 +161,7 @@ En bref : serveur et client se sont reconnus, ont choisi une manière de chiffre HTTP/3 n'existe pas dans une version non sécurisée ou non chiffrée. -## HSTS +## HSTS [^13] [^14]** Une autre avancée pour sécuriser un site web est d’utiliser le HSTS « HTTP Strict Transport Security ». @@ -173,7 +173,7 @@ Le HSTS force les navigateurs et les applications à utiliser — si cela est po Facebook, Google, Gmail, Twitter et PayPal ne sont que quelques-uns des grands réseaux sociaux et portails de paiement à déployer une politique de sécurité HSTS aujourd’hui. -## HTTPA +## HTTPA [^15] [^16] [^17]** Cette nouvelle avancée est beaucoup moins aboutie. Elle permet d’ajouter à HTTPS qui sécurise le transport des données un protocole pour garantir également leur protection lors du traitement en protégeant le calcul en cours d'exécution. @@ -197,66 +197,50 @@ ils ont répondu : « Nous avons des discussions en cours qui doivent être exam ## Bibliographie -[^1] [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... - -### HTTP/3 -[^1] https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP/3 - - -[^1] https://en.wikipedia.org/wiki/HTTP/3 - - -[^1] https://blog.cloudflare.com/fr-fr/http-3-from-root-to-tip-fr-fr/ - - -[^1] https://www.silicon.fr/http3-protocole-262163.html - - -[^1] https://kinsta.com/fr/blog/http3/#http3-coming - - -[^1] https://www.kadiska.com/fr/blog-protocole-http-3-lavenir-pour-une-meilleure-performance-web/ - - -[^1] https://www.phonandroid.com/http-3-tout-savoir-sur-le-nouveau-protocole-qui-va-accelerer-le-web.html - - -[^1] https://www.csoonline.com/article/3564253/6-ways-http-3-benefits-security-and-7-serious-concerns.html - - -[^1] https://www.ionos.com/digitalguide/hosting/technical-matters/http3-explained/ - - -[^1] https://www.f5.com/company/blog/http3-will-bring-significant-changes-and-challenges - - -[^1] https://azurplus.fr/comment-http-3-et-quic-accelereront-votre-navigation-web/ - - -[^1] https://www.fasterize.com/fr/blog/protocole-http3/ - - -[^1] https://blog.ilearned.eu/http3.html - - -[^1] https://blog.cloudflare.com/fr-fr/http3-the-past-present-and-future-fr-fr/ - - -[^1] https://stringfixer.com/fr/HTTP_3 - - -[^1] https://w3techs.com/technologies/details/ce-http3 - - -[^1] https://caniuse.com/http3 - - - -### HTTPS -[^1] https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure - - -[^1] https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure#HTTPS - - - -### HSTS -[^1] https://www.globalsign.com/fr/blog/qu-est-ce-que-le-hsts-comment-le-mettre-en-uvre - - -[^1] https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security - - - -### HTTPA -[^1] https://www.silicon.fr/httpa-attestation-integrite-tls-418933.html - - test -[^1] https://blog.desdelinux.net/en/Http-a-protocol-for-web-services-in-trusted-environments/ - - -* https://arxiv-org.translate.goog/abs/2205.01052?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=sc - - -* https://securite.developpez.com/actu/328186/Vous-avez-entendu-parler-de-HTTPS-Decouvrez-maintenant-HTTPA-des-services-Web-dans-des-environnements-de-confiance-avec-Intel-SGX-un-outil-qui-fournit-le-chiffrement-en-memoire/ - - +[^1]: "Hypertext Transfer Protocol", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP/3 (consulté le 01/06/2022) + ** Avis de la source : fiable pour la définition +[^2]: "HTTP/3" : le passé, le présent et l'avenir, https://blog.cloudflare.com/fr-fr/http3-the-past-present-and-future-fr-fr/ (consulté le 01/06/2022) + ** Avis de la source : document ancien mais qui explique la l’évolution du protocole + +[^3]: "Qu’est-ce que HTTP/3 – Informations sur le nouveau protocole UDP rapide ?", kinsta.com, +https://kinsta.com/fr/blog/http3/#http3-coming, (consulté le 04/06/2022) + ** Avis de la source : résumé de la différence UDP-TCP + +[^4]: "HTTP/3 : Des origines à nos jours", blog.cloudflare.com, https://blog.cloudflare.com/fr-fr/http-3-from-root-to-tip-fr-fr/ (consulté le 01/06/2022) + ** Avis de la source : présentation de l’importance des normes + +[^5]: "HTTP/3", en.wikipedia.org, https://en.wikipedia.org/wiki/HTTP/3 (consulté le 01/06/2022) + ** Avis de la source : Bon résumé + +[^6]: "HTTP/3 : le protocole origine Google est dans les starting-blocks", silicon.fr, https://www.silicon.fr/http3-protocole-262163.html, (consulté le 02/05/2022) + ** Avis de la source : comparaison HTTP/2 vs HTTP3 + +[^7]: "HTTP/3: the next Hypertext Transfer Protocol explained simply", ionos.com ,https://www.ionos.com/digitalguide/hosting/technical-matters/http3-explained/ (consulté le 04/06/2022) + ** Avis de la source : document qui date de 2 ans mais qui résume bien HTTP/3 + +[^8]: "HTTP/3", http3-explained.haxx.se, https://http3-explained.haxx.se/fr/h3, (consulté le 31/05/2022) + ** Avis de la source : très complet et très clair source principale de la partie HTTP/3 +[^9]: "Qu’est-ce que le protocole HTTP/3, et ce qu’il change par rapport à HTTP/1 et HTTP/2", fasterize.com, https://www.fasterize.com/fr/blog/protocole-http3/ (consulté le 31/05/2022) + ** Avis de la source : information sur QUIC + +[^10]: Can I use , caniuse.com, https://caniuse.com/http3, (consulté le 02/06/2022) + ** Avis de la source : très bonne source d’information pour les compatibilités browser protocole +[^11]: Usage statistics of HTTP/3 for websites, w3techs.com, https://w3techs.com/technologies/details/ce-http3 (consulté le 02/06/2022) + ** Avis de la source : très bonne source d’information actualisé +[^12]: "HyperText Transfer Protocol Secure", fr.wikipedia.org, https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure, (consulté le 1/06/2022) + ** Avis de la source : très complet et source la plus importante pour la partie HTTPS +[^13]: "Qu’est-ce que le HSTS et comment le met-on en œuvre ?", globalsign.com, https://www.globalsign.com/fr/blog/qu-est-ce-que-le-hsts-comment-le-mettre-en-uvre +[^14]: "HTTP Strict Transport Security", wikipedia.org , https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security, (consulté le 2/06/2022) + ** Avis de la source : résumé vulgarisé + +[^15]: "HTTPA : vers une attestation d’intégrité sur TLS ?", silicon.fr,https://www.silicon.fr/httpa-attestation-integrite-tls-418933.html, (consulté le 2/06/2022) + ** Avis de la source : description technique de HTTPA + +[^16]: HTTPA, a protocol for web services in trusted environments, blog.desdelinux.net/, https://blog.desdelinux.net/en/Http-a-protocol-for-web-services-in-trusted-environments/ (consulté le 2/06/2022) + ** Avis de la source : bonne entrée en matière + +[^17]: "Vous avez entendu parler de HTTPS. Découvrez maintenant HTTPA : des services Web dans des environnements de confiance", securite.developpez.com, https://securite.developpez.com/actu/328186/Vous-avez-entendu-parler-de-HTTPS-Decouvrez-maintenant-HTTPA-des-services-Web-dans-des-environnements-de-confiance-avec-Intel-SGX-un-outil-qui-fournit-le-chiffrement-en-memoire/ (consulté le 2/06/2022) + ** Avis de la source : très bonne source + From 2d828a580f653d75d3b21213f4b19f036b87b347 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Mon, 13 Jun 2022 16:35:26 +0200 Subject: [PATCH 168/241] Update POP.md --- "R\303\251seaux/POP.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 58ce7c1..5006e24 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -8,17 +8,17 @@ parent: Réseaux ## qu'est ce que POP [1] [2] -Le protocole POP (Post Office Protocol) est un protocole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on ne pourra les lires via un client de messagerie telle qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus sur le serveur. +Le protocole POP (Post Office Protocol) est un protocole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on pourra les lires via un client de messagerie telle qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus dans le serveur. Le gros point négatif de POP vient de là. Après avoir consulté ses mails sur une machine, il est alors impossible pour l'utilisateur de consulter ce même mail sur une autre machine. Il est est possible de conserver ses mails sur le serveur POP, mais pendant une durée limitée qui doit être configuré sur le client mail de l'utilisateur. -Le protocole Imap, son concurrant, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. +Le protocole Imap, son concurrent, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite aux lettres lorsque nous y accédons et empêche alors toute autre connexion. -## conversation POP [9] +## Conversation POP [9] ![](https://github.com/WassimBouhdid/Wiki-TI/blob/main/Assets/Images/conversation%20POP3.PNG) @@ -33,14 +33,14 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ## Ou est-il utilisé ? -Tous les clients mails peuvent être paramètrés afin d'utiliser POP +Tous les clients mails peuvent être paramétrés afin d'utiliser POP ## Qu'elle est le futur du protocole POP [5] POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. Cependant, son développement n'a pas progressé depuis 2003. -De l'autre côté, son concurent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourd'hui. +De l'autre côté, son concurrent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourd'hui. ## L'avantage du protocole POP [3][4] @@ -55,7 +55,7 @@ De l'autre côté, son concurent IMAP publie sa dernière version, la version 4, ## sécurisation du protocole POP [10] -La sécurisation du protocole POP, peut-être fais de deux manière +La sécurisation du protocole POP, peut-être faites de deux manière différente. Premièrement, on peut sécuriser les échanges au niveau du protocole grâce From 98956949d5560021c35fd27e58fafe8e74bd615f Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Mon, 13 Jun 2022 16:39:49 +0200 Subject: [PATCH 169/241] Update POP.md --- "R\303\251seaux/POP.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 5006e24..1ac11d4 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -8,15 +8,15 @@ parent: Réseaux ## qu'est ce que POP [1] [2] -Le protocole POP (Post Office Protocol) est un protocole beaucoup utiliser dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveurs vers notre ordinateur sur lequelles on pourra les lires via un client de messagerie telle qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus dans le serveur. +Le protocol POP (Post Office Protocol) est un protocole frotement utilisé dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveur vers notre ordinateur sur lequels on pourra les lire via un client de messagerie tel qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus sur le serveur. Le gros point négatif de POP vient de là. Après avoir consulté ses mails sur une machine, il est alors impossible pour l'utilisateur de consulter ce même mail sur une autre machine. -Il est est possible de conserver ses mails sur le serveur POP, mais pendant une durée limitée qui doit être configuré sur le client mail de l'utilisateur. +Il est possible de conserver ses mails sur le serveur POP, mais pendant une durée limitée qui doit être configuré sur le client mail de l'utilisateur. -Le protocole Imap, son concurrent, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet au utilisateur de consulter leurs emails sur n'importe quelle autre machine. +Le protocole Imap, son concurrent, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet à l'utilisateur de consulter leurs emails sur n'importe quelle autre machine. -Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite aux lettres lorsque nous y accédons et empêche alors toute autre connexion. +Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite aux lettres lorsque nous y accédons et empêche alors toutes autres connexions. ## Conversation POP [9] From 89f97297090a21f88f437148db2d98f5631a6126 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Mon, 13 Jun 2022 16:45:53 +0200 Subject: [PATCH 170/241] Update POP.md --- "R\303\251seaux/POP.md" | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 1ac11d4..e424c5b 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -25,49 +25,49 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d ### Le protocole POP gère les commandes suivantes [5] : * LIST : donne le nombre de courriers présents sur le serveur avec leur numéro. -* RETR [numéro] : récupère le courrier numéro en attente sur votre serveur. -* DELE [numéro] : détruit le courrier numéro. +* RETR [x] : récupère le courrier numéro en attente sur votre serveur. +* DELE [x] : détruit le courrier numéro. * NOOP : vérifie la connexion. * LAST : récupère le dernier message arrivé sur le serveur. * QUIT : quitte la session et en autorise une autre. -## Ou est-il utilisé ? +## Oú est-il utilisé ? -Tous les clients mails peuvent être paramétrés afin d'utiliser POP +Tout les clients mails peuvent être paramétrés afin d'utiliser POP. -## Qu'elle est le futur du protocole POP [5] +## Quel est le futur du protocole POP [5] POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. Cependant, son développement n'a pas progressé depuis 2003. -De l'autre côté, son concurrent IMAP publie sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncer jusqu'à aujourd'hui. +De l'autre côté, son concurrent IMAP a publié sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncée jusqu'à aujourd'hui. -## L'avantage du protocole POP [3][4] +## L'avantages du protocole POP [3][4] -* POP est plus simple à utilisé, plus simple à configurer et efficace +* POP est plus simple à utiliser, plus simple à configurer et efficace * Permet la gestion de ses emails en local ce qui facilite et augmente la vitesse de recherche et de tri. * Il nécessite une quantité minimale de ressources afin de fonctionner. -## Désaventage du protocole POP [3][4] +## Désavantages du protocole POP [3][4] * Nécessite une connexion constante à internet. * Oblige l'utilisateur à sauvegarder ses mails afin de ne pas les perdre en cas de problème. -## sécurisation du protocole POP [10] +## Sécurisation du protocole POP [10] -La sécurisation du protocole POP, peut-être faites de deux manière -différente. +La sécurisation du protocole POP, peut-être faites de deux manière s +différentes. Premièrement, on peut sécuriser les échanges au niveau du protocole grâce à un certificat SSL ou TLS. Cette technique permet aux serveurs et aux clients de s'authentifier mutuellement. Les échanges de messages peuvent -alors être chiffré. +alors être chiffrés. Ensuite, il est possible d'ajouter une couche de sécurité PGP et S/MIME. Ces 2 outils sécurisent le dialogue entre les utilisateurs de la messagerie électronique et sur des échanges de bout en bout. Pour garder l'intégrité et la confidentialité des échanges PGP et S/MIME -fonctionne à l'aide d'un mécanisme de signature numérique et de +fonctionnent à l'aide d'un mécanisme de signature numérique et de chiffrement. ## Source From 497b532d63e58f2011d6fb3ff0bbed70a743b3c3 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Mon, 13 Jun 2022 16:46:15 +0200 Subject: [PATCH 171/241] Update POP.md --- "R\303\251seaux/POP.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index e424c5b..2ac767b 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -6,7 +6,7 @@ parent: Réseaux # POP -## qu'est ce que POP [1] [2] +## Qu'est ce que POP [1] [2] Le protocol POP (Post Office Protocol) est un protocole frotement utilisé dans le monde du mail. Il permet de télécharger nos mails se situant sur un serveur vers notre ordinateur sur lequels on pourra les lire via un client de messagerie tel qu'Outlook, Thunderbird, Gmail, etc. Après avoir téléchargé un mail avec POP, celui-ci ne se trouvera plus sur le serveur. From fe92f74f5de59ff795b955ef0cd398efc73fbe5f Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Mon, 13 Jun 2022 17:19:38 +0200 Subject: [PATCH 172/241] Update conversation POP3.PNG --- Assets/Images/conversation POP3.PNG | Bin 71000 -> 71674 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Assets/Images/conversation POP3.PNG b/Assets/Images/conversation POP3.PNG index ae3b5fe9b63d9b9674d06e78e3d856dab4d50e5e..2ec296892e6b76195bb0a0a60cafdcf2f332edd6 100644 GIT binary patch literal 71674 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�Io(8jK9=G6%TpIDeGn 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 v*m6PUcnH?D&ArSMbo0HMWSkve_J|Ss+th` From 85ad05e8c5e63db4d361be45f128517f04b176c5 Mon Sep 17 00:00:00 2001 From: WassimBouhdid Date: Mon, 13 Jun 2022 17:23:36 +0200 Subject: [PATCH 173/241] Update conversation POP3.PNG --- Assets/Images/conversation POP3.PNG | Bin 71674 -> 70437 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Assets/Images/conversation POP3.PNG b/Assets/Images/conversation POP3.PNG index 2ec296892e6b76195bb0a0a60cafdcf2f332edd6..19f8d90d90189198cf96a2273d0a68044804bee3 100644 GIT binary patch literal 70437 zcmce8cU;rg_r8$=Dk54dAX96Vwg`w2h62G!Eh0`f0gbY!$P5s0p)%rPPX{Oh0Sp9? zk*Gja0s+~3Ndkl&2!xURZURdclVlY#&Mz-FL2QM8hpS@%5c{OysC{ zbNkC=Yu&wEGXJthDyzW8EVz3ED0M!de~y32hfX zZI>U6ECV+aAiro|*rqM~+pTNbx4TxYett*6<6?Q`gJ+E5t>IhUPZiy&%r)LpSk*jz z_*3Pz^yfv>49R_0-UT@07jRFcktLHKb(0l?YsG>gG%s(xu-CibCbjD;5n}J`YI}FV zcN?N(y%fR!j-pA=8U2Z`)<_9Fmzxd#bf>((K*(YFww>U4_F=Zd)sArek@s;PV@IF1 z(%`;9*Ubtk?-fPe77)_910pd*<*XMf5#Y}%4deAu4T;Kyrk6|l0=$&&)$$xfaVuK<5qC+z0? zgO(WBrzjZJuYsC*D;;z1-o0PpQa*8Fdk)x0)vhv#J$yzXLbj$Z*j7xj5yr@V=+Ak? z7j_8n=OF1p*(%!wr7VpU$mV!!JA(QJq^;f#Wwh<8G`+{EA{F5_gJsI0U)Bxbt{cKx zcR&tntC3V~!0jq}rD~@#Y+*qEiI;c3YYWe=|36!In96K0b&g(`o7Ne>A0zQhZp~Hj zW+3S*V6S!?f~T)lzJNguA%0un?Bm(`@`)(Ex@ehT$j4c0OR)G|`^Y)`aXbDm8-0eS zYE!GOy%=XFjU0c}D>lM_T~4trHDfmsPtV?PCaGH>U@YV zi!k6WqJguB+F82me!;lkX$nN0$#q_>m`D;VzNE#MPJ(XkQLQpU@Hsa>EWBum-ulA! zI(QyS`(5A+^!=$kbs^^HW`&Hh$<gS&3dPt`CE zPj=va1|2aFbZBT_w2o8>B*+Y+0558C>_=uztu@Db6o3O3l~PlxYp+K#1No=`j$~S4dIHg z*&6g?5Lm`H`E4&3^weTvoC$gDg&E2+C&~15Y}MXOJj=(P)F5-EvgLEgZQ|~g_TOW! zS~CqzO>a0@M5vx3ZpkbrKwJIyTCtefiuAcW^kvLeC^17Es;Z%CRSk(U4Cgxm4o7cY zfc?+Vu35NA@Br^WV*h(MTZydU7AM@pYmfnh_smswD`JuCD0S+4Mf#0GA=9vR5k%BW zR+ceqD5`a{|3pxbE}WFO823+@ZiL>$Z5u>#j?A{dN2y)N1+v!Mknh9obpri4EStwL zUpLZjA1l&)U-fgQbi_p3E}S$&TG?u@BB=7*Tj%IGPYGrJOi@ed9*_%S+%F0I%>MIQ z;69Sb`koj^4WH8XZT4>dOkLGXEoMrUg5X}QPF zcdawaMv%&2bA#Kl^DI@8t?EMEgp8FYML!)VhJCv)v{PKHj0=m#9| ztK&$14|4d;O0Q##3qQxm6|S8OazTIpaE`0VEs^Jq(iTBSLyV`}qSRfQqWCSgDp@;j zt&H}=dl8>|vjma#bCl=C1>^4Yg+7Hd9oW9gh`i~{Ga{n*D=rXraiVMv!~*XT%3N2JA&-lwpl|m&>RtgLE)Lq}hmF(A+ux#2I3#E`x z`i2*1b-Xt}y%f!Q&j}yxR|&G+RmJo2*dCmqBy*~^qdoJwuIWbJsO91=c&pD6{e84P zY#ik6pCU%Q)+`KVvWlNXAVz4(u|yIUrbx*+gutbiIF;m022o5SODs#=qc0U^MtC~- zYYsz{&ZK6GY9pDNT_7kBi$86A;Fsrk;3;3+`JcI$;tviW`WhI#hoc-0{Bhj};mJb* zxL{@FL;B?eVcKm;s?O5TPP6?Hez`?6j}(qt6Z~-qjnK37gJ&~CnXZNDUrZQiCq^n*#rVXO|Dd+ zj)u;(_YkGmpF>d6(&XrwA`TKtWW3M2`SybSSG{R29)?#ZzdkSn^0#8Z@hIU$!$58{ zwB$xZOHMR&0nv~jHuL)PH|J?-TCrFWH6g0j7UW_SNn`rM0XqIfrxj~(@|heq(`Prn zLwVA!qIIq@RUrLC8UN*xPCV>RWZfsVc7C(XwgQj2zq4%AeR$@?drs6{Rm^JIo9`W~ z*lE7sPQFvwiZxq)szT9?QXSQd5FfKxuW^Yr@$ebR!sr$Fy^@YBR$mT3>3DMae+VEp zgb81P#p~UXsmIfxoK%ti=6e$S3L=lr+KVWP9qcp z7=H@pYxl?GE86yB=tGHJdmL6JVB z%U>y-IP;v@YaGF#xiSq^ag&JY`iYi8hDQdZSMOSu;HI|~htQqp1ifYggJepl#HC_3 zM(fC=@R?bze4^WU1E*camLeCNUK$ncTK`-fu@F@-e{X1Rv{T*6W1(M?e#2Q)g4Abk zF=WESXSBZh;=;}jsGz7q`PjTnMJB1B(w80ry_)7G+|qc${8EWs@4=bS+WpAf+S5E$ zdp0eL$_N)T@u=Tk@&mY^)F>_J#zY{jTJE1xa!f6rE#5b`&web6bY1Hk zhxPT&)6Ut$`%QSt)%OqNJ?gWt-E)!}XtX}5_@HBV> zG=IVSHHcx^m7WvnS?a5g^Gs@-;gKigM8O08UT#DUO%Y|g$7J($o{MlFsQC$kqGT8n zF*96`up$ZxMd_mkSeEj|!%UDCa`@YBrb5u<#X@4`x7sA=HBM2a-`3U9oiBGpSj`3V zlVn(w5=;4#zJd-rg4V5eEMG%GCkL9zPHI`|H3pDPO(!m(3ns$kUJK61WQvTwEG;?+ zJxNw-=WjD!K3Rjf)b;p)-FA2q9OYX)->pb*rGp%eEAj86oT8HioMSs#($i6$%*5$1 z_AHEuR=~S@F5bEI?=LA@J^*-NM@xV+&X5p{fm=HjBD@Y3T^i0}cJO+tp_5geRoo)m zoU1H~UT^9|Cir%nQ=ZbDRoTAXEn%hbkpjaFxf4$tnBs*iq2$|WV;AoNqQdeu4}yYl6N*J!>=`WaC;2bL z(sU|SS_4qS`K^_ilFkDq7`afCrnLUtgpb?A5&bBggn8EikF#y5+eaH#9UNS36j%3Z z;^q+3P;7mj_cmdk(%;4MyTgc;sRAP^LRynq1*5E>w(u+Kdl)ZuhYiX0PFwd@7+_Sf zWc=HrnUDGtI%I+!@4p{d>o?s}M(C3Y+LX2w(Qr{%>uDiqnmVF8|Jkwmk6N0M27{YU?JYdofPzf}Tq#~h(bm415h(S2BG zm))57U9O!wkfdpa{I^i}P%#WX@t5`uHTq3=i>6EXZAUZ>B3@%#<; zi+3r0zp_;aYW93ZO+%x?hOii!>7q+oGtuIv^Hb4jB%C$MPRffFz?{AIgrYDa4n>tD z(8+789mU+Gk!R0|yc=u;)JtqSUIL#cHrCtfZ&R|@I=sN;y{6UpovCn*(TT#}3tYzF zF@=P|y(5p4n-Lq#e1o>;f9k;HUiC>xg?O%zVx>(tHt~cnp+9o5Giko?%!XJLjOxOu zpFl^3#mE(Q?j2=cqnXb4G&aT>cBna&%#GOucW$zfl>QyHfLmDS->K3W1g~NQ2}!6` zzj*ETg8P)XZ5yPeppkI=`?f37DsEGbvF(QXzD1jibZXN-m|mto!AKd%CQ+kt+t%$_ z3Eb}=)tEL2k$MCV;NYdWTqn|e=R!~=nPr(X5+gBn{GQHy##f?Sd z4cqAx`Ws^AJW6awyj)3UcqD1Jmk){LXQwf)IPJ-HAr;x^XTAjyIhr~h+t`_o5wM)n z&5$+S`1S3w=}Cr$azNWFTwQ>`9=T;mA%GgGiKvpfjLIFHdH~JmJFAJHbo!5Gd6TDw z3NzUa{+f)5Q}h|Eb4=ob{pHXx31ws zW#$|C!O6H6*`eInF;&E@x}hJ1kD+II_vH=^8X_LsN3hmJ{>8@hx18qWpJmt-P@R(F z_csnhkc$X2VEngtky>it__ds;qexXV&AN^}9aAYxwx6$Yu!VS&4GuQ_is{^$Prh8- zdxbqkqg8e$OeCofJSJ8qR=(;CeXTH)$$sd^{)om}(4o6tS(z6IR`O>rtaJH&BsKux z(3Gu!<2czE!MO~d2{BqV&-Xf^i~!v(Tx?+XU%4u zpobOzj(H()ampT~JiP{surrIi+H-qd!F;UnGCU*~c6a@*57L|EvngWmt_}^CrXf&e zM`x?q6GY_wKT43CC3$L|3rUJWgPoh4tbCdB^z*H8u=#>;isYIT*Ukpi3H#ZyU3ePvd=7z zknM(Rzngt>Yy?G&YV1%OVtF-G350@NjYr@#77*C^2uaF^E&8!aA{tf{ctKg{=qola zmR8`9_9-cpx5ZoUO65l>m#`+l#;yUJXA)=Wt7{ zOOs_7MNq3Nl+5&)(ALzw2dpeqAF#YhRWaG3Nns*MM87?&vs2g4W>ekBnucOnwTx`h ztgy(&PofUs9s;&2CGZt4Fc31G79y=WZWozG)GOjtB%~?y(sO=Wkig(;^T0yy1I~f* zVYXKmxBbfEyD^7sUV1mOob0mvB6mib^}yFsHVyJlewclx*(H%(oWtetv>PMDTp%fB zS`o`IHz?LTlhPMyQ5Ei@kYv~Z1H9VzeeU&D-jT*jAoGGxNhjV8nm!!X-S>z%a6^>K zl)F2E|BBE3e9gbDo)H2)H$>pS+Jf_J!mf&uz!zcybQmpcL2bR?}=jTqI3 zd|T{+jyjcW`vY>5AOJ3ggcU2{U}3qv$mt&63Q!DRv0iX=B(^f@Wo+iOg_SOphlyw6 zeddNP`*srY;oE2g^;oAvSeM?S8lR#;ahI??ndgy~5h;9ePvQZ!9K$90mSb&d0$yBUX#Z>jWjxHcyCE+)&K@Hj}KWsfE4k)kO4LVC zw&8R82B&t`V)G*+>pdteo2rqdrnczd%13#PmkPYwnp|hjm7v}KaDdpe{-}y zC-(2CLe{d4_Is`?e7{I+_JhXooKvk1o!-jyimG-^t1Bs*s-CThy&5^x_U$ycnNR7_ zKTE;fI@E%O%OYSxt|d~lZ{}5~j~rO)HT*+}q?F4U-ee=qG>Ohe=M9lP<>WJHO%BSK zKF;HzSF4cjj9~=egiTc}=SqLuu=tXG$@_4G0iMJLlY zqmWh$_q(PCS+XHF*pV%;h}x&94JqKwgQ6cq!{wRQJF*xTyg%}+50hS-faFiSOG|`) z5YC!vbS93>za$jcNvDkcUUeuhzNY1BHF)QdP&?zs9~c3|zKC2*(RL&&oR3F`attB< zlr1vuH3VrD#T(XH35gnh$dKrCFhz*>Zm=v-NS_W^V1+jh;Xi^?cxyNr?AUVkB7Wk7 zY$crxOO$mia(VQayuEHc;A+KIm#f}^nck$VN z^!oxonlD7taxuW*Wu-q1Tx;^@RXfMX_#_%q!2dm&yA)$y_$R=KQ4M(PE@CQV^G%T8 z>T;9$Koz-s0LBD(j1#C`TbQH?`vg%q2weHzH5ja)=AGfJm5A`^&4@dxyQ;EAQ{rH7Pv` z6Mg(%k;Amda2D_Gh?;$d8ibpUg7ozl5x>0l33zyRvVz}xzuouhz$SXm%?3@r^z765 zQBX)IHp4UzH&eP;dg};PNp^7AL=bB^{{qv3-txR`52#BfbC~o_?0jVm=ZiC#=dRK6F`-K_l0)z_}F>3oj*JF z=7AyOcdmu8!GK#M?1RG}AhLjHqI?MGl!GlF1r+zK05dI0d<(n>Q=k2}nyi(?8zoKE3T5*mQOPPNdLIoH7JIV)HgLD_q zYhD1P7r$fyspB+!fxH-%$5WaZ-ew>E)emoXau#!O>>LQfYi#k&#M){an6T8iu%8c|JLJp|tfr ziZyto;$@AQh7v3*H$>rXVShh+p zEV&^{L~IXyYd-)Ai!7(k<%Qb6gWUkO=)`(sgqCmNv>1;3hi_Hntb}5t16KcoBP3D0 z!S2J@Z(5C+eb#s)buCT{ancuK#JS6jp{gDIxNRDM^5sfkU4LLuhGJQZOhB6|1gIrk zp*aa7Hw+PJ>3;AmwkE#drjYxP^l3O_E#3`1^DF)MTT$r)9e3W!Sfl4=TwUHt48~qM zO4r9}eX=vM7N7Yzbj{SU_UMK|0_+DZbp1Mm$_GI2PRCm9=5x5bJGZ>Z0An`Lfj`V4 z+qg-zDHw<-Uqx3ln|eV}ZyN%$;b2wvPGtF9=BUDjiL~=$$@SRu2yeq>$_oKTk;B@6xc}<hlIt^N*GSNeg4Ke0jGe=K?<;b^h{wM- zRFxFS!*5b*WZxC6P+}y8&2NGqUyP*72rhd{1)Ni`Gf@aL9){Vp0_#S>r%`rCA2Q3$ zwlW4vc@!k|A$*q1=1N&qbwIZ7sY$r^ZGtu8Nk9!{TUAN39;s865?wXsY7;#s5#(Cf z_-$Yt$X>Mjte`!M_CRT#{=~M48gzu%o|*hU+r$M2TCr49!F9e6p}t8=vU|#sdQtx#kn( z(Uz~=HCG(dA?z+87D3~@en9)}+YjDR<&5d=W6rG5g0VCUD3USsi25t!zm>P5HM) zYPp5^a^Qdc_`cB!3l+N7SfFd=v~Zd^)Dwfmx(3AS=JSgp2~ynEEV@(nk&QXtD8~9Y z>;u-#A#M?M#crsF4lk1cxha37Y%s30=C0nLPlR|u+Jo3);mX3R2YI}n&x4i z4uBH?vhs{})!*GyuT*fnryA3i3^&XBnXY>=4c};9h#hT4O~_!jW7R0`WX6iC}14I|mydhx;%@3?w zk!?b!Suj_Ja#;<$>{k-o#x$F+F2KJ~mK1(w=KLe=uf%b|l$Aem(>iC7bpdXr zjPHT)MVrVq9RUzw9%WY5bt~3h(ia;G6-9 z2(vO@?6pIxXghil>UM^!UL@l`S|(NTWQ%SysQD^O*E z1TXcMi(i$<_-3K;d?B&@?0#9)MJd$$xY_$^dBdw^tIoLp<+1#h7DP|4E*GCzLZRl& zlP8wqX?ICyaUH3jrsUVFX4%kOq^X+{Tf*8d(%L|)VKyKL>-!K}RqHyft#*qmI**z; zq)bocUGR-#cVN#Mo?t{h0#!*zt8=E(f?sXr$Mzclw(pufxL$(^bDwxdQt+FOBmq3o zT7FCqoy(_UthADg4;WO&4Ia)I{hYeR`;b)t>EE@nMrH~wGA*Hxyx8<9=F?Ph?Z#zu#PI*UtpWVcl>gyVW~_Kc({wo zUE)rKuYKo3(6J?jb0kG;$p>O%KR}nWsUQR%zkp06lcq)lis*lAcH8Ol<#YWv1VUb{g%hiiZW5` z{X}}tNbyWNB0^I_rRqJ@B`mmdP+IXC5m~I3A3dEE-Rm|4`w3|ZU1NdGdkB+Z9~S;Z z?w8JT?}P34uRc2BuAek6)r-0_MJ%=0_aWRk=Sz7 z+xWf7{LOEk#HkKd?L_&9D>_)s(MuCzM=t0xf(+mun5t}QGK^SLB;n#ur8d18U}@}5 zjP2i|%~YiiX^`yXrdNCAds8~DG2*KHt&pMpN+p3kNP!6a%zqzg2-(7G(Gl#a#zkNB5@&jgnjDW;G1wl z$Z0z7O7wED0peeA7JED!&NoSAZQXEi&{IRgxIaI))u zj^}tK5Q1FTIo4K6-ylsIIOSjEVMkyv6D@4EP)%LK@&yuok=yO>{t~8a8A&DUAv-Ev zy_=709CUey{NY0R^wlEk{LuyG{`(e(FF`NDDyrN(t5DR2A+*b5k(v4Cyj}@1`_xAC zK&-;udK0*`W`ZTp(d;|SYms7E6BEIal2JW&r&RVF&qwe$J!%WkoX($O=|BjR&+-#l4)anj*+F-D+NE3u z&@Rmft)z}f*{L_snDA4SK7_yti09TackEM?H6xoIg&WUDSk%b?(WKfhVy@M553#c+3E8OYE2J*Q7c47s9*fd7r5H zqtd-amr>Q|;$6fC9|PK_J?<$U3-P~vYvvD?{&9SWua(0Z>DUrzbB^>MsY+Fdnt)*X-a?xP zdYA?CjW%~bnN`vmSN16!kv;&Q<0Byh$>@dvx@>nu(kW}9CO_w3l6*Pc!f=Q@FO`Kq z9_iYfx9w#H-@MPLlu#sV%+viLir2+krF=mky7BJ9zI&1yqk=O>_xlU{+-aB9`BuPv zrWoGue|{lTNiT1k%Z+iQ%tFF|X>{V6+qZSD;vlGjNrgT#X}y5PDer~Ey+TLvf>_ZiKuZi6RRI2YoI0->O- z2Tn=re%$QFRQ_5QEELq0+~x05^f1IS8T@LZ6*&NWIm?zoN42|rzdP9 z=aL37-KIaA|IYU#TqJm4+HRigTRYjI{fw{8=jtb>)-yjIM(j*kiOR-T{PTeDi&02m z9I5q8p0bo7W<=!uvg^dpk<-!mnGuUmoP{`P&GtW`fO7VIc#nGQqe`i)omIhx7UmDw z5}pTU+D9o` zpg%A-NQz|@CjFG%2dzjVb_1?!KgR+Hw5*MvP45TA_l&jJXGV{j&uY>W1Ui*45R_#D zKdE!WdFDUb<}F zb8g9bpKez0^63q)K--1=_Lo7^#Ca~;Xxa}fPMh}No7u6=nZUr*_;Fc}4z+!%(ZYg5 z1Ovs;cN>+pF!#jkm|j?|@DJSP3v<(Y0mW6Bj;*-L`I`5ri?f(NGp|2bQ@>QAeB6WK6f7e3U^!Ca@8nd za?0C66+h#Nj}mhUJ1O`N?>#_NrZ@*zz$xq{FLb|8Xk|s540WYt`UFl+Sc(C90pAu7 z3@hOQI`hxa&!pLH70WJASSeC1y#3M2mUHvo=}oPSxZV+ott!}X%82}_aU~oY|Kqr; zlIJ_?W;k}NX51U;Ng_!rq}lhUUWT8t-+GRI5!8x<>9Al(jD&86Vx~-@@5FOw!k0#f z{9c_OGt_IeZo7(?Pd1NK%B0A(#FT07>pWiJOzx+}IvS*!iC}#qDoy*H8VQcSm5E<5 zO2|*Swb?r#l{K|4&tN3Ys($SedAk5c8xP$<5GQZ(q%XaGtYy&2Jld~kC}Kof=!&~{ zJFI+I#XzGYf|nRmve}@(XG}DoD(XJC&uqa-?t{DUT*?G7{3-gE-*e8PrR^y&8WfrC zfSqTY>8Q}smwHXN4UWcpN0@p_2Pr04ckufTG&3npMC<5gv@p@Ba%{19T2H~f`@(ND>~kL4m!MV|ui&Nl zMwemK?Mo;7wb{!qwDpGj1ZwW;(Q_)&Dv@tidg+#BrV}A+|7$#54dtle)1;i1Hyf@- zb{)aZhQi441{%|Cy?*CQD&NoDiI<+FI?Z~F8$sN?26LT}ym9UJvG}g-cz(6Q)m0IO=ZGer$YEiMR!DuenLkVkG;WHzwIoHt-seP64%&00zIoR=%NZQ z6mh?ZZk!bnbDx>J((dQaDj(L6$McJ#A9xGKLSWL_y!YCB4KZ)qZzXg-9j3X^&I|qF z>UeH+UDMl)Xzjwq-lgX>=;T9lcBI?zxxz5hpzubx(!^ej!$Rd80j|oJ4ncPP?$M<_ zXVz?o&ctSs9}({$l_6$3(M?2qa|oJb>jpJ$@pgw_@_Ap#<6UtFZmsi6H- zEOMc}w~v}Ny485}O|aS>B-%V~Xe(p9!X9Q4 zL$F#}0#<_Ap-VspA`!MyNq){?S-T4UL-e`oJTeg89$idZ+LW5po9k zLW=IntwFBVybl|7I5UjZ8YzHcAlA@)zM{8U2~!7a8{C;{p`QumkR?L7u_42>(!J3< za;?{i2Xw2$<{?b0hs9@%_@=#Hi2MZoNiU;%cd57Gi_rRRAN_`z`6G9Iv%^P4R$)pO zdbbqx5lcngw~gXiH7IBz{?|f*V-16s`_!dQ2I<&`skbP1J-*H4)jn{92lwFjQ$-Th zZ@k|h@#Ot5GcMQ!CAtc#r5#eyVrQOj2*6(Zp`Xu8;%t3@u6w|ZptLg$)jmI89DSvX z2{Yg^kV=K@-;?nYf?i)JbD6m=%Ind<9lrMIHDM52f`U-=qxp6DWR^o_s4dh9Vj%mq zm16Pkw5v73ks0E7g)ZZQMu}&d66h{y8DwCgr7RI`Prz7Qq&`e{G?T1Kv+>2KoAmPy ziTBL#nPGVR-n02OjIvuiuNK^%-&9q}k7jiGQtOc(kFxPrFP$REYOW_1z$riFdzK6if7dE7X6)obk!A*my(H9n}Vx)-^Jj zvP_Y~<~&xZp|-{2Cs;3SH26Af5N48NEd}{!gJOvyl*k6_pA&CwhgN6et^bm*Xg(Rp z%dd=!8tt3I|%&(icn*u%4Ou2p<8+x zq=W`?d}BwM)$Eh_#J35Hah8_871-!FaaIBN+?f-7(Ko3%NS=6&Om~a{ek;%;3>4l~ z>9NWU9?QFSgxew9^Hs?;qv-~9eRINBhH7vxkbri!3iu#8}n=FxE{`;rWGyIQ80 zpeWO88mhr}xebvoh8@MKH$U*OlG>55W<;{%tmH_0(rF%#^;5sATDrU={b=~o=Ke^0 z_C9D=*_z&Is_5guz}KYcRzL9 zcRKW)#qRDmzqGP*T$$d1u$#J>IKieVQE$xbt3Lp&+mAXYi8;_MWzn-U8xhocmE#Wv8lHuB-He);qZj{6>E zQ#!HXr9<<}|Fa;!aqvd5*;*ibRC9{S*MPF;II3W8`o4>~^g1)e9>0gq*H>d$x{~at zN7|hP-dqC`8lX?fPKV}Pe^L~giPgkwv$g~Wlon!O9z`RJh6loqIJC(@hxG7##xp6FnC&-qH z+7DPeYQ~ki38@q62A9{D&mZ5t=owUDM7vP^2hXHJWTaf>y+)ChSEc8ZCVk83o1Jyk zfkWkfN+Rtz57BRznKq}Xi5>?|SDX!*VCZnDUo`6&`yK-M)7~s6!EJv$HaCm}+R~sG z5EYF>SKW4#zJes(w$g| zyuv&^yWM>0y+HBh`=VEew)1OfXgD;a8zV;YdpGF#Di9N74KcezjU~iY$Nz-^+71sE zQBa}RnQw&QiY9hQE9RMdn$wu?s&)=REH1y_xl<3;7|plT-^tbg)M^sOfe>4OO1i)) z>AuKh3Z?z&pIwq)b#(11t-x=5tJ)bKL2c?R8YvttIW0l=87~v5EEBOX`D)4+?Zez&EQH0bxBB+FpJ_vWI zY*0C;w5QhRz*ZH?%mI4Jn46v`IYWZ4_PRaw0CoLs$2h4>a$evchLmc{s{Nxy92?Z)IVsL( zeMR`#5pEbb5iAP}x9w8~2Ha3}r&RUB%4V8Dpz#k@8tp&VM6$@@?uKPN*bU3Y-6$pl zPj?;%cPut|Dq!#ut=6_H2;%=@vy#qSwVyo?Zt{`~N%%0wf$1)Ft87*F9X?<-=1%2U zSxW`Bdze4st?>0F(d=92!oLWSz2<~0-tHwkcx(0L@6r_6svTZ$HJv$Dc`yZ}#rDU6 z9ka0yVKh{ruhlxEQ6Sh(M+)snNi}>W#>Rn6rN3MH&c{8Ghh3jX0>@7DT1{l&-$OoXqR~mI4bf4FLaqFED8v}NXQMjsq z%@Gmx9;7;>6#x7(si(#E3xNr&jv)ZY=nea~l>!}JYB8<-HM+&*?f$^Pv5C%WTA23y zcs>JfMbIDOUesbsvL9(Hpa@vZ9Q+cLoHE&0c?C=sGJr8Q+G1_q521H;9esV*-ts)T zdaB8dS``n*-q=6;#>V+9?(&_vyN6&-J@xYc7<`lAE%DwWkfS9tw-^Birt9^!k#!tj z=_2JA_UZ2}1&o#TVjIG<1Rpz&`3hJO%x!_u++6&G`;}L={P1h z#PRG2U!MuGuFet%9Zey!=To!QQkR(D|5-64fzN1mok&a} zDT7{y|AXp(1+kzHTe#vjGuC~7*K5v~z!o;ie{DZqp`_|BpG|Zv-frQ*oo%qHY z3u5AmtCY2rt^l$2`-*_3&?z0B^7vJ!5w53~3|#-S-$xs~3Xu(?Mf4NL9$0eGL&sgs z?_880qnSbop`E0rAo&hOLV$sPMFFDZC~ArTR{CH=0;9Ird`K=4DvvK>fB;e4?SI%M02*Su#S*^ zg8CKxZX+lB>@L@Wm#7d*iyE$wE_ok+yRVozXg~{>77`E%LWE1}Xj4xs1V`C}j;6%5 zL7JAS$My({;#pIJtG~`}-#9KFOx!!1M^-@u<8aE#ciz^Dv^?+)Rj*U6DC#Trja%5a zZ}eUSn%s)-GIE>oc$ATFsa)7$lWW7M06oKb6OWaVZ5r!=EjeHxT>FbN+I@PRSLW9JPB*u~ zQ-N$(Xn|!n=3T^XSvYEHpXI{1pA@pI)V91W&f;7vQ8L`yyX_GtlUDth+h>SJEO@sC zNIK_CwaUJED`N#y68AHMvv0-gCj_Ngsp@}HcT5R>Pf2)kB|OpGHq1%%rQxI_CVK2gN=D7n*z?-3HWQ z$Z$~6qlaRiQvA-!>FLcq{5{hAhU{KUcK13B`tTb@LPD=8|qUbbDEY^l$)ZAJ|44L zF_AqCNRM$R%hTY>FZnRI_FvB2nXf&IyHD8vvxalL48L_gvuGmiT*$(?9hjAC7mI1 z&Ape8&S5R;g%a0ix@YV&%^fy#Nc66L={satnD$}5(Q&jd^OyLB7*DuJ(FwRr&f|zk zc*_Mm`7&0+l&4`Ec?#aUFr70|)M=`a@%!Zk#AAPpwCM>NS}lFRC--Ip0-q*pA&_WK z9W1U6QFKl>ZS|&xa1WN;nj-b$I?%ShBno~F3%L`6mON*>XyGm+Pp1u!J${`8`N{C4 z_o1zx^;WUJh*_mVOi`_7zHcj)l`n~pqNW%LfZneZM*FSNt3p1xZLHsD=J3|8erQL;p-js*+=&rp%dQgU7!UetEo3;cU;GXk`kZQ>*s&)uN2!8gHMyTzfQaY=fTJ~b`|GcDu}jTT#zgvOM1P* ze&(DNcLI#aEDbBcjv4o-BkKB^Hkjt@{@zFT^!ydpteAU1M3e#m9i#KM1 z0YWXlwBk`{#fg2Xy$eOdMe+roe#Cl?cHA%TdCCXcP(3dR9As&;H>PtY#)X_y{_1Q0 z7vm`C=V#TC$VzR_wHFDsr{0iTW5)aEm+k)^vT?u1(4K43tgHpiJhDTsM(^gtJ!p-I zclr4qaM1C2IrQk~)n67j`EPZV_N_<p=J)&EAB4U2{pC0GL$wIunRE`XfKlJ$VxZPULzlmp2+u4-PC|&%N zoac?!5wlnG6BXv0@BjVF206a&y7ASMYJR_LS~Nq5&;9Y(4L0=~ee>lDzwGh|j+N7o zR;g_Bn{H30rlH{ESXHtH^V5T!oOkw+YoQN3$EDDWo>^xt5skmBOf;5b0u<)wsb_dj zXgt<%C>Zk_Rf+@yt5_sbS7M_f+&kGDkZ8J`=Vbnkdo=ex#F&>A@O$HkpGLI8XL(h?}dxJIFJugZBE5 zUE8{#M!m6@@1m;%80=|#*`fKJuB~D*;XY?v)NWaO5Y@2hP<>&<)*kl{fIJ_WL9<=W z=zirBL;C(7+wb$`?2oJts0nxqaQ_k-`D|$kS)9?KDtN64d$-p^RRlzyMFxp8l4^-J z%NDuNWnoxU`;fznCwfz&!AU9u!FWZ(+jh8+)=ZMIP3%jD5^*`QCd&&8TE-jb+3f|_ z%Y634a36)RPxIQ+4}WRWF?{2`oJ=Fy(`T`k8aq0OTF9*2(#bqQ>nlqb zE^^`Jc$FeJ-@K^Y4Bvadd^Qnpz51L6%FD+q59vHuG%uhC&#Rn%FE zb4~Y zg*&)s83x5EoejDe9f3Mz{1Ig2@9zHxl`pCi+L#afbZjZ&eKS&FxZjbm!z$J94wG#a zGta86flL<@8?Mz3=?BqkN(VoRZL=4sl+8J>L|or8_%hQ}mXbxeK?!ZVNeWn?B6Q0%h*Ve5lEzwWNduLd>BjtP2kmyBu(OPtA}{)K zTsQ+={_3Of$WiXnd{SFUu)&1NLu-i*scqY9VYsFt;BqJ@iHbjl(;To>Eb%>usvS<~ zx}qVO16Dp-N8QM**z=T8h4~JDWPB(sPrjKP@mPM^4^Nky7((ITonAUX?Ka)03Euyt(ezRl)lN@^ar;g zc6VRy0rB3vJvS?dvTtMvhNVBM%G$I_%C%ahF@3x$`&6Hrh81urDss9p6|BEX9bC)` zW^C^MwxP4b8PqI2>t0Stx7btpLKvzJtr8~GH>zjN8PxoP@+TQ$9;|}M+G?Xd6n0o& z>8H>w+Dc@`qhQqTi%xcg0CWLsmewAu{#Bs+tL*xwXI3)akbrdDUxDM-xH+uW>T?%$ z9c!5W`26ZVS<9UMBe>fyWi2}c`nI?f;Hm`k-^ofTK`o`Rm-{|6r1f)LKohe;K+Sso z`OEivjU~0-yu}?Yu>uvjjova*m2JgjI<;zagiK%R`eIflcUi8g+;%b zQ~WBM1$fpc+=k!J5wGoL#D8lW2XqO3ASJdf=<;W{@@;$7N-+-nxD5fA27j~t8aM)R zF5$*X;+$OZR{doI96+?DN622c-Yj#z}s&aGHVn+F5tZcdZ>$2m40L$iF zJY_(i=|x8>gEE@KE&dx!SibWegi6P}b}K35Q1*Z3>M~7oKMX@Y(^H0^Y5YIT5*jL> z1!GUTgQVqcIbn)B_vEkW1O~LMu)iqft{^F&=TH9|pNY4s6ytP=KK#5<%~#(o-?Xz* zsR5|TPXD=K9e17+sOuHqkvhS#0&Q&WNCJmC09s>bcx$!q#@5VL&w5JMepNKA#6@#RDd%J)S_CAF~VQ`%vMSivaV=PC$;hF7D;s2H2tfdO!Q^l2`=otu+(T zE|0(z&3}%t;IQY;?@D~820vGC|7C~}_*qo@D|f56Hw8Zvx8J=nHiScm4t@RFo$H`VyoTu@$`uM#|Ikg3OvpRV zdCv3P_wU~15c{YgQ?SE1J$LUyL-Z)mEt1UMcP2H268LY=bDq4pd& z4EPT0*9wG|;sN9}ROAla!&#|&?Q+>+YcP)#x4WO%?~jhpZo|N0_}W*C(*xR5b@CiP zIzDKz9ky~uo13q=ZOS+>cqGMPz~oWU)!qmXSK4!{$5rf)0G}mN3+$Bzdfk!Xn!tce z-=TKQy|Mo(^IG^-y`KF(?MOjk!(KQ~H z5G^f@KxwZGbIGxP$X2P2)*A-81nYze2i_z;+Xv~lLp1>4WT5BTEfrhvDH~zq?ACbH z%>hL21;^73QG-ruS;l?nQJ9oR*CtZ4+FAPv^6n$94=3^-6>M&6+|Ux-edwWUbMV1{ zx>!?L1(@Gjk^(%U&Gu3T3eV=pf2ZUP6D2vFOAedhI=0&G_9@vp%f2O6;QEz)suc0!+< zUDVl?LM~-yx-*dj3fE(**h;gYp;~^{e9e<8c7_6X0&cz~Mm)eF_T`4M%foyji1_UG ziyquPQ$t~snBw8z+Ghaz;*OeyZ--Y)-<8oPdPRaXwOtL0rzwqZyv`yge{Qk;U|Z3= z%O)Z=iJa965guZd5!aR4HXSD(Ba9*gP+N z3l)J<%h86l{OJBS$Ft6nZ7GtLZ&4lJWQ2DQ&kFAmbfNa8$7Zs$s$7vl1LoK7Ft9(6N71R=>yi_+ z2+DPP=Op+w^IDbuR;j@Zxt=%$=RLs125!!RX>6= z59k(NpWCtLtvL(Fqr&eOk7#A?niPvo8Kl1bYY6dIkX26cbFB^s+-?C2Sb=LpnUOP5~L*btBb9IxzzWele3+SvT{27NRt`>5FVuF4?Fg@HwNEtm{V=Zz~H}TVP9rY>YO()%l4^EUYWKhR!_8j zG%Xi>I`A@Xw^H+<*-VBTs)P!Xbi^1n;^Atx4Vg(13T@8WMwD9-2v5A0Zs2{bpY;qa z{s{jNN6{_3nsyTy)cVq+PwL3_Sr5CXHpfkRTE#K*bQN*k)A!cVMe$d^c)j7*Q*cH3 zyaIPlYSRc!#)_Z5;CQ(t9g{qrBe?#j`t%ggJzL>T2wsGYoly zQ_b4<+KS=BuZ9`rmcrlL;m(NP={$I=bK5&Nt5zTy{s)GZcX4gB6=EBo zeL}A;5&Y2RUkHr66!#zwl?*!)g&)?sYaKL10Csmzbd^HRr(#{xVFw%53Ivl*6403p zAowDQy)K>Yw4>Moxw5MkYmuQ_Y%2;^uQUtG_rORaH$6amZ`vC2UE>~0bKdl0iO2#x zPYFog26Uu(42Pf!c~*^YHKP`ByzlR(8d|*pTn!vZZGVO20TGl5k@|kW+W=y8w~0QS zGhveD_+-RO3HhFA+HoZGP(o*E$Sl^5|Io&ABY8q+)jdms9rr{^`e6C`Hz}!kChuFV ztOg3JhVS}3!$(F&hB5HU%erp|&7BIB2S=YwD z!jlvO2}msBt6jm+;5s;A-se3Y(1~yQL=Ee=+-;6W-~V2aEwII=EJUVf!0NE_eTCJI zc?M!S4f18=*^wG6nQJ8UF>RvguWoyLFgP70qTY|r{Nv{4Gn?+I8Snwf9(hi)wM1Bs zj#5XCHg`YV3ntNFr^URJbWTYw()0Tv0)TD(if%Zjad-YyMeo(K-mtNd&%xR|Pp-ui zmdhGD({0h2`+!dzSCqEoMd|;*9VyFQ_gB=uIXyASK~*tJ~5Qq6zJ}E5129UDX<1rWp0| zJ4@#r{N@8kyG~S@ulGBCCQrzsP+&`r=si2{yE$T;7)&|E$>8SJLpU3GOSD+_76bRa zXX)GSQ=&m^)jgyNQNXhX!Mc=Jp+5;>S<12_BTUl=SYw*Vyuq-M~pfZAL? zLq~#n)=eW8dT{1BaDcelB6}CGqoV5``4lKzXN8>`dA8L>=;%4&eQpY`^sIC2Zn1<=>IW?-m1<1NikJdQB9k5*ID4KlW!Rob9+b*)&~~ z68)m-lhjK=+W!{-tUf&kLdIh4?4b0X$ZU}ICExC^z#h3qt|KAz(?^S({K>WKcvGjO z5TSLOUM0mywj~?^^u5q8_Rs|aPgfxJGHpG7McZQZ7@5vz+YQ6E6vKu$7ctLDU5^lq z>hsBilGEnYa7$&X;29+e>vyCSY(6BfG%dn?*@2!N8rK5TthRjb6pV^2PtY~LKkz6@ zO&=uZ6$pk4ZGyt}50{*C`XI-yNc3!sL+f;U)Rt2?QWF7GT~TfIcX*Rv#6qWQBxw&`m=$dcEPD!|-1Z%%O>VR0DphKL9ep z<|h)1qw~P&Sbw7%Fas<)ME*Bx20GCBzcn(kH2Sn<10cvE>y;V#JY4Pd$ zd|lFfGB7L(=z;`}f}sklp@JT2ReaH}|Ca_}pON?6UIRvQ0GquW?rM1{CwH2fq!EQY z@5C!C=D=}k)+KXbY$ze)6I*i;hZl5!`kLtnL&WYvnwSZ~H}J`@!zIobVokodv=gX1LQ&kRZX z;vjnA)ry(w(2T)8PK=2;7KBS8w&3ddOfXt*W%6qLX(E?gr&}kY!?PvKqr%W){t0T& zpW(r5>KOOkPTU5SADgfio5I^$PMGcwO`wg}>-i8!H6o&Y-wl5v20s!J)jX~z@s?hjt zKDsd<|GM>J3rdi@>5|A4$qyIfWFUDnTFbbzeWo=<$i5)sT7)$I_@$%WwDhbx`Q2wD zl&x{mqi|W*@L9KH(<#A^Qd!-02wD}cr{^wPL#1G4&avmBw%Ay;?-4b!5CbwR;AFoEL!uEt?kER|cYSpvl%~gu@TOa0;P;Aw>$Hd+!2EUCyx846;XR(KX z{1PHQ5Mfrebc6j^n4qp>a%<_3ZSV_|CKe0Fl)N{4_0GYb(H@PV9^+Z|(G>ev>0?(r z`liH0;O_@W)j=|~D{9YVPV{8yCi@Y##8C@J{p!{zvG(6mBR?>HVyagj8|Gf@fhNkG zR_gBWL6jn|v~`Pn352ar^A9)eBebO*?+UiOR2@KR;m*n#g@#Pzco$~W1yRl4KM#9h z!gz!|HI^*Ts=udvE%oZKy7ha|tNKTiKSO$#;d$(%zt}l%brX~N^|v#2O6^Lo!RO17 zdw)_yY&Q#ab8h`L!oD}o?y44^uiHV?bia>XjGpmiQo(J#%gKYH{*OLzrPWdEj%OlX z2eU5Jj~VUeT*`5)i#vIcst)`4z4B#F4Ut%~;HpYjR}PP33|&f0-1U z_BEIkuL!7XxoLkFkvt`;&sx)hSEX&k1q)T2{iDV>JwTwk>6#^9d%ne`Ygl|u+JurN z-|S3?oOQ928|EiOq`}Ad07Bo2R{a_b0&h&7>qt>VC zVlLXoZJDK?&Y`ZBfw@gyC=u=}Dn)tW6q+8_vNt6%hM1XMlK|R~v4%5(*D}m8@k+wX zZkX_UWo~y9MQ{R1V^P(SzTvLFwA!Zc&NS<5wV!O+$9RR-z>g(|9YaTO-*BcY+nwEO zy~5y_it@fGe=%CUnTmOL#x)aBTAz&#d{E&AK0BXtvh>&8lBmeUYnvw zZOI4-_m?GXh#KhE_fcm|>N(&h13RxLx#O)9r}Hb5>=;={pBhq8W_gfRwaEEuDpp4+ z;O8BjV0pFAq7>e0b=m=((V;}6MIg~x;3x>Qi~cm<>YeZp{sI7CNk#|Aa&jYw zOi@|Pop|5MAoQ3*#9%mV@HgK~zK494z@G)pKIWLNyGAE)bb-SFz`K}?TqhW6h0^ zT@SPK?{y~tJ@u63LTc@z00z*p95u)VhkxRt+GAm|V#Hs>?81;qvk12tRc0~gN@-{g|Wuo7tQf$$E{RZaYrr;cx*4qYGYv-@` zr`+U4Og~8eKfAd)K__Q^#|G|?WxP^hYSx=taF#4JhLYlpc>3u1ptD^D9kL^U8oO!q z=_(Fp1Q>8V-p0zJU~54t?y_Pk<)-R~KsTjn!5iw%-M-HTSitsLBqu+n(F15dF|}L< z^;q}q2czdXL=z5?lEZnIQ|(~L3GLfqANXKG?=!t@7YJtNnSYi#?x>q(-qCl}M~qCf zT3a|4CFn^4qec#z$j`49JWp@5V=Z*RT!JyGp2xGx2C@IP(g@TDcQ3ke!}8t!K#GV1 z`wVTmbr||YAlc&0n&*$q%i>`fu&Ec)iYmmBPODvkzIX2YsGMQG)}^?G-w>vm2+r1@ zqhY2Mt^-|EY|M^Y)xb;re*+?zm@7Z$?cni&+L}q~_mek9JMMmNO)Q)ezf|Gf!4&)5 zq2b8v*lC0q2hQrxC5=UvmHpaJ4y5F8M{_zE8ytNV@ALJoS=_z+bUhA#QM`UYl)Rf2 z7E)5BBe?8j_lJ604)Ajt(Ls$Yc5!zc-IAk6az{>)o0vU=M;vr`EWN8B$d;D_zEqIh zc9c(V$wqQ<&mNA83s$j^QKREFdvs9~_0ykG?63X7{naopl0cMstQeyFL*dv@P$=fU zP@Uo2(g2ql($Vg=2YipkZB!Xw_q#x$Nk8HR&iIQ(5TbL@-j;DiDcZ6-tHxk3jUgZ@n*ko;>Ep!1~Jb> z4S5IMm#g-cJxw(M^~Xx{4N$KR7^1$sw96`WvVl@(%68M-_jccfaD>N7H&4p<=XR3I zLAIu~4A2KIPHHepx?XR{zn}W_-;#!`bDBVWn%}Rx!RLNkGzRoPOp1e27oZd0FjWVk z$=^{)+H=3x1X#yDWflj|!_MZ#^2?p+&1n(cT^`|Y;{7h8m40WGl zL%w`Rmx~(kK>^w21raKQHv7iYYST<#UP#1tn}z@J-@dw>CMYi3wGe)>hW9{q-vuqp z<;2cQH=x|o5c-iEN7v#n_o!tBCEzPrj9TAX%TL$k|I@K{nt>dBs5l9}>lTsF&%u|`wVCl8J!}YE zGS777jhGG3kw?CF;T}4$TQL3!6oLGo-6HV*t&wm)Tnc`|Hw%8!xFuJFI}0v?=NWop zKB#B?v&krm#Dr-Dg-a@wA9gJZa!+~@s1+3!yPy|#i^J9A#(>!hHw z29&n(1WMb822$qDwu*)0Z{FbA=d_wjaW`tr-l_G*eth?PXk8Oix&iSQtrEq2(^Pxb zb#Qc_+9I++Pk$Q6kd6P&{Z)3BfU=_EDO$fbct#7X${}+jB;;TA1jbvdM;E_eVreJPSE;~U?aVJj3^lr1Bks%Kgiw&p zzUY0UNRJq0I>gc0UG$ht1lx&()@Q_s#Rw*HZXExsV#sUaUxOQ5sA|>|DcA`U;3@2I z^B;C+N4DmA_T^Gt9;2OFU)Vv<51{ye26w4<2S?S!+9jIsLN%tI4Tut1RrYrapWS_b zP7%08jD{mTzDj$595g_DutIP6(uV8D?CK))MsZ1-{w43Rx&(*S10%hyl_#qPxF4-z z(A*hZyS~)`<2=Ysv{Xq?!ZhGcifZQ9;at;V|!UG`=D4+(e^Efrysf60s>g^FETnpsW3QX}>z7^XD-Dwwr|6*ur^M5UF!>aRoN#~^JQ4=v^KMyxQO$RZl_#t*FZ{-@28-q$zm|?$l3tLR<4z6Lps{n?;H))RbMlAtY1NZM?M`#c>X$e5U&f34 zoJl3t#k>(XH)DdN@*R9f{nK<&Ipb)DM1M#E1g1gs-}on&Fy=hcTUv76?teyPDmFxM zH$XK#%sWbhmaoL~AAbSY4$Nxc?IN>GdPMIwke#b_o>szu)K#fJ;&nI!R_Po1j>D$m@W9mKQRwL{W$WfWo>(w zuApnC%`RGV0|<%S4`c2)~TQGKgKdxehe;PwW0t~r(P z;;Qy4C0r|Mj4X>tQd37%U1@Hoxx77>`Ga@f_M*3g8Co=#OK=I946ej=O=k2+4)<`s zRnDo@7+DZ_0@($NA?$Mk!8py#PS&r754_x8819W0r)1Nn0U?8i`>_+NQvG|owGNO+ zUs#u?*DGny2{MXePlJi+mE_pzTZM0s+Oe3u8%;>9*vwSl;YR1wk-aK#PyMtxOI!GE zLG$&}8g73t9JA(7bU-3G@VU~JNibi3A5&avk7whiHpWksh^CQietdo`?Y}``TE_EvwW9`-uQY5t%&48F>P~{+pj$T zG6^sVvlh$sIN4}d?9Jq;mze3)y^g)VWkc8wP1JB2w?b?U&JgB@o0v3p9BmOdgq^PF z@TVqFUJAjX->`Vhw9zv2i`E->MWoG^OacX+1gTwfFXq1v`IpPI0xc6DH$kbpwCq{v z4t+MjErZGJ<88kZuJP{`)DfYy`|h52>+WIDAM1^o5Wzc7!as}9nk z>pY`c9kSuB$TR6hqsolRGt%R2ifHPPZ(EX{JyO$}=H{z+QYO4kY(eNwy^j(NVb!@s`Ke)htC``H(Hl$vIA>jO(mGu~PNSf5Ryyt5pz zsXBt>L~z)q^LujHOt2d)kg-4n^FPQ~4}k$@3%bIzeCW3rW52>Yw+oUTXR?Qmkc*Al ztBV}yY7PmWA%#*!C9H;+kZRGYYvhP^1gERi1iRt$!vdK@&+b%TBzL6T5v*+E)$3`J zpoMnYfo;0BrT?^Z+8wZALv9yGVQ!rd4AZ%Nx=SfW`Oj`QHc8!{{>v6Hsq+V^giCMa zdiLdnY`58$PKcn^!P)xfrq2UHLeR)khnP%Ryg&XsB7td_IrOorx-GCeCG+dQV6ML* z4D;*EA3V705h2WKH$_BImMZXO!k~{cR*=G%131@T2nV{l`Ga1jCNM1-RP3as3O!xi zD{Vx3mu{{6`8Ozx%iv0MO`b`d>*?EYSCteuVw1dfXSj$2V}_DKw!nxIdcyTg_l5g- zJHc-8YzALF3Q892E@02;Jb*bJFuxc+?sGSTW)eTuZjM9doaSOm3hq#QxZlT z%N3TS+Pzd=rg88Is=Rn&mNo&Gk^)EexR4a{T4J73$n@XrpfiaenCFsgyJ%(c#S7XZ zWgtv*E?wfk8?NGKtVR4RkOgwq!c?l1B7S>UAsB^&gojk(ftkZU&I@-QzT0{O-&xoq zZ{~$-<@|m>n}BR{Q}4Fo6Pa9p;o`MA$bEY4pJfwe6j<6 zLyAiM3|!;jiOjYK`|W2XxFOO{Lp4B^ovS;@;0))*P$mOHn`rk6s>MH`Lxg zEXkpw;b`T8bX`)alz-zU32l;mSL85%69D8w85Z7SC3?kv%7UNT?aKz8$takwcVCxe zM}hSXxJa(SnN(Mz8G?gZ$0+dxKBC9aQ_60P8tbBKF*P-)Ue~W)i_#??bQZ6~Ei(O! zUGedRpD55Q@Gim$-bL60xm_R%Cup|#iEeT`2(fe^%IX)Xu{t}YMl$89FAlUHs}Fi) zGAp>2<{C_l_*Ms;`D8P~G$1rC10 zG8mUWB&tT!w>UoACB(mhGKlf3i`QVTMZb=2F+VU7ZSQb7jNa!PoBud(#-Bm9MiRL=fnkBJ$tmGs z5kDbhK=oP?n7La{x_}vS<BVD#2CFksI3ZC~}XaNwjFLZ;P{tlIhtRGeQaLRS@^#U56M{k}&QF>Rze>)CFve zg>C?kzdQfP@N2mj45@=hX0Fa&;3MluNsUxVN5!fXXJj21Kt`-)j^UaQg5oD+kg%c|$d>zB)SrCNQ*O!oJ9sbxQqf7iaN$2Kj+EYsgE zTG$qWF_#VPheNto#uxT`p%%-JqU^>=tTL2Wa*9N z`enyHP=XSKN%;3-ZJ7oLcz=NUWVc4=xsBj`oSXf9So5hPVYwWwAe$3`;N<2FL_!9* zPh;kB7LYtV&P_kcYVWhDIS#?1D&I9rBwy#Jbuv?bV(8Y4j>h4_OI36si+)$DqT&t{dDCGdOS$FNU*I+P6{dMH z>Y6Mt=g+b5f#0u3&M+P&s3ff_a?@P=H>6U!>SN^Wz9Tv#Jz8@g9={Df^PzA!O<~(_ zNUdnWSG>~e6tDC;0hL~Lywa=r&T;(@pNee=a#OszEP3~PQsN(@wz`Wn1Ugdsw_gpg zM|{wgPia+BUd#?BMJ;!bLH^@oSELICS@b&az=mEQmsV$dw|=w5W z=Rl+skk`#Cc|S8Nb|?{K2Hre6@_FT4NJA~e3b1arUYrdUPqazzN@fP<#FblVcEx+V z)K#HB&><&+?SP4xZKk{p8Jub(RnuxaooaOHKcH)R@Pp(I5nV@$V#hwz>U!v$z0@mq z9t7K0!!$ae69RbHAsS43-55?);t9kQ`_cmULGk)>%Q%+Slx9Crc^9l&|JMv1WZbKO z^m#q-$n&@a|2;+r!vCeQJfI0-kPA9{k>Cm+uK= zMG;fnY=MR?ysu8e7w0;NY0R9>$Xz+|7N|+WYXUw_N5~}B-(eu>Cc*tq-axWkHG-OS z)1pXZ${S5RXc9Lhv@T|-ijsW%ARdYy;1wI~Iqn)@tReI1$}C&)fRhoY{x@`!q;Rz< zHz3k&e0wwJyZTo96^vUd|DQ5(qwn zE$=?9h}=2i)~smHsgA{llr$MD2o?i6ZJ zJ8L>Au(`U>HbQHB&~rf>6Vypk z2fTAy|3tM)ZS>2Rd%xa2kNECAw-j=#B@Li?i#|R}0k6(iHI07HaxVk7)gei(DoW`; z2Rm_x`74r%2mURV7xeQWm)bIS<%+s>z=~dj2=0?SFmOPt1tfkCW|Plo@TEXhP&eW8 z?dZ5lSwbNt+{$0n7p_x{Wxd3z6201R(Ii<+>Z5Ble}Je{!_ShS;%A@TfjLcB&}Og) z)2y#2mrYOk;F=!A)kOOue|jrjEl_%<+CXXA(YY9c;m$++7k?BSxXpUY7e1&#;rhD^ z`YPyYBr|aK$j}*;$L`6Jn zpIx56Vu*0g6-XYDLDP1Ov=E{lr*Rv%a$N5X^}1l_@hu~(6CSUE&QCFis+W{H0bvH1 z&iT?mwU*%-dOg3i2Mff?2REs<4V1eS`^6Ds*gkGmFDhu$@6h@#P3e}j$*w(v!n5?3 z2|B*o|1D~hKvC*HSnT635nF{xSNYT#(~#*b4HA{vvPN@=?@ zQ@aP-PwuB^aO+doS(P>&Y&hEeU5W)OC8yTSKQDibo&e$$@>-cO)FVm&JViXAi=2$U zf<5A^)oKwCq)tk+e>W~)Q>$zqWs&2(_u92_%y6>1c#w}g;`VA>3b(}xt`f*>@oNm& zxUrz*+DtVaOJ#O4>h-L20toByrHWuo4~!K*%|E{poHO8IrUiroAR^5V09`Mo2X{6; zE=6X(MM~P6bb#)?%b^UDoUI?NU`0ZNX0_tpohm7)irwaG zZDuGfA75zY$u%3ZgA(`SC%yF3k>=jxu;}{)LFSY?+`nAxfLH{n%DLR^hak?!jtI8s z$lV+Zr=WLbRy{io+SuecN{>9Y$L_>y-;7-hm@y|VjLGqPn zgcVP{0eymjd(;E0muZ2uHLw=$%+L+p4+A%4CFSudUJp*@9TM*dzBbhO!sT9t8p)Wy zCg+!)hNpa0QhQ8xjCHCXG2Rc-Q`;tAN$;A-9Dzx2XV|zrZq>M@4Yr0Cy5q4DCNX;t zq|Ez&{{B;H+F*;ZesB!^agdMN?dw)tjzsAwVeQ_N?)V67dK;YCM!N6AugDsI`6s4$ z%4FhgilG{p+RA~aX|!*Z@-^j9XtzV0f-0Lx$xXi<)XU^%rL z^bGn3qCu&JZf5N`&cLGS+^CRdf0|CK?CJKO6Pjzv?ehy)9=LQH*>Yzh>`i$Z-Ph!1 z`kzBcXZzE{a-B@=TSAEDJ;#yMUJ+LbM>T^SYCM)cUi3lHq@viN_V$Og{0>_RW1M5? z8*H`(Uk z_8C(=W=lo#vAAmYgc0*(x^~Wh~0)i;)K ziAfiTv{2vSo?7Ylg(TBoEUTskt%5K?;-BC^%iHb_cqAJ=P=(llyDe9G}! zObjx^61Gf(7x(Bw+ur$8B-uu%;@`hTM2aYQ{~!dEEqgwQgL-F?(uk)^^<*ooW?sD6 zE9$V@Btq{=^Y9}Dc!$a$UG~=MF|VB4Fip6K@wK-sy&@@Z!cXU1@0+jRf*kVN77O&* z4{t;@*~}-=EcP*)(}?cf`sml&qM$?KA^=>Qe%(*1J(0;?mk7Uu6mkeY3X)ZTX636a z`Fu!I+j4O}$LR4S{M{*jAEg5)n8nULFyEU|gEgM?oXyf6AJ*iK-yV1%nQzhrt5$Ac z)s97N7gxGsPbRPo?ffoW#+1j^o;-G1!&)~vLIEi%Q3S}}0QR>O4+zD!!VIY`3|SXw zJnh5Y{m0fEdt12Y45fGQ%0^>SO3w>%)DQlC_g8ksR1>wUi6t;xEJNS1*N>0X?v6vl z8cF#ktpiHwucX+)rdRSUV5Sz69}76CPpRYC`SGlBiPjW)a)HUnw7BWilyTySm-1xB zXh~>l(}VOTv+EWoaHhOOi6!29=+UQK6jrpuP(qzu(+TJXV{%8Z9$2)ujK zl;CTr=cwB;l-^ToW9^MiCO>8ZhGR$d=uN%1A)em+H7rk~VQLtOY4QQtFugqM0el(e z9tbIUwD4smVh1JvPdtJ@tmllB^J!Zy=gg!Eq5 zpV)}ieJmXU!*oK{!=Lt`T=#Ld*qZa?@JfZ%1$du~Ra8w$5m6GS<&Hw z&f4C!=e1t)cvVCQh!M3EyD#-Af^=ajq-3F49j6g7uZx&>pSZ#gg9+ow^Cy&~5x_O1 zi8WB!bG{K(T&{EXb=yAa=L~Uw*`xg9u`+2eKY4Ci=}Qj3%b+J3)*x$pqohi9w2vBn zl75%EqNZC`y!$Ml{tJd^WaaEV1_B>gT`+*VBTw_Qa`RK-{LY!;KFwi6(k4@Ow z3NNcWT=g^Y8V(iI(rgFQBsx!I)L4}rP341oX{DtYi$@Jy?htrqW9EJ*rg4C~zS&Gz zpb&!5A2sG5uEhntWKI8wLi>+=zq)ZjxtPS$G$nhF?fcx_@tn9j^P7P`@w?ASFO4=mq;1|DoZZJjzew|&^B&|UJJc&0K-R#{tI>n zpk`lWo0Ludmi=1na=Y8B9LW`|CKY?^AFr)(!4dFt-LKm!8tpbbn;-P@T8$uo?(&>qX@%m z)85a7fklS{rJjK$R?}hh_dyBd?|1t2-7mv?`V8tuNAJ~*@ZE-}5DfwRFHHuqdl>fD zuU)N;7(~WrNO*0bLl=U!n1LP-jSEtACY@&;zJgPqyMWh_6Z{P>iD&Ajg`1QTr>PEZDX&9 zaT@qn&H4$FMKq$tjXi455oeDn#pz%v4%H>}0Fp}=A@3m~%a9h4lmK|z3RuVcG#pJR zn|q)c&V7<)4u772ka)q_!s$7X#O2&k>!BC+&^fDxdag~aI%VOrRYF2qS_L#le5Ee( z1svS1+P|Xc!e0J+rQ){!Pm2KI@-{+>P@6JFk{B;8+f_k+v%)4rqRwM>_4mbv20}0QS$LhW9){^b`_^sok@*i8GvHfK{NW(jzo2vDXpnUvTbo z{CaKHu6$K`N22e>Oz9u#2%DCf%TxSDH26mm&;+H3WSMh;@hV?1)HTLHUMTsP3ZN}! zH^a+BpEF5*&(aXFJ1RC8vo737N2rEoBkKC6>4hh-485K|_xb`XbX+7i`g~dFUvBJ@ zG@BaXoFEy5N!nCsW33$Br2$& zZR~+DR!M2IyUL~Ev9b0(!FTi^3T@|!si^zSgHJm6@v9q`+N=}ArD|Csfj@VP(^U%O zsX=3R?E5MPSJ?nH+rB%+qPylg?h)H>2uhV!?T?UF?@7&=W}14C>(xqGMb_9_`E%{@ z;`(O_$LN`d64c1QqsiUp9*_6lfcZIjah<1v}0k4S8VPT|H1pib<-<$*-!U>-jJ| zm9JP$mv5I`!`(d|3$!9u<{m%xY`wN8fc{!_WU}2|>01PfARCo3OUGEH@Lj^0Dzc|Y zl00`KBnf!ZA|jR{Mkx zIYONp_HYeU_JkK%6=N&YpX;k#WtCfhUPX3HQ2UjyZGZcr+-4rK?&PUD`6s9hI}O`3R~-(Hi?|)sBxqs~7Ge zUUmzGZ^eBm%CH9qG&8#Y;6;Tr!J8=-)GNOFXj{T<*Q=(4jT}?{rs?#P#vn5MLzP*k zU}%!R0*Vl49@a|LL`%KQ@($_T=J{zTu(L`AM8REKTGsfS`-|z}n5?m*- zvNxugzk?KlUP6r*C(CI%Gn1jEudV$tJ-8K}uy7+Gq);$)Bf*jzDQQ_&5&-8i%+`T7AVpLcgR{5vK|mmD7NK6?jX>Ip7Y)F7`@4N-@7%@&{dcR`-FuH<;L^^N-O&E3Vv8AJraN6fw82?)D7$^3;sk~ zG^_T-(CQl{#I=R?MSMxj0j0Pj*a4Gj7<~G0MMO~6<_39_P3WVhsHl`Vb68{;;V-}v zm7fOV0`iL&>fpRwWd=?ykwb*Yps7;(_kD19vtM@>fkF+cNzJM~I7s{LR6^fVJ`Ltr zUEjn0yB;8#(JnqYL^4OH<2A8vk7Zmpe??LI#^btYWCO=f8bB}HdZtI^H|WUU8D78B zXt{oCWEATf*LpaQ?K2afrX4k6uRC?=uNqr$^s`mIFEvLA(acD!*PqLe1sc=3@}v9s zCjn3Ezm?)wOoA=PUW(vj>5EA~&lFXyS%Qxl(c<%B{>h*1MlK#oIN~bCUzYD8v?!qw z;DweBE~`0GwBELGpd8Dg4mUfBP)v-(k*{yK3MY^V(4da+07jF9);KUqohSLja+moe zVOXCHMj)UM(`6gUWEK#6kL)5o%OBYn`Y?l!r~^_A?gL49*-oi%Ao&atMvB&9r_l(9 zCM1}C*qIqwa>#!Bcz;sIFBh4dE6QoBt%{j{W>*ukf!w>_uX+RRHmXV5{}Cw@06yKUq~F7j zb67+BF&3`d$fU6Fe)rXPGn~oeAn0*ndXO?!BCtw7az~kPss(osY_NQB;?((UzK4=E z5>-J5_g5#@f54yYEljZEM^cNJ#}pV*ZMS07)Vo9P{aRoljdsk4ag$bz&0=2j&1(&h zF1HOKsr`PU2F(h%dKB@xs&}&G*-aC~MI)4YR}$*80B5I?1z+E9yUK(I37mIQEg>`| z(&t%|FMc!V4^Pj&ES&i$rBm5;>bqBChf*(UoR#uHNPC(*AKMDlx6fnr@XrVMbLH&Y zLz!&`4ER2*%(nUDtCX!69yD3Vq8-gzQF>qM{(U zd7=IJwYz}pYF?>lJm3wSh|$eRjKV7rfGNNI6h9Pz>AQd997`Zs67)MxG*1q9Uo4Ki zK$NZK#7#^-BmDVVmn#?G(|ALH-$iE1_41GFIISGTbls5rTN1Mc$mu0Mx3t5l6TFXb)B zVBYp}g4bExRj+pB8(H3Y9C53FjCTHYqbrxn#D>-k-5tG;mJE171A}Y^h}qh#G-sRe z6R=*Z^mI|Ubzwtr2;wjAF=wX1ZW*dpM*gAd>ob=UL-`-UL(a5KiJw0UZn}TAD%YTl zh2r6oWpF-bcY(UoLrtPr0IVv>7s8sX9D7cI2*}TP4uf{FRh--_;wQ2gZ`uxg9P9eM z0X*PWoj7n<*t53iW{ zc&uTan>Rwvxzg?A{=UkJDG?AqH@d2*cKG7YUE)7VNA+cD+u6!snFo}Kl9PzC*MbpK zSKMDsB-!H54mGA$6(7+aJKxy}A6pkXI7#SD|I^o(ANkyxFVOrDMc^>>X!03BtP(z; zh5piU=JU7o^8lkL_gzyTgY@v8t+n-`l-wZ!RRz_x9k&PKP?Lr3#bX1dF%m-K$JFf`Xv%%5a0$ENFiy4SittcIS4f^QhVM;8`DN$17AF+h zqSmv>8Rv6W+GDzME%(0Uz509aHrHruSG{}TX#>5nok`B}<6-pnf{n5Y`fLVU$DQi{jSb z&bDW`H8$*r`PDx-m@aw6?~A_%JT^DR|2%LRYHWME8q93H(X=U%B6VZDL~Lc3;P;*! zDx_4OSy#Jz$~~;As_XHVke5vJ&c=_iCe6|A5j862Xr&YS+X)Wv(|uh7E+J3$SNOX- zYRIzUO{Z%1sgRLIrHn^x2026BHziG|edG035aN>FRozYjtg1~IKO>s548yOwfiz7p zu{t=^sv8JXP>L(4Z2DuYwvRfrk><{h2y{4tBr@AmF+lVT|CZ8mFQz0w}u z;{AlTc=HlAVXcg%WiiL3MgXuU2^)3aGW~!K?rA>f6FP5h)j9#qL*7$n9`g0=*P1V! zzA*lMRPW(s{c(;Y`5s>t;gk0-L;Q5^K$MlC^acjBtj)P*J5|@()b0y!@3a6YC;lc# zqj%{TA!~jkG^SpWkXCoumBe}Zm^@oFTGVtWsoekA^5c9^d6^W~>d(5|ny(5MlF5!` z@!@j)uS`$1!ZiY!lQAOkV;9~A@3=RAbTxvwrPc}lFC;)=nIz@0>5G6Y;m(W2SFzjy zHpM|{#uQ+OlKO;>Pg?^*^ycCDk}UFs6^M>&&D?=GZU+`PpiBZ;hd(Yo z@ez9y>^t1y#F>4{?HspER72K^uoyxecetNTvl!_2_A0e{b=3R|_{Xqf2J@auy}j*7 zc;!F+XV0WYDC9UYR%?_PT_id{5tc=Blqn)b(?S%L9oUM|hHh@wLpbkyf^3?0{MP65 zFBIWjlvws;GcfLWy#8)F)04&62=ikOclIUHv}^Y3b4`zeHf#bFT+QMGm_y45OugIq zL6}G*g`Xe3D-cD}=q@Wu9|_lIr1^J0s6D>kd_Cxs!I>7#o{3}AwV*(IK8O6FK}mz^ z9}r&g3vRapK~}af(VjCP!g=(e{jlN9vNE@f2Y~UTsn+wOpvxQVB6B&w-~07k5UQpp zv1XI$hrE7=q6zVQ*x3?yYHiJEEiENIzmgrc57F!$e=UHM3F@CG3!!^oIwQ4*_~B0Hf1ldiS&ei_G20ub}?nm5P;1&UBBA{?v z2tMxpB2CkX$+wlGBOXX1P;WCsQN?s_(=55UW;!+|@Pi9!qj=)`_atP4ZQ6zIXlB@( z+ywE4ehI)t$d3Mcf*G1;kHvoMj$^p#;D#7zU|6;XYBk&JkF}#`diZ;Jh7ZM!JP-Q6(BQPN_np(i=`+k4h zW1YB7FtgJ)X*%JLAkuhRrIg3{Er+h2_@onY=ILdt@073TwBQ0#dmF?X+KU7VJnqX& zLY-Gmeqn2cxN3f5uXm6$cF3S+(!qAK_0-pMQBZlsqS8Ix*NXN+uO0AHE^=t&Z>U?Z zz!}bboVHSiG2I$IJfb zPVeTt`TtCmGhe@JWyaIBGa1xVED4cCBZu&DgYW&9(IkOiaZ@gRS7~YK!bM%!P4Z2O z_W;QiG|b#enIY*%F7fvhZOYdG*WniET7p2^B+mHblLXyyz`U5>lHLL!-auNH%T80`a7MRipy%?qPW;J^$_qJT|^j`KSM)34yiTe0_xejN?~p zIfyYa{iMiWEau|<55L-v>y_r6oMNl?f}zL?%Q>2BH43Lps`c#qy}J0Q?V)>N(HVV% z4cSW6u|i7S)eAO*{=fzH$J+{7rBnQi64}eFxGS|O$#HJGfmqq^7MT2=220$g*Aw(g z=@-<036rc&LG#O6s+UIFO-f&r_jyYSTicfVj^!}W2I4lH_skhMwNW5AeTrtahjfn* zG1+1}cL|r^d+f&Dl(V)NniR1!3pWM`4OPWcDP#H5l(n_!44%p5YoC zny&Ks8p+unnstZVvF;0lhU-@&Lfs+#o25u0UY)|6BH$|>~>OzUtbsn_yyLD zty}_H6l1c7UkpGx0_|M_(;o>Q?c0~V6U0&Kj@Rv9cx)Hef-K0u6k}2@yGv?V@Xwrp zWa)xj5Yr3&A6&az0okQ3>z7y1Gq*gOkH__>0x9B*Apw$P`ly)i-nB6qO||l_rLG`t zf%pA5qZH#916lu{c%SvH(Mfrn6cd~erkMA_V3*mlmh-I_8ISzx%%yi%5gD%(1vm+vV9oE{35ITp-$A72E*lAY>w3I*?I%?wrcp3XDBdw zc*-Yt^zFCw3yTROs8KElj3;h39M=HE_Ir6pQ=ZX)>C|KXI?X3#OI*Y%r6$zfP%AR1xaI2V(UlQR z6V0AOs#=B%I&vVHShA^EOaR~l2TCA^G5O+It*)~_SnypF{d#Zc{>aY&e{GEpT@{34 zadUO&iZGsDY)NtWa-g(mD9TyZ;ydnR?pfeOy=CAD{!lV*_ufP+A|XLMcZ8Vc3|j*ePie1A205S*C$>Wy2hSm8hlY7Tookr zgK3Q7T)H!e3ugCcb)$QQR+Vj(N~OuZWf_qq;kJ=2$~Ll- zEHex#5?Mob5|TALVMx}okL>%JCEHlWI=?f6QkUjq&Bu+{D{7e!by?;fE%IquqfpB342 z6>lG&i;D|<#pXFPz~%emTaP>D_L;bGcQ!uXxNCjqJYDcyJUZg!S{*(VC;4Lbb6=GZ z$G*|0kK4aTRzy2yu8{g=M-bhC1H8udERKJkxOqGw8+tNvd{SgW-D+eEp%`wFJ*zfv zWpKv;r84%>AlYtm6uTT|VSEZ&{3UL;K|QXN>%!gp#^*iEimp}rF8-;dB8gs#=bmRk zn@RPDQe_TKuBo@?n(LU~*3(Fnnmon03hss~RYo(acrIECMVt|!D-+a=6lJyF6Dug{ ze5XD&gwKSrUz1;8oD97*8ebt4$caSLorlzx6-|w#G1ne3D7%w>G`1||oQi+^EvlHg zJTrHv!-J)LM=9BP6o$yPR0Ne4oV%A2{fCwxr%(ecP95`>_GvzWsHV#gs6$R)3VEre z!kJix%wtR-{rcU&up*?UPP)0grxy9?p_f{WRYP=>&P`$Q2xvx_fQMPin~uBSk#vSC zkeb)2x_eB^CRgO677G~1IS60S4?C`lE~ME?+1y_~&fgP5o8YckGh%i(?vT*^8$Zl%3mrbIhjyDCHs2gTD%7!;!uAFWA?gqiKM~mki8k zQ^zR1I#R<`np4Q{p-d39|8R?MgL-8K2T=R*cOt5f>j=}Vx`{uKX z-ym*B|&#!>TCx!<$?KGzy+**$1&#QbF*d z;O6xU&=$6wHRi2L&tQs3n#gFh?Gh|4dSR{ww$~4=kE3PkS_`=cb@m8({7sao2WX1~ z|ACA@D|>hSpZ%lvWD|$M`u_8Z!43Q+{@PdV)oG)nc*VV*bal|V$#S5-^1Vo|6ZRbJ z$SLaEz|fw7y>+OD^7ouRsqYwp2%s*NFgXe*fk{cR-AQRYj>n|#UOHhH-JvZIqF5wW)jDA|U z_c_r#(sD{BpBmJD$@f>O1$%v$w7Dt7r%RCsqhWTzR;G$CK<_4?5b~b=`#BxgUx<0< zpHZvK(<-A0Ag+ifqVV@#2qq+S7Pit$t4^|;E^0Y5+r9B`bc76u8)RraEz&cu)@cy; z>p>jTUR{{%=I|7qe=SSZ1O=i_x&Vvj$Y>!^59-&i!IN?Zx3k5QK>~`VT<)x84>cH$ zTEr>&tBG|@3ESJa&Z^0yzkVRvK|yvux9Os8>ng6*3z0m2t3WD8J#G*~HRP%zmI7|G zdHaka�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 literal 71674 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�Io(8jK9=G6%TpIDeGn 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 Date: Tue, 14 Jun 2022 08:51:54 +0200 Subject: [PATCH 174/241] Update MQTT.md --- "R\303\251seaux/MQTT.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index a383e3a..9b46592 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -4,7 +4,7 @@ ## Introduction [1][2] -MQTT est un protocole basé sur TCP-IP au niveau de la couche applicative. Celui-ci appartient aux protocoles de messagerie dit de type **publish-subscribe**. +MQTT, pour "Message Queuing Telemetry Transport", est un protocole basé sur TCP-IP au niveau de la couche applicative. Celui-ci appartient aux protocoles de messagerie dit de type **publish-subscribe**. Il a vu le jour avec une première version en 1999 et est né de la collaboration de Andy Stanford-Clark (IBM¹) et Arlen Nipper (Eurotech²). MQTT a été conçu dans le but d'étre utilisé dans les zones où la bande passante est tout d'abord limitée. Ensuite, ces principaux objectifs étaient d'être efficace en therme de bande passante, d'être léger et également de posséder un faible dépense en énergie. From 740763d79faec180558a55e18623c1945c0674fb Mon Sep 17 00:00:00 2001 From: LeveauArnaud <43784062+LeveauArnaud@users.noreply.github.com> Date: Tue, 14 Jun 2022 13:57:57 +0200 Subject: [PATCH 175/241] Update IPsec.md --- "R\303\251seaux/IPsec.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/IPsec.md" "b/R\303\251seaux/IPsec.md" index 91ff8fa..1030dcc 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/R\303\251seaux/IPsec.md" @@ -55,8 +55,8 @@ Le mode transport a possède un temps de traitement rapide, mais ne sécurise qu - Il commence par crypter les données - Ensuite il rajoute un entête intermédiaire entre l’entête du paquet et les données. +Screenshot 2022-06-14 at 10 32 06 -![mode transport-1 (1)](https://user-images.githubusercontent.com/43784062/170671717-796d871d-dcfe-45f1-a1ec-e915cb5f8160.jpg) - Fonctionnement en mode Tunnel : @@ -68,7 +68,7 @@ Le mode transport a possède un temps de traitement rapide, mais ne sécurise qu - Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre l’expéditeur et le destinataire. -![mode tunnel -1](https://user-images.githubusercontent.com/43784062/170671863-06d7e744-6ceb-4831-9136-4cb51cbb58c2.jpg) +Screenshot 2022-06-14 at 10 31 58 ### Gestion des clés IKE & ISAKMP From ea8a0e93a7fc5765906daaf5fe0e0e6a1dea53ac Mon Sep 17 00:00:00 2001 From: ServaisLeon-2TL1 <56824199+ServaisLeon-2TL1@users.noreply.github.com> Date: Sun, 19 Jun 2022 18:41:28 +0200 Subject: [PATCH 176/241] Create Quic et TCP.md --- "R\303\251seaux/Quic et TCP.md" | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 "R\303\251seaux/Quic et TCP.md" diff --git "a/R\303\251seaux/Quic et TCP.md" "b/R\303\251seaux/Quic et TCP.md" new file mode 100644 index 0000000..c3d244d --- /dev/null +++ "b/R\303\251seaux/Quic et TCP.md" @@ -0,0 +1,54 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Quic et TCP + +## C’est quoi TCP? + +TCP est l'abréviation de Transmission Control Protocol. Il s'agit de l'un des protocoles principale de la famille de protocoles TCP/IP et l'une des normes les plus importantes d'Internet. Il s'agit d'un protocole orienté connexion qui utilise les services du protocole Internet au niveau de la commutation. + + + +## C’est quoi Quic? [1] +C’est rare qu’un protocolle basant sur IP apparait. Depuis le 27 mai 2021 la version 1.0 à été publié officielment. QUIC ("Quick UDP Internet Connections") est un protocole de transport expérimental de Google, qui a été mis à la disposition du public pour la première fois en 2013. Afin d'envoyer rapidement et facilement des paquets de données simples via le protocole UDP (User Datagram Protocol) sans connexion. Le travail de QUIC a été motivé par le désir de développer des alternatives aux solutions de sécurité établies pour TCP, HTTP/2 et TLS/SSL. Cela offre la même protection tout en réduisant les retards de connexion et de transport et en permettant plusieurs connexions. + + +## Mais pourquoi inventer un nouveau protocolle si TCP existe déjà ? [2] + +TCP, est un protocole classique permettant d'envoyer des données binaires sans erreur. TCP garantit que tous les paquets sont envoyés sans modification, dans le bon ordre et sans perte. Si nécessaire, la pile TCP réclame les paquets manquants jusqu'à ce que les données soient disponibles. Pour que cela fonctionne, il y a un handshake initial au cours duquel la destination se met d'accord sur différents paramètres. Cela cause qu’au début d’une connection TCP beaucoup de temps est perdu à cause du TCP-Handshake et du TLC-Handshake. +D'autre part, Quic est moins sujet à la perte de paquets et peut donc mieux fonctionner sur des réseaux peu fiables. Quic est un protocole basé sur UDP, spécialement conçu pour être utilisé dans des réseaux rapides, fiables et sécurisés. Il offre un certain nombre d'avantages par rapport à TCP, notamment de meilleures performances et une plus grande fiabilité. +Quic est également très évolutif et peut être facilement adapté aux besoins d'un réseau. Il est en outre très efficace sur le plan énergétique et peut donc être utilisé dans des appareils mobiles, où les fonctions d'économie d'énergie sont avantageuses. + + +## Quic avec HTTP/3 [3] + + +Les deux protocoles HTTP3 et QUIC sont les dernières avancées dans le domaine des technologies Internet. + +HTTP3 est une évolution du célèbre protocole de transfert hypertexte (HTTP). Alors que HTTP était jusqu'à présent basé sur le protocole TCP/IP, HTTP3 s'appuie sur le nouveau protocole UDP, spécialement conçu pour la transmission de données sur Internet. L'utilisation du protocole UDP permet à HTTP3 de fonctionner beaucoup plus rapidement que le HTTP traditionnel. En outre, HTTP3 offre quelques nouvelles fonctions particulièrement utiles pour l'utilisation d'Internet. Par exemple, plusieurs requêtes peuvent être envoyées simultanément au serveur, ce qui augmente considérablement la vitesse de la connexion. La sécurité est également améliorée par le nouveau protocole, puisque toutes les données sont transmises de manière cryptée. + +On ignore encore totalement quand QUIC ou HTTP/3 seront présentés comme norme. En conséquence, les développeurs et les administrateurs ont encore le temps de planifier l'avenir et de paniquer. Il n'est pas vraiment nécessaire de paniquer. QUIC est facile à mettre en œuvre. Comme l'infrastructure utilisée est le très répandu UDP, il suffit de mettre à jour le logiciel du navigateur sans devoir attendre la prochaine version du système d'exploitation. En outre, QUIC est qualifié de rétrocompatible. Si l'interlocuteur n'est pas encore prêt pour le nouveau protocole, il met à disposition un fallback sur TCP. + + +## Différence entre Quic et TCP [2] [3] + +La plus grande différence est sûrement que Quic ce situe dans le « user space » par rapport à TCP qui ce trouve dans le kernel : +![grafik](https://user-images.githubusercontent.com/56824199/174491370-c7f36cac-c627-4e70-83a4-80d219ff3809.png) + +L'avantage de l'implémentation de QUIC dans l'espace utilisateur est que les développeurs peuvent écrire / sélectionner leur propre implémentation et que les développeurs peuvent rapidement diffuser les corrections et améliorations de la pile QUIC via des mises à jour régulières de l'application (comme du côté serveur). La plupart des entreprises utilisent également la pile QUIC uniquement pour communiquer avec leurs services, ce qui est donc également possible dans la plupart des cas. Dans ce cas, l'entreprise possède à la fois les implémentations client et serveur. + + +## Perfomance Quic vs TCP [4] + +![grafik](https://user-images.githubusercontent.com/56824199/174491383-a2e94588-8602-45ba-8a2b-b0bab52e645d.png) + + +## Bibliographie + +[1] Wiki Ionos, „QUIC: Das steckt hinter dem experimentellen Google-Protokoll“, +« 20.07.2020 », https://www.ionos.de/digitalguide/hosting/hosting-technik/quic-das-internet-transportprotokoll-auf-udp-basis/ [05.06.2022] + +[2] Frank Carius, „QUIC - UDP mit TLS statt TCP“, « 2021 », https://www.msxfaq.de/netzwerk/grundlagen/quic_udp_mit_tls_statt_tcp.htm [05.06.2022] + +[3] Nicky Reinert, „HTTP/3 und QUIC: Was steckt hinter dem nächsten großen Update für HTTP?“, « 08.08.2019 », https://entwickler.de/webentwicklung/http3-und-quic-was-steckt-hinter-dem-nachsten-grossen-update-fur-http/ [05.06.2022] + +[4] Frederic Lardinois, „Google Wants To Speed Up The Web With Its QUIC Protocol“, « 18.04.2015 », https://techcrunch.com/2015/04/18/google-wants-to-speed-up-the-web-with-its-quic-protocol/?guccounter=1&guce_referrer=aHR0cHM6Ly9sZXZlbHVwLmdpdGNvbm5lY3RlZC5jb20vd2lsbC1nb29nbGVzLXF1aWMtcHJvdG9jb2wtcmVwbGFjZS10Y3AtNmVkOTkxYTBjYTFl&guce_referrer_sig=AQAAAMih_sDttxvv2RkTzk0RRJOclfaZ4vxcSO-lurMsnuBkQ--QgYwfbsqTjkYe0Xn0nSVsqplskoMP77pnlIUBcBpwmy9cGfpoPW2UgSTqBhs6alxSgdCfAYrz5L2v7UVJHYNagfJBxr5yySWOVZmm_fu8wROwNpsaMj3ttQzt9ESn [05.06.2022] + From 1483faf8437ebea959b9eaba6da91968452977f2 Mon Sep 17 00:00:00 2001 From: ServaisLeon-2TL1 <56824199+ServaisLeon-2TL1@users.noreply.github.com> Date: Sun, 19 Jun 2022 18:43:07 +0200 Subject: [PATCH 177/241] Ajout article Quic et TCO --- "R\303\251seaux/Quic et TCP.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/R\303\251seaux/Quic et TCP.md" "b/R\303\251seaux/Quic et TCP.md" index c3d244d..522f47c 100644 --- "a/R\303\251seaux/Quic et TCP.md" +++ "b/R\303\251seaux/Quic et TCP.md" @@ -6,7 +6,6 @@ TCP est l'abréviation de Transmission Control Protocol. Il s'agit de l'un des protocoles principale de la famille de protocoles TCP/IP et l'une des normes les plus importantes d'Internet. Il s'agit d'un protocole orienté connexion qui utilise les services du protocole Internet au niveau de la commutation. - ## C’est quoi Quic? [1] C’est rare qu’un protocolle basant sur IP apparait. Depuis le 27 mai 2021 la version 1.0 à été publié officielment. QUIC ("Quick UDP Internet Connections") est un protocole de transport expérimental de Google, qui a été mis à la disposition du public pour la première fois en 2013. Afin d'envoyer rapidement et facilement des paquets de données simples via le protocole UDP (User Datagram Protocol) sans connexion. Le travail de QUIC a été motivé par le désir de développer des alternatives aux solutions de sécurité établies pour TCP, HTTP/2 et TLS/SSL. Cela offre la même protection tout en réduisant les retards de connexion et de transport et en permettant plusieurs connexions. @@ -20,7 +19,6 @@ Quic est également très évolutif et peut être facilement adapté aux besoins ## Quic avec HTTP/3 [3] - Les deux protocoles HTTP3 et QUIC sont les dernières avancées dans le domaine des technologies Internet. HTTP3 est une évolution du célèbre protocole de transfert hypertexte (HTTP). Alors que HTTP était jusqu'à présent basé sur le protocole TCP/IP, HTTP3 s'appuie sur le nouveau protocole UDP, spécialement conçu pour la transmission de données sur Internet. L'utilisation du protocole UDP permet à HTTP3 de fonctionner beaucoup plus rapidement que le HTTP traditionnel. En outre, HTTP3 offre quelques nouvelles fonctions particulièrement utiles pour l'utilisation d'Internet. Par exemple, plusieurs requêtes peuvent être envoyées simultanément au serveur, ce qui augmente considérablement la vitesse de la connexion. La sécurité est également améliorée par le nouveau protocole, puisque toutes les données sont transmises de manière cryptée. From 3206773bbc51f587b2ee6485859260c1d2f931aa Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Mon, 27 Jun 2022 13:14:49 +0200 Subject: [PATCH 178/241] =?UTF-8?q?R=C3=A9organisation=20des=20liens=20et?= =?UTF-8?q?=20mise=20=C3=A0=20jour=20des=20pages=20de=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Images/SchemaH323.png | Bin .../Images/SchemaSIP.png | Bin "R\303\251seaux/Futur_http.md" | 179 ++++++++-------- "R\303\251seaux/MQTT.md" | 195 ++++++++---------- "R\303\251seaux/asterix.md" | 160 +++++++------- "R\303\251seaux/delegation_dns.md" | 41 ++-- "R\303\251seaux/docker_swarm.md" | 127 +++++++----- "R\303\251seaux/kubernetes.md" | 55 +++-- "R\303\251seaux/proxy.md" | 186 ++++++++++------- .../quic_tcp.md" | 18 +- .../sip_vs_h323.md" | 175 ++++++++-------- "R\303\251seaux/wireshark.md" | 170 +++++++-------- .../IPsec.md" | 69 +++---- .../https.md" | 115 +++++------ .../protocoles_vpn.md" | 104 ++++------ .../zabbix.md" | 31 ++- reseaux.md | 26 ++- securite.md | 12 +- template.md | 20 +- 19 files changed, 854 insertions(+), 829 deletions(-) rename "R\303\251seaux/SchemaH323.png" => Assets/Images/SchemaH323.png (100%) rename "R\303\251seaux/SchemaSIP.png" => Assets/Images/SchemaSIP.png (100%) rename "R\303\251seaux/Quic et TCP.md" => "R\303\251seaux/quic_tcp.md" (98%) rename "R\303\251seaux/Comparatif entre SIP et h323.md" => "R\303\251seaux/sip_vs_h323.md" (58%) rename "R\303\251seaux/IPsec.md" => "S\303\251curit\303\251/IPsec.md" (87%) rename "R\303\251seaux/https.md" => "S\303\251curit\303\251/https.md" (60%) rename "R\303\251seaux/Les protocoles VPN.md" => "S\303\251curit\303\251/protocoles_vpn.md" (90%) rename "R\303\251seaux/Analyse Zabbix.md" => "S\303\251curit\303\251/zabbix.md" (91%) diff --git "a/R\303\251seaux/SchemaH323.png" b/Assets/Images/SchemaH323.png similarity index 100% rename from "R\303\251seaux/SchemaH323.png" rename to Assets/Images/SchemaH323.png diff --git "a/R\303\251seaux/SchemaSIP.png" b/Assets/Images/SchemaSIP.png similarity index 100% rename from "R\303\251seaux/SchemaSIP.png" rename to Assets/Images/SchemaSIP.png diff --git "a/R\303\251seaux/Futur_http.md" "b/R\303\251seaux/Futur_http.md" index 9bbde7b..a701ee9 100644 --- "a/R\303\251seaux/Futur_http.md" +++ "b/R\303\251seaux/Futur_http.md" @@ -1,4 +1,8 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: L'avenir d'HTTP +parent: Réseaux +--- # L’avenir de HTTP ## Définition [^1]** @@ -16,33 +20,34 @@ Les versions successives du protocole vont progressivement corriger les problèm La version HTTP/2 est toujours la version majoritaire actuellement. Par rapport à ses prédécesseurs, elle a introduit le concept de multiplexage de plusieurs transactions HTTP dans une seule connexion TCP. Ce concept visait à résoudre le problème du blocage de Head Of Line (HOL), qui est l’un des principaux problèmes de performance rencontrés. -Ce multiplexage est malheureusement inefficace s’il existe des pertes de paquets. +Ce multiplexage est malheureusement inefficace s’il existe des pertes de paquets. De plus, les pages web reprennent des contenus de plus en plus lourds (vidéos 4K, images, rendus 3D etc.), et le trafic ne cesse d’augmenter. C’est dans ce contexte que HTTP/3 a été démarré pour aider à améliorer les performances du web. - ## Vers l’avenir de HTTP [^4]** -Sans disposer de boule de cristal, on peut raisonnablement penser que l’avenir de HTTP va se baser sur plusieurs normes qui correspondent à des avancées + +Sans disposer de boule de cristal, on peut raisonnablement penser que l’avenir de HTTP va se baser sur plusieurs normes qui correspondent à des avancées majeures depuis la première version de HTTP. Il s’agit des normes suivantes : -- HTTPS : [RFC 2818] -- HSTS : [RFC 6797] -- QUIC : [RFC 9000] est la norme principale, décrivant le socle de base de QUIC -- HTTP/3 [Toujours En cours de standardisation par l’IETF : dernier draft date du 11 mars 2022 : Hypertext Transfer Protocol Version 3 (HTTP/3)] -- HTTPA : hors norme actuellement +- HTTPS : [RFC 2818] +- HSTS : [RFC 6797] +- QUIC : [RFC 9000] est la norme principale, décrivant le socle de base de QUIC +- HTTP/3 [Toujours En cours de standardisation par l’IETF : dernier draft date du 11 mars 2022 : Hypertext Transfer Protocol Version 3 (HTTP/3)] +- HTTPA : hors norme actuellement -Ces différentes normes seront détaillées ci-dessus +Ces différentes normes seront détaillées ci-dessus -## HTTP/3 [^3] [^5] [^6] [^7] [^8] [^9]** +## HTTP/3 [^3][^5][^6][^7][^8][^9]** Un certain nombre de différences importantes existent entre HTTP/2 et HTTP/3. ![image](https://user-images.githubusercontent.com/56791491/172709717-23d03c0a-e536-4685-b266-cf3d1f0bf79d.png) ### TCP vs UDP + Contrairement à HTTP/2, HTTP/3 n'utilise pas le protocole de contrôle de transmission (TCP) comme le faisaient ses prédécesseurs. Au lieu de cela, il utilise le protocole de connexion Internet rapide UDP. @@ -65,12 +70,11 @@ mais chaque flux pourra atteindre la destination dans un ordre différent de cel Dans les faits, ce protocole UDP n’est pas un transport fiable. Pour éviter ce problème, QUIC ajoute une couche au-dessus d'UDP qui introduit la fiabilité. L’objectif est de garantir la même fiabilité des communications, contrôle de flux et gestion de la congestion similaires à TCP. -Ainsi QUIC peut envoyer d’un seul coup à un serveur les requêtes de connexion et de chiffrement, ce qui réduit de moitié la latence des nouvelles connexions. +Ainsi QUIC peut envoyer d’un seul coup à un serveur les requêtes de connexion et de chiffrement, ce qui réduit de moitié la latence des nouvelles connexions. En résumé, QUIC accélère la navigation web tout en améliorant la sécurité. HTTP/3 ne prend en charge que les connexions cryptées grâce au cryptage TSL 1.3 intégré. - -### Avantages de l’HTTP/3 +### Avantages de l’HTTP/3 Les avantages de HTTP/3 sont une meilleure vitesse de transmission, des temps de chargement plus courts et une connexion plus stable. S'appuyant sur UDP, HTTP/3 contourne les points faibles de TCP et utilise tous les avantages de HTTP/2 et HTTP sur QUIC. @@ -82,7 +86,6 @@ Il évalue la quantité de trafic qui peut être envoyée avant que la congestio En s’appuyant sur le protocole UDP et en prenant en charge les flux de première classe, QUIC résout ce problème de latence lié au démarrage lent de la connexion. - #### Le problème de blocage de HOL est résolu QUIC offre un support au multiplexage, de sorte que différents flux HTTP peuvent utiliser différents flux de transport QUIC tout en partageant la même connexion QUIC. @@ -95,50 +98,47 @@ De nombreux critiques indiquent que HTTP/3 arrive trop tôt après le protocole #### Ossification -L’Internet est rempli d’équipements divers comme des routeurs ou pare-feu, qui exécutent généralement des logiciels pour gérer le trafic réseau et qui sont rarement mis à jour. +L’Internet est rempli d’équipements divers comme des routeurs ou pare-feu, qui exécutent généralement des logiciels pour gérer le trafic réseau et qui sont rarement mis à jour. Ce phénomène est souvent appelé « ossification ». Cela signifie que beaucoup de ces éléments ne sont pas encore adaptés au protocole QUIC. #### Problèmes de sécurité La sécurité des applications et des données est au centre des critiques. -Grâce à une réglementation claire des requêtes et des réponses, TCP était considéré comme un protocole fiable et orienté connexion. +Grâce à une réglementation claire des requêtes et des réponses, TCP était considéré comme un protocole fiable et orienté connexion. Or, puisque les contrôles de sécurité et le cryptage n'ont plus lieu via TLS, mais directement via UDP, les fournisseurs ont peur d’un impact sur la sécurisation du trafic de données en raison du manque d'authentification TLS. En conséquence, certains réseaux bloquent sciemment QUIC ! +#### Performances -#### Performances - -Bien que les performances soient théoriquement améliorées par le passage à HTTP/3, certains maillons risquent de poser problème dans la chaîne et devront être adaptés pour procurer les avancées espérées. +Bien que les performances soient théoriquement améliorées par le passage à HTTP/3, certains maillons risquent de poser problème dans la chaîne et devront être adaptés pour procurer les avancées espérées. Ainsi, pour l’optimisation des performances, beaucoup d’appareils prennent en charge la fonction de déchargement TCP (“TCP offloading”) au niveau de leurs cartes d’interface réseau, mais peu d’entre eux le prennent en charge pour UDP. -Par rapport à son homologue TCP, UDP souffre également d’un manque de support des API. C’est également le cas pour les bibliothèques TLS sur QUIC. +Par rapport à son homologue TCP, UDP souffre également d’un manque de support des API. C’est également le cas pour les bibliothèques TLS sur QUIC. TCP est le protocole courant depuis des années, alors que UDP ne l’est pas, de sorte que les systèmes d’exploitation et la pile logicielle ne sont généralement pas aussi optimisées. Par conséquent, il y a beaucoup plus de charge/besoins CPU avec QUIC : selon certaines estimations, deux fois plus qu’avec HTTP/2. - -### Usage de HTTP/3 [^10] [^11]** +### Usage de HTTP/3 [^10][^11]** Les motivations pour introduire le nouveau protocole sont donc nombreux : -- Amélioration de performances -- Meilleur temps de réponse -- Meilleur comportement lors de pertes de paquets -- Amélioration de la confidentialité -Bien que HTTP/3 soit déjà disponible actuellement, son usage reste minoritaire, comme on peut le consulter sur le site https://w3techs.com/technologies/comparison/ce-http2,ce-http3 + +- Amélioration de performances +- Meilleur temps de réponse +- Meilleur comportement lors de pertes de paquets +- Amélioration de la confidentialité + Bien que HTTP/3 soit déjà disponible actuellement, son usage reste minoritaire, comme on peut le consulter sur le site https://w3techs.com/technologies/comparison/ce-http2,ce-http3 ![image](https://user-images.githubusercontent.com/56791491/172710600-7cd1777e-57bb-49cf-83cc-314544a62687.png) -Pourtant, de nombreux browsers permettent maintenant d’utiliser HTTP/3 ( voir la liste via l’URL suivante https://caniuse.com/http3) : +Pourtant, de nombreux browsers permettent maintenant d’utiliser HTTP/3 ( voir la liste via l’URL suivante https://caniuse.com/http3) : ![image](https://user-images.githubusercontent.com/56791491/172710586-cd925436-1f5b-4f18-b59f-a8dcd13e2418.png) Et de nombreux sites l’utilisent déjà comme google (évidement) mais aussi Youtube ou Facebook - -![image](https://user-images.githubusercontent.com/56791491/172710551-471dea08-50e9-45d5-908a-35e68e5f94ea.png) - +![image](https://user-images.githubusercontent.com/56791491/172710551-471dea08-50e9-45d5-908a-35e68e5f94ea.png) ## HTTPS [^12]** @@ -148,10 +148,11 @@ HTTPS permet au visiteur de vérifier l'identité du site web auquel il accède, Il garantit théoriquement la confidentialité et l'intégrité des données envoyées par l'utilisateur (notamment des informations entrées dans les formulaires) et reçues du serveur. Il peut permettre de valider l'identité du visiteur, si celui-ci utilise également un certificat d'authentification client. -Les parties prenantes sont -- le client — par exemple le navigateur Web — contacte un serveur — par exemple Wikipédia — et demande une connexion sécurisée, en lui présentant un certain nombre de méthodes de chiffrement de la connexion (des suites cryptographiques) ; -- le serveur répond en confirmant pouvoir dialoguer de manière sécurisée et en choisissant dans cette liste une méthode de chiffrement et surtout, en produisant un certificat garantissant qu'il est bien le serveur en question et pas un serveur pirate déguisé (on parle de l'homme du milieu). -- Ces certificats électroniques sont délivrés par une autorité tierce (autorité de certification) à laquelle le client comme le serveur ont choisi de faire confiance, un peu comme un notaire dans la vie courante, et le client peut vérifier, grâce à la signature de cette autorité sur le certificat présenté par le serveur, que celui-ci est authentique. Le client s’assure par ailleurs que le certificat n’est pas périmé et aussi éventuellement que l’autorité de certification ne l’a pas révoqué. +Les parties prenantes sont + +- le client — par exemple le navigateur Web — contacte un serveur — par exemple Wikipédia — et demande une connexion sécurisée, en lui présentant un certain nombre de méthodes de chiffrement de la connexion (des suites cryptographiques) ; +- le serveur répond en confirmant pouvoir dialoguer de manière sécurisée et en choisissant dans cette liste une méthode de chiffrement et surtout, en produisant un certificat garantissant qu'il est bien le serveur en question et pas un serveur pirate déguisé (on parle de l'homme du milieu). +- Ces certificats électroniques sont délivrés par une autorité tierce (autorité de certification) à laquelle le client comme le serveur ont choisi de faire confiance, un peu comme un notaire dans la vie courante, et le client peut vérifier, grâce à la signature de cette autorité sur le certificat présenté par le serveur, que celui-ci est authentique. Le client s’assure par ailleurs que le certificat n’est pas périmé et aussi éventuellement que l’autorité de certification ne l’a pas révoqué. Le certificat contient aussi une clé dite publique qui permet de chiffrer un message pour le rendre secret et uniquement déchiffrable par le serveur grâce à une clé dite privée que seul le serveur détient, on parle de chiffrement asymétrique. Cela permet au client d'envoyer de manière secrète un code aléatoire qu’il invente (une clé symétrique dite clef de session) qui sera mélangé à tous les échanges entre le serveur et le client de façon à ce que tous les contenus de la communication soient chiffrés. Pour cela, on mélange le contenu avec le code, ce qui donne un message indéchiffrable, et à l'arrivée refaire l’opération symétrique avec ce message redonne le contenu en clair. @@ -160,20 +161,18 @@ En bref : serveur et client se sont reconnus, ont choisi une manière de chiffre HTTP/3 n'existe pas dans une version non sécurisée ou non chiffrée. +## HSTS [^13][^14]** -## HSTS [^13] [^14]** - -Une autre avancée pour sécuriser un site web est d’utiliser le HSTS « HTTP Strict Transport Security ». +Une autre avancée pour sécuriser un site web est d’utiliser le HSTS « HTTP Strict Transport Security ». HTTP Strict Transport Security (HSTS) est un mécanisme de politique de sécurité proposé pour HTTP, permettant à un serveur web de déclarer à un navigateur web qu'il doit interagir avec lui en utilisant une connexion sécurisée (comme HTTPS). Elle est communiquée au client via la réponse HTTP, et plus précisément dans le champ d'en-tête nommé « Strict-Transport-Security ». Elle spécifie une période de temps durant laquelle l'utilisateur doit accéder au Serveur informatique uniquement de façon sécurisée. -Le HSTS force les navigateurs et les applications à utiliser — si cela est possible — le HTTPS pour se connecter. +Le HSTS force les navigateurs et les applications à utiliser — si cela est possible — le HTTPS pour se connecter. Facebook, Google, Gmail, Twitter et PayPal ne sont que quelques-uns des grands réseaux sociaux et portails de paiement à déployer une politique de sécurité HSTS aujourd’hui. - -## HTTPA [^15] [^16] [^17]** +## HTTPA [^15][^16][^17]** Cette nouvelle avancée est beaucoup moins aboutie. Elle permet d’ajouter à HTTPS qui sécurise le transport des données un protocole pour garantir également leur protection lors du traitement en protégeant le calcul en cours d'exécution. @@ -187,60 +186,62 @@ Dans un article intitulé : « HTTPA : HTTPS Attestable Protocol », récemment HTTPA est conçu pour fournir une certification à distance et des garanties informatiques confidentielles entre un client et un serveur lors de l'utilisation du Web sur Internet. Dans le cas de HTTPA, nous supposons que le client est digne de confiance et que le serveur ne l'est pas. L'utilisateur client peut vérifier ces garanties pour décider s'il peut faire confiance et exécuter les traitements informatiques sur le serveur ou non. Cependant, HTTPA n'offre aucune garantie que le serveur est digne de confiance. Elle comporte deux parties : la sécurisation des communications et des traitements -- Concernant la sécurité des communications, HTTPA reprend toutes les hypothèses de HTTPS pour la sécurité des communications, y compris l'utilisation de TLS et la communication sécurisée, notamment l'utilisation de TLS et la vérification de l'identité de la personne. -- En ce qui concerne la sécurité informatique, le protocole HTTPA nécessite de fournir un état d'assurance supplémentaire d'attestation à distance pour que les traitements informatiques se produisent dans un espace sécurisé, afin que l'utilisateur client puisse exécuter les calculs dans une mémoire chiffrée. +- Concernant la sécurité des communications, HTTPA reprend toutes les hypothèses de HTTPS pour la sécurité des communications, y compris l'utilisation de TLS et la communication sécurisée, notamment l'utilisation de TLS et la vérification de l'identité de la personne. +- En ce qui concerne la sécurité informatique, le protocole HTTPA nécessite de fournir un état d'assurance supplémentaire d'attestation à distance pour que les traitements informatiques se produisent dans un espace sécurisé, afin que l'utilisateur client puisse exécuter les calculs dans une mémoire chiffrée. Quant à savoir si ou quand HTTPA pourrait être adopté, il n'est pas clair. Lorsqu'on leur a demandé s'il était prévu de soumettre la spécification sous forme de RFC ou d'entreprendre une autre forme de normalisation, ils ont répondu : « Nous avons des discussions en cours qui doivent être examinées par l'équipe juridique d'Intel avant de pouvoir adopter HTTPA ». - ## Bibliographie -[^1]: "Hypertext Transfer Protocol", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP/3 (consulté le 01/06/2022) - ** Avis de la source : fiable pour la définition - +[^1]: "Hypertext Transfer Protocol", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP/3 (consulté le 01/06/2022) + ** Avis de la source : fiable pour la définition + [^2]: "HTTP/3" : le passé, le présent et l'avenir, https://blog.cloudflare.com/fr-fr/http3-the-past-present-and-future-fr-fr/ (consulté le 01/06/2022) - ** Avis de la source : document ancien mais qui explique la l’évolution du protocole - + ** Avis de la source : document ancien mais qui explique la l’évolution du protocole + [^3]: "Qu’est-ce que HTTP/3 – Informations sur le nouveau protocole UDP rapide ?", kinsta.com, -https://kinsta.com/fr/blog/http3/#http3-coming, (consulté le 04/06/2022) - ** Avis de la source : résumé de la différence UDP-TCP - -[^4]: "HTTP/3 : Des origines à nos jours", blog.cloudflare.com, https://blog.cloudflare.com/fr-fr/http-3-from-root-to-tip-fr-fr/ (consulté le 01/06/2022) - ** Avis de la source : présentation de l’importance des normes - -[^5]: "HTTP/3", en.wikipedia.org, https://en.wikipedia.org/wiki/HTTP/3 (consulté le 01/06/2022) - ** Avis de la source : Bon résumé - -[^6]: "HTTP/3 : le protocole origine Google est dans les starting-blocks", silicon.fr, https://www.silicon.fr/http3-protocole-262163.html, (consulté le 02/05/2022) - ** Avis de la source : comparaison HTTP/2 vs HTTP3 - -[^7]: "HTTP/3: the next Hypertext Transfer Protocol explained simply", ionos.com ,https://www.ionos.com/digitalguide/hosting/technical-matters/http3-explained/ (consulté le 04/06/2022) - ** Avis de la source : document qui date de 2 ans mais qui résume bien HTTP/3 - -[^8]: "HTTP/3", http3-explained.haxx.se, https://http3-explained.haxx.se/fr/h3, (consulté le 31/05/2022) - ** Avis de la source : très complet et très clair source principale de la partie HTTP/3 -[^9]: "Qu’est-ce que le protocole HTTP/3, et ce qu’il change par rapport à HTTP/1 et HTTP/2", fasterize.com, https://www.fasterize.com/fr/blog/protocole-http3/ (consulté le 31/05/2022) - ** Avis de la source : information sur QUIC - -[^10]: Can I use , caniuse.com, https://caniuse.com/http3, (consulté le 02/06/2022) - ** Avis de la source : très bonne source d’information pour les compatibilités browser protocole -[^11]: Usage statistics of HTTP/3 for websites, w3techs.com, https://w3techs.com/technologies/details/ce-http3 (consulté le 02/06/2022) - ** Avis de la source : très bonne source d’information actualisé -[^12]: "HyperText Transfer Protocol Secure", fr.wikipedia.org, https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure, (consulté le 1/06/2022) - ** Avis de la source : très complet et source la plus importante pour la partie HTTPS + https://kinsta.com/fr/blog/http3/#http3-coming, (consulté le 04/06/2022) + ** Avis de la source : résumé de la différence UDP-TCP + +[^4]: "HTTP/3 : Des origines à nos jours", blog.cloudflare.com, https://blog.cloudflare.com/fr-fr/http-3-from-root-to-tip-fr-fr/ (consulté le 01/06/2022) + ** Avis de la source : présentation de l’importance des normes + +[^5]: "HTTP/3", en.wikipedia.org, https://en.wikipedia.org/wiki/HTTP/3 (consulté le 01/06/2022) + ** Avis de la source : Bon résumé + +[^6]: "HTTP/3 : le protocole origine Google est dans les starting-blocks", silicon.fr, https://www.silicon.fr/http3-protocole-262163.html, (consulté le 02/05/2022) + ** Avis de la source : comparaison HTTP/2 vs HTTP3 + +[^7]: "HTTP/3: the next Hypertext Transfer Protocol explained simply", ionos.com ,https://www.ionos.com/digitalguide/hosting/technical-matters/http3-explained/ (consulté le 04/06/2022) + ** Avis de la source : document qui date de 2 ans mais qui résume bien HTTP/3 + +[^8]: "HTTP/3", http3-explained.haxx.se, https://http3-explained.haxx.se/fr/h3, (consulté le 31/05/2022) + ** Avis de la source : très complet et très clair source principale de la partie HTTP/3 + +[^9]: "Qu’est-ce que le protocole HTTP/3, et ce qu’il change par rapport à HTTP/1 et HTTP/2", fasterize.com, https://www.fasterize.com/fr/blog/protocole-http3/ (consulté le 31/05/2022) + ** Avis de la source : information sur QUIC + +[^10]: Can I use , caniuse.com, https://caniuse.com/http3, (consulté le 02/06/2022) + ** Avis de la source : très bonne source d’information pour les compatibilités browser protocole + +[^11]: Usage statistics of HTTP/3 for websites, w3techs.com, https://w3techs.com/technologies/details/ce-http3 (consulté le 02/06/2022) + ** Avis de la source : très bonne source d’information actualisé + +[^12]: "HyperText Transfer Protocol Secure", fr.wikipedia.org, https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure, (consulté le 1/06/2022) + ** Avis de la source : très complet et source la plus importante pour la partie HTTPS + [^13]: "Qu’est-ce que le HSTS et comment le met-on en œuvre ?", globalsign.com, https://www.globalsign.com/fr/blog/qu-est-ce-que-le-hsts-comment-le-mettre-en-uvre -[^14]: "HTTP Strict Transport Security", wikipedia.org , https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security, (consulté le 2/06/2022) - ** Avis de la source : résumé vulgarisé - -[^15]: "HTTPA : vers une attestation d’intégrité sur TLS ?", silicon.fr,https://www.silicon.fr/httpa-attestation-integrite-tls-418933.html, (consulté le 2/06/2022) - ** Avis de la source : description technique de HTTPA - -[^16]: HTTPA, a protocol for web services in trusted environments, blog.desdelinux.net/, https://blog.desdelinux.net/en/Http-a-protocol-for-web-services-in-trusted-environments/ (consulté le 2/06/2022) - ** Avis de la source : bonne entrée en matière - -[^17]: "Vous avez entendu parler de HTTPS. Découvrez maintenant HTTPA : des services Web dans des environnements de confiance", securite.developpez.com, https://securite.developpez.com/actu/328186/Vous-avez-entendu-parler-de-HTTPS-Decouvrez-maintenant-HTTPA-des-services-Web-dans-des-environnements-de-confiance-avec-Intel-SGX-un-outil-qui-fournit-le-chiffrement-en-memoire/ (consulté le 2/06/2022) - ** Avis de la source : très bonne source - - + +[^14]: "HTTP Strict Transport Security", wikipedia.org , https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security, (consulté le 2/06/2022) + ** Avis de la source : résumé vulgarisé + +[^15]: "HTTPA : vers une attestation d’intégrité sur TLS ?", silicon.fr,https://www.silicon.fr/httpa-attestation-integrite-tls-418933.html, (consulté le 2/06/2022) + ** Avis de la source : description technique de HTTPA + +[^16]: HTTPA, a protocol for web services in trusted environments, blog.desdelinux.net/, https://blog.desdelinux.net/en/Http-a-protocol-for-web-services-in-trusted-environments/ (consulté le 2/06/2022) + ** Avis de la source : bonne entrée en matière + +[^17]: "Vous avez entendu parler de HTTPS. Découvrez maintenant HTTPA : des services Web dans des environnements de confiance", securite.developpez.com, https://securite.developpez.com/actu/328186/Vous-avez-entendu-parler-de-HTTPS-Decouvrez-maintenant-HTTPA-des-services-Web-dans-des-environnements-de-confiance-avec-Intel-SGX-un-outil-qui-fournit-le-chiffrement-en-memoire/ (consulté le 2/06/2022) + ** Avis de la source : très bonne source diff --git "a/R\303\251seaux/MQTT.md" "b/R\303\251seaux/MQTT.md" index 9b46592..d6854a1 100644 --- "a/R\303\251seaux/MQTT.md" +++ "b/R\303\251seaux/MQTT.md" @@ -1,37 +1,38 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: MQTT +parent: Réseaux +--- # Article Wiki MQTT - Momin Maxime 2TL2 - ## Introduction [1][2] MQTT, pour "Message Queuing Telemetry Transport", est un protocole basé sur TCP-IP au niveau de la couche applicative. Celui-ci appartient aux protocoles de messagerie dit de type **publish-subscribe**. -Il a vu le jour avec une première version en 1999 et est né de la collaboration de Andy Stanford-Clark (IBM¹) et Arlen Nipper (Eurotech²). +Il a vu le jour avec une première version en 1999 et est né de la collaboration de Andy Stanford-Clark (IBM¹) et Arlen Nipper (Eurotech²). MQTT a été conçu dans le but d'étre utilisé dans les zones où la bande passante est tout d'abord limitée. Ensuite, ces principaux objectifs étaient d'être efficace en therme de bande passante, d'être léger et également de posséder un faible dépense en énergie. Ce protocole, possédant une moindre surcharge en therme d'en-têtes que d'autres protocoles comme HTTP³, excelle au niveau du transfert de données comparés à d'autres protocoles de communication. Un point important à spécifier est que celui-ci est décrit comme être facile à mettre en oeuvre coté client et convient très bien à des environnements possédants des ressources limitées. Etant donné que ce critère était également l'un des objectifs initiaux du protocole, il est important de le souligner. -Il n'est pas rare de voir MQTT qualifié de protocole de file d'attente. Cette qualification est trompeuse étant donnée que MQTT ne présente pas de file d'attente comparable aux différentes solutions plus traditionnelles de communication. +Il n'est pas rare de voir MQTT qualifié de protocole de file d'attente. Cette qualification est trompeuse étant donnée que MQTT ne présente pas de file d'attente comparable aux différentes solutions plus traditionnelles de communication. - -*IBM¹: Société multinationale américaine présent dans le domaine informatique* -*Eurotech²: Société italienne dans le secteur de l'informatique* -*HTTP³: Protocole de communication client-serveur* +*IBM¹: Société multinationale américaine présent dans le domaine informatique* +*Eurotech²: Société italienne dans le secteur de l'informatique* +*HTTP³: Protocole de communication client-serveur*
## Qu'est-ce qu'un protocole "publish-subscribe"? [1][3][4] -Pour comprendre MQTT, il est impératif de comprendre ce qu'est un protocole que l'on qualifie de "publish-subscribe". +Pour comprendre MQTT, il est impératif de comprendre ce qu'est un protocole que l'on qualifie de "publish-subscribe". Tout d'abord, il faut savoir que ce protocole utilise un mécanisme particulier pour transférer les données et est composé de deux types d'acteurs et d'un domaine de donnée: - Le domaine de donnée est appelé le **courtier** ou **broker**. -- Le premier type de client est **l'éditeur** ou plus communément qualifié le **publisher**. -*-> Les clients publiant des données sur le courtier sont qualifiés d'éditeurs.* -- Le second type sont les **abonnés** ou **subscriber**. -*-> Les clients récupèrant les informations publiées sur le courtier sont qualifiés d'abonnés.* +- Le premier type de client est **l'éditeur** ou plus communément qualifié le **publisher**.*-> Les clients publiant des données sur le courtier sont qualifiés d'éditeurs.* +- Le second type sont les **abonnés** ou **subscriber**. + *-> Les clients récupèrant les informations publiées sur le courtier sont qualifiés d'abonnés.* -Un éditeur n'envoie des messages/données pour, à priori, aucun distanateur bien spécifique. A la place, les messages sont envoyé à une catégorie bien spécifique présente sur un courtier. *Il peut, bien entendu, il y avoir une multitude de catégories différentes présentes sur le courtiers.* +Un éditeur n'envoie des messages/données pour, à priori, aucun distanateur bien spécifique. A la place, les messages sont envoyé à une catégorie bien spécifique présente sur un courtier. *Il peut, bien entendu, il y avoir une multitude de catégories différentes présentes sur le courtiers.* Mais comment recevoir les données dans ces circonstances vous demandez-vous ? Et bien tout simplement par principe d'abonnement. Un dabonné souhaitant recevoir des données s'abonnera à la ou les catégories souhaitées et recevra donc les données présentes dans celles-ci. @@ -43,10 +44,10 @@ Bien entendu, un éditeur ne peut donc pas savoir si ses messages envoyés au co ### Dissociation ? [1][8] -Un des élément fondamentale spécifique à ce modèle est la dissociation complète entre les éditeurs et les abonnés et ce sur plusieurs plans. +Un des élément fondamentale spécifique à ce modèle est la dissociation complète entre les éditeurs et les abonnés et ce sur plusieurs plans. - La **dissociation spatiale**: Les acteurs n'ont pas besoin de connaitre les informations de l'autre tel que l'adresse IP ou encore le port. -- La **dissociation temporelle**: L'éditeur ainsi que l'abonné ne doivent pas nécessairement fonctionner au même instant pour communiquer. +- La **dissociation temporelle**: L'éditeur ainsi que l'abonné ne doivent pas nécessairement fonctionner au même instant pour communiquer. - La **dissociation de synchronisation**: Se traduit par le fait que l'envoie ou la réception d'un élèment n'interrompt pas les opérations s'exécutant sur les deux acteurs. ### Le filtrage [1][5] @@ -56,16 +57,13 @@ Il est également interressant de savoir, qu'avec l'aide d'un filtrage bien déf Il existe 4 types de filtrage différents dans le cas du modèle "pub-sub": 1. **Filtrage par sujet**: -Les messages envoyés sont reçus et stockés dans des catégories logiques plus communément appelés "sujets". Les différents abonnés d'un système, qui sont abonnés aux différents sujets visés, auront accès à toutes les informations envoyés et stockés dans ces catégories logiques spécifiques. - + Les messages envoyés sont reçus et stockés dans des catégories logiques plus communément appelés "sujets". Les différents abonnés d'un système, qui sont abonnés aux différents sujets visés, auront accès à toutes les informations envoyés et stockés dans ces catégories logiques spécifiques. 2. **Filtrage basé sur le contenu**: -Ici, les messages sont filtrés selon leurs attributs et/ou leur contenu. Un abonné recevra donc uniquement les messages correspondant aux différentes contraintes qu'il a spécifié. Il est important de préciser que cette méthode possède un inconvénient qui est que le contenu doit être connu avant toutes choses par l'abonné ainsi que par l'émetteur pour fonctionner correctement. - + Ici, les messages sont filtrés selon leurs attributs et/ou leur contenu. Un abonné recevra donc uniquement les messages correspondant aux différentes contraintes qu'il a spécifié. Il est important de préciser que cette méthode possède un inconvénient qui est que le contenu doit être connu avant toutes choses par l'abonné ainsi que par l'émetteur pour fonctionner correctement. 3. **Filtrage par type**: -Dans ce cas-ci, le filtrage se fait en fonction de l'évènement ou du type. Il est coutume d'utiliser cette méthode dans les languages qualifiés d'orientés objet. - + Dans ce cas-ci, le filtrage se fait en fonction de l'évènement ou du type. Il est coutume d'utiliser cette méthode dans les languages qualifiés d'orientés objet. 4. **Filtrage hybride** -Dans certaines situations, la combinaison du filtrage par sujet et de celui basé sur le contenu est d'application. Dans un premier temps, des messages sont publiés dans des sujets spécifiques (Filtrage par sujet). Par la suite, les abonnés récupèrent des messages basés sur le contenu de différents sujets correspondant à leurs spécifications ultérieures (Filtrage basé sur le contenu). + Dans certaines situations, la combinaison du filtrage par sujet et de celui basé sur le contenu est d'application. Dans un premier temps, des messages sont publiés dans des sujets spécifiques (Filtrage par sujet). Par la suite, les abonnés récupèrent des messages basés sur le contenu de différents sujets correspondant à leurs spécifications ultérieures (Filtrage basé sur le contenu). ### Points importants à savoir [1] @@ -81,6 +79,7 @@ Ensuite, il faut bien comprendre que les messages envoyés par un éditeur ne se MQTT découpe l'espace en 2 parties distinctes composées de l'émetteur (publisher) et de l'abonné (subscriber). Ceux-ci doivent uniquement avoir pris connaissance de l'adresse ip et du port du courtier afin de pouvoir, dans le cas de l'émetteur, envoyer des messages et, dans le cas de l'abonné, s'abonner afin d'avoir la possibilité de recevoir des messages spécifiques. MQTT se dissocie donc d'une certaine manière spatialement. Généralement, l'utilisation de MQTT concerne une conversation quasi instantannée entre l'éditeur et l'abonné. Quand ce n'est pas le cas, une solution de repli existe car MQTT se dissocie temporellement. Le courtier peut donc stockés les informations afin qu'elles soient accessibles plus tard pour les distanataires qui ne sont pas actuellement connectés. Pour que cela se fasse, il faut respecter deux conditions: + 1. L'abonné s'est déja connecté une fois avec une session persistante. 2. L'abonné possède sur la catégorie spécifique une QoS¹ de 1 ou 2. @@ -88,24 +87,19 @@ MQTT peut également faire de la dissocation de synchronisation. Une bonne parti MQTT fonctionne avec un filtrage par sujet. Chaque message émis par un éditeur au courtier contient donc un sujet. Le courtier utilise ce sujet afin de vérifier si oui ou non un abonné peut recevoir ce message spécifique. -*QoS¹: la qualité de service décrit la capacité de transmettre des informations dans de bonnes et certaines conditions (les QoS concernant MQTT seront vues plus tard dans l'article.* +*QoS¹: la qualité de service décrit la capacité de transmettre des informations dans de bonnes et certaines conditions (les QoS concernant MQTT seront vues plus tard dans l'article.* ### MQTT - Qualités de services [6][7] -Il existe trois types différents de qualités de services pour le protocole MQTT. A savoir que chaque connexion au courtier est spécifiée par une valeur allant de 0 à 2. - -1. QoS = 0 -**Au plus une fois** qui signifie que le message sera envoyé uniquement envoyé une fois à l'abonné sans accusé de réception. Si l'abonné n'est pas en ligne ou que le message se perd, il ne sera jamais renvoyé et sera donc perdu. A savoir que le message ne requiert donc pas d'être stocké dans le courtier. Ce mode de transfert est le plus rapide des 3. +Il existe trois types différents de qualités de services pour le protocole MQTT. A savoir que chaque connexion au courtier est spécifiée par une valeur allant de 0 à 2. -2. QoS = 1 -**Au moins une fois** spécifie que le message sera envoyé jusqu'à ce qu'un accusé de réception soit reçu par l'émetteur du message. Le message doit donc pouvoir être stocké temporairement par l'émetteur pour pouvoir être renvoyé si jamais. Le message pourra, dans ce cas-ci, être envoyé plusieurs fois. - -3. QoS = 2 -**Exactement une fois** est le niveau le plus important, le plus sûr et le plus lent dans MQTT. Il est défini par l'utilisation d'une négociation à deux niveaux entre le client expéditeur et le client abonné. Ce procédé permet de garantir la réception d'une unique copie du message. +1. QoS = 0**Au plus une fois** qui signifie que le message sera envoyé uniquement envoyé une fois à l'abonné sans accusé de réception. Si l'abonné n'est pas en ligne ou que le message se perd, il ne sera jamais renvoyé et sera donc perdu. A savoir que le message ne requiert donc pas d'être stocké dans le courtier. Ce mode de transfert est le plus rapide des 3. +2. QoS = 1**Au moins une fois** spécifie que le message sera envoyé jusqu'à ce qu'un accusé de réception soit reçu par l'émetteur du message. Le message doit donc pouvoir être stocké temporairement par l'émetteur pour pouvoir être renvoyé si jamais. Le message pourra, dans ce cas-ci, être envoyé plusieurs fois. +3. QoS = 2 + **Exactement une fois** est le niveau le plus important, le plus sûr et le plus lent dans MQTT. Il est défini par l'utilisation d'une négociation à deux niveaux entre le client expéditeur et le client abonné. Ce procédé permet de garantir la réception d'une unique copie du message.
- ## MQTT & MQ ? MQTT est bien différent d'un simple protocole de messagerie par file d'attente. Contrairement à ce dernier, en MQTT, le principe est de pouvoir partager un message à tout abonnés s'étant abonné au préalable au sujet et non pas juste à un seul consomateur. Les sujets sont également bien plus flexibles qu'une simple liste d'attente étant donné que ceux-ci peuvent être créés au fur et à mesure. @@ -121,6 +115,7 @@ Généralement un client MQTT, éditeur ou abonné, est placé derrière un rout ## Messages MQTT [9] #### CONNECT (Se connecter) + Si le message d'initiation de connexion CONNECT envoyé au courtier ne respecte pas les spécifications MQTT ou génère un temps trop important entre l'ouverture du socket réseau et l'envoi du message CONNECT, le courtier se charge de mettre fin à la connexion. Ce procéder permet d'éviter toutes tentatives de ralentissement du courtier. #### PUBLISH (Publier) @@ -129,11 +124,11 @@ Dés que le client a établi la connexion avec le courtier, celui-ci peut publie #### SUBSCRIBE (S'abonner) -Comme dit plus haut, si aucune personne n'est abonné à un sujet, aucune donnée ne sera jamais transmise. Il est donc indispensable de pouvoir s'abonner. Pour cela, le client voulant s'abonné doit envoyé un SUBSCRIBE au courtier. +Comme dit plus haut, si aucune personne n'est abonné à un sujet, aucune donnée ne sera jamais transmise. Il est donc indispensable de pouvoir s'abonner. Pour cela, le client voulant s'abonné doit envoyé un SUBSCRIBE au courtier. #### SUBACK (Accusé d'abonnement) -Pour confirmer à l'abonné qu'il s'est bien abonné à un sujet, le courtier (après avoir bien reçu un message SUBSCRIBE par l'abonné) lui envoie un message d'accusé de réception SUBACK. +Pour confirmer à l'abonné qu'il s'est bien abonné à un sujet, le courtier (après avoir bien reçu un message SUBSCRIBE par l'abonné) lui envoie un message d'accusé de réception SUBACK. Quand l'envoi du SUBSCRIBE et la réception d'un message SUBACK est réalisé avec succès par l'abonné, celui-ci obtient et obtiendra chaque messages publiés qui correspond aux rubriques liées à ses abonnements qui étaient contenus dans son précédent message SUBSCRIBE. #### UNSUBSRIBE (Se désabonner) @@ -155,75 +150,63 @@ Au niveau de la sécurité, MQTT est également très interressant permettant un ## Bibliographie : -1) - Lien: https://iot.goffinet.org/iot_protocole_mqtt.html, -Nom du site: goffinet, -Nom de l'auteur: /, -Date de consultation: 25/05/2022, -Dernière date de modification: / -
- -2) - Lien: https://fr.wikipedia.org/wiki/MQTT, -Nom du site: wikipedia, -Nom de l'auteur: /, -Date de consultation: 25/05/2022, -Dernière date de modification: 28/01/2022 -
- -3) - Lien: https://fr.wikipedia.org/wiki/Publish-subscribe -Nom du site: wikipedia, -Nom de l'auteur: /, -Date de consultation: 25/05/2022, -Dernière date de modification: 31/03/2021 -
- -4) - Lien: https://ably.com/topic/pub-sub -Nom du site: ably, -Nom de l'auteur: Matthew O’Riordan, -Date de consultation: 25/05/2022, -Dernière date de modification: 17/07/2020 -
- -5) - Lien: https://stringfixer.com/fr/Publish/subscribe -Nom du site: stringfixer.com, -Nom de l'auteur: /, -Date de consultation: 03/06/2022, -Dernière date de modification: / -
- -6) - Lien: https://www.ibm.com/docs/fr/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mm-tc-doc-tc60340--htm -Nom du site: ibm.com, -Nom de l'auteur: /, -Date de consultation: 03/06/2022, -Dernière date de modification: 20/04/2021 -
- -7) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/ -Nom du site: hivemq.com, -Nom de l'auteur: The HiveMQ Team, -Date de consultation: 04/06/2022, -Dernière date de modification: 16/02/2015 -
- - +1) - Lien: https://iot.goffinet.org/iot_protocole_mqtt.html, + Nom du site: goffinet, + Nom de l'auteur: /, + Date de consultation: 25/05/2022, + Dernière date de modification: / + `
` +2) - Lien: https://fr.wikipedia.org/wiki/MQTT, + Nom du site: wikipedia, + Nom de l'auteur: /, + Date de consultation: 25/05/2022, + Dernière date de modification: 28/01/2022 + `
` +3) - Lien: https://fr.wikipedia.org/wiki/Publish-subscribe + Nom du site: wikipedia, + Nom de l'auteur: /, + Date de consultation: 25/05/2022, + Dernière date de modification: 31/03/2021 + `
` +4) - Lien: https://ably.com/topic/pub-sub + Nom du site: ably, + Nom de l'auteur: Matthew O’Riordan, + Date de consultation: 25/05/2022, + Dernière date de modification: 17/07/2020 + `
` +5) - Lien: https://stringfixer.com/fr/Publish/subscribe + Nom du site: stringfixer.com, + Nom de l'auteur: /, + Date de consultation: 03/06/2022, + Dernière date de modification: / + `
` +6) - Lien: https://www.ibm.com/docs/fr/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mm-tc-doc-tc60340--htm + Nom du site: ibm.com, + Nom de l'auteur: /, + Date de consultation: 03/06/2022, + Dernière date de modification: 20/04/2021 + `
` +7) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels/ + Nom du site: hivemq.com, + Nom de l'auteur: The HiveMQ Team, + Date de consultation: 04/06/2022, + Dernière date de modification: 16/02/2015 + `
` 8) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part2-publish-subscribe -Nom du site: hivemq.com, -Nom de l'auteur: The HiveMQ Team, -Date de consultation: 04/06/2022, -Dernière date de modification: 19/01/2015 -
- - -9) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ -Nom du site: hivemq.com, -Nom de l'auteur: The HiveMQ Team, -Date de consultation: 06/06/2015, -Dernière date de modification: 02/02/2015 -
- + Nom du site: hivemq.com, + Nom de l'auteur: The HiveMQ Team, + Date de consultation: 04/06/2022, + Dernière date de modification: 19/01/2015 + `
` +9) - Lien: https://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe/ + Nom du site: hivemq.com, + Nom de l'auteur: The HiveMQ Team, + Date de consultation: 06/06/2015, + Dernière date de modification: 02/02/2015 + `
` 10) - Lien: https://www.planete-domotique.com/blog/2021/03/17/protocole-mqtt-iot-domotique/ -Nom du site: planete-domotique.com, -Nom de l'auteur: Lucas, -Date de consultation: 06/06/2015, -Dernière date de modification: / -
- + Nom du site: planete-domotique.com, + Nom de l'auteur: Lucas, + Date de consultation: 06/06/2015, + Dernière date de modification: / + `
` diff --git "a/R\303\251seaux/asterix.md" "b/R\303\251seaux/asterix.md" index 4d3e1d6..82c6310 100644 --- "a/R\303\251seaux/asterix.md" +++ "b/R\303\251seaux/asterix.md" @@ -1,14 +1,11 @@ --- layout: default -title: INTEGRATION DE FLUX VIDEO DANS UNE INFRASTRUCTURE ASTERIX +title: Asterix parent: Réseaux --- - -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) - # ASTERIX -## **Qu'est-ce que ASTERIX ?[^1] [^9]** +## **Qu'est-ce que ASTERIX ?[^9]** Astérix est une implémentation logicielle d'un autocommutateur privé PBX qui est une centrale téléphonique desservant une organisation privée et permettant @@ -21,8 +18,11 @@ désigné qui peut ou non être mappé au plan de numérotation du bureau centra Astérisk permet donc l'établissement et le contrôle de la communication entre les différents terminaux tels que les postes téléphoniques, les appareils ou services de voix sur protocole internet (VoIP). + ###### Fig.1 Schéma d'une infrastructure asterisk + ![flux d'appel](https://user-images.githubusercontent.com/74672498/169313118-e214baf6-f8d7-40f4-a8c8-4b757a64b2e8.png) + ###### "https://docplayer.fr/508846-Le-support-de-la-video-par-asterisk.html" docplayer.fr Il prend en charge plusieurs fonctionnalités disponibles dans les systèmes PBX @@ -64,14 +64,16 @@ peut être aussi utilisé en mode multicast via satellite sans garantie de quali Le rôle principal de RTP consiste à numéroter les paquets IP afin de reconstituer les flux voix ou vidéo de manière fluide et ce, même si le réseau -sous jacent change l'ordre des paquets. Par opposition à HTTP et FTP qui fonctionnent au-dessus de TCP, RTP fonctionne au dessus de UDP +sous jacent change l'ordre des paquets. Par opposition à HTTP et FTP qui fonctionnent au-dessus de TCP, RTP fonctionne au dessus de UDP Il est utilisé par SIP, H.323, MGCP et éventuellement d'autres protocoles pour transporter les médias entre les points d'extrémité. Exemple de communication via SIP ###### Fig.2 Schéma d'une converstion via SIP + ![utilisation_avec_sip](https://user-images.githubusercontent.com/74672498/169355709-eaec4f3c-978d-42bf-8bc2-6c2245cf71ea.png) + ###### "https://www.researchgate.net/figure/VoIP-call-setup-based-on-SIP-SDP-RTP-RTCP-protocols-based-on-9_fig3_1924445" researchgate.net - **Utilisation avec un canal de retour[^3]** @@ -80,22 +82,24 @@ RTP peut être utilisé conjointement avec un canal de retour via RTCP voir RTSP Pour améliorer les performances de RTP, un protocole spécifique au streaming permet de contrôler la diffusion du contenu, il s’agit de RTSP (Real Time Streaming Protocol). -RTSP est un protocole de niveau applicatif qui sert à contrôler les propriétés temps-réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. +RTSP est un protocole de niveau applicatif qui sert à contrôler les propriétés temps-réel du contenu délivré. Il est adapté aussi bien à la diffusion de données pré-enregistrées que de données diffusées en direct. -- **Utilisation en mode unicast[^2] [^3]** +- **Utilisation en mode unicast[^3]** Ce mode de diffusion nécessite l'ouverture d’un flux spécifique entre le serveur et le client. Les protocoles utilisés sont RTSP pour le contrôle du flux et RTP pour l’émission du flux. RTSP utilise TCP alors que RTP utilise UDP. L’intérêt de RTSP par rapport à RTP est d’ajouter un contrôle sur le contenu et de pouvoir par exemple accéder directement à un point donné du contenu sans avoir à le télécharger dans sa globalité. Il améliore ainsi les performances. - + Comment sa se passe : - - 1. Le client contacte le serveur de streaming grâce au protocole RTSP. - 2. le serveur retourne via RTSP une description de la session de streaming qu’il va ouvrir. - 3. Le serveur informe le client du nombre de flux ( Une session étant composé de plusieurs flux : audio, video etc) - 4. Le serveur donne des informations décrivant les flux comme le type du média et le codec de compression - 5. Les flux sont diffusés séparément via le protocole RTP. + +1. Le client contacte le serveur de streaming grâce au protocole RTSP. +2. le serveur retourne via RTSP une description de la session de streaming qu’il va ouvrir. +3. Le serveur informe le client du nombre de flux ( Une session étant composé de plusieurs flux : audio, video etc) +4. Le serveur donne des informations décrivant les flux comme le type du média et le codec de compression +5. Les flux sont diffusés séparément via le protocole RTP. ###### Fig.2 Utilisation de RTP en unicast + ![rtp_unicast](https://user-images.githubusercontent.com/74672498/169299420-0e91d1bf-7c4f-429f-99c5-da9a9a9e5b5c.png) + ###### "https://www.iifa.fr/video-ip" iifa.fr - **Utilisation en mode multicast[^2]** @@ -108,21 +112,25 @@ connecté. il n'existe qu'un seul flux qui est dupliqué au niveau de chaque rec Comment sa se passe : -Pour se connecter au multicast, le client doit télécharger un fichier type SDP(Session Description Protocol) qui contient les informations nécessaires pour recevoir le flux multicast, l'adresse IP du serveur, le numéro de port et les informations de description des flux (même informations que celle envoyées par RTSP dans le cas d'un diffusion unicast). +Pour se connecter au multicast, le client doit télécharger un fichier type SDP(Session Description Protocol) qui contient les informations nécessaires pour recevoir le flux multicast, l'adresse IP du serveur, le numéro de port et les informations de description des flux (même informations que celle envoyées par RTSP dans le cas d'un diffusion unicast). + +###### Fig.3 Utilisation de RTP en multicast -###### Fig.3 Utilisation de RTP en multicast ![rtp_multicast](https://user-images.githubusercontent.com/74672498/169301654-924eb1f4-ccb3-4ee8-aed4-38f244f8cc9f.png) -###### "https://www.iifa.fr/video-ip" iifa.fr - #### **RTP et la NAT[^7]** - +###### "https://www.iifa.fr/video-ip" iifa.fr + +#### **RTP et la NAT[^7]** + Les protocoles de signalisation utilisés pour les échanges multimédias (H.323 SIP, MGCP etc) sont en effet sensible à la NAT! Pourquoi? - + Lors d'une signalisation, ces protocoles ne se contentent pas de mentionner leur adresse IP dans l'entête des paquets qu'ils envoient mais l'indiquent également dans le corps de leurs messages. Par exemple avec le protocole SIP un message d'invitation INVITE comporte des informations sur l'ip de la source du paquet. Le récepteur ne peut répondre correctement à la requête puisque l'ip source initiale est une adresse privée. Le récepteur envoie donc sa réponse vers l'adresse ip source spécifiée qui ne lui est pas accessible, et le paquet de réponse n'arrive jamais. - - ###### Fig.4 Utilisation de la NAT + +###### Fig.4 Utilisation de la NAT + ![nat_rtp](https://user-images.githubusercontent.com/74672498/169309816-8f15135e-f6b8-4e7b-8c0c-acfcd0bcd053.png) -###### "https://docs.switzernet.com/3/public/110303-asterisk-nat/" docs.switzernet.com + +###### "https://docs.switzernet.com/3/public/110303-asterisk-nat/" docs.switzernet.com Le protocole NAT posent donc quelques soucis au niveau d'une infrastructure décentralisée notamment lors de l'échange des paquets voix et video dans le protocole RTP. RTP étant décentralisé, pour résoudre le problème, tous les paquets RTP seront envoyés de l'interlocuteur au serveur avant d'être redirigés vers le bon client. Cette solution induit une forte utilisation de la bande passante du serveur, mais permet de résoudre le problème de la NAT. @@ -148,22 +156,22 @@ rtpend=20000 Si vous avez un NAT ou un pare-feu entre Asterisk et le serveur, vous devez les configurer pour gérer le transfert des ports. -### **Intégration de la video dans Asterisk[^6] [^5]** +### **Intégration de la video dans Asterisk[^5]** Asterisk prend en charge une variété de support audio et vidéo et fournit des modules CODEC pour faciliter l'encodage et le décodage des flux audio. Pour l'instant le transcodage vidéo ou le transcodage d'image n'est pas pris en charge. #### **Pris en charge des vidéos[^6]** -Non | Valeur de configuration | Format Module | Distribué avec Astérisk | -:-: | :-:| :-:| :-: | -H.261 | h261 | n/A | OUI| -H.263 | h263 | format_h263 | OUI| -H.263+ | h263p | format_h263 | OUI| -H.264 | h264 | format_h264 | OUI| +| Non | Valeur de configuration | Format Module | Distribué avec Astérisk | +| :----: | :---------------------: | :-----------: | :-----------------------: | +| H.261 | h261 | n/A | OUI | +| H.263 | h263 | format_h263 | OUI | +| H.263+ | h263p | format_h263 | OUI | +| H.264 | h264 | format_h264 | OUI | le fichier produit par les pilotes de format vidéo Asterisk n'est pas dans un format vidéo habituel. [Gstreamer](https://gstreamer.freedesktop.org/) prend en charge la production de ces fichiers et la conversion de divers fichiers vidéo en fichiers vidéo + audio Asterisk. -#### **Prise en charge du pilote de canal[^5] [^8]** +#### **Prise en charge du pilote de canal[^8]** Dans Asterisk un canal est l'unité atomique qui transporte un appel au sein d'Asterisk. Il peut s'agir d'une connection physique à une ligne téléphonique ou à un poste téléphonique comme il peut s'agir d'une connection logique induite par un appel en provenance d'un réseau de données. Chaque canal est géré par un pilote qui en connaît les moindres détails et qui n'expose que le strict nécessaire à la couche supérieure du PBX. @@ -171,15 +179,15 @@ Généralement, un pilote de Canal lit dans un fichier de configuration les info Les pilotes de canal qui prennent en charge la video dans Asterisk sont: -Pilote de canal | Module | Remarque -:-: | :-:| :-:| -SIP|chan_sip.so|Le pilote de canal SIP (chan_sip.so) prend en charge la vidéo| -IAX2|chan_iax2.so|Prend en charge les appels vidéo (sur les troncs aussi)| -Local|chan_local.so|Transfère les appels vidéo en tant que canal proxy| -Agent| chan_agent.so| Transfère les appels vidéo en tant que canal proxy | -oss |chan_oss.so| Prend en charge l'affichage/le décodage vidéo, voir video_console.txt| +| Pilote de canal | Module | Remarque | +| :-------------: | :-----------: | :---------------------------------------------------------------------: | +| SIP | chan_sip.so | Le pilote de canal SIP (chan_sip.so) prend en charge la vidéo | +| IAX2 | chan_iax2.so | Prend en charge les appels vidéo (sur les troncs aussi) | +| Local | chan_local.so | Transfère les appels vidéo en tant que canal proxy | +| Agent | chan_agent.so | Transfère les appels vidéo en tant que canal proxy | +| oss | chan_oss.so | Prend en charge l'affichage/le décodage vidéo, voir video_console.txt | -Ci-dessous on peut voir un exemple de configuration de base de sip : sip.conf +Ci-dessous on peut voir un exemple de configuration de base de sip : sip.conf ```conf [general] @@ -217,43 +225,49 @@ context=hackers sip list peers ``` - Pour ce qui est des applications, elles rendent des services lorsqu'un appel est traité dans le système. Pour chaque appel, une suite d'applications est exécuté en série dans l'ordre dans lequel elles sont défini dans un diaplan (fichier qui reprend les instructions de traitement d'un l'appel). Certaines applications utilisent un fichier de configuration comme l'application VoiceMail (Messagerie vocale) -Les applications de plans de numérotation qui sont connus pour gérer la vidéo sont : +Les applications de plans de numérotation qui sont connus pour gérer la vidéo sont : - Messagerie vocale - Stockage de la messagerie vocale vidéo -- Enregistrer - Enregistre les fichiers audio et vidéo -- Lecture - Lit une vidéo tout en étant invité à lire l'audio -- Echo - Renvoie l'audio et la vidéo à l'utilisateur - +- Enregistrer - Enregistre les fichiers audio et vidéo +- Lecture - Lit une vidéo tout en étant invité à lire l'audio +- Echo - Renvoie l'audio et la vidéo à l'utilisateur ## Bibliographie -[^1]: "_Qu'est-ce que ASTERIX ?_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Asterisk_(logiciel) (consulté le 18/05/2022) - ** Résumé : Bref définition d'asterisk ainsi que de ses fonctionnalités - ** Avis sur la ressource : Très leger et pas assez explicite dans certains point -[^2]: "_RTP ?_", iifa.fr, https://www.iifa.fr/video-ip) (consulté le 19/05/2022) - ** Résumé : Détaille les différents mode d'utilisation de RTP - ** Avis sur la ressource : Clair et schématique le meilleur pour comprendre RTP en unicast et multicast -[^3]: "_RTP ?_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Real-time_Transport_Protocol (consulté le 19/05/2022) - ** Résumé : Définition de RTP ainsi que des protocoles associés - ** Avis sur la ressource : Va droit au but : Bonne base pour comprendre le protocole -[^4]: "_Intégration de RTP dans Asterisk_", asteriskdocs.org, http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-APP-D-SECT-37.html (consulté le 18/05/2022) - ** Résumé : Montre une configuration minimaliste de RTP au sein d'astérisk - ** Avis sur la ressource : Clair mais assez leger : insuffisant pour une configuration total -[^5]: "_Prise en charge des pilote de canal_", wiki.asterisk.org, https://wiki.asterisk.org/wiki/display/AST/Video+Telephony (consulté le 19/05/2022) - ** Résumé : Donne les différents pilote de canal ainsi que les format video d'asterisk - ** Avis sur la ressource : Assez concis -[^6]: "_Prise en charge des vidéos_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) - ** Résumé : Document officiel d'asterisk (Prise en charge des médias) - ** Avis sur la ressource : Pas très détaillé concernant les flux videos -[^7]: "_RTP et la NAT_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) - ** Résumé : Fonctionnement d'Asterisk avec un routeur NAT et les problèmes rencontrés - ** Avis sur la ressource : Super explication de comment résoudre le problème de la nat dans une infrastructure Asterisk -[^8]: "_Pilote de canal_", wiki.auf.org, https://wiki.auf.org/wikiteki/Asterisk/QuelquesNotions (consulté le 19/05/2022) - ** Résumé : Détaille les différents cannaux et leurs pilote utilisés par Astérisk - ** Avis sur la ressource : Super article très explicite -[^9]: "_PABX_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Autocommutateur_t%C3%A9l%C3%A9phonique_priv%C3%A9 (consulté le 19/05/2022) - ** Résumé : Bref définition de ce que c'est qu'un PBX et de son evolution - ** Avis sur la ressource : Chouette définition +[^1]: "_Qu'est-ce que ASTERIX ?_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Asterisk_(logiciel) (consulté le 18/05/2022) + ** Résumé : Bref définition d'asterisk ainsi que de ses fonctionnalités + ** Avis sur la ressource : Très leger et pas assez explicite dans certains point + +[^2]: "_RTP ?_", iifa.fr, https://www.iifa.fr/video-ip) (consulté le 19/05/2022) + ** Résumé : Détaille les différents mode d'utilisation de RTP + ** Avis sur la ressource : Clair et schématique le meilleur pour comprendre RTP en unicast et multicast + +[^3]: "_RTP ?_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Real-time_Transport_Protocol (consulté le 19/05/2022) + ** Résumé : Définition de RTP ainsi que des protocoles associés + ** Avis sur la ressource : Va droit au but : Bonne base pour comprendre le protocole + +[^4]: "_Intégration de RTP dans Asterisk_", asteriskdocs.org, http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-APP-D-SECT-37.html (consulté le 18/05/2022) + ** Résumé : Montre une configuration minimaliste de RTP au sein d'astérisk + ** Avis sur la ressource : Clair mais assez leger : insuffisant pour une configuration total + +[^5]: "_Prise en charge des pilote de canal_", wiki.asterisk.org, https://wiki.asterisk.org/wiki/display/AST/Video+Telephony (consulté le 19/05/2022) + ** Résumé : Donne les différents pilote de canal ainsi que les format video d'asterisk + ** Avis sur la ressource : Assez concis + +[^6]: "_Prise en charge des vidéos_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) + ** Résumé : Document officiel d'asterisk (Prise en charge des médias) + ** Avis sur la ressource : Pas très détaillé concernant les flux videos + +[^7]: "_RTP et la NAT_", fr.wikipedia.org, https://wiki.asterisk.org/wiki/display/AST/Asterisk+Audio+and+Video+Capabilities (consulté le 19/05/2022) + ** Résumé : Fonctionnement d'Asterisk avec un routeur NAT et les problèmes rencontrés + ** Avis sur la ressource : Super explication de comment résoudre le problème de la nat dans une infrastructure Asterisk + +[^8]: "_Pilote de canal_", wiki.auf.org, https://wiki.auf.org/wikiteki/Asterisk/QuelquesNotions (consulté le 19/05/2022) + ** Résumé : Détaille les différents cannaux et leurs pilote utilisés par Astérisk + ** Avis sur la ressource : Super article très explicite + +[^9]: "_PABX_", fr.wikipedia.org, https://fr.wikipedia.org/wiki/Autocommutateur_t%C3%A9l%C3%A9phonique_priv%C3%A9 (consulté le 19/05/2022) + ** Résumé : Bref définition de ce que c'est qu'un PBX et de son evolution + ** Avis sur la ressource : Chouette définition diff --git "a/R\303\251seaux/delegation_dns.md" "b/R\303\251seaux/delegation_dns.md" index 55a6ba9..3485270 100644 --- "a/R\303\251seaux/delegation_dns.md" +++ "b/R\303\251seaux/delegation_dns.md" @@ -3,54 +3,43 @@ layout: default title: Délégation DNS parent: Réseaux --- - # Délégation DNS ## Domaines, sous-domaines et zones [^2] -La délégation DNS est le mécanisme permettant à un domaine de ne pas devoir gérer l'ensemble des machines qui le compose. Il peut décider de confier la gestion d'un sous-ensemble de ces machines à d'autres serveurs. Ces sous-ensembles sont déterminés par la hiérarchie des noms DNS : il s'agit des sous-domaines. - -Ainsi, le domaine 'mondomaine.dom.' peut être découpé en sous-domaines, dont par exemple 'sousdom.mondomaine.dom.'. Les machines qui appartient à 'mondomaine.dom.', mais à aucun des sous-domaines de ce dernier, constituent la **zone** 'mondomaine.dom.'. Un serveur de nom doit obligatoirement gérer sa zone, mais peut déléguer ses sous-domaines à d'autres serveurs de noms. +La délégation DNS est le mécanisme permettant à un domaine de ne pas devoir gérer l'ensemble des machines qui le compose. Il peut décider de confier la gestion d'un sous-ensemble de ces machines à d'autres serveurs. Ces sous-ensembles sont déterminés par la hiérarchie des noms DNS : il s'agit des sous-domaines. -En effet, chaque sous-domaine est lui-même une zone, et doit donc posséder un serveur de nom (désigné par Name Server (NS) ou Authoritative Server (SOA)). Dans notre exemple, il y aura donc (au minimum) une machine responsable pour la zone 'mondomaine.dom.', et une autre machine responsable de la zone 'sousdom.mondomaine.dom.'. +Ainsi, le domaine 'mondomaine.dom.' peut être découpé en sous-domaines, dont par exemple 'sousdom.mondomaine.dom.'. Les machines qui appartient à 'mondomaine.dom.', mais à aucun des sous-domaines de ce dernier, constituent la **zone** 'mondomaine.dom.'. Un serveur de nom doit obligatoirement gérer sa zone, mais peut déléguer ses sous-domaines à d'autres serveurs de noms. +En effet, chaque sous-domaine est lui-même une zone, et doit donc posséder un serveur de nom (désigné par Name Server (NS) ou Authoritative Server (SOA)). Dans notre exemple, il y aura donc (au minimum) une machine responsable pour la zone 'mondomaine.dom.', et une autre machine responsable de la zone 'sousdom.mondomaine.dom.'. ## La délégation en pratique -La délégation consiste donc à ce qu'un serveur de nom d'un domaine redirige les requêtes concernant les sous-domaines au serveur de noms du sous-domaine concerné [^1]. +La délégation consiste donc à ce qu'un serveur de nom d'un domaine redirige les requêtes concernant les sous-domaines au serveur de noms du sous-domaine concerné [^1]. -Pour cela, il doit posséder le nom du serveur de nom du sous-domaine dans son fichier de zone, sous la forme d'un record NS. Néanmoins, cela n'est pas suffisant, puisque les clients auront besoin de l'adresse IP de ce serveur du sous-domaine. +Pour cela, il doit posséder le nom du serveur de nom du sous-domaine dans son fichier de zone, sous la forme d'un record NS. Néanmoins, cela n'est pas suffisant, puisque les clients auront besoin de l'adresse IP de ce serveur du sous-domaine. -Par exemple, pour contacter 'www.sousdom.mondomaine.dom.', avoir le nom du serveur ns.sousdom.mondomaine.dom. n'est pas suffisant, il faut son adresse IP pour pouvoir lui envoyer une requête DNS. Or, cette machine appartient à la zone "sousdom" dont elle est elle-même responsable! +Par exemple, pour contacter 'www.sousdom.mondomaine.dom.', avoir le nom du serveur ns.sousdom.mondomaine.dom. n'est pas suffisant, il faut son adresse IP pour pouvoir lui envoyer une requête DNS. Or, cette machine appartient à la zone "sousdom" dont elle est elle-même responsable! -Pour pouvoir résoudre ce problème, il faut faire une exception au principe de répartition des machines par zone. Il va falloir ajouter l'IP de la machine ns.sousdom.mondomaine.dom. au fichier de zone du NS de mondomaine.dom, alors que cette machine n'appartient théoriquement pas à cette zone. +Pour pouvoir résoudre ce problème, il faut faire une exception au principe de répartition des machines par zone. Il va falloir ajouter l'IP de la machine ns.sousdom.mondomaine.dom. au fichier de zone du NS de mondomaine.dom, alors que cette machine n'appartient théoriquement pas à cette zone. -Cette adresse IP du serveur de nom d'un sous-domaine est encodée sous forme d'un record A. Ce record est appelé **Glue Record** [1]. +Cette adresse IP du serveur de nom d'un sous-domaine est encodée sous forme d'un record A. Ce record est appelé **Glue Record** [1]. -Dans le cas de notre exemple, la délégation de zone sera donc configurée en ajoutant les deux Resource Records suivants au fichier de zone du serveur de nom de 'mondomaine.dom.' : +Dans le cas de notre exemple, la délégation de zone sera donc configurée en ajoutant les deux Resource Records suivants au fichier de zone du serveur de nom de 'mondomaine.dom.' : ``` sousdom.mondomaine.dom. IN NS ns.sousdom.mondomaine.dom. ns.sousdom.mondomaine.dom IN A 1.2.3.4 ``` - - - - - ## Bibliographie -* [^1]: P. Mockapetris, IETF, [RFC 1034 - DOMAIN NAMES - CONCEPTS AND FACILITIES](https://datatracker.ietf.org/doc/html/rfc1034), Internet Draft, Nov. 1987 - +[^1]: P. Mockapetris, IETF, [RFC 1034 - DOMAIN NAMES - CONCEPTS AND FACILITIES](https://datatracker.ietf.org/doc/html/rfc1034), Internet Draft, Nov. 1987 + **Résumé** : Standard définissant les concepts du DNS - **Avis sur la ressource** : Il s'agit du texte de standardisation d'origine du DNS. Attention, il date de 1987 et possède de nombreuses mises à jour à consulter en parallèle. - -* [^2]: **Slides du cours Admin I - Chapitre DNS**, V. Van den Schrieck, 2018, consulté le 10 janvier 2022 - + **Avis sur la ressource** : Il s'agit du texte de standardisation d'origine du DNS. Attention, il date de 1987 et possède de nombreuses mises à jour à consulter en parallèle. + +[^2]: **Slides du cours Admin I - Chapitre DNS**, V. Van den Schrieck, 2018, consulté le 10 janvier 2022 + **Résumé** : Présentation de la hiérarchie DNS et des différents rôles des serveurs DNS **Avis sur la ressource** : C'est un slideshow présentant les bases du DNS, qui gagnerait à être plus détaillé (schémas, texte, ...) - - - - diff --git "a/R\303\251seaux/docker_swarm.md" "b/R\303\251seaux/docker_swarm.md" index d9d86d1..a8dfac3 100644 --- "a/R\303\251seaux/docker_swarm.md" +++ "b/R\303\251seaux/docker_swarm.md" @@ -1,5 +1,11 @@ +--- +layout: default +title: Docker Swarm +parent: Réseaux +--- # Docker swarm -Un docker swarm est un ensemble ("cluster") d'hôtes Docker ("Docker hosts"). Un docker host est une instance Docker Engine. Il est possible d'en avoir plusieurs sur une même machine hôte. On appelles "nodes" les docker hosts faisant partie d'un swarm. Ces nodes peuvent avoir deux rôles : + +Un docker swarm est un ensemble ("cluster") d'hôtes Docker ("Docker hosts"). Un docker host est une instance Docker Engine. Il est possible d'en avoir plusieurs sur une même machine hôte. On appelles "nodes" les docker hosts faisant partie d'un swarm. Ces nodes peuvent avoir deux rôles : - manager : gère l'adhésion des hôtes et la délégation des taches. - worker : fait tourner un service swarm. @@ -16,62 +22,71 @@ Le principe d'un docker swarm est de déployer les services sur un seule node, l [1][2][3] ## Créer un docker swarm et le rejoindre [4][14] + On initialise sur un docker host le swarm. Ce docker host deviendra un manager. -``` + +``` docker swarm init --advertise-addr= ``` + \ est l'adresse IP de la machine abritant le manager. La commande renvoie un message indiquant la commande à taper pour qu'un autre docker host puisse rejoindre le swarm en tant que worker ou manager. Elle ressemblera à : + ``` docker swarm join --token :2377 ``` + On peut obtenir ces commandes en utilisant sur un node manager : -``` + +``` docker swarm join-token [worker/manager] -``` +``` +On peut également changer changer le mode d'un node avec les commandes -On peut également changer changer le mode d'un node avec les commandes -``` +``` docker node promote docker node demote ``` + La première transforme un worker en manager et la seconde fait l'inverse. [9][10] ## Services et tasks [1][2][3] + Un services est la définition des tasks à exécuter sur les nodes worker ou manager. En définissant un service on indique quelle image utiliser et les commandes à exécuter dans les tasks. On définit pour ce service un état optimal que Docker essaiera de maintenir. On peut définir le nombre de répliques, ressources de stockage, ressources de réseau, ports exposés vers l'extérieur, etc. Le manager distribuera les tasks en fonction de l'état optimal. Les tasks, en opposition aux "standalone containers", sont des containers faisant partie d'un service swarm et étant gérés par un swarm manager. Le type de service qu'on définit dans l'état optimal permets de déterminer le nombre de tasks qui seront distribuées par le manager entre les workers. -- Replicated service : le manager distribue un nombre précis de tasks à travers les workers. +- Replicated service : le manager distribue un nombre précis de tasks à travers les workers. - Global service : le manager distribue une task à chaque node disponible dans le cluster. ![docker_swarm](https://user-images.githubusercontent.com/94830560/172188028-a8e5dc46-8b43-4404-bc66-99b7c880394c.png) - ## Création de services [5] + La parmétrisation d'un service peut être très complète. Voyons les points basiques. Pour plus d'informations, n'hésitez pas à consulter la documentation [Docker](https://docs.docker.com/engine/swarm/services/#create-a-service). La commande de base pour créer un service swarm est la suivante. \ est l'image qu'utiliserons les containers (tasks) et \ est la commande qui sera exécutée dans le container après sa création. + ``` docker service create ``` On peut bien sûr compléter cette commande avec une multitude de flags : -- ```--name ``` permets de donner un nom au service. -- ```--p/--publish ``` permets de choisir un Published Port, un port externe sur lequel on accède au service. -- ```--env ``` permets de définir des variables d'environnement. -- ```--workdir``` permets de définir un working directory. -- ```--user``` permets de définir un utilisateur. -- ```--mode``` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flag un service sera replicated par défaut. -- ```--replicas``` permets d'indiquer le nombre de répliques qu'on veut avoir. +- ``--name `` permets de donner un nom au service. +- ``--p/--publish `` permets de choisir un Published Port, un port externe sur lequel on accède au service. +- ``--env `` permets de définir des variables d'environnement. +- ``--workdir`` permets de définir un working directory. +- ``--user`` permets de définir un utilisateur. +- ``--mode`` permets d'indiquer le mode de service (replicated, global, ...). Si on n'utilise pas ce flag un service sera replicated par défaut. +- ``--replicas`` permets d'indiquer le nombre de répliques qu'on veut avoir. - etc. On peut également définir le comportement de mise à jour du service (délai avant mise à jour automatique, que faire lors d'une erreur de mise à jour, ...), définir une façon de revenir à une version antérieure du service en cas de problème avec la version actuelle du service. -Pour avoir des données persistantes on peut utiliser le flag ``` --mount ``` pour définir des data volumes ou bind mounts [[5]](https://docs.docker.com/engine/swarm/services/#give-a-service-access-to-volumes-or-bind-mounts). Le principe est similaire aux [bind mounts [12]](https://docs.docker.com/storage/bind-mounts/) et [named volumes [13]](https://docs.docker.com/storage/volumes/) utilisés pour avoir des données persistantes sur des standalone containers. +Pour avoir des données persistantes on peut utiliser le flag ``--mount`` pour définir des data volumes ou bind mounts [[5]](https://docs.docker.com/engine/swarm/services/#give-a-service-access-to-volumes-or-bind-mounts). Le principe est similaire aux [bind mounts [12]](https://docs.docker.com/storage/bind-mounts/) et [named volumes [13]](https://docs.docker.com/storage/volumes/) utilisés pour avoir des données persistantes sur des standalone containers. Quelques exemples issus de la documentation Docker [5] : @@ -82,12 +97,14 @@ docker service create --name helloworld \ --user my_user \ alpine ping docker.com ``` + ``` docker service create --name my_web \ --replicas 3 \ --publish published=8080,target=80 \ nginx ``` + ``` docker service create \ --mode global \ @@ -96,9 +113,10 @@ docker service create \ nginx:latest ``` -Il est facile de modifier un service avec la commande ``` docker service update ... ```. Elle vient, tout comme la commande de création, avec beaucoup de flags. [5] +Il est facile de modifier un service avec la commande ``docker service update ...``. Elle vient, tout comme la commande de création, avec beaucoup de flags. [5] ## Tolérance aux pannes et Load balancing [1] + Les workers communiquent l'état de leurs tasks qui leur ont été assigné. De cette manière le manager peut maintenir l'état désiré. Par exemple, dans le cas où un worker tombe en panne et n'est plus disponible le manager redistribue une nouvelle Task à un autre worker pour respecter le nombre de répliques qu'on doit avoir. Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DNS pour chaque service dans le swarm. Le manager fait du load balancing pour distribuer les requêtes entre les service disponibles en fonction du nom DNS du service. Il utilise le load balancing également pour rendre les services accessibles à l'extérieur du swarm si on le souhaite. Il peut assigner automatiquement un "Published Port", un port extérieur, à un service (entre 30 000 et 32 767). On peut aussi choisir nous même un port non utilisé. @@ -108,28 +126,31 @@ Le mode swarm possède un DNS interne qui assigne automatiquement une entrée DN     - # Réseaux overlay + On peut aussi préciser à la création d'un service un réseau overlay. Le but d'un réseau overlay est de permettre la communication entre des containers sur des docker hosts/machines différentes. Tous les containers peuvent participer à un réseau overlay, peu importe si ce sont des tasks définis par un service ou des standalone containers. Dès qu'un container rejoindra le réseau une adresse ip du réseau lui sera attribué. [6] ## Création d'un réseau overlay [7][11] -On doit créer le réseau overlay sur un manager. Ce dernier fera savoir aux autres nodes que le réseau existe. + +On doit créer le réseau overlay sur un manager. Ce dernier fera savoir aux autres nodes que le réseau existe. + ``` docker network create -d overlay ``` -Quelques flags à utiliser : +Quelques flags à utiliser : -- ```--attachable```permets d'attacher manuellement des containers au réseau et donc à des standalone containers d'utiliser le réseau overlay. -- ``` -d / --driver``` indique le driver qui gèrera le réseau (bridge, overlay, ...). Bridge est mis par défaut, il faut donc préciser que c'est un réseau overlay dans notre cas avec ``` --d overlay```. -- ``` --gateway ``` définit une Gateway pour le réseau. -- ```--internal ```empêche l'accès au réseau depuis l'exterieur. -- ```--ipv6 ```active l'IPv6. -- ``` --subnet ``` définit le sous-réseau dans lequel Docker va piocher les adresses à attribuer. Docker attribue par défaut des subnets aux différents réseaux et fait en sorte qu'il ne se superposent pas. Ce flag nous permets de choisir le subnet d'adresses. -- ``` --ip-range ``` permets de définir un sous-ensemble d'adresses ip dans le subnet que Docker utilisera pour l'attributaion des ip. +- ``--attachable``permets d'attacher manuellement des containers au réseau et donc à des standalone containers d'utiliser le réseau overlay. +- `` -d / --driver`` indique le driver qui gèrera le réseau (bridge, overlay, ...). Bridge est mis par défaut, il faut donc préciser que c'est un réseau overlay dans notre cas avec `` --d overlay``. +- ``--gateway`` définit une Gateway pour le réseau. +- ``--internal ``empêche l'accès au réseau depuis l'exterieur. +- ``--ipv6 ``active l'IPv6. +- ``--subnet`` définit le sous-réseau dans lequel Docker va piocher les adresses à attribuer. Docker attribue par défaut des subnets aux différents réseaux et fait en sorte qu'il ne se superposent pas. Ce flag nous permets de choisir le subnet d'adresses. +- ``--ip-range`` permets de définir un sous-ensemble d'adresses ip dans le subnet que Docker utilisera pour l'attributaion des ip. - etc. Exemple de la documentation Docker [11] : + ``` docker network create --d overlay \ @@ -140,20 +161,24 @@ Exemple de la documentation Docker [11] : my_overlay ``` - -Pour plus d'infos ou exemples consultez la documentation [Docker [11]](https://docs.docker.com/engine/reference/commandline/network_create/) ou la commande ``` docker network create --help```. +Pour plus d'infos ou exemples consultez la documentation [Docker [11]](https://docs.docker.com/engine/reference/commandline/network_create/) ou la commande `` docker network create --help``. ## Attribuer un réseau overlay à un service ou un standalone container [7][8] -Attribuer un réseau overlay à un service ou standalone container ce fait à sa création avec le flag ``` --network ``` . + +Attribuer un réseau overlay à un service ou standalone container ce fait à sa création avec le flag ``--network`` . + ``` docker service create ... --network ... ``` -Dans le cas du standalone container il faut veiller à ce que le réseau ai été créé avec le flag ```--attachable ```. Sans ça on ne pourra tout simplement pas attribuer le réseau overlay. + +Dans le cas du standalone container il faut veiller à ce que le réseau ai été créé avec le flag ``--attachable ``. Sans ça on ne pourra tout simplement pas attribuer le réseau overlay. + ``` docker run ... --network ... ``` ## Ports utilisés [6][7] + Un réseau overlay utilise plusieurs ports pour communiquer : - 2377/tcp : communications pour la gestion du cluster @@ -165,23 +190,23 @@ Il faut donc veiller à ouvrir ces ports sur chaque Docker host participant à u     -# Bibliographie -| N° | Auteur | Date de rédaction | Date de consultation | Titre | Lien | -|---|---|---|---|---|---| -| 1 |Docker| - | 1 Juin 2022 | Swarm mode key concepts | https://docs.docker.com/engine/swarm/key-concepts/ | -|2|Docker| - |1 Juin 2022| Getting started with swarm mode |https://docs.docker.com/engine/swarm/swarm-tutorial/| -|3|Docker| - |1 Juin 2022| How nodes work |https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/| -|4|Docker| - |1 Juin 2022| Create a swarm |https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/| -|5|Docker| - |3 Juin 2022|Deploy services to a swarm|https://docs.docker.com/engine/swarm/services/| -|6|Docker| - |3 Juin 2022|Use overlay networks|https://docs.docker.com/network/overlay/| -|7|Docker| - |3 Juin 2022|Networking with overlay networks|https://docs.docker.com/network/network-tutorial-overlay/| -|8|Docker| - |3 Juin 2022|Networking with standalone containers|https://docs.docker.com/network/network-tutorial-standalone/| -|9|Docker| - |1 Juin 2022|docker node promote|https://docs.docker.com/engine/reference/commandline/node_promote/| -|10|Docker| - |1 Juin 2022|docker node demote|https://docs.docker.com/engine/reference/commandline/node_demote/ | -|11|Docker| - |3 Juin 2022|docker network create|https://docs.docker.com/engine/reference/commandline/network_create/| -|12|Docker| - |6 Juin 2022|Use volumes|https://docs.docker.com/storage/volumes/| -|13|Docker| - |6 Juin 2022|Use bind mounts|https://docs.docker.com/storage/bind-mounts/| -|14|Sandip Bhowmik|15 Novembre 2018|1 Juin 2022|How to Configure Docker Swarm with multiple Docker Nodes on Ubuntu 18.04|https://linuxconfig.org/how-to-configure-docker-swarm-with-multiple-docker-nodes-on-ubuntu-18-04| -|15|BMitch|19 Février 2018|1 Juin 2022|What is the difference between docker host and node?|https://stackoverflow.com/questions/48801206/what-is-the-difference-between-docker-host-and-node| -|16|Simplilearn - Matthew|26 Octobre 2018|1 Juin 2022|Docker Swarm - Docker Swarm Tutorial - What Is Docker Swarm? - Docker Swarm Example - Simplilearn|https://www.youtube.com/watch?v=Tm0Q5zr3FL4| - +# Bibliographie + +| N° | Auteur | Date de rédaction | Date de consultation | Titre | Lien | +| --- | --------------------- | ------------------ | -------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| 1 | Docker | - | 1 Juin 2022 | Swarm mode key concepts | https://docs.docker.com/engine/swarm/key-concepts/ | +| 2 | Docker | - | 1 Juin 2022 | Getting started with swarm mode | https://docs.docker.com/engine/swarm/swarm-tutorial/ | +| 3 | Docker | - | 1 Juin 2022 | How nodes work | https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/ | +| 4 | Docker | - | 1 Juin 2022 | Create a swarm | https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/ | +| 5 | Docker | - | 3 Juin 2022 | Deploy services to a swarm | https://docs.docker.com/engine/swarm/services/ | +| 6 | Docker | - | 3 Juin 2022 | Use overlay networks | https://docs.docker.com/network/overlay/ | +| 7 | Docker | - | 3 Juin 2022 | Networking with overlay networks | https://docs.docker.com/network/network-tutorial-overlay/ | +| 8 | Docker | - | 3 Juin 2022 | Networking with standalone containers | https://docs.docker.com/network/network-tutorial-standalone/ | +| 9 | Docker | - | 1 Juin 2022 | docker node promote | https://docs.docker.com/engine/reference/commandline/node_promote/ | +| 10 | Docker | - | 1 Juin 2022 | docker node demote | https://docs.docker.com/engine/reference/commandline/node_demote/ | +| 11 | Docker | - | 3 Juin 2022 | docker network create | https://docs.docker.com/engine/reference/commandline/network_create/ | +| 12 | Docker | - | 6 Juin 2022 | Use volumes | https://docs.docker.com/storage/volumes/ | +| 13 | Docker | - | 6 Juin 2022 | Use bind mounts | https://docs.docker.com/storage/bind-mounts/ | +| 14 | Sandip Bhowmik | 15 Novembre 2018 | 1 Juin 2022 | How to Configure Docker Swarm with multiple Docker Nodes on Ubuntu 18.04 | https://linuxconfig.org/how-to-configure-docker-swarm-with-multiple-docker-nodes-on-ubuntu-18-04 | +| 15 | BMitch | 19 Février 2018 | 1 Juin 2022 | What is the difference between docker host and node? | https://stackoverflow.com/questions/48801206/what-is-the-difference-between-docker-host-and-node | +| 16 | Simplilearn - Matthew | 26 Octobre 2018 | 1 Juin 2022 | Docker Swarm - Docker Swarm Tutorial - What Is Docker Swarm? - Docker Swarm Example - Simplilearn | https://www.youtube.com/watch?v=Tm0Q5zr3FL4 | diff --git "a/R\303\251seaux/kubernetes.md" "b/R\303\251seaux/kubernetes.md" index 430b88b..ae95e13 100644 --- "a/R\303\251seaux/kubernetes.md" +++ "b/R\303\251seaux/kubernetes.md" @@ -3,38 +3,35 @@ layout: default title: Kubernetes parent: Réseaux --- - -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) - # Kubernetes ## Historique [1] -La méthode de déploiement de plusieurs applications a énormément évolué. Originellement, les applications étaient déployées sur le serveur physique. Cette solution a vite montré des limites de performances. +La méthode de déploiement de plusieurs applications a énormément évolué. Originellement, les applications étaient déployées sur le serveur physique. Cette solution a vite montré des limites de performances. -Pour répondre à cette problématique, la virtualisation est apparue. Elle consiste à exécuter des applications dans des machines virtuelles (VMs) avec un système d'exploitation propre par-dessus l'OS hôte. Cela permet une structure évolutive et une sécurité plus importante par l'isolation des applications. +Pour répondre à cette problématique, la virtualisation est apparue. Elle consiste à exécuter des applications dans des machines virtuelles (VMs) avec un système d'exploitation propre par-dessus l'OS hôte. Cela permet une structure évolutive et une sécurité plus importante par l'isolation des applications. Les VMs ont cependant encore un problème de ressource, chaque application nécessitant un Kernel. La conteneurisation est ensuite arrivée pour pallier à cela. Un conteneur est similaire à une VM dans son fonctionnement logique. La différence majeure est que les conteneurs sont exécutés sur l'OS hôte et non sur son propre OS. Cette avancée permet d'avoir des applications légères, une meilleure portabilité et une uniformité pour tous les environnements. ## Qu'est ce que Kubernetes ? [1] [2] -Kubernetes est un outil permettant la gestion de conteneurs. Il permet le déploiement et la restauration automatique de plusieurs applications sur plusieurs machines physiques disponibles dans le réseau Kubernetes. -Il permet également la mise à l'échelle et facilite la mise à jour de ces applications. Toutes ses fonctionnalités ont pour objectif principal d'assurer une haute disponibilité et une gestion des ressources évolutive. +Kubernetes est un outil permettant la gestion de conteneurs. Il permet le déploiement et la restauration automatique de plusieurs applications sur plusieurs machines physiques disponibles dans le réseau Kubernetes. +Il permet également la mise à l'échelle et facilite la mise à jour de ces applications. Toutes ses fonctionnalités ont pour objectif principal d'assurer une haute disponibilité et une gestion des ressources évolutive. -Un environnement Kubernetes, appelé Cluster, est composé de 1 ou plusieurs Node(s) ou nœud(s). Un nœud représente une machine physique du Cluster. -Parmi les Nodes, au moins 1 doit servir de Master Node. Celui- où ceux-ci s'occupent, en plus des ressources applicatives déployées par le client, de gérer les composants nécessaires au fonctionnement du Cluster. +Un environnement Kubernetes, appelé Cluster, est composé de 1 ou plusieurs Node(s) ou nœud(s). Un nœud représente une machine physique du Cluster. +Parmi les Nodes, au moins 1 doit servir de Master Node. Celui- où ceux-ci s'occupent, en plus des ressources applicatives déployées par le client, de gérer les composants nécessaires au fonctionnement du Cluster. -Kubernetes propose un ensemble de ressources permettant la gestion des applications. +Kubernetes propose un ensemble de ressources permettant la gestion des applications. L'unité de base de Kubernetes est un Pod. Il contient le ou les conteneurs nécessaires au fonctionnement d'une application, et se voit attribuer une adresse IP interne au Cluster. ## Quelques concepts Kubernetes [1] [2] -Comme expliqué ci-dessus, Kubernetes propose une multitude de concepts pour organiser une infrastructure d'applications. En voici une liste non exhaustive : +Comme expliqué ci-dessus, Kubernetes propose une multitude de concepts pour organiser une infrastructure d'applications. En voici une liste non exhaustive : 1. Deployments -Les Deployments, où déploiements, sont des ressources permettant de contrôler un Replication Set. Ce dernier est une couche supplémentaire permettant la gestion de plusieurs Pods basés sur une même image. -Alors que les ReplicaSet s'occupent d'assurer la disponibilité d'un certain nombre de répliques d'une application, un déploiement permet en plus de gérer la mise à jour des Pods en garantissant la disponibilité de l'application. Il permet aussi de garder un historique des versions de l'application et d'y revenir au cas où une mise à jour s'avère non fonctionnelle. +Les Deployments, où déploiements, sont des ressources permettant de contrôler un Replication Set. Ce dernier est une couche supplémentaire permettant la gestion de plusieurs Pods basés sur une même image. +Alors que les ReplicaSet s'occupent d'assurer la disponibilité d'un certain nombre de répliques d'une application, un déploiement permet en plus de gérer la mise à jour des Pods en garantissant la disponibilité de l'application. Il permet aussi de garder un historique des versions de l'application et d'y revenir au cas où une mise à jour s'avère non fonctionnelle. 2. Service @@ -42,41 +39,39 @@ Un Service Kubernetes est une ressource permettant de faire le lien entre les di 3. Volumes et Persistent Volumes -Les Volumes permettent de créer des ressources partagées pour tous les conteneurs dans un pod. La durée de vie d'un Volume est liée à celle du Pod utilisant ces données. Les Persistent Volumes ont eux un cycle de vie indépendant du/des pod(s) auquel/auxquels ils sont liés. Cela permet d'assurer une persistance des données même si un pod vient à disparaitre. +Les Volumes permettent de créer des ressources partagées pour tous les conteneurs dans un pod. La durée de vie d'un Volume est liée à celle du Pod utilisant ces données. Les Persistent Volumes ont eux un cycle de vie indépendant du/des pod(s) auquel/auxquels ils sont liés. Cela permet d'assurer une persistance des données même si un pod vient à disparaitre. 4. Ingress -Un Ingress permet d'exposer des applications au travers de règles de routage. Cela permet d'avoir plusieurs applications accessibles sur la même adresse IP publique. Les Ingress s'occupent uniquement de gérer les accès depuis l'extérieur. Cette ressource nécessite cependant un contrôleur d'Ingress, qui est parfois intégré avec le fournisseur, sinon configuré en plus des autres ressources. +Un Ingress permet d'exposer des applications au travers de règles de routage. Cela permet d'avoir plusieurs applications accessibles sur la même adresse IP publique. Les Ingress s'occupent uniquement de gérer les accès depuis l'extérieur. Cette ressource nécessite cependant un contrôleur d'Ingress, qui est parfois intégré avec le fournisseur, sinon configuré en plus des autres ressources. ## Exemple en application -Une entreprise possède 2 serveurs pour héberger des applications Web. Ces applications nécessitant une très haute disponibilité, une faible latence et pouvoir supporter beaucoup de requêtes, l'entreprise à décidé de mettre en ligne ces applications à l'aide de Kubernetes. Le schéma ci-dessous représente l'infrastructure Kubernetes de l'entreprise. +Une entreprise possède 2 serveurs pour héberger des applications Web. Ces applications nécessitant une très haute disponibilité, une faible latence et pouvoir supporter beaucoup de requêtes, l'entreprise à décidé de mettre en ligne ces applications à l'aide de Kubernetes. Le schéma ci-dessous représente l'infrastructure Kubernetes de l'entreprise. Les 2 serveurs de l'entreprise font office de Master Node, ce qui permet d'assurer une haute disponibilité des services de gestion du Cluster Kubernetes. -Chaque application est mise en ligne à l'aide d'un Deployment. Chaque Déploiement assure que 2 répliques de l'application soient en ligne dans toutes les circonstances. Ces 2 répliques sont donc des Pods gérés par le Déploiement. Les outils des Master Nodes permettent d'équilibrer la charge sur les différentes machines du Cluster. +Chaque application est mise en ligne à l'aide d'un Deployment. Chaque Déploiement assure que 2 répliques de l'application soient en ligne dans toutes les circonstances. Ces 2 répliques sont donc des Pods gérés par le Déploiement. Les outils des Master Nodes permettent d'équilibrer la charge sur les différentes machines du Cluster. -L'application App 2 nécessite une base de données à laquelle toutes les répliques doivent avoir accès. La base de données doit être déployée dans l'environnement Kubernetes à l'aide d'un Persistant Volume (PV). Chaque réplique d'App 2 y accède à l'aide du label indiqué lors de la création du PV, ou de son adresse IP interne au Cluster. Etant donné que c'est un persistant volume, les données ne disparaitrons si un Pod cesse de fonctionner. +L'application App 2 nécessite une base de données à laquelle toutes les répliques doivent avoir accès. La base de données doit être déployée dans l'environnement Kubernetes à l'aide d'un Persistant Volume (PV). Chaque réplique d'App 2 y accède à l'aide du label indiqué lors de la création du PV, ou de son adresse IP interne au Cluster. Etant donné que c'est un persistant volume, les données ne disparaitrons si un Pod cesse de fonctionner. -Pour permettre aux utilisateurs (User 1 et User 2) d'accéder à l'application App 2, cette dernière doit être exposée sur le réseau externe. Pour cela, 2 types de ressources Kubernetes sont créées dans le Cluster. La première est un Service. Chaque application possède son propre Service de type NodePort. Ce Service permet de rendre l'application disponible sur un port de l'adresse IP de chacun des Nodes. -Acccèder à l'application au travers de l'adresse IP des Nodes n'est pas une bonne pratique. Cela réduit l'efficacité de l'équilibrage de charge et expose les adresses IP de tous les Nodes du Cluster. -Pour pallier à cela, un Ingress est créé. L'Ingress récupère les Services des 2 applications et leur attribue une route. Lorsqu'un utilisateur désire accèder à l'application, celui-ci doit indiquer l'adresse IP (ou le nom de domaine si un [DNS est mis en place](https://kubernetes.io/fr/docs/concepts/services-networking/dns-pod-service/)) qui lui est attribué par le Ingress Controller et la route définie pour l'accès à l'application. +Pour permettre aux utilisateurs (User 1 et User 2) d'accéder à l'application App 2, cette dernière doit être exposée sur le réseau externe. Pour cela, 2 types de ressources Kubernetes sont créées dans le Cluster. La première est un Service. Chaque application possède son propre Service de type NodePort. Ce Service permet de rendre l'application disponible sur un port de l'adresse IP de chacun des Nodes. +Acccèder à l'application au travers de l'adresse IP des Nodes n'est pas une bonne pratique. Cela réduit l'efficacité de l'équilibrage de charge et expose les adresses IP de tous les Nodes du Cluster. +Pour pallier à cela, un Ingress est créé. L'Ingress récupère les Services des 2 applications et leur attribue une route. Lorsqu'un utilisateur désire accèder à l'application, celui-ci doit indiquer l'adresse IP (ou le nom de domaine si un [DNS est mis en place](https://kubernetes.io/fr/docs/concepts/services-networking/dns-pod-service/)) qui lui est attribué par le Ingress Controller et la route définie pour l'accès à l'application. ![Infrastructure Kubernetes](https://user-images.githubusercontent.com/56077782/171189387-2a83fdad-00d5-44b8-bd10-0d934cab1eb0.png) - -User 1 et User 2 désirent accéder à l'application App 2 en utilisant l'URL suivante: /app2. -Les requêtes sont alors renvoyées par l'Ingress vers le Service de l'App 2. Celui-ci accède ensuite à l'un des Pods lié au Service de l'App 2. +User 1 et User 2 désirent accéder à l'application App 2 en utilisant l'URL suivante: /app2. +Les requêtes sont alors renvoyées par l'Ingress vers le Service de l'App 2. Celui-ci accède ensuite à l'un des Pods lié au Service de l'App 2. Les 2 utilisateurs ont alors accès à la même application avec les mêmes données, mais sur des répliques différentes. ## Bibliographie 1. **Documentation Officielle Kubernetes**, Kubernetes, [What is Kubernetes?](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/), Dernière mise à jour le 4 avril 2022, consulté dernièrement le 7 mai 2022 - **Résumé** : Présentation officielle de Kubernetes + **Résumé** : Présentation officielle de Kubernetes - **Avis sur la ressource** : Cette présentation explique clairement l'utilité de Kubernetes avec l'arrivée de la virtualisation ainsi que le fonctionnement de base de la technologie. - + **Avis sur la ressource** : Cette présentation explique clairement l'utilité de Kubernetes avec l'arrivée de la virtualisation ainsi que le fonctionnement de base de la technologie. 2. **Introduction aux concepts de Kubernetes**, Digital Ocean, [An introduction to Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes), Justin Ellingwood, 1 octobre 2014 (dernière mise à jour le 2 mai 2018), consulté dernièrement le 7 mai 2022 - **Résumé** : Explication d'un bon nombre des concepts et composants de Kubernetes - - **Avis sur la ressource** : Ce site reprends beaucoup des concepts de Kubernetes avec une explication claire de chacun d'entre eux. + **Résumé** : Explication d'un bon nombre des concepts et composants de Kubernetes + + **Avis sur la ressource** : Ce site reprends beaucoup des concepts de Kubernetes avec une explication claire de chacun d'entre eux. diff --git "a/R\303\251seaux/proxy.md" "b/R\303\251seaux/proxy.md" index 38a3225..5b1bcee 100644 --- "a/R\303\251seaux/proxy.md" +++ "b/R\303\251seaux/proxy.md" @@ -3,84 +3,101 @@ layout: default title: Proxy parent: Réseaux --- - # Le proxy -## Qu'est-ce qu'un proxy?[^1] [^2] +## Qu'est-ce qu'un proxy?[^2] + Tiré de l'anglais qui signifie "procuration", le terme proxy désigne un serveur qui permet de relayer les requêtes. Un serveur Proxy (également appelé serveur mandataire) est donc un serveur qui agit comme intermédiaire entre un utilisateur demandeur d'une ressource et le serveur distant, fournisseur de cette ressource. L'utilisateur ne peut plus s'adresser directement au serveur distant sans passer par le serveur Proxy, qui fonctionne au nom du client, masquant potentiellement la véritable origine de la demande. + ###### Fig.1 Schéma d'un serveur Proxy - -###### "https://www.proxyvpn.fr/wp-content/uploads/2019/02/1200px-CPT-Proxy.svg_.png"© proxyvpn.fr + +###### "https://www.proxyvpn.fr/wp-content/uploads/2019/02/1200px-CPT-Proxy.svg_.png"© proxyvpn.fr ## Que se passe-t-il au niveau du réseau ? [^3] + Le Proxy travaille sur la couche application, au niveau 7 du modèle OSI. Concrètement, dans le cas d'un proxy web, il décapsule donc toutes les couches inférieures quand il reçoit une requête http et réencapsule les paquets IP pour les retransmettre vers le serveur de destination. Il y a donc deux connexions TCP ce qui signifie une rupture de flux au niveau du Proxy. ###### Fig.2 Décapsulation de la requête reçue et réencapsulation + ![Décapsulation de la requête et réencapsulation](https://zestedesavoir.com/media/galleries/5382/2e3db985-cde5-4e61-9bf7-5af14485d872.png) + ###### "Décapsulation de la requête et réencapsulation" https://zestedesavoir.com/media/galleries/5382/2e3db985-cde5-4e61-9bf7-5af14485d872.png Dans un réseau, on peut donc empêcher les utilisateurs, grâce à un Firewall d'accéder directement à Internet et les obliger de passer par un Proxy, ce qui permet de contrôler les accès dans un sens comme dans l'autre. -## Les différentes fonctionnalités d'un serveur Proxy [^2] [^4] [^5] +## Les différentes fonctionnalités d'un serveur Proxy [^4][^5] #### **Amélioration des performances** + * Le caching Proxy ou proxy-cache -Grâce à sa capacité de garder en cache les pages les plus souvent visitées par les utilisateurs du réseau local, le Proxy est capable de réduire le temps d'accès à ces pages ainsi que la bande passante vers Internet. -Le caching proxy a été le premier type de serveur proxy. + Grâce à sa capacité de garder en cache les pages les plus souvent visitées par les utilisateurs du réseau local, le Proxy est capable de réduire le temps d'accès à ces pages ainsi que la bande passante vers Internet. + Le caching proxy a été le premier type de serveur proxy. * Le PEP (Performance Enhancing Proxy) -C'est un Proxy concu pour améliorer les performances TCP en cas de : - - temps aller-retour élevés - - pertes de paquets élevées - - taux de chargement et téléchargement très différents -Il peut compresser les données afin d'utiliser le réseau plus efficacement ce qui participe également à la rapidité de la navigation. + C'est un Proxy concu pour améliorer les performances TCP en cas de : + - temps aller-retour élevés + - pertes de paquets élevées + - taux de chargement et téléchargement très différents + Il peut compresser les données afin d'utiliser le réseau plus efficacement ce qui participe également à la rapidité de la navigation. + #### **Anonymisation de l'utilisateur** -Le serveur Proxy transmet la requête au serveur distant via une adresse ip publique et de ce fait masque l'adresse ip initiale, celle de l'utilisateur. La réponse du serveur distant ne se fait que via le Proxy car il est le seul à connaître l'adresse d'origine. L'utilisateur devient invisible ou presque car le trafic reste entièrement visible pour le FAI (Fournisseur d'Accès à Internet) et pour le Proxy lui-même. Un certain degré de confiance doit s'établir entre le serveur Proxy et son utilisateur. + +Le serveur Proxy transmet la requête au serveur distant via une adresse ip publique et de ce fait masque l'adresse ip initiale, celle de l'utilisateur. La réponse du serveur distant ne se fait que via le Proxy car il est le seul à connaître l'adresse d'origine. L'utilisateur devient invisible ou presque car le trafic reste entièrement visible pour le FAI (Fournisseur d'Accès à Internet) et pour le Proxy lui-même. Un certain degré de confiance doit s'établir entre le serveur Proxy et son utilisateur. #### **Journalisation des connexions** -Le Proxy enregistre l'ensemble des requêtes dans les logs et offre ainsi une traçabilité centralisée des flux. Ceci permet, entre autres, de rédéfinir la politique de sécurité du réseau sur base des données récoltées sans oublier, dans le cadre d'une entreprise de concilier RGPD et récolte de ces données parfois à caractère personnel. + +Le Proxy enregistre l'ensemble des requêtes dans les logs et offre ainsi une traçabilité centralisée des flux. Ceci permet, entre autres, de rédéfinir la politique de sécurité du réseau sur base des données récoltées sans oublier, dans le cadre d'une entreprise de concilier RGPD et récolte de ces données parfois à caractère personnel. #### **Filtrage et surveillance** + - Contrôle de contenu - - Un filtrage peut être appliqué suivant la politique de sécurité en place sur le réseau. Ceci permet de bloquer les sites inutiles dans un cadre de travail (pornographie, réseaux sociaux,...) mais également ceux considérés comme malveillants. -Les requêtes peuvents être filtrées selon : - - des listes - - White List -> le filtrage se fait à partir d'une liste de sites autorisés - - Black List -> le filtrage se fait à partir d'une liste de sites non autorisés - - une URL - - un filtre d'expressions régulières (URL Regex filtering) - - le MIME - - des mots-clés du contenu + - Un filtrage peut être appliqué suivant la politique de sécurité en place sur le réseau. Ceci permet de bloquer les sites inutiles dans un cadre de travail (pornographie, réseaux sociaux,...) mais également ceux considérés comme malveillants. + Les requêtes peuvents être filtrées selon : + - des listes + - White List -> le filtrage se fait à partir d'une liste de sites autorisés + - Black List -> le filtrage se fait à partir d'une liste de sites non autorisés + - une URL + - un filtre d'expressions régulières (URL Regex filtering) + - le MIME + - des mots-clés du contenu - Contournement des filtres - - Dans certains cas, les utilisateurs peuvent contourner les proxies qui filtrent à l'aide de listes noires en envoyant les informations proxy à partir d'un site ne figurant pas sur la liste. - - Certains serveurs limitent leur service en fonction de l'origine de la requête. Par exemple, en cas de censure gouvernementale qui vise à bloquer l'accès à certains sites dits subversifs en utlisant la géolocalisation basée sur IP. En passant par un proxy situé dans un autre pays, il est possible de contourner le filtrage(5). - Dans l'autre sens, un internaute étranger pourra accéder à un site qui n'accepte que les internautes d'un pays ciblé en passant par un proxy situé dans le pays en question. + + - Dans certains cas, les utilisateurs peuvent contourner les proxies qui filtrent à l'aide de listes noires en envoyant les informations proxy à partir d'un site ne figurant pas sur la liste. + - Certains serveurs limitent leur service en fonction de l'origine de la requête. Par exemple, en cas de censure gouvernementale qui vise à bloquer l'accès à certains sites dits subversifs en utlisant la géolocalisation basée sur IP. En passant par un proxy situé dans un autre pays, il est possible de contourner le filtrage(5). + Dans l'autre sens, un internaute étranger pourra accéder à un site qui n'accepte que les internautes d'un pays ciblé en passant par un proxy situé dans le pays en question. #### **Sécurisation** + Le serveur Proxy protège les utilisateurs de son réseau en servant de visage public unique. Tous ses utilisateurs sont anonymes car ils sont dissimulés par l'adresse IP du Proxy. En cas de tentative de piratage sur une machine spécifique, son adresse IP sera beaucoup plus difficile à trouver. De plus, les Proxies peuvent jouer le rôle de Firewall ce qui augmente encore la sécurité du réseau. -## Types de serveurs Proxy [^1] [^2] -Il existe de nombreux types de serveurs Proxy classés selon leur fonctionnalités décrites ci-dessus. -#### **HTTP Proxy ou Web Proxy**[^7] [^5] +## Types de serveurs Proxy [^2] + +Il existe de nombreux types de serveurs Proxy classés selon leur fonctionnalités décrites ci-dessus. + +#### **HTTP Proxy ou Web Proxy**[^5] + - Proxy transparent -Ce type de Proxy ne masque pas l'adresse IP de l'utilisateur. Il est utilisé par les écoles, les organisations et les gouvernements afin de pouvoir contrôler l'utilisation d'Internet et ainsi censurer son contenu. -Le serveur Web connaît donc l'adresse IP de l'utilisateur mais il sait également que l'utilisateur utilise un Proxy. + Ce type de Proxy ne masque pas l'adresse IP de l'utilisateur. Il est utilisé par les écoles, les organisations et les gouvernements afin de pouvoir contrôler l'utilisation d'Internet et ainsi censurer son contenu. + Le serveur Web connaît donc l'adresse IP de l'utilisateur mais il sait également que l'utilisateur utilise un Proxy. - Proxy anonyme -L'adresse IP de l'utilisateur est remplacée par l'adresse IP du Proxy. -Le serveur Web ne connaît pas l'adresse IP de l'utilisateur mais il sait que l'utiilisateur utilise un Proxy. + L'adresse IP de l'utilisateur est remplacée par l'adresse IP du Proxy. + Le serveur Web ne connaît pas l'adresse IP de l'utilisateur mais il sait que l'utiilisateur utilise un Proxy. - Proxy déformant ou distordant -Le Proxy transmet une fausse adresse IP pour désigner l'utilisateur leurrant ainsi le serveur quant à la source de la requête. -Le serveur Web sait que l'utilisateur utilise un proxy et pense connaître l'adresse IP d'origine. + Le Proxy transmet une fausse adresse IP pour désigner l'utilisateur leurrant ainsi le serveur quant à la source de la requête. + Le serveur Web sait que l'utilisateur utilise un proxy et pense connaître l'adresse IP d'origine. - Proxy High Anonymity ou Proxy Elite -Il s'agit du type de Proxy le plus sécurisé car il parvient à dissimuler également son existence au serveur en modifiant périodiquement l'adresse IP qu'il présente au serveur Web. -Le serveur Web ne connaît ni l'adresse IP de l'utilisateur ni celle du Proxy. + Il s'agit du type de Proxy le plus sécurisé car il parvient à dissimuler également son existence au serveur en modifiant périodiquement l'adresse IP qu'il présente au serveur Web. + Le serveur Web ne connaît ni l'adresse IP de l'utilisateur ni celle du Proxy. #### **Proxy SOCK (Socket Secure)** [^6] + Le Proxy SOCK est un Proxy de tunneling, technique consistant à utiliser un protocole pour transporter des données à l'intérieur d'un autre protocole. Il crée une connexion TCP vers un autre serveur derrière le Firewall au nom du client. Le serveur Proxy SOCK relaie la session TCP et UDP d'un utilisateur qui n'est pas autorisé à établir une connexion avec un serveur extérieur au-delà du Firewall. + ###### Fig.3 Schéma d'un Proxy de tunneling + ![](https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png) _shivk "https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png" @@ -88,92 +105,119 @@ _shivk "https://miro.medium.com/max/1378/1*St3AO8UxsllEnO93Pqoqcw.png" "Le client SSH crée un proxy SOCK (tunnel). Il prend le trafic local envoyé à un port spécifique du PC et l'envoie via la connexion SSH à un emplacement distant, le serveur SSH" #### **Proxy FTP (File Transfer Protocol)**[^11] + Celui-ci fonctionne comme un relais pour le transfert de fichiers et permet de contrôler les connexions et les commmandes telles que PUT et GET en fonction des adresses source et de destination et de l'authentification de l'utilisateur. Il peut également réguler la quantité et la fréquence des transferts et limiter la taille des fichiers. #### **Proxy SIP (Session Initiation Protocol)**[^11] + Basé sur le protocole SIP, le Proxy SIP permet de contrôler les appels au sein d'un réseau. Il redirige les appels selon les informations reprises dans le registre SIP. #### **Proxy SSL (HTTPS Proxy)**[^11] + Le Proxy SSL effectue le chiffrement et déchiffrement entre l'utilisateur et le serveur de manière totalement invisible. #### **Proxy SMTP (Simple Mail Transfer Protocol)**[^11] + Le Proxy SMTP contrôle les e-mails, entrants ou sortants, sur base de l'adresse source, le serveur de l'expéditeur ou encore le contenu. Les proxies SMTP sont utilisés pour, entre autres, filtrer les spams, prévenir contre le phishing et autre logiciels malveillants. #### **Proxy DNS et Proxy Smart DNS**[^11] + Le Proxy DNS transfère les requêtes et les réponses DNS entre l'utilisateur et le serveur. Il peut, entre autres, améliorer les performances grâce à son cache et protèger les serveurs contre le piratage de domaine et l'usurpation de DNS. Le Proxy Smart DNS se distingue du Proxy DNS par le fait qu'il contourne les restrictions mises en place par les serveurs DNS comme par exemple la géolocalisation. #### **Reverse Proxy** [^5] + Le Reverse Proxy se situe entre un groupe de serveurs et Internet, il gère le trafic pour ses serveurs. En bref, le proxy protège les clients, alors qu'un Reverse Proxy protège les serveurs. Pour plus d'informations sur le Reverse Proxy, se référer à l'[article](https://github.com/KeviinKeurvels/Wiki-TI/blob/reverse_proxy/reverse_proxy.md) de Monsieur Kevin Keurvels. - ## Différence entre Proxy et Firewall [^8] + Les Firewalls bloquent les accès non autorisés à des réseaux privés ou depuis ces réseaux privés. Ils empêchent les machines au sein du réseau d'être exposées librement à Internet. Les principales différences entre un Firewall et un Proxy : + - Un Firewall bloque les connexions, un Proxy les facilite. - Un Firewall se place entre un réseau privé et public. Un Proxy peut se placer entre deux réseaux publics - Un Firewall protège un réseau interne contre des attaques tandis qu'un Proxy fournit une anonymisation et contourne des restrictions - Un serveur Proxy peut faire office de Firewall -Les pare-feu ne peuvent pas être considérés comme des serveurs proxy car même s'ils ont la capacité de bloquer ou d'autoriser les requêtes en fonction de certaines règles, ils ne les acheminent pas. -## Différence entre Proxy et VPN [^9] [^12] -Un VPN (Virtual Private Network) est une connexion sécurisée et chiffrée entre deux réseaux. A l'instar d'un Proxy, il masque l'adresse IP en agissant comme intermédiaire et réoriente le traffic. + Les pare-feu ne peuvent pas être considérés comme des serveurs proxy car même s'ils ont la capacité de bloquer ou d'autoriser les requêtes en fonction de certaines règles, ils ne les acheminent pas. + +## Différence entre Proxy et VPN [^12] + +Un VPN (Virtual Private Network) est une connexion sécurisée et chiffrée entre deux réseaux. A l'instar d'un Proxy, il masque l'adresse IP en agissant comme intermédiaire et réoriente le traffic. Un VPN ajoute un réseau privé virtuel, une sorte de tunnel personnel qui vous cache aux yeux des autres. Ce tunnel de chiffrement transforme un texte normal en un mélange codé, déchiffrable à l'aide d'une clé de déchiffrement que seuls l'utilisateur et le serveur VPN possèdent. Les principales différences entre un VPN et un Proxy : + - un VPN fournit un cryptage, une authentification et une protection d'intégrité au trafic tandis que le Proxy ne fournit pas beaucoup de sécurité sur la connexion elle-même. - un VPN fonctionne sur le Firewall, un Proxy fonctionne sur les navigateurs. - Un VPN crée un tunnel de connexion, un Proxy ne crée aucun tunnel. - Les protocoles utilisés sont différents : PPTP, IKEv2, L2TP/IPsec, SSL, TLS...pour un VPN et HTTP, SMTP, FTP... pour un Proxy. -Le VPN et le proxy ont des objectifs similaires, mais un VPN fournit plus de sécurité qu’un serveur proxy. + Le VPN et le proxy ont des objectifs similaires, mais un VPN fournit plus de sécurité qu’un serveur proxy. + +## Risques liés au Proxy[^10] -## Risques liés au Proxy[^4] [^10] #### Serveur Proxy gratuit -Il y a toujours une contrepartie à la gratuité d'un service. -- Performances diminuées : quand la charge de trafic est importante, le maintien de la vitesse nécessite une bande passante étendue. Seulement, la plupart des serveurs Proxy gratuits fonctionnent avec une faible bande passante ce qui signifie un ralentissement certain au niveau de la navigation Web. + +Il y a toujours une contrepartie à la gratuité d'un service. + +- Performances diminuées : quand la charge de trafic est importante, le maintien de la vitesse nécessite une bande passante étendue. Seulement, la plupart des serveurs Proxy gratuits fonctionnent avec une faible bande passante ce qui signifie un ralentissement certain au niveau de la navigation Web. - Logiciels espions : ils sont généralement téléchargés comme des applications libres ou transmis par des sites malveillants. - Sécurité des données : Dans le cas d'un serveur Proxy hacké, les informations personnelles qui transitent via le serveur risquent d'être surveillées, récoltées et modifiées à des fins malveillantes comme l'usurpation d'identité. + #### Historique de navigation + Un Proxy connaît l'IP d'origine et l'historique des requêtes de l'utilisateur. Dès lors, il s'agit de vérifier si le serveur enregistre ces données et quelle politique de conservation des données il applique car si ces données sont consignées et vendues alors que le service attendu est l'anonymisation, le dit-service est frauduleux. + #### Cryptage -Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu’il filtre. Il faut donc associer son utilisation avec un protocole de cryptage sinon les demandes seront envoyées en texte brut et à la merci de celui qui écoute . +Il ne faut pas oublier que de base, un serveur proxy ne chiffre pas le trafic qu’il filtre. Il faut donc associer son utilisation avec un protocole de cryptage sinon les demandes seront envoyées en texte brut et à la merci de celui qui écoute . ## Bibliographie -[^1]: "_Qu'est-ce qu'un proxy?_", proxyvpn.fr, https://www.proxyvpn.fr/qu-est-ce-qu-un-proxy (consulté le 02/05/2022) - ** Résumé : Page Web décrivant le Proxy - ** Avis sur la ressource : Court mais concis pour une première approche +[^1]: "_Qu'est-ce qu'un proxy?_", proxyvpn.fr, https://www.proxyvpn.fr/qu-est-ce-qu-un-proxy (consulté le 02/05/2022) + ** Résumé : Page Web décrivant le Proxy + ** Avis sur la ressource : Court mais concis pour une première approche + [^2]: "_Proxy server_", Wikipedia, https://en.wikipedia.org/wiki/Proxy_server (consulté le 02/05/2002) - ** Résumé : Page wipédia décrivant un serveur Proxy - ** Avis sur la ressource : Beaucoup plus détaillée que la page en français équivalente + ** Résumé : Page wipédia décrivant un serveur Proxy + ** Avis sur la ressource : Beaucoup plus détaillée que la page en français équivalente + [^3]: Vince,"_Le proxy dans tous ses états_", zestedesavoir.com, https://zestedesavoir.com/tutoriels/2789/les-reseaux-de-zero/reprenons-du-service/le-proxy-dans-tous-ses-etats/ (consulté le 06/05/2022) - ** Résumé : Le fonctionnement du proxy plus détaillé - ** Avis sur la ressource : Un des seuls sites où l'on aborde la couche OSI + ** Résumé : Le fonctionnement du proxy plus détaillé + ** Avis sur la ressource : Un des seuls sites où l'on aborde la couche OSI + [^4]: Jeff Petter, "_What is a Proxy server and how does it work?_", varonis.com, https://www.varonis.com/blog/what-is-a-proxy-server 27/03/2020(consulté le 06/05/2022) - ** Résumé : Le fonctionnement du Proxy, risques et avantages - ** Avis sur la ressource : Très claire mais un peu simple dans la description + ** Résumé : Le fonctionnement du Proxy, risques et avantages + ** Avis sur la ressource : Très claire mais un peu simple dans la description + [^5]: "_Qu'est-ce qu'un serveur proxy et comment fonctionne-t-il ?_", avast.com, https://www.avast.com/fr-fr/c-what-is-a-proxy-server (consulté le 04/05/2022) - ** Résumé : Un récap du Proxy - ** Avis sur la ressource : La page est claire mais Avast en profite pour faire sa publicité + ** Résumé : Un récap du Proxy + ** Avis sur la ressource : La page est claire mais Avast en profite pour faire sa publicité + [^6]: _shivk, "_Adventure with Proxy : Intro to Proxy_", medium.com, https://medium.com/@_shivk/adventure-with-proxy-intro-to-proxy-f7e640b455e7 février 2020 (consulté le 06/05/2022) - ** Résumé : Le Proxy et ses différents types - ** Avis sur la ressource : Très claire au niveau des différents Proxies + ** Résumé : Le Proxy et ses différents types + ** Avis sur la ressource : Très claire au niveau des différents Proxies + [^7]: "_What is an HTTP Proxy? Types of HTTP Proxies explained_", bestproxyreviews.com, https://www.bestproxyreviews.com/http-proxy/ 21/04/2022(consulté le 06/05/2022) - ** Résumé : Différents types de Proxies et leurs fournisseurs - ** Avis sur la ressource : Très claire au niveau des différents Proxies + ** Résumé : Différents types de Proxies et leurs fournisseurs + ** Avis sur la ressource : Très claire au niveau des différents Proxies + [^8]: "_Différence entre Proxy et Firewall_", waytolearnx.com, https://waytolearnx.com/2018/09/difference-entre-proxy-et-firewall.html 09/09/2018(consulté le 02/05/2022) - ** Résumé : Un rappel sur le Proxy et sur le Firewall - ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails + ** Résumé : Un rappel sur le Proxy et sur le Firewall + ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails + [^9]: "_Différence entre VPN et Proxy_, waytolearnx.com, "https://waytolearnx.com/2018/07/difference-entre-vpn-et-proxy.html 28/07/2018(consulté le 02/05/2022) - ** Résumé : Un rappel sur le Proxy et sur le VPN - ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails + ** Résumé : Un rappel sur le Proxy et sur le VPN + ** Avis sur la ressource : Juste ce qu'il faut sans entrer dans les détails + [^10]: Vuk Mujovic, "_Cacher les connexions Proxy: qu'est-ce qu'un Proxy et une adresse IP?_", le-vpn.com, https://www.le-vpn.com/fr/quest-ce-quun-proxy/#:~:text=Risques%20li%C3%A9s%20%C3%A0%20l'utilisation%20d'un%20proxy&text=Le%20risque%20le%20plus%20courant,transmis%20par%20des%20sites%20malveillants. 29/10/2021(consulté le 08/05/2022) - ** Résumé : Les fonctionnalités du Proxy, les types et les risques liés au Proxy - ** Avis sur la ressource : Concis avec en prime une liste des serveurs Proxy les plus connus + ** Résumé : Les fonctionnalités du Proxy, les types et les risques liés au Proxy + ** Avis sur la ressource : Concis avec en prime une liste des serveurs Proxy les plus connus + [^11]: Catherine Chipeta, "_Qu'est-ce qu'un serveur Proxy? Une explication claire de son fonctionnement_", upguard.com, https://www.upguard.com/blog/proxy-server#:~:text=Proxy%20servers%20work%20by%20facilitating,directly%20back%20to%20the%20user. 18/04/2022(consulté le 07/05/2022) - ** Résumé : Le fonctionnement et les types de Proxies - ** Avis sur la ressource : Aussi claire que le titre + ** Résumé : Le fonctionnement et les types de Proxies + ** Avis sur la ressource : Aussi claire que le titre + [^12]: "_Qu'est-ce qu'un VPN et comment fonctionne-t-il ?_", avast.com, https://www.avast.com/fr-fr/c-what-is-a-vpn (consulté le 04/05/2022) - ** Résumé : Un récap du VPN - ** Avis sur la ressource : La page est claire mais Avast en profite pour placer sa publicité \ No newline at end of file + ** Résumé : Un récap du VPN + ** Avis sur la ressource : La page est claire mais Avast en profite pour placer sa publicité diff --git "a/R\303\251seaux/Quic et TCP.md" "b/R\303\251seaux/quic_tcp.md" similarity index 98% rename from "R\303\251seaux/Quic et TCP.md" rename to "R\303\251seaux/quic_tcp.md" index 522f47c..a06282c 100644 --- "a/R\303\251seaux/Quic et TCP.md" +++ "b/R\303\251seaux/quic_tcp.md" @@ -1,31 +1,32 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Quic et TCP +parent: Réseaux +--- # Quic et TCP ## C’est quoi TCP? TCP est l'abréviation de Transmission Control Protocol. Il s'agit de l'un des protocoles principale de la famille de protocoles TCP/IP et l'une des normes les plus importantes d'Internet. Il s'agit d'un protocole orienté connexion qui utilise les services du protocole Internet au niveau de la commutation. - ## C’est quoi Quic? [1] -C’est rare qu’un protocolle basant sur IP apparait. Depuis le 27 mai 2021 la version 1.0 à été publié officielment. QUIC ("Quick UDP Internet Connections") est un protocole de transport expérimental de Google, qui a été mis à la disposition du public pour la première fois en 2013. Afin d'envoyer rapidement et facilement des paquets de données simples via le protocole UDP (User Datagram Protocol) sans connexion. Le travail de QUIC a été motivé par le désir de développer des alternatives aux solutions de sécurité établies pour TCP, HTTP/2 et TLS/SSL. Cela offre la même protection tout en réduisant les retards de connexion et de transport et en permettant plusieurs connexions. +C’est rare qu’un protocolle basant sur IP apparait. Depuis le 27 mai 2021 la version 1.0 à été publié officielment. QUIC ("Quick UDP Internet Connections") est un protocole de transport expérimental de Google, qui a été mis à la disposition du public pour la première fois en 2013. Afin d'envoyer rapidement et facilement des paquets de données simples via le protocole UDP (User Datagram Protocol) sans connexion. Le travail de QUIC a été motivé par le désir de développer des alternatives aux solutions de sécurité établies pour TCP, HTTP/2 et TLS/SSL. Cela offre la même protection tout en réduisant les retards de connexion et de transport et en permettant plusieurs connexions. ## Mais pourquoi inventer un nouveau protocolle si TCP existe déjà ? [2] TCP, est un protocole classique permettant d'envoyer des données binaires sans erreur. TCP garantit que tous les paquets sont envoyés sans modification, dans le bon ordre et sans perte. Si nécessaire, la pile TCP réclame les paquets manquants jusqu'à ce que les données soient disponibles. Pour que cela fonctionne, il y a un handshake initial au cours duquel la destination se met d'accord sur différents paramètres. Cela cause qu’au début d’une connection TCP beaucoup de temps est perdu à cause du TCP-Handshake et du TLC-Handshake. D'autre part, Quic est moins sujet à la perte de paquets et peut donc mieux fonctionner sur des réseaux peu fiables. Quic est un protocole basé sur UDP, spécialement conçu pour être utilisé dans des réseaux rapides, fiables et sécurisés. Il offre un certain nombre d'avantages par rapport à TCP, notamment de meilleures performances et une plus grande fiabilité. -Quic est également très évolutif et peut être facilement adapté aux besoins d'un réseau. Il est en outre très efficace sur le plan énergétique et peut donc être utilisé dans des appareils mobiles, où les fonctions d'économie d'énergie sont avantageuses. - +Quic est également très évolutif et peut être facilement adapté aux besoins d'un réseau. Il est en outre très efficace sur le plan énergétique et peut donc être utilisé dans des appareils mobiles, où les fonctions d'économie d'énergie sont avantageuses. ## Quic avec HTTP/3 [3] -Les deux protocoles HTTP3 et QUIC sont les dernières avancées dans le domaine des technologies Internet. +Les deux protocoles HTTP3 et QUIC sont les dernières avancées dans le domaine des technologies Internet. HTTP3 est une évolution du célèbre protocole de transfert hypertexte (HTTP). Alors que HTTP était jusqu'à présent basé sur le protocole TCP/IP, HTTP3 s'appuie sur le nouveau protocole UDP, spécialement conçu pour la transmission de données sur Internet. L'utilisation du protocole UDP permet à HTTP3 de fonctionner beaucoup plus rapidement que le HTTP traditionnel. En outre, HTTP3 offre quelques nouvelles fonctions particulièrement utiles pour l'utilisation d'Internet. Par exemple, plusieurs requêtes peuvent être envoyées simultanément au serveur, ce qui augmente considérablement la vitesse de la connexion. La sécurité est également améliorée par le nouveau protocole, puisque toutes les données sont transmises de manière cryptée. On ignore encore totalement quand QUIC ou HTTP/3 seront présentés comme norme. En conséquence, les développeurs et les administrateurs ont encore le temps de planifier l'avenir et de paniquer. Il n'est pas vraiment nécessaire de paniquer. QUIC est facile à mettre en œuvre. Comme l'infrastructure utilisée est le très répandu UDP, il suffit de mettre à jour le logiciel du navigateur sans devoir attendre la prochaine version du système d'exploitation. En outre, QUIC est qualifié de rétrocompatible. Si l'interlocuteur n'est pas encore prêt pour le nouveau protocole, il met à disposition un fallback sur TCP. - ## Différence entre Quic et TCP [2] [3] La plus grande différence est sûrement que Quic ce situe dans le « user space » par rapport à TCP qui ce trouve dans le kernel : @@ -33,12 +34,10 @@ La plus grande différence est sûrement que Quic ce situe dans le « user space L'avantage de l'implémentation de QUIC dans l'espace utilisateur est que les développeurs peuvent écrire / sélectionner leur propre implémentation et que les développeurs peuvent rapidement diffuser les corrections et améliorations de la pile QUIC via des mises à jour régulières de l'application (comme du côté serveur). La plupart des entreprises utilisent également la pile QUIC uniquement pour communiquer avec leurs services, ce qui est donc également possible dans la plupart des cas. Dans ce cas, l'entreprise possède à la fois les implémentations client et serveur. - ## Perfomance Quic vs TCP [4] ![grafik](https://user-images.githubusercontent.com/56824199/174491383-a2e94588-8602-45ba-8a2b-b0bab52e645d.png) - ## Bibliographie [1] Wiki Ionos, „QUIC: Das steckt hinter dem experimentellen Google-Protokoll“, @@ -49,4 +48,3 @@ L'avantage de l'implémentation de QUIC dans l'espace utilisateur est que les d [3] Nicky Reinert, „HTTP/3 und QUIC: Was steckt hinter dem nächsten großen Update für HTTP?“, « 08.08.2019 », https://entwickler.de/webentwicklung/http3-und-quic-was-steckt-hinter-dem-nachsten-grossen-update-fur-http/ [05.06.2022] [4] Frederic Lardinois, „Google Wants To Speed Up The Web With Its QUIC Protocol“, « 18.04.2015 », https://techcrunch.com/2015/04/18/google-wants-to-speed-up-the-web-with-its-quic-protocol/?guccounter=1&guce_referrer=aHR0cHM6Ly9sZXZlbHVwLmdpdGNvbm5lY3RlZC5jb20vd2lsbC1nb29nbGVzLXF1aWMtcHJvdG9jb2wtcmVwbGFjZS10Y3AtNmVkOTkxYTBjYTFl&guce_referrer_sig=AQAAAMih_sDttxvv2RkTzk0RRJOclfaZ4vxcSO-lurMsnuBkQ--QgYwfbsqTjkYe0Xn0nSVsqplskoMP77pnlIUBcBpwmy9cGfpoPW2UgSTqBhs6alxSgdCfAYrz5L2v7UVJHYNagfJBxr5yySWOVZmm_fu8wROwNpsaMj3ttQzt9ESn [05.06.2022] - diff --git "a/R\303\251seaux/Comparatif entre SIP et h323.md" "b/R\303\251seaux/sip_vs_h323.md" similarity index 58% rename from "R\303\251seaux/Comparatif entre SIP et h323.md" rename to "R\303\251seaux/sip_vs_h323.md" index 152a31c..927d6ce 100644 --- "a/R\303\251seaux/Comparatif entre SIP et h323.md" +++ "b/R\303\251seaux/sip_vs_h323.md" @@ -1,52 +1,56 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Comparatif SIP - H323 +parent: Réseaux +--- # Comparatif entre SIP et h323 ## 1. Introduction -### 1.1 Qu’est-ce que le protocole SIP [^1] [^2] : -       La « Session Initiation Protocol » (SIP) est un protocole TCP/IP de le couche applicative normalisée et standardisé par l’IETF*. Il s’agit d’un protocole de communication standard couramment utilisé dans les télécommunications multimédias. Ce dernier est le plus répandu dans la téléphonie par internet (la VoIP*). +### 1.1 ``Qu’est-ce que le protocole SIP`` [^1][^2] : -       Le protocole SIP permet d’établir une « session » entre deux ou plus de participants, de modifier cette session et finalement de mettre fin à cette session. +       La « Session Initiation Protocol » (SIP) est un protocole TCP/IP de le couche applicative normalisée et standardisé par l’IETF*. Il s’agit d’un protocole de communication standard couramment utilisé dans les télécommunications multimédias. Ce dernier est le plus répandu dans la téléphonie par internet (la VoIP*). + +       Le protocole SIP permet d’établir une « session » entre deux ou plus de participants, de modifier cette session et finalement de mettre fin à cette session.       Par défaut, ce protocole est supporté sur le port 5060 par TCP ou UDP et pour sa version sécurisé, SIP-TLS, sur le port 5061 par défaut. Il fonctionne aussi bien avec l’IPv4 qu’avec l’IPv6.       SIP est un protocole de type « requête-réponse ». Celui-ci est similaire aux protocoles internet tel que http et SMTP. -       SIP prend en charge cinq aspects afin de réaliser un établissement et une terminaison de communications multimédia : - * Localisation de l’utilisateur - * Disponibilité de l’utilisateur - * Capacités de l’utilisateur - * Établissement d’une session - * Gestion d’une session +       SIP prend en charge cinq aspects afin de réaliser un établissement et une terminaison de communications multimédia : + +* Localisation de l’utilisateur +* Disponibilité de l’utilisateur +* Capacités de l’utilisateur +* Établissement d’une session +* Gestion d’une session -### 1.2 Qu’est-ce que le protocole H.323 [^4] [^5] [^7]: +### 1.2 ``Qu’est-ce que le protocole H.323`` [^4][^5][^7]:       Comme le SIP, le H.323 est un protocole conçu pour initier, gérer et terminer des sessions médias. Cependant celui-ci est standarisé par L'IEEE*. - +       Existant depuis 1996, Il est considéré comme assez ancien. C’est un protocole binaire et se fait remplacer par le SIP. - +       Il utilise le numéro de port TCP 1720. - +       Il ressemble davantage à une combinaison de plusieurs protocoles différents qui peuvent être regroupés en trois catégories : - + * La signalisation * La négociation de codec * Le transport de l’information +### 1.3 Schéma illustrant une communication VoIP (session + multimédia) + +``SIP`` [^1] -### 1.3 Schéma illustrant une communication VoIP (session + multimédia) - -SIP [^1] +![SIP]("../Assets/Images/SchemaSIP.png") -![SIP](https://github.com/CastermaneRobin/Wiki-TI/blob/Comparatif-Sip-H323/R%C3%A9seaux/SchemaSIP.png) - - -H.323 [^8] - -![H.323](https://github.com/CastermaneRobin/Wiki-TI/blob/Comparatif-Sip-H323/R%C3%A9seaux/SchemaH323.png) +``H.323`` [^8] + +![H323]("../Assets/Images/SchemaH323.png") Documentation du schéma car ce dernier est plus complexe qu'une communication SIP : - + * ARQ = Adminssion Request, demande l'autorisation de participer à un appel * ACF = Admission Confirm, réponse positive pour cette appel * ARJ = Admission Reject, réponse rejeter @@ -54,109 +58,108 @@ Documentation du schéma car ce dernier est plus complexe qu'une communication S * H.245 = Défini pour les canaux des média par H.323 * TCS = Terminal capability set, codecs envoyé au terminal * ACK = Accusé de réception -* OCL = Open logical channel, ouverture d'un chemin de communication +* OCL = Open logical channel, ouverture d'un chemin de communication * CLC = Close logical channel, fermeture d'un chemin de communication * ESC = End session command, commande pour mettre fin à la session * DRQ = Disengage Request, mettre fin à l'appel * DCF = Disengage Confirm, réponse pour mettre fin à l'appel - -## 2. Comparaison entre ces deux protocoles [^1] [^2] [^3] [^4] [^5] -### 2.1 Codage des messages : + +## 2. Comparaison entre ces deux protocoles [^1][^2][^3][^4][^5] + +### 2.1 ``Codage des messages`` :       Les messages H323 sont encodés dans un format binaire compact. Les messages sont efficacement codés et décodés par des machines (codec). Alors que ceux du protocole SIP, sont plus faciles à lire par l’homme, ils sont encodés au format ASCII. L’avantage du SIP est qu’il ressemble aux protocoles http/SMTP et est beaucoup plus simple que le H323. Cela rend le H323 moins convivial pour les techniciens dans un environnement de dépannage. - +       Ils utilisent tous les deux le protocole RTP* comme protocole de transfert des données multimédia. - +       Le SIP est plus léger car il est basé sur une approche similaire au protocole http. -### 2.2 En terme de temps : +### 2.2 ``En terme de temps`` :       Le protocole H323 a été introduit quelques années avant le SIP. L’internet Engineering Task Force (IETF) a développé le protocole SIP basé sur le H323. Comparé au H323, SIP est plus simple, plus évolutif et plus étroitement lié aux applications Internet existantes. - -### 2.3 Utilisation : -       SIP et H323 sont des protocoles de communication utilisés pour les appels multimédia et la téléconférence sur des réseaux basés sur le protocole Internet. - -       D’autres communications multimédias sont prises en charge par SIP telles que la messagerie instantanée, les jeux en ligne et même le partage de fichiers. +### 2.3 ``Utilisation`` : + +       SIP et H323 sont des protocoles de communication utilisés pour les appels multimédia et la téléconférence sur des réseaux basés sur le protocole Internet. + +       D’autres communications multimédias sont prises en charge par SIP telles que la messagerie instantanée, les jeux en ligne et même le partage de fichiers.       Cependant, H323 se concentre uniquement sur la conférence multimédia, c'est à dire la possibilité d'interagir à distance à travers une variété de canaux de communication. Par exemple : audio, vidéo et partage à distance d'écrans -### 2.4 Utilisation technique : +### 2.4 ``Utilisation technique`` : + +| ``Comparatif`` | ``SIP`` | ``H323`` | +| :------------------------------------------- | :-------------------------------------------------- | :----------------------------------------------------------------------------------------------- | +| Nombre d'échange pour établir la connexion | 1,5 aller-retour (voir schéma ci-dessus) | 6 à 7 aller-retour (voir schéma ci-dessus) | +| Maintenance du code protocolaire | Simple par sa nature textuelle à l'exemple de Http | Complexe et nécessitant un compilateur | +| Evolution du protocole | Protocole ouvert à des nouvelles fonctions | Ajout d'extensions propriétaires sans concertation entre vendeurs | +| Détection d'un appel en boucle | Oui | Inexistante sur la version 1, un appel routé sur l'appelant provoque une infinité de requêtes | +| Signalisation multicast | Oui, par défaut | Non | -| Comparatif | SIP | H323 | -| :--- | :--- | :--- | -| Nombre d'échange pour établir la connexion | 1,5 aller-retour (voir schéma ci-dessus)| 6 à 7 aller-retour (voir schéma ci-dessus)| -| Maintenance du code protocolaire | Simple par sa nature textuelle à l'exemple de Http | Complexe et nécessitant un compilateur | -| Evolution du protocole | Protocole ouvert à des nouvelles fonctions | Ajout d'extensions propriétaires sans concertation entre vendeurs | -| Détection d'un appel en boucle | Oui | Inexistante sur la version 1, un appel routé sur l'appelant provoque une infinité de requêtes | -| Signalisation multicast | Oui, par défaut | Non | +### 2.5 ``Fiabilité`` : -### 2.5 Fiabilité : +       Le fait que H323 ait une portée limitée le rend moins complexe que SIP. -       Le fait que H323 ait une portée limitée le rend moins complexe que SIP. -       H323 présente d’autres avantages tels que la fiabilité, la traversée NAT, l’adressage flexible et l’équilibrage de charge sur SIP. ## 3. Conclusion - -       Bien que le protocole H.323 et le protocole SIP proposent deux ensembles de structures de systèmes téléphonies IP, ils poursuivent les mêmes objectifs. -       Le protocole SIP peut être utilisé à de nombreuses fins de communication multimédia, telles que les jeux en ligne, la messagerie instantanée et le partage de fichiers, en plus de l'application prévue pour la conférence multimédia. Cependant, H323 est limité à la conférence multimédia. +       Bien que le protocole H.323 et le protocole SIP proposent deux ensembles de structures de systèmes téléphonies IP, ils poursuivent les mêmes objectifs. + +       Le protocole SIP peut être utilisé à de nombreuses fins de communication multimédia, telles que les jeux en ligne, la messagerie instantanée et le partage de fichiers, en plus de l'application prévue pour la conférence multimédia. Cependant, H323 est limité à la conférence multimédia.       Ils sont développés et modifiés séparément en fonction des différents systèmes d'application de développement.       La flexibilité et la simplicité du protocole SIP lui a permis de remplacer quasiment la totalité du protocole H.323 dans le monde de la VoIP. -### Définition en large permettant de comprendre certains concepts : [^6] [^7] +### Définition en large permettant de comprendre certains concepts : [^6][^7] -| Sujet | Définition | -| :--- | :--- | -| *VoIP | « Voice Over Internet Protocol », permet la transmission de la voix par internet. | -| *IETF | Ils produisent la plupart des nouveaux standards d’Internet. | -| *IEEE | Institut des ingénieurs électriciens et électroniciens | -| *RTP | est un protocole de communication informatique permettant le transport de données | -| RTCP | il va de pair avec le RTP, il transmet les paquets de contrôle au participant d’un appel. C’est-à-dire de donner un feedback sur la qualité du service fourni par le RTP. | +| ``Sujet`` | ``Définition`` | +| :----------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| *VoIP | « Voice Over Internet Protocol », permet la transmission de la voix par internet. | +| *IETF | Ils produisent la plupart des nouveaux standards d’Internet. | +| *IEEE | Institut des ingénieurs électriciens et électroniciens | +| *RTP | est un protocole de communication informatique permettant le transport de données | +| RTCP | il va de pair avec le RTP, il transmet les paquets de contrôle au participant d’un appel. C’est-à-dire de donner un feedback sur la qualité du service fourni par le RTP. | ## Bibliographie - -* [^1]: [3CX-VoIp-SIP](https://www.3cx.fr/voip-sip/sip/), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) +[^1]: [3CX-VoIp-SIP](https://www.3cx.fr/voip-sip/sip/), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) + **Résumé** : Définition du protole SIP et de la VoIP. - **Avis sur la ressource** : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. - -* [^2]: [Wikipédia-SIP](https://fr.wikipedia.org/wiki/Session_Initiation_Protocol), Wikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) - + **Avis sur la ressource** : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. + +[^2]: [Wikipédia-SIP](https://fr.wikipedia.org/wiki/Session_Initiation_Protocol), Wikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) + **Résumé** : Article résumant les informations éssentiel du protocole SIP. - **Avis sur la ressource** : Encyclopédie libre régulièrement mise à jour. - -* [^3]: [Goffinet François-SIP](https://sip.goffinet.org/sip/architecture/), François Goffinet, 2021, consulté le (8/05/2022) - + **Avis sur la ressource** : Encyclopédie libre régulièrement mise à jour. + +[^3]: [Goffinet François-SIP](https://sip.goffinet.org/sip/architecture/), François Goffinet, 2021, consulté le (8/05/2022) + **Résumé** : Explication détaillé de l'architecture SIP. **Avis sur la ressource** : Rédigé par un formateur IT, écrivains, professionel avec de l'expérience dans le métiers depuis de nombreuses années [LinkedIn](https://www.linkedin.com/in/fegoffinet/). - -* [^4]: [Wikipédia-H.323](https://fr.wikipedia.org/wiki/H.323#:~:text=323%20regroupe%20un%20ensemble%20de,est%20publi%C3%A9e%20en%20novembre%201996.), WWikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) - + +[^4]: [Wikipédia-H.323](https://fr.wikipedia.org/wiki/H.323#:~:text=323%20regroupe%20un%20ensemble%20de,est%20publi%C3%A9e%20en%20novembre%201996.), WWikipédia, dernière modification a été faites le 30 mars 2022, consulté le (8/05/2022) + **Résumé** : Article résumant en large les informations du protocole H.323. **Avis sur la ressource** : Encyclopédie libre régulièrement mise à jour. - -* [^5]: [Techno-Science.net](https://www.techno-science.net/definition/1369.html), Tecnho-Science/Wikipédia, mis en ligne en 2004, consulté le (8/05/2022) - + +[^5]: [Techno-Science.net](https://www.techno-science.net/definition/1369.html), Tecnho-Science/Wikipédia, mis en ligne en 2004, consulté le (8/05/2022) + **Résumé** : Ce site explique et définit l'utilisation du protocole H.323 dans ses débuts. **Avis sur la ressource** : C'est un site d'information sur l'actualité des sciences et des technologies édité par l'association Techno-Science.net. - -* [^6]: [3CX-RTCP](https://www.3cx.fr/voip-sip/rtcp/#:~:text=Le%20RTCP%20signifie%20Real%20Time,aux%20participants%20d'un%20appel), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) - + +[^6]: [3CX-RTCP](https://www.3cx.fr/voip-sip/rtcp/#:~:text=Le%20RTCP%20signifie%20Real%20Time,aux%20participants%20d'un%20appel), Equipe 3CX, Création du site en 2005 mais il est régulièrement mis à jour, consulté le (8/05/2022) + **Résumé** : Définition du protole RTCP. **Avis sur la ressource** : 3CX est une plateforme de communication complète. Cette entreprise mets à jour régulièrement ces informations disponible en ligne. De plus, ils organisent régulièrement des webinaires, les liens sont disponilbes sur leur site web. - -* [^7]: [IEEE-H.323](https://ieeexplore.ieee.org/document/874981), Equipe IEEE, Date de publication en Octobre 2000 (Le H.323 étant assez ancien). - + +[^7]: [IEEE-H.323](https://ieeexplore.ieee.org/document/874981), Equipe IEEE, Date de publication en Octobre 2000 (Le H.323 étant assez ancien). + **Résumé** : Définition du H.323 par des experts de l'équipe IEEE **Avis sur la ressource** : L'IEEE est une oganisation à but non lucratif, c'est une très grande organisation professionnelle technique au monde dédiée à l'avancement de la technologie. - -* [^8]: [Oracle-H.323](https://docs.oracle.com/en/industries/communications/session-border-controller/8.4.0/configuration/sip-and-h-323.html#GUID-D0030405-6A1C-4FFB-8A54-4381BE76E0D6), Equipe Oracle. - + +[^8]: [Oracle-H.323](https://docs.oracle.com/en/industries/communications/session-border-controller/8.4.0/configuration/sip-and-h-323.html#GUID-D0030405-6A1C-4FFB-8A54-4381BE76E0D6), Equipe Oracle. + **Résumé** : Schéma de communication par des experts de l'équipe Oracle. **Avis sur la ressource** : Oracle a pour but d'aider les gens à découvrir des informations et à partager celles-ci. - - diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index c0157b7..ab9d225 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -1,49 +1,56 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Wireshark +parent: Réseaux +--- +[*]: ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) + Résumé : guide sur les la coloration + Avis sur la ressource : concis et donne des exemples utiles + # Wireshark -## Wireshark ? C'est quoi ? [^1] [^2] [^3] [^4] +## Wireshark ? C'est quoi ? [^1][^2][^3][^4] + +Wireshark est un analyseur de paquets réseau créé en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétables par des humains. +Wireshark est utilisé notamment pour : -Wireshark est un analyseur de paquets réseau créé en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétables par des humains. -Wireshark est utilisé notamment pour : - L'analyse et le troubleshooting réseau. - La sécurité réseau. - Le reverse engineering. - Le développement et le début de protocoles. -- L’éducation. +- L’éducation. Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ses très nombreux filtres , ses fonctionnalités variées et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia [^2]). Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. -## Fonctionnalités : [^1] [^2] [^3] [^5] +## Fonctionnalités : [^1][^2][^3][^5] Voici une liste de fonctionnalités non exhaustive de Wireshark mais suffisante pour commencer. ### La capture de paquets : -La fonctionnalité principale et de base de Wireshark est la capture de paquets. Pour commencer une capture, ouvrez Wireshark et sélectionnez un réseau que vous voulez observer en double cliquant dessus. -![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) -Lorsque vous souhaitez arrêter la capture, appuyez sur le petit carré rouge en haut à gauche. -Vous pouvez ensuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dans **fichier -> enregistrer sous**. -Pour recommencer une capture, cliquez sur l'aileron bleu, à gauche du carré rouge. +La fonctionnalité principale et de base de Wireshark est la capture de paquets. Pour commencer une capture, ouvrez Wireshark et sélectionnez un réseau que vous voulez observer en double cliquant dessus. +![image](https://user-images.githubusercontent.com/62069633/170109781-124844a2-4c1d-4583-8e6c-85e1d788fb4e.png) +Lorsque vous souhaitez arrêter la capture, appuyez sur le petit carré rouge en haut à gauche. +Vous pouvez ensuite travailler dessus ou enregistrer la capture pour revenir dessus plus tard en allant dans **fichier -> enregistrer sous**. +Pour recommencer une capture, cliquez sur l'aileron bleu, à gauche du carré rouge. ![image](https://user-images.githubusercontent.com/62069633/170111507-3912c10a-ce96-4149-b715-db2f774c736e.png) ### L'analyse de paquets -Maintenant que nous avons une capture Wireshark, cela nous permet de l'analyser. Pour ce faire nous aurons l'aide de trois fenêtres : +Maintenant que nous avons une capture Wireshark, cela nous permet de l'analyser. Pour ce faire nous aurons l'aide de trois fenêtres : + 1. Le packet list 2. Le packet details -3. Le packet bytes pane +3. Le packet bytes pane ![image](https://user-images.githubusercontent.com/62069633/170119431-f55549da-1adb-4bfb-8e43-2ae49e237546.png) #### 1. Le packet list -Le packet list nous permet de voir tous les paquets enregistrés dans cette capture. Cette fenêtre vous communique déjà des informations générales classées dans différentes colonnes. Vous pouvez si vous le souhaitez supprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête. -Cependant les colonnes par défaut seront généralement amplement suffisantes. -- No. : cette colonne numérote les paquets capturés et indique à quelle conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'une ligne pleine apparait sur un autre paquet, c'est qu'ils sont dans une même conversation (par exemple three handshake). -![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png) -Les paquets qui n'ont pas de lignes mais des pointillés ne font pas partie de cette conversation. -![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) +Le packet list nous permet de voir tous les paquets enregistrés dans cette capture. Cette fenêtre vous communique déjà des informations générales classées dans différentes colonnes. Vous pouvez si vous le souhaitez supprimer, ajouter ou modifier des colonnes en faisant un clic droit sur l'entête.Cependant les colonnes par défaut seront généralement amplement suffisantes. + +- No. : cette colonne numérote les paquets capturés et indique à quelle conversation appartient le paquet : si en cliquant sur un paquet vous voyez qu'une ligne pleine apparait sur un autre paquet, c'est qu'ils sont dans une même conversation (par exemple three handshake).![image](https://user-images.githubusercontent.com/62069633/170123265-fcdcf935-272d-42d4-9b04-e25624661fe5.png)Les paquets qui n'ont pas de lignes mais des pointillés ne font pas partie de cette conversation.![image](https://user-images.githubusercontent.com/62069633/170123621-fe1cc571-e45b-43c0-bf79-532116f7d749.png) - Time : cette colonne indique quand sont arrivés les paquets après le début de la capture. - Source : indique l'adresse IP qui a envoyé le paquet. - Destination : indique l'adresse IP qui a reçu le paquet. @@ -54,97 +61,94 @@ Les paquets qui n'ont pas de lignes mais des pointillés ne font pas partie de c #### 2. Le packet details Lorsque vous sélectionnez un packet dans le packet list, vous pourrez retrouver tous les protocoles utilisés par ce paquet dans cette fenêtre. -Vous pouvez développer un protocole en faisant un clic gauche dessus. +Vous pouvez développer un protocole en faisant un clic gauche dessus. De plus, vous pouvez, dans le packet list, ne faire apparaitre que les paquets utilisant le même protocole en faisant un clic droit sur le protocole **Appliquer comme un filtre -> Sélectionné** ou n'afficher que les paquets de la conversation avec **Filtre de conversation -> le protocole souhaité**. #### 3. Le packet bytes pane Ici, vous retrouverez le paquet brut au format hexadécimal ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit cela sélectionnera dans le packet détails ce à quoi il correspond (et vice versa). -### Les filtres : [^6] [^7] +### Les filtres : [^6][^7] -Il existe deux types de filtre dans Wireshark : les filtres de capture et les filtres d'affichage. Le premier se met avant une capture et permet de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. +Il existe deux types de filtre dans Wireshark : les filtres de capture et les filtres d'affichage. Le premier se met avant une capture et permet de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. #### Filtres de capture : -Pour appliquer un filtre de capture, entrez, avant la capture, le filtre ici : -![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) -Si vous souhaitez entrer deux filtres, utilisez le mot clé : `and` -Si vous souhaitez appliquer un filtre inversé (donc : capturer tous sauf), utilisez le mot clé: `not` +Pour appliquer un filtre de capture, entrez, avant la capture, le filtre ici : +![image](https://user-images.githubusercontent.com/62069633/170136920-c9313d66-dd70-4da5-9b51-57b10902a2ca.png) + +Si vous souhaitez entrer deux filtres, utilisez le mot clé : `and` +Si vous souhaitez appliquer un filtre inversé (donc : capturer tous sauf), utilisez le mot clé: `not` Wireshark utilise des filtres par défaut s’il est utilisé à distance pour ne pas enregistrer ce qui est lié à cette connexion (comme ssh). ##### Exemples utiles (trouver ici [^6]) -Pour capturer tout se qui vient et sort d'une adresse IP : -`host 172.18.5.4` -Pour capturer tout ce qui concerne un range d’IP : -`net 192.168.0.0/24` -Pour capturer tout ce qui concerne un port : -`port 53` -Pour ne capturer que du trafic IPv4 : -`ip` -Pour ne capturer que du trafic unicast : -`not broadcast and not multicast` +Pour capturer tout se qui vient et sort d'une adresse IP : +`host 172.18.5.4` +Pour capturer tout ce qui concerne un range d’IP : +`net 192.168.0.0/24` +Pour capturer tout ce qui concerne un port : +`port 53` +Pour ne capturer que du trafic IPv4 : +`ip` +Pour ne capturer que du trafic unicast : +`not broadcast and not multicast` #### Filtres d’affichage : -Pour appliquer un filtre de capture, entrez, le filtre ici : -![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) +Pour appliquer un filtre de capture, entrez, le filtre ici : +![image](https://user-images.githubusercontent.com/62069633/170139504-3bd37f17-fa69-4376-b305-01c3f09a3876.png) -Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `and` ou `&&` -Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `or` ou `||` +Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `and` ou `&&` +Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `or` ou `||` ##### Exemples utiles (trouver ici [^7]) -Pour n'afficher que les paquets possédant un protocole : +Pour n'afficher que les paquets possédant un protocole : `TCP` -Pour n'afficher que ce qui correspond à une adresse IP : -`ip.addr==172.18.5.4` -Pour capturer tout ce qui concerne un range d’IP : -`ip.addr==192.168.0.0/24` -Pour capturer tout ce qui concerne un port : -`tcp.port==53` -Pour ne capturer que le trafic entre deux machines (par exemple client et serveur): -`ip.src==192.168.18.5 and ip.dst==192.168.2.45` +Pour n'afficher que ce qui correspond à une adresse IP : +`ip.addr==172.18.5.4` +Pour capturer tout ce qui concerne un range d’IP : +`ip.addr==192.168.0.0/24` +Pour capturer tout ce qui concerne un port : +`tcp.port==53` +Pour ne capturer que le trafic entre deux machines (par exemple client et serveur): +`ip.src==192.168.18.5 and ip.dst==192.168.2.45` ### La colorisation : [^8] -La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose, de base, 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. -![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) +La colorisation permet de mettre en évidence des paquets qui répondent à certains filtres sans pour autant cacher les autres. Wireshark propose, de base, 20 filtres. Pour ajouter ou supprimer des filtres aller dans **vue -> coloring rules**. +![image](https://user-images.githubusercontent.com/62069633/170142753-0138ffd1-61dd-4164-a87f-9ad87fc1daee.png) -Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Ainsi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisations et vous pourrez aller chercher des règles préfaites sur internet pour des cas spécifiques. +Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règles de colorisation. Ainsi vous pouvez avoir plusieurs sets de règles que vous utiliserez dans différentes utilisations et vous pourrez aller chercher des règles préfaites sur internet pour des cas spécifiques. ## Bibliographie -[^1]:* [Wireshark User’s Guide](https://www.wireshark.org/docs/wsug_html_chunked/), auteur inconnu, date de création inconnu, consulté le (24/05/2022) - Résumé : documentation officielle de Wireshark - Avis sur la ressource : clair et très complet malgré un design un peu rebutant - -[^2]:* [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) -Résumé : page Wikipédia Wireshark -Avis sur la ressource : très peu complète mais donnes quelques informations de bases - -[^3]:* [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) -Résumé : petit guide concis sur wireshark -Avis sur la ressource : petit guide concis mais clair et agréable à lire - -[^4]:* [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) -Résumé : alternatives à Wireshark -Avis sur la ressource : présente bien les alternatives - -[^5]:* [How to Use Wireshark: A Complete Tutorial](https://www.lifewire.com/wireshark-tutorial-4143298), Scott Orgera, 8 juillet 2020, consulté le (24/05/2022) -Résumé : autre guide sur wireshark -Avis sur la ressource : très clair mais trop court - -[^6]:* [CaptureFilters](https://wiki.wireshark.org/CaptureFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -Résumé : guide sur les filtres de captures -Avis sur la ressource : concis et donne des exemples utiles - -[^7]:* [DisplayFilters](https://wiki.wireshark.org/DisplayFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -Résumé : guide sur les filtres d'affichage -Avis sur la ressource : concis et donne des exemples utiles - -[^7]:* [ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) -Résumé : guide sur les la coloration -Avis sur la ressource : concis et donne des exemples utiles +[^1]: * [Wireshark User’s Guide](https://www.wireshark.org/docs/wsug_html_chunked/), auteur inconnu, date de création inconnu, consulté le (24/05/2022) + Résumé : documentation officielle de Wireshark + Avis sur la ressource : clair et très complet malgré un design un peu rebutant + +[^2]: * [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) + Résumé : page Wikipédia Wireshark + Avis sur la ressource : très peu complète mais donnes quelques informations de bases + +[^3]: * [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) + Résumé : petit guide concis sur wireshark + Avis sur la ressource : petit guide concis mais clair et agréable à lire + +[^4]: * [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) + Résumé : alternatives à Wireshark + Avis sur la ressource : présente bien les alternatives + +[^5]: * [How to Use Wireshark: A Complete Tutorial](https://www.lifewire.com/wireshark-tutorial-4143298), Scott Orgera, 8 juillet 2020, consulté le (24/05/2022) + Résumé : autre guide sur wireshark + Avis sur la ressource : très clair mais trop court + +[^6]: * [CaptureFilters](https://wiki.wireshark.org/CaptureFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) + Résumé : guide sur les filtres de captures + Avis sur la ressource : concis et donne des exemples utiles + +[^7]: * [DisplayFilters](https://wiki.wireshark.org/DisplayFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) + Résumé : guide sur les filtres d'affichage + Avis sur la ressource : concis et donne des exemples utiles diff --git "a/R\303\251seaux/IPsec.md" "b/S\303\251curit\303\251/IPsec.md" similarity index 87% rename from "R\303\251seaux/IPsec.md" rename to "S\303\251curit\303\251/IPsec.md" index 1030dcc..bb65b73 100644 --- "a/R\303\251seaux/IPsec.md" +++ "b/S\303\251curit\303\251/IPsec.md" @@ -1,45 +1,41 @@ --- layout: default title: IPSec -parent : Réseaux +parent : Sécurité --- - # IPSec ( Internet Protocol Security ) ## Un peu d'histoire -En informatique et plus particulièrement en réseau, les paquets IP sont les éléments principaux pour communiquer des données entre deux machines. +En informatique et plus particulièrement en réseau, les paquets IP sont les éléments principaux pour communiquer des données entre deux machines. Dans ces paquets on y distingue deux grands types d'éléments à savoir, ceux pour les données et ceux contenant l’adresse de l’expéditeur et du destinataire. Screenshot 2022-06-02 at 14 59 04 - Le point négatif de cette communication est l’absence de sécurité en effet les données des paquets ne sont pas cryptées de plus il n’est pas possible de vérifier l’authenticité de celles-ci également. C’est un gros problème vu que lors de cet échange de données, les paquets passent par différents routeurs. Elles peuvent donc être interceptées, lues, manipulées, modifiées à tout moment par une personne mal intentionnée. Pour faire face à cette situation et ainsi permettre un transfert de paquets de données sécurisés sur des réseaux publics, l’Internet Protocol Security ou IPsec a été développé. -## IPSec +## IPSec + +« Internet Protocol Security » (IPSec) est une suite de protocoles conçue pour la suite de protocoles Internet TCP-IP standardisé par l’IETF (Internet Engineering Task Force) pour l’IPv4 mais aussi l’IPv6 permettant une communication sécurisée avec des réseaux IP qui ne sont pas dignes de confiance. La confidentialité, l’authenticité et l’intégrité de la circulation des données sont assurées par un système d'authentification et de cryptage . + +On peut répartir la suite des protocles IPSec en 3 groupes : -« Internet Protocol Security » (IPSec) est une suite de protocoles conçue pour la suite de protocoles Internet TCP-IP standardisé par l’IETF (Internet Engineering Task Force) pour l’IPv4 mais aussi l’IPv6 permettant une communication sécurisée avec des réseaux IP qui ne sont pas dignes de confiance. La confidentialité, l’authenticité et l’intégrité de la circulation des données sont assurées par un système d'authentification et de cryptage . +- Protocoles de transfert : -On peut répartir la suite des protocles IPSec en 3 groupes : + - AH ( Authentication Header ) + - ESP ( Encapsulating Security Payload ) +- Gestion des clés : - - Protocoles de transfert : - - - AH ( Authentication Header ) - - ESP ( Encapsulating Security Payload ) - - - Gestion des clés : - - - ISAKMP ( Internet Security Association and Key Management Protocol ) - - IKE ( Internet Key Exchange ) - - - Base de données : - - - SAD ( Security Association Database ) - - SPD ( Security Policy Database ) + - ISAKMP ( Internet Security Association and Key Management Protocol ) + - IKE ( Internet Key Exchange ) +- Base de données : + + - SAD ( Security Association Database ) + - SPD ( Security Policy Database ) ### Protocoles de transfert AH et ESP @@ -53,24 +49,20 @@ La combinaison de ces protocoles possède deux mode de fonctionnnemnt, le mode ` Le mode transport a possède un temps de traitement rapide, mais ne sécurise que les données de l'utilisateur, les adresses source et cible restent non protégées c'est pourquoi ce mode ce mode ne peut être utilisé qu’entre deux machines, par exemple routeur à routeur ou ordinateur à ordinateur. - - Il commence par crypter les données - - Ensuite il rajoute un entête intermédiaire entre l’entête du paquet et les données. -Screenshot 2022-06-14 at 10 32 06 - - - +- Il commence par crypter les données +- Ensuite il rajoute un entête intermédiaire entre l’entête du paquet et les données. + `Screenshot 2022-06-14 at 10 32 06` - Fonctionnement en mode Tunnel : - + Le paquet recoit une nouvelle en-tête IP contenant les adresse source et cible ainsi que les données. Ce mode permet de connectées deux réseaux entre eux. - - Il commence par crypter le paquet contenant les données - - Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre -l’expéditeur et le destinataire. +- Il commence par crypter le paquet contenant les données +- Ensuite il forme un nouveau paquet avec une nouvelle entête IP pour assurer l’intégrité de celui-ci et donc empêcher un pirate de connaitre + l’expéditeur et le destinataire. Screenshot 2022-06-14 at 10 31 58 - ### Gestion des clés IKE & ISAKMP IKE ou Internet Key Exchange est un procédé de gestion de clés permettant d'assurer la négociation entre deux entités afin de mettre en place un canal de communication sécurisé entre celles-ci. Ce dernier utilise l'algorithme Diffie-Hellaman pour l'échange des clés tout en combinaison avec ISAKMP . @@ -90,7 +82,7 @@ Dans la base de données SDP on va retrouver les information permettant de déte ## Les points positifs et négatif d'IPSec -Les avantages d’IPSec sont indéniables en matière de performance et de fiabilité. +Les avantages d’IPSec sont indéniables en matière de performance et de fiabilité. Une fois le tunnel ouvert, les différentes formes de paquets de données (mail, ftp, voip,... ) peuvent être communiquées sans que des outils/applications n’aient à être installés. IPSec fourni également une grande sécurité pour le trafic de données interne des entreprises mais cela peut aussi réduire la vitesse de communication. @@ -98,21 +90,20 @@ Deplus IPSec complique la traversée des NAT et Pare-Feu à cause de l’absence ## Exemple utilisation d'IPSec -Voici un exemple d'utilisation IPSec en mode tunnel : +Voici un exemple d'utilisation IPSec en mode tunnel : -Prennons par exemple une entreprise qui possède deux sites, celle-ci aimerait que ses deux sites puissent communiquer sur le même réseau de mainère sécurisée. Pour répondre à ce besoin elle va mettre en place un VPN pour relier les deux sites et utiliser la suite de protocoles IPSec afin de créer un tunnel sécursié entre les deux sites. +Prennons par exemple une entreprise qui possède deux sites, celle-ci aimerait que ses deux sites puissent communiquer sur le même réseau de mainère sécurisée. Pour répondre à ce besoin elle va mettre en place un VPN pour relier les deux sites et utiliser la suite de protocoles IPSec afin de créer un tunnel sécursié entre les deux sites. ![Screenshot 2022-06-08 at 15 47 43](https://user-images.githubusercontent.com/43784062/172632849-84ae322a-aad7-4681-88c0-fdca4b8bc8fc.png) - -Voici un exemple d'utilisation IPSec en mode transport : +Voici un exemple d'utilisation IPSec en mode transport : Prennons par exemple, une connexion bureau à distance sécurisée où une personne sur une machine A se connecte sur une seconde machine B ( ex : Teamviewer ). Pour établir une communication sécurisé entre sa machine et la seconde elle va devoir utiliser le mode Transport d'IPSec. ![Screenshot 2022-06-08 at 16 19 19](https://user-images.githubusercontent.com/43784062/172640127-7c37ab62-fd3b-436b-b80e-e88c07368373.png) - ## Sources : + [1] https://www.ionos.com/digitalguide/server/know-how/ipsec-security-architecture-for-ipv4-and-ipv6/, consulté le 26/05/2022, date article : 03/08/2016, auteur : /, Affiliation : ionos.com, titre artcile : Secure network connections with IPsec [2] https://www.frameip.com/vpn/, consulté le 26/05/2022, date article : /, auteur : /, Affiliation : frameip.com, titre artcile : RÉSEAU PRIVÉ VIRTUEL VPN @@ -123,8 +114,6 @@ Prennons par exemple, une connexion bureau à distance sécurisée où une perso [5] https://www.sstic.org/media/SSTIC2006/SSTIC-actes/Faiblesses_d_IPSec_en_deploiements_reels/SSTIC2006-Article-Faiblesses_d_IPSec_en_deploiements_reels-vanhullebus.pdf, consulté le 31/05/2022, auteusr :Yvan Vanhullebus , Affiliation : Netasq, titre article : Faiblesses d’IPSec en déploiements réels - - [6] https://www.rfc-editor.org/rfc/rfc2408.html, consulté le 31/05/2022 , date article : Novembre 1998 ,auteurs : D. Maughan & M. Schertler & M. Schneider & J. Turner , Affiliation : RFC, titre article : Internet Security Association and Key Management Protocol (ISAKMP) [7] https://www.rfc-editor.org/rfc/rfc3947.html, consulté le 31/05/2022, date article : Janvier 2005, auteurs :T. Kivinen & B. Swander & A. Huttunen & V. Volpe , Affiliation : RFC, titre article : Negotiation of NAT-Traversal in the IKE diff --git "a/R\303\251seaux/https.md" "b/S\303\251curit\303\251/https.md" similarity index 60% rename from "R\303\251seaux/https.md" rename to "S\303\251curit\303\251/https.md" index 0071b48..b0b4d47 100644 --- "a/R\303\251seaux/https.md" +++ "b/S\303\251curit\303\251/https.md" @@ -1,18 +1,15 @@ --- layout: default title: HTTPS -parent: Réseaux +parent: Sécurité --- - -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) - # HTTPS ## Qu'est-ce que HTTPS ? Le HTTPS est un protocole permettant de sécuriser les échanges de données entre un serveur et un client, et de valider l’identité d’un site visité. Cette double sécurisation est essentielle : elle garantit la confidentialité des données et rassure les internautes qui se connectent à votre site web. -C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SSL ou TLS.
+C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SSL ou TLS. `
`

What's HTTPS?
@@ -21,35 +18,28 @@ C'est le protocole de transfert HTTP qui est encapsulé au sein d'une session SS ## Pourquoi HTTPS ? -- Meilleur référencement et positionnement par l'algorithme de Google. - -- Protéger les informations des internautes et de vos clients en évitant les attaques de l'homme du milieu ( l'interception du trafic). - -- Éviter d’avoir le label “Non sécurisé” à l’affichage de votre site internet. - -- Pour bénéficier de HTTP/2.0
La norme n'impose pas HTTPS mais les navigateurs Firefox et Chrome requiert HTTPS pour se connecter à un site en HTTP/2.0. +- Meilleur référencement et positionnement par l'algorithme de Google. +- Protéger les informations des internautes et de vos clients en évitant les attaques de l'homme du milieu ( l'interception du trafic). +- Éviter d’avoir le label “Non sécurisé” à l’affichage de votre site internet. +- Pour bénéficier de HTTP/2.0 `
` La norme n'impose pas HTTPS mais les navigateurs Firefox et Chrome requiert HTTPS pour se connecter à un site en HTTP/2.0. ## Objectifs d'HTTPS 1. Confidentialité : - Les données échangées sont chiffrées à l'aide d'une clé et ne peuvent être déchiffrées par les deux parties. - + Les données échangées sont chiffrées à l'aide d'une clé et ne peuvent être déchiffrées par les deux parties. 2. Authentification : - Le client vérifie que le serveur qu'il adresse est celui qu'il prétend être (ceci évite les attaques de l'homme du milieu). Au besoin, le client peut vérifier son identité auprès du serveur. - + Le client vérifie que le serveur qu'il adresse est celui qu'il prétend être (ceci évite les attaques de l'homme du milieu). Au besoin, le client peut vérifier son identité auprès du serveur. 3. Intégrité : - Les parties s'assurent que les données reçues n'ont pas fait l'objet d'une modification. - + Les parties s'assurent que les données reçues n'ont pas fait l'objet d'une modification. 4. Transparence : - Aucun changement nécessaire dans le protocole applicatif englobé. - + Aucun changement nécessaire dans le protocole applicatif englobé. 5. Spontanéité : - Un client peut spontanément se connecter à un serveur (pas de prérequis). + Un client peut spontanément se connecter à un serveur (pas de prérequis). ### Comprendre le SSL/TLS [1] @@ -61,25 +51,25 @@ Aujourd'hui il n'y a plus que TLS mais on fait référence à SSL par abus de la ### Versions SSL/TLS [4] -- SSL 1.0 (jamais publié) par Netscape, -- SSL 2.0 en 1995, déprécié en 2011 par la RFC 6176, -- SSL 3.0/RFC 6101 en 1996 (refonte), déprécié en 2015 par la RFC 7568, -- TLS 1.0 / RFC 2246 en 1999 (modifications mineures), -- TLS 1.1 / RFC 4346 en 2006 (protections contre les attaques sur CBC), -- TLS 1.2/ RFC 5246 en 2008 (chiffrement authentifié ou AEAD via GCM et CCM), -- Mise à jour sur TLS 1.2 en 2011/ RFC 6176 (compatibilité SSL), -- TLS 1.3 / RFC 8446 en 2018 (compression, renégociation, MD5, SHA1, RC4, 3DES, PFS obligatoire, optimisation réseau (0-RTT) , SHA-256, Courbe elliptique 25519 & 448). +- SSL 1.0 (jamais publié) par Netscape, +- SSL 2.0 en 1995, déprécié en 2011 par la RFC 6176, +- SSL 3.0/RFC 6101 en 1996 (refonte), déprécié en 2015 par la RFC 7568, +- TLS 1.0 / RFC 2246 en 1999 (modifications mineures), +- TLS 1.1 / RFC 4346 en 2006 (protections contre les attaques sur CBC), +- TLS 1.2/ RFC 5246 en 2008 (chiffrement authentifié ou AEAD via GCM et CCM), +- Mise à jour sur TLS 1.2 en 2011/ RFC 6176 (compatibilité SSL), +- TLS 1.3 / RFC 8446 en 2018 (compression, renégociation, MD5, SHA1, RC4, 3DES, PFS obligatoire, optimisation réseau (0-RTT) , SHA-256, Courbe elliptique 25519 & 448). ### Rappels cryptographiques [2] Le chiffrement symétrique et asymétrique sont les deux techniques utilisées pour protéger la confidentialité de votre message sur internet. La différence fondamentale entre les deux réside dans le fait que le chiffrement symétrique permet de chiffrer et de déchiffrer le message à l'aide de la même clé. En revanche, le chiffrement asymétrique utilise la clé publique pour le chiffrement et une clé privée pour le déchiffrage. -| | Chiffrement symétrique | Chiffrement asymétrique | -| :---------: | :----------------------------------------------------: | :---------------------------------------------------------: | -| Définition | Une seule clé pour le chiffrement et le déchiffrement. | Une clé différente pour le chiffrement et le déchiffrement. | +| | Chiffrement symétrique | Chiffrement asymétrique | +| :---------: | :------------------------------------------------------: | :--------------------------------------------------------------: | +| Définition | Une seule clé pour le chiffrement et le déchiffrement. | Une clé différente pour le chiffrement et le déchiffrement. | | Performance | Rapide en exécution. | Lent à l’exécution en raison de la charge de calcul élevée. | -| Algorithmes | AES, DES, 3DES et RC4. | Diffie-Hellman, RSA. | -| Objectif | Utilisé pour la transmission massive des données. | Souvent utilisé pour l'échange des clés secrètes. | +| Algorithmes | AES, DES, 3DES et RC4. | Diffie-Hellman, RSA. | +| Objectif | Utilisé pour la transmission massive des données. | Souvent utilisé pour l'échange des clés secrètes. | ## Authentification [3] @@ -87,16 +77,16 @@ Un certificat c'est comme la carte d'identité d'un serveur, il permet d'assurer Il existe 3 types de certificats. -1. Validation de domaine
+1. `` Validation de domaine `
` Simple vérification sur l’appartenance du domaine. -2. Validation d’organisation
+2. `` Validation d’organisation `
` Vérification de l’identité du propriétaire (carte d’identité, SIRET, etc). -3. Validation étendue
+3. `` Validation étendue `
` Enquête sur le propriétaire (vérification d’une présence physique, opérationnelle et juridique), permet l’affichage du propriétaire dans la barre d’adresse). ## Mise en pratique [5] -Si vous avez un site HTTP en production sous apache et que vous souhaitez le mettre en HTTPS, la solution la plus simple consiste à utiliser l'outil [Certbot](https://doc.ubuntu-fr.org/apache2#activation_du_module_ssl) de [Let's Encrypt](https://letsencrypt.org/fr/). +Si vous avez un site HTTP en production sous apache et que vous souhaitez le mettre en HTTPS, la solution la plus simple consiste à utiliser l'outil [Certbot](https://doc.ubuntu-fr.org/apache2#activation_du_module_ssl) de [Let's Encrypt](https://letsencrypt.org/fr/). L’objectif de Let’s Encrypt et du protocole ACME est de permettre la mise en place d’un serveur HTTPS et l’obtention automatique d’un certificat de confiance, reconnu nativement par les navigateurs, sans intervention humaine. Ceci est accompli en exécutant un agent de gestion de certificat sur le serveur Web. @@ -142,50 +132,43 @@ Vous trouverez une documentation plus détaillée à ce sujet sur [cette page](h Voilà, nous avons terminé ! Nous avons appris ce qu'est le HTTPS et comment le mettre en place. -- dites TLS et pas SSL (déprécié!) -- HTTPS bientôt le « défaut » -- commencez vos nouveaux projets en HTTPS (même en dev pour s'approcher de la réalité !) -- Soyez à jour, testez régulièrement votre site et actualisez sa configuration -- Utilisez les outils d'automatisation TLS (Let’s encrypt/ACME) +- dites TLS et pas SSL (déprécié!) +- HTTPS bientôt le « défaut » +- commencez vos nouveaux projets en HTTPS (même en dev pour s'approcher de la réalité !) +- Soyez à jour, testez régulièrement votre site et actualisez sa configuration +- Utilisez les outils d'automatisation TLS (Let’s encrypt/ACME) ## Bibliographie 1. [Qu’est ce que SSL/TLS et HTTPS ?](https://www.hostinger.fr/tutoriels/quest-ce-que-ssl-tls-et-https), Bernadeta Kairyte, 08 mars 2022, consulté le 1er mai 2022. - - Résumé : Présentation des protocoles de chiffrement et de sécurité. - - Avis sur la ressource : Très bon résumé concernant le protocole SSL/TLS et HTTPS. - + - Résumé : Présentation des protocoles de chiffrement et de sécurité. + - Avis sur la ressource : Très bon résumé concernant le protocole SSL/TLS et HTTPS. 2. [Différence entre le cryptage symétrique et asymétrique](https://waytolearnx.com/2018/07/difference-entre-le-cryptage-symetrique-et-asymetrique.html#comment-2889), Anonyme, 23 juillet 2022, consulté le 30 avril 2022 - - Résumé : Explication de la différence entre le cryptage symétrique et asymétrique. - - Avis sur la ressource : Resumé assez court mais très pertinent. - + - Résumé : Explication de la différence entre le cryptage symétrique et asymétrique. + - Avis sur la ressource : Resumé assez court mais très pertinent. 3. [Types de certificats SSL : Lequel convient le mieux à votre site ?](https://kinsta.com/fr/blog/types-de-certificats-ssl/), Salman Ravoof, 28 juillet 2021, consulté le 01 mai 2022 - - Résumé : Les différents types de certificats SSL. - - Avis sur la ressource : Explication dans les grandes lignes. - + - Résumé : Les différents types de certificats SSL. + - Avis sur la ressource : Explication dans les grandes lignes. 4. [SSL/TLS and PKI History](https://www.feistyduck.com/ssl-tls-and-pki-history/), Ivan Ristić, février 2022, consulté le 27 avril 2022 - - Résumé : L'histoire du protocole SSL/TLS et de la PKI. - - Avis sur la ressource : Résume assez long mais très pertinent. - + - Résumé : L'histoire du protocole SSL/TLS et de la PKI. + - Avis sur la ressource : Résume assez long mais très pertinent. 5. [Utiliser HTTPS avec Apache2](https://doc.ubuntu-fr.org/tutoriel/securiser_apache2_avec_ssl), Gabriel Theuws, 16 mars 2021, consulté le 25 avril 2022 - - Résumé : Mise en place de certbot dans un ser apache. - - Avis sur la ressource : Les etapes de configuration sont très bien expliquées. - + - Résumé : Mise en place de certbot dans un ser apache. + - Avis sur la ressource : Les etapes de configuration sont très bien expliquées. 6. [Mettre son site en ligne (4/4) : Comprends le SSL / HTTPS](https://www.youtube.com/watch?v=_UpuZ0Y3k-c), Jonathan Boyer, 24 février 2016, consulté le 26 avril 2022 - - Résumé : Vidéo expliquant le fonctionnement des protocoles SSL/TLS et HTTPS. - - Avis sur la ressource : Video de qualité et les démonstantions sont bien illustrées. - + - Résumé : Vidéo expliquant le fonctionnement des protocoles SSL/TLS et HTTPS. + - Avis sur la ressource : Video de qualité et les démonstantions sont bien illustrées. 7. [Représentation HTTPS](https://www.oni.fr/wp-content/uploads/2018/07/est-ce-que-le-https-est-bon-pour-le-seo-1.jpg), Camille DOSTIE, 03 Juillet 2018, consulté le 08 mai 2022 - - Résumé : Image expliquant le protocole HTTPS. - - Avis sur la ressource : Images bien illustrées. - + - Résumé : Image expliquant le protocole HTTPS. + - Avis sur la ressource : Images bien illustrées. 8. [HTTPS n’aura plus de secret pour vous](https://www.youtube.com/watch?v=NCPgs4YlijU&t=2186s), Grégory Paul, 09 mai 2016, consulté le 01 mai 2022 - - Résumé : Conférence Devoxx sur le protocoles HTTPS. - - Avis sur la ressource : La vidéoconférence est présentée par quelqu'un de très compétent en la matière. + - Résumé : Conférence Devoxx sur le protocoles HTTPS. + - Avis sur la ressource : La vidéoconférence est présentée par quelqu'un de très compétent en la matière. diff --git "a/R\303\251seaux/Les protocoles VPN.md" "b/S\303\251curit\303\251/protocoles_vpn.md" similarity index 90% rename from "R\303\251seaux/Les protocoles VPN.md" rename to "S\303\251curit\303\251/protocoles_vpn.md" index 18dcf49..3aaa515 100644 --- "a/R\303\251seaux/Les protocoles VPN.md" +++ "b/S\303\251curit\303\251/protocoles_vpn.md" @@ -1,25 +1,22 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Protocoles VPN +parent: Sécurité +--- # Les protocoles VPN - - ## Introduction : Les connexions VPN (Virutal Private Network) permettent de créer un lien sécurisé entre deux points, elles sont utilisées par les entreprises pour fournir à leurs employés un moyen d'accéder au réseau interne ou à des ressources internes depuis un ordinateur ou un réseau distant. Les connexions VPN sont chiffrées ce qui rend le trafic opaque pour les personnes non autorisées. Il existe aussi des connexions VPN commerciaux destinés aux internautes pour chiffrer leurs trafic et garantir leurs anonymat ainsi que contourner la censure. Cet article est consacré aux VPN qui passent à travers internet, donc n'abordera pas les VPN privés tel que les VPN MPLS. La première connexion VPN a été développé par un employé de Microsoft en 1996. Il a développé le “point-to-point tunneling protocol” (PPTP). -Il existe trois types de connexions VPN : - +Il existe trois types de connexions VPN : 1- Site to Site VPN => entre deux réseaux d’entreprise ![image](https://user-images.githubusercontent.com/71373221/172702429-810763b1-7064-47d3-82c4-985e9d6fa493.png) - - - - 2- Client to Site VPN => entre un équipement client et un réseau d’entreprise. ![image](https://user-images.githubusercontent.com/71373221/172702490-6885a770-2e6d-4a71-a2a5-700b60072871.png) @@ -28,8 +25,6 @@ Il existe trois types de connexions VPN : ![image](https://user-images.githubusercontent.com/71373221/172167250-c4a129a1-8677-4987-a332-770f594a8b81.png) - - Le choix du protocole VPN à utiliser se base sur trois facteurs: 1- Les algorithmes de chiffrement utilisés donc le niveau de sécurité et de cryptage offert @@ -38,16 +33,12 @@ Le choix du protocole VPN à utiliser se base sur trois facteurs: 3- La facilité de mise en place - ## Les protocoles VPN - - - ### PPTP signifie Point-to-Point Protocol C’est le protocole VPN le plus ancien, ses plus gros avantages sont la vitesse qu’il offre et la facilité de configuration. Son cryptage est faible (128 bits) donc facilement piratable - + • Ce protocole est compatible avec toutes les plateformes : Windows, Linux, macOS, iOS, Android, Tomato, DD-WRT et d’autres systèmes d’exploitation et appareils. • Pour établir une connexion PPTP il faut l’adresse du serveur, un nom d’utilisateur et un mot de passe. @@ -61,8 +52,6 @@ Le schéma suivant montre comment un paquet PPTP est assemblé. ![image](https://user-images.githubusercontent.com/71373221/172167318-0a443f0d-833c-4158-bf44-e4ae609382c6.png) - - ### L2TP/ Ipsec L2TP ou Layer 2 Tunneling Protocol fusionne les meilleures fonctionnalités des deux protocoles de tunneling PPTP (Point-to-Point Tunneling Protocol) et L2F (Layer 2 Forwarding Protocol). Il est compatible avec plusieurs plateformes. @@ -80,55 +69,52 @@ Il encapsule les données deux fois, ce qui peut ralentir la connexion. Cependan • Très facile à configurer -L2TP est un protocole de niveau 2, le principe de ce protocole est de crypter des trames PPP et de les encapsuler dans un datagramme IP qui est crypté avec IPsec. -IPsec permet de sécuriser les échanges au niveau de la couche réseau. +L2TP est un protocole de niveau 2, le principe de ce protocole est de crypter des trames PPP et de les encapsuler dans un datagramme IP qui est crypté avec IPsec. +IPsec permet de sécuriser les échanges au niveau de la couche réseau. Le schéma suivant montre comment un paquet L2TP/IPsec est assemblé. ![image](https://user-images.githubusercontent.com/71373221/172167379-f74de74f-d68d-41e8-a7b7-a07404487c39.png) ### SSTP (Secure Socket Tunneling Protocol): - + SSTP est un protocole VPN développé par Microsoft pour remplacer PPTP et L2TP/IPSec. Il a été introduit pour améliorer la sécurité des transferts de données et éviter les blocages des pare-feu. Il utilise SSL/TLS, des négociations de clés sécurisées et des transferts cryptés. Lorsqu'un client établit une connexion VPN basée sur SSTP, il établit d'abord une connexion TCP au serveur SSTP via le port TCP 443. L'établissement de liaison SSL/TLS se produit via cette connexion TCP. • Disponible sur Linux et Mac OS X mais il est utilisé principalement sur Windows. -• SSTP utilise le chiffrement AES-256 (Advanced Encryption Standard) +• SSTP utilise le chiffrement AES-256 (Advanced Encryption Standard) • Facile à installer et à configurer -• Utilise TCP sur le port 443 ce qui le rend difficile à bloquer +• Utilise TCP sur le port 443 ce qui le rend difficile à bloquer -SSTP est un protocole de niveau transport , les paquets IP sont chiffrés, encapsulés puis transportés dans un canal SSL. +SSTP est un protocole de niveau transport , les paquets IP sont chiffrés, encapsulés puis transportés dans un canal SSL. Le schéma suivant montre comment un paquet SSTP est assemblé. - ![image](https://user-images.githubusercontent.com/71373221/172168007-9ef2bcdf-a25c-4acf-98d2-f666cbda1b03.png) - -### IKEv2/IPsec : Internet Key Exchange version 2 with IPsec +### IKEv2/IPsec : Internet Key Exchange version 2 with IPsec IKEv2 est un protocole de tunnellisation. Il est associé à IPsec pour assurer la sécurité du trafic internet. Il est plus rapide que les autres protocoles grâce à la prise en charge de MOBIIKE. • Très sécurisée - Prend en charge plusieurs versions d’AES. • IKEv2 est pris en charge par moins de systèmes et de logiciels que L2TP/IPSec - • IKEv2 utilise le port 500 du protocole UDP, donc peut être bloqué par un pare-feu. • Connexion stable et cohérente -IKEv2 est un protocole de niveau application, il permet l’échange de clés secrètes de façon sécurisée. Le principe de ce protocole est de chiffrer des messages en utilisant des clés pré-partagées. IPsec permet de sécuriser les échanges au niveau de la couche réseau. +IKEv2 est un protocole de niveau application, il permet l’échange de clés secrètes de façon sécurisée. Le principe de ce protocole est de chiffrer des messages en utilisant des clés pré-partagées. IPsec permet de sécuriser les échanges au niveau de la couche réseau. IKE combine des éléments issus de protocoles différents : -- ISAKMP : Internet Security Association and Key Management Protocol (RFC 2408) -- OAKLEY : Oakley Key Determination Protocol (RFC 2412) -- DOI : IPSec Domain of Interpretation (RFC 2407) + +- ISAKMP : Internet Security Association and Key Management Protocol (RFC 2408) +- OAKLEY : Oakley Key Determination Protocol (RFC 2412) +- DOI : IPSec Domain of Interpretation (RFC 2407) Le schéma suivant montre l’emplacement de IKE et IPsec dans les couches TCP/IP. ![image](https://user-images.githubusercontent.com/71373221/172167414-8ffaa2f6-dc8e-4c1b-b80c-b58e895b7f19.png) - ### OpenVPN C’est le protocole VPN le plus utilisé, il est compatible avec plusieurs équipements. Il offre une forte sécurité et ne ralentit pas la connexion internet, il est open source donc fiable. @@ -136,51 +122,44 @@ C’est le protocole VPN le plus utilisé, il est compatible avec plusieurs équ • Très sécurisée - Il crypte les données avec un chiffrement complexe, notamment AES et Camellia, des algorithmes de chiffrement 256 bits. - • Il s’appuie sur SSL/TLS pour l’authentification et le cryptage. -• Utilisation du chiffrement AES-256 et n’importe quel port. - +• Utilisation du chiffrement AES-256 et n’importe quel port. • Open source, ce qui le rend plus fiable • Possibilité d’améliorer la Vitesse en utilisant UDP. - -• La configuration est complexe. +• La configuration est complexe. Le transfert de données démarre après l'échange de la clé symétrique en utilisant la connexion TLS déjà établie. OpenVPN utilise un tunnel UDP sans connexion où il n'y a pas de mécanisme de retransmission et ACK. La structure de paquet ainsi que l'encapsulation de la couche réseau peuvent être vues dans l’image ci-dessous. -L'en-tête de paquet se compose uniquement d'opcode et d'ID de clé. L'opcode est utilisé pour identifier le type de paquet, l'ID de clé est utilisé pour identifier l'état TLS local associé. +L'en-tête de paquet se compose uniquement d'opcode et d'ID de clé. L'opcode est utilisé pour identifier le type de paquet, l'ID de clé est utilisé pour identifier l'état TLS local associé. ![image](https://user-images.githubusercontent.com/71373221/172167457-f08c2733-d506-41a2-b0d6-cdaff62bb6be.png) - - ### WireGuard C’est un protocole récent, développé en 2017 pour Linux, son principal avantage est sa vitesse ultra-rapide. -• Il est compatible avec windows, macOS, iOS et Android. +• Il est compatible avec windows, macOS, iOS et Android. -• Il utilise deux clefs une publique et une privée pour gérer l’authentification du serveur et des différents clients. +• Il utilise deux clefs une publique et une privée pour gérer l’authentification du serveur et des différents clients. • Utilise le protocole UDP, donc peut être bloqué par un pare-feu. • Simple et facile à configurer -• Utilise ChaCha20 pour le chiffrement et Poly1305 pour l'authentification. Il utilise aussi Curve25519 pour l'échange de clé Diffie-Hellman à courbe elliptique (ECDH) ; BLAKE2s pour le hachage; et un handshake 1.5 Round Trip Time (1.5-RTT) +• Utilise ChaCha20 pour le chiffrement et Poly1305 pour l'authentification. Il utilise aussi Curve25519 pour l'échange de clé Diffie-Hellman à courbe elliptique (ECDH) ; BLAKE2s pour le hachage; et un handshake 1.5 Round Trip Time (1.5-RTT) Le protocole WireGuard fournit un tunnel réseau sécurisé entre deux terminaux en utilisant le protocole UDP (User Datagram Protocol) comme protocole de transport. Il utilise un protocole cryptographique de handshake appelé Noise pour fournir une authentification mutuelle et l’accord sur la clé. Les données de transport telles que les paquets IP encapsulés dans les tunnels WireGuard sont protégées à l'aide du chiffrement authentifié avec données supplémentaires (AEAD). - ## Conclusion ![image](https://user-images.githubusercontent.com/71373221/172167603-14fd30d6-0057-47b3-8cc6-dc9a989246bc.png) +Le PPTP est un ancien protocole vulnérable actuellement, il est conseillé de ne plus l’utiliser. -Le PPTP est un ancien protocole vulnérable actuellement, il est conseillé de ne plus l’utiliser. - -L2TP est une bonne option si la sécurité est plus importante pour la connexion VPN que la vitesse. IKEv2/IPsec est le plus rapide, plus que L2TP et PPTP, Il est plus léger et plus stable qu'OpenVPN. Il offre le même niveau de sécurité que L2TP et OpenVPN. +L2TP est une bonne option si la sécurité est plus importante pour la connexion VPN que la vitesse. IKEv2/IPsec est le plus rapide, plus que L2TP et PPTP, Il est plus léger et plus stable qu'OpenVPN. Il offre le même niveau de sécurité que L2TP et OpenVPN. WireGuard peut être bloqué par les pare-feux car il utilise UDP, comme IKEv2. Il est toujours en cours de développement et doit encore faire l'objet d’audits de sécurité. @@ -188,41 +167,35 @@ OpenVPN est cependant moins susceptible d'être bloqué par les pare-feux lorsqu SSTP est un protocole propriétaire de Microsoft, s’il faut choisir entre PPTP, L2TP et SSTP, pour un ordinateur Windows, il vaut mieux utiliser SSTP car il peut contourner les pares-feux et il est plus sécurisé que PPTP. - - - ## Bibliographie - * IPSec Overview Part Four: Internet Key Exchange (IKE) -https://www.ciscopress.com/articles/article.asp?p=25474&seqNum=7 + https://www.ciscopress.com/articles/article.asp?p=25474&seqNum=7 Consulté le 21 mai 2022 Date de publication : Feb 22, 2002. L'article est écrit par Cisco Press . - -Résumé : Article écrit par Cisco et décrit les protocoles IPSec et IKE1&2. +Résumé : Article écrit par Cisco et décrit les protocoles IPSec et IKE1&2. Avis sur la resource : Excellent article, il donne des détails technique approfondis sur les protocoles IPSec et IKE1&2. * Les différents protocoles utilisées par les fournisseurs VPN -https://www.vpnmonde.com/les-differents-protocoles-pour-les-vpn/ + https://www.vpnmonde.com/les-differents-protocoles-pour-les-vpn/ Consulté le 20 mai 2022 -Résumé : Article écrit par des bénévoles en sécurité informatique, il analyse et compare les différents protocoles VPN du marché. +Résumé : Article écrit par des bénévoles en sécurité informatique, il analyse et compare les différents protocoles VPN du marché. Avis sur la resource : Excellent article, il explique en détails les protocoles VPN et donne les avantages et inconvénients de chaque protocole. - * Understanding VPN Protocols: Which One is Best? | CyberNews -https://cybernews.com/what-is-vpn/vpn-protocols/ + https://cybernews.com/what-is-vpn/vpn-protocols/ Consulté le 13 mai 2022 -Résumé : Cet article explique les protocoles VPN, il compare aussi les différents protocoles utilisés. +Résumé : Cet article explique les protocoles VPN, il compare aussi les différents protocoles utilisés. -Avis sur la resource : ce document décrit bien les protocoles VPN et fait une comparaison détaillée. +Avis sur la resource : ce document décrit bien les protocoles VPN et fait une comparaison détaillée. * Secure Socket Tunneling Protocol (SSTP).: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-sstp/70adc1df-c4fe-4b02-8872-f1d8b9ad806a @@ -232,7 +205,7 @@ Date de publication: 06/24/2021. L'article est écrit par Microsoft. -Résumé : Article écrit par Microsoft et décrit le protocole SSTP. +Résumé : Article écrit par Microsoft et décrit le protocole SSTP. Avis sur la ressource : Excellent article, il donne des détails technique approfondis sur le protocole SSTP. * Les VPNs et les protocoles SLIP, PPP, PPTP, L2F, L2TP, LCP, IPSec, MPLS, NAT: http://wapiti.enic.fr/commun/ens/peda/options/ST/RIO/pub/exposes/exposesrio2001ttv02/Roudel_Maroc/index.htm @@ -243,10 +216,5 @@ Date de publication: Janvier 2002. L'article est écrit par Philippe Roudel et Alain Maroc ENIC. -Résumé : Cet article décrit les protocoles suivants: SLIP, PPP, PPTP, L2F, L2TP, LCP, IPSec, MPLS, NAT. +Résumé : Cet article décrit les protocoles suivants: SLIP, PPP, PPTP, L2F, L2TP, LCP, IPSec, MPLS, NAT. Avis sur la ressource : Excellent article, il donne des détails technique approfondis sur tous les protocoles abordés. - - - - - diff --git "a/R\303\251seaux/Analyse Zabbix.md" "b/S\303\251curit\303\251/zabbix.md" similarity index 91% rename from "R\303\251seaux/Analyse Zabbix.md" rename to "S\303\251curit\303\251/zabbix.md" index 6de8258..bd6b183 100644 --- "a/R\303\251seaux/Analyse Zabbix.md" +++ "b/S\303\251curit\303\251/zabbix.md" @@ -1,27 +1,35 @@ +--- +layout: default +title: Zabbix +parent: Sécurité +--- + # Zabbix ## 1. Introduction -Zabbix est un logiciel de monitoring open source. Projet démarré en tant que logiciel interne en 1998, il est rendu public en 2011 et la première version stable du logiciel, la 1.0, sort en 2004. Actuellement, la dernière version majeure disponible et stable est la 6.0.4 disponible depuis le 3 mai 2022 mais il existe aussi la version 6.2.0 qui est en bêta. Zabbix est utilisé pour la surveillance de divers composant informatique telle que les serveurs, machines virtuelles et services cloud. [1] [7] +Zabbix est un logiciel de monitoring open source. Projet démarré en tant que logiciel interne en 1998, il est rendu public en 2011 et la première version stable du logiciel, la 1.0, sort en 2004. Actuellement, la dernière version majeure disponible et stable est la 6.0.4 disponible depuis le 3 mai 2022 mais il existe aussi la version 6.2.0 qui est en bêta. Zabbix est utilisé pour la surveillance de divers composant informatique telle que les serveurs, machines virtuelles et services cloud. [1] [7] ## 2. Fonctionnement -L’outil de supervision Zabbix fonctionne avec une partie coté serveur qui s’installe sur un environnement Linux et un coté agent qui peut s’installer sur n’importe quelle plateforme. [2] -Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix (container dans lequel nos données sont envoyées)[9], c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]
-Il existe aussi le cas de figure où c’est le serveur qui initie la communication via des requêtes grâce à un agent Zabbix et des paramètres utilisateur. Les paramètres utilisateur vont permettre de définir les éléments à monitorer et les données qui devront être récoltée par l’agent Zabbix. Comme pour le trappeur, les données récoltées vont être récoltées et traitées par le serveur. [2] [4]
+L’outil de supervision Zabbix fonctionne avec une partie coté serveur qui s’installe sur un environnement Linux et un coté agent qui peut s’installer sur n’importe quelle plateforme. [2] +Zabbix peut opérer de plusieurs façons pour récolter des informations. Avec un trappeur Zabbix (container dans lequel nos données sont envoyées)[9], c’est l’hôte qui démarre une communication avec le serveur et envoie ses données. Le trappeur permet de mettre en place des scripts afin de définir des variables. Les valeurs contenues dans ces variables sont ensuite transmises au serveur qui lui va traiter ses données et les afficher sur une interface graphique. [2] [3]`
` +Il existe aussi le cas de figure où c’est le serveur qui initie la communication via des requêtes grâce à un agent Zabbix et des paramètres utilisateur. Les paramètres utilisateur vont permettre de définir les éléments à monitorer et les données qui devront être récoltée par l’agent Zabbix. Comme pour le trappeur, les données récoltées vont être récoltées et traitées par le serveur. [2] [4] `
` -Pour assurer la sécurité des communications entre le serveur et les machines clientes, Zabbix va appliquer un système de chiffrement. De cette manière, toutes les données transmissent sont protégées lorsqu’elles circulent sur des réseaux non sécurisés. [5]
+Pour assurer la sécurité des communications entre le serveur et les machines clientes, Zabbix va appliquer un système de chiffrement. De cette manière, toutes les données transmissent sont protégées lorsqu’elles circulent sur des réseaux non sécurisés. [5] `
` Une fois arrivées sur le serveur, les données doivent être stockées. Pour cela, Zabbix utilise une base de données relationnelle sous MySQL ou PostgreSQL. Les données ainsi stockées pourront alors être utilisée par une interface web afin de visualiser le monitoring de nos machines. [5] -Zabbix va permettre ainsi de construire des graphes sur tout un tas de paramètres que l’on décide de monitorer : L’espace disque libre sur un serveur, le taux d’utilisation de la RAM d’une machine, la chaleur du processeur, etc.
+Zabbix va permettre ainsi de construire des graphes sur tout un tas de paramètres que l’on décide de monitorer : L’espace disque libre sur un serveur, le taux d’utilisation de la RAM d’une machine, la chaleur du processeur, etc. `
` ![Architecture Zabbix Agent et trappeur](http://www.kjkoster.org/zapcat/Architecture_files/zabbix%20arch.png). -Afin de mieux gérer les comportement non désiré ou état critique d’une infrastructure IT, Zabbix propose un système d’envoi de notification. L’utilisateur installant et paramétrant l’outil de monitoring, va pouvoir définir des seuils pour un élément que l’on veut surveiller. Ainsi lorsque, par exemple, l’espace libre sur le disque de stockage X : de notre serveur sera inférieur à la valeur définie, Zabbix va envoyer une notification par mail, messagerie instantanée ou SMS selon ce qui a été définit. [6]
+Afin de mieux gérer les comportement non désiré ou état critique d’une infrastructure IT, Zabbix propose un système d’envoi de notification. L’utilisateur installant et paramétrant l’outil de monitoring, va pouvoir définir des seuils pour un élément que l’on veut surveiller. Ainsi lorsque, par exemple, l’espace libre sur le disque de stockage X : de notre serveur sera inférieur à la valeur définie, Zabbix va envoyer une notification par mail, messagerie instantanée ou SMS selon ce qui a été définit. [6] `
` ## 3. Avantages et Inconvénients + ### 3.1. Avantages : + * Découverte automatique du réseau[10] * Intégration SNMP [7] * Très complet @@ -31,28 +39,31 @@ Afin de mieux gérer les comportement non désiré ou état critique d’une inf Le protocole SNMP permet à une application de gestion (ici Zabbix) de demander des informations provenant d'une unité gérée. L'unité gérée contient un logiciel qui envoie et reçoit des informations SNMP. Ce module logiciel est généralement appelé agent SNMP. [11] ### 3.2. Inconvénients + * Interface très encombrée [8] * La configuration demande une très grande maitrise de l’outil [8] * Gourmand en ressources [8] ## 4. Concurrent + Même si Zabbix est un outil de monitoring très populaires à l'heure actuelle, il existe de nombreux autres logiciels de supervision qui ont chacun leurs spécificités. [12] + * Nagios: un de premiers logiciel de ce type ayant vu le jour en 1999 sous le nom de NetSaint. * DataDog: outil de surveillance prévu plus spécifiquement pour les équipes de développement afin de mettre sous forme de graphes les différentes données récoltées par leurs applications. * Microsoft System Center: l'outil de surveillance proposé par Microsoft * Netdata: Conçu et optimisé pour les systèmes Linux * Chekmk: Extrèmement simple à mettre en place - ## 5. Conclusion -Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration qu’ont apportés toutes les versions, Zabbix est maintenant une référence connue dans le monde entier en ce qui concerne le monitoring de système informatique. Malgré la forte concurrence dans ce domaine, Zabbix a réussi à innover et à se différencier des autres outils de monitoring existant.
+Grâce à sa longévité de plus de 20 ans et à chaque ajout et amélioration qu’ont apportés toutes les versions, Zabbix est maintenant une référence connue dans le monde entier en ce qui concerne le monitoring de système informatique. Malgré la forte concurrence dans ce domaine, Zabbix a réussi à innover et à se différencier des autres outils de monitoring existant. `
` ## Sources + * Zabbix. (n.d.). Download million images for free. https://stringfixer.com/fr/Zabbix [1] * Supervision et métrologie Zabbix : principes et fonctionnement - Syloe. (n.d.). Syloe. https://www.syloe.com/supervision-et-metrologie-zabbix [2] * Elément trapper. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/documentation/4.0/fr/manual/config/items/itemtypes/trapper [3] -* Paramètres utilisateur. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] +* Paramètres utilisateur. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution https://www.zabbix.com/documentation/4.0/fr/manual/config/items/userparameters [4] * Kalsin, V. (2020, July 30). Comment installer et configurer Zabbix et configurer des serveurs à distance sur Ubuntu 20.04. DigitalOcean The developer cloud. https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-zabbix-to-securely-monitor-remote-servers-on-ubuntu-20-04-fr [5] * Logiciel zabbix open source | Glossaire Syloé Experts Devops & Cloud. (n.d.). Syloe. https://www.syloe.com/glossaire/logiciel-zabbix/ [6] * Notes de publication. (n.d.). Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution. https://www.zabbix.com/fr/release_notes [7] diff --git a/reseaux.md b/reseaux.md index 5c7482b..1579abf 100644 --- a/reseaux.md +++ b/reseaux.md @@ -4,30 +4,52 @@ title: Réseaux nav_order: 2 has_children: true --- - # Réseaux Cette section regroupe tous les articles concernant le réseau : Protocoles, configuration, outils, bonnes pratiques... -## Protocoles transport et applicatifs +## Services et protocoles transport et applicatifs ### Le DNS + - [Délégation DNS](Réseaux/delegation_dns.md) - [DNSSec](Réseaux/dnssec.md) ### Le Web - [HTTPS](Réseaux/https.md) +- [Le futur d'HTTP](Réseaux/futur_http.md) + +### Le mail + +- [POP](Réseaux/POP.md) ### La VoIP - [IAX](Réseaux/iax.md) +- [Asterix](Réseaux/asterix.md) +- [Comparatif SIP/H323](Réseaux/sip_vs_h323.md) ### Autres - [LDAP](Réseaux/ldap.md) +- [ICMP](Réseaux/ICMP.md) +- [IPSec](Sécurité/IPsec.md) +- [MQTT](Réseaux/MQTT.md) +- [Quic et TCP](Réseaux/quic_tcp.md) +- [SMB](Réseaux/SMB.md) +- [XMPP](Réseaux/XMPP.md) ## Administration réseaux - [Proxy](Réseau/proxy.md) - [Reverse Proxy](Réseaux/reverse_proxy.md) + +## Virtualisation et conteneurisation + +- [Docker Swarm et les réseaux overlays](Réseaux/docker_swarm.md) +- [Kubernetes](Réseaux/kubernetes.md) + +## Outils + +- [Wireshark](Réseaux/wireshark.md) diff --git a/securite.md b/securite.md index e1f261f..ae7f0e6 100644 --- a/securite.md +++ b/securite.md @@ -4,14 +4,16 @@ title: Sécurité nav_order: 2 has_children: true --- - # Sécurité - [PGP](Sécurité/PGP.md) -- [Etude de cas : Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) - +- [Etude de cas : Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) +- [HTTPS](Sécurité/https.md) +- [IPSec](Sécurité/IPsec.md) +- [Protocoles VPN](Sécurité/protocoles_vpn.md) +- [Zabbix](Sécurité/zabbix.md) -# Concepts liés à la sécurité dans d'autres sections : +# Concepts liés à la sécurité dans d'autres sections : - [Reverse Proxy](Réseaux/reverse_proxy.md) - +- [Proxy](Réseaux/proxy.md) diff --git a/template.md b/template.md index 515ff05..3495d84 100644 --- a/template.md +++ b/template.md @@ -1,26 +1,20 @@ -[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +--- +layout: default +title: Titre de l'article +parent: Sécurité/Réseaux/... +--- # Titre ## Sous-titre 1 Texte - - ## Sous-titre 2 Texte - - - - - ## Bibliographie * [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... - - - + - Résumé : ... + - Avis sur la ressource : ... From 27dabeda5f22703e870b9bc1d731e90d43d64b26 Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Mon, 27 Jun 2022 14:34:51 +0200 Subject: [PATCH 179/241] =?UTF-8?q?Ajustement=20des=20chemins=20d'acc?= =?UTF-8?q?=C3=A8s=20vers=20les=20images=20+=20mise=20en=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/POP.md" | 41 ++++++++++++++------------------- "R\303\251seaux/sip_vs_h323.md" | 33 ++++++++++++++------------ "R\303\251seaux/wireshark.md" | 28 +++++++++++----------- 3 files changed, 49 insertions(+), 53 deletions(-) diff --git "a/R\303\251seaux/POP.md" "b/R\303\251seaux/POP.md" index 2ac767b..3074b76 100644 --- "a/R\303\251seaux/POP.md" +++ "b/R\303\251seaux/POP.md" @@ -3,7 +3,6 @@ layout: default title: POP parent: Réseaux --- - # POP ## Qu'est ce que POP [1] [2] @@ -14,15 +13,18 @@ Le gros point négatif de POP vient de là. Après avoir consulté ses mails sur Il est possible de conserver ses mails sur le serveur POP, mais pendant une durée limitée qui doit être configuré sur le client mail de l'utilisateur. -Le protocole Imap, son concurrent, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet à l'utilisateur de consulter leurs emails sur n'importe quelle autre machine. +Le protocole Imap, son concurrent, quant à lui permet de télécharger ses mails à partir d'un serveur mail, mais le mail en question reste sur le serveur. Cela permet à l'utilisateur de consulter leurs emails sur n'importe quelle autre machine. Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc de la vérification de notre identifiant et de notre mot de passe. Il bloque également l'accès à notre boite aux lettres lorsque nous y accédons et empêche alors toutes autres connexions. ## Conversation POP [9] -![](https://github.com/WassimBouhdid/Wiki-TI/blob/main/Assets/Images/conversation%20POP3.PNG) +

+ Conversation POP +

+ -### Le protocole POP gère les commandes suivantes [5] : +### Le protocole POP gère les commandes suivantes [5] : * LIST : donne le nombre de courriers présents sur le serveur avec leur numéro. * RETR [x] : récupère le courrier numéro en attente sur votre serveur. @@ -31,13 +33,13 @@ Le protocole POP peut s'occuper de l'authentification de l'utilisateur et donc d * LAST : récupère le dernier message arrivé sur le serveur. * QUIT : quitte la session et en autorise une autre. -## Oú est-il utilisé ? +## Où est-il utilisé ? Tout les clients mails peuvent être paramétrés afin d'utiliser POP. ## Quel est le futur du protocole POP [5] -POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. +POP4 n'existe qu'en tant que proposition informelle ajoutant la gestion de base des dossiers, la prise en charge des messages en plusieurs parties, ainsi que la gestion des indicateurs de message pour concurrencer IMAP. Cependant, son développement n'a pas progressé depuis 2003. De l'autre côté, son concurrent IMAP a publié sa dernière version, la version 4, en 1994 et aucune version 5 n'a été annoncée jusqu'à aujourd'hui. @@ -56,38 +58,29 @@ De l'autre côté, son concurrent IMAP a publié sa dernière version, la versio ## Sécurisation du protocole POP [10] La sécurisation du protocole POP, peut-être faites de deux manière s -différentes. +différentes. -Premièrement, on peut sécuriser les échanges au niveau du protocole grâce -à un certificat SSL ou TLS. Cette technique permet aux serveurs et aux -clients de s'authentifier mutuellement. Les échanges de messages peuvent +Premièrement, on peut sécuriser les échanges au niveau du protocole grâce +à un certificat SSL ou TLS. Cette technique permet aux serveurs et aux +clients de s'authentifier mutuellement. Les échanges de messages peuvent alors être chiffrés. -Ensuite, il est possible d'ajouter une couche de sécurité PGP et S/MIME. -Ces 2 outils sécurisent le dialogue entre les utilisateurs de la +Ensuite, il est possible d'ajouter une couche de sécurité PGP et S/MIME. +Ces 2 outils sécurisent le dialogue entre les utilisateurs de la messagerie électronique et sur des échanges de bout en bout. -Pour garder l'intégrité et la confidentialité des échanges PGP et S/MIME -fonctionnent à l'aide d'un mécanisme de signature numérique et de +Pour garder l'intégrité et la confidentialité des échanges PGP et S/MIME +fonctionnent à l'aide d'un mécanisme de signature numérique et de chiffrement. ## Source * [1] Fonctionnement du protocole POP et IMAP - Base de connaissances - KALANDA. (2019). Kalanda.Net. Consulté le 27 mai 2022, à l’adresse https://www.kalanda.net/apps/index.php/knowledgebase/27/Fonctionnement-du-protocole-POP-et-IMAP.html#:%7E:text=Le%20protocole%20POP%20permet%20de,les%20voir%20sur%20mon%20smartphone). - * [2] Arobase.org. (2018, 25 septembre). Le protocole POP. Consulté le 25 mai 2022, à l’adresse https://www.arobase.org/fonctionnement/pop.htm#:%7E:text=Le%20protocole%20POP%20g%C3%A8re%20l,m%C3%AAme%20temps%20%C3%A0%20votre%20courrier. - * [3] Questiaux, J. (2021, 18 juin). Mon compte email : choisir POP ou IMAP ? Better Web. Consulté le 20 mai 2022, à l’adresse https://www.betterweb.fr/blog/mon-compte-email-choisir-pop-ou-imap - * [4] A. (2020, 31 décembre). POP3, Post Office Protocol : de quoi s’agit-il, à quoi sert-il et en quoi est-il différent d’IMAP? Informatique Mania. https://www.informatique-mania.com/en/courriers-electroniques/bureau-de-protocole-de-messagerie-pop3/ - * [5] Wikipedia contributors. (2022c, mai 16). Post Office Protocol. Wikipedia. https://en.wikipedia.org/wiki/Post_Office_Protocol - * [6] POP et IMAP : différences, avantages et inconvénients. (2010, 17 mars). L’Orient-Le Jour. https://www.lorientlejour.com/article/650498/POP_et_IMAP%2B%253A_differences%252C__avantages_et_inconvenients.html#:%7E:text=Parmi%20les%20avantages%20du%20compte,enfin%20une%20utilisation%20minimale%20des - * [7] POP3 - RFCs 1939 : https://www.ietf.org/rfc/rfc1939.txt - * [8] IMAP4 - RFCs 3501 : https://datatracker.ietf.org/doc/html/rfc3501 - * [9] POP3-Client-Server-Procedure. (2009). Researchgate. https://www.researchgate.net/figure/POP3-Client-Server-Procedure_fig2_251917023 - -* [10] Problématique. (2003). Techniques de l’Ingénieur. https://www.techniques-ingenieur.fr/base-documentaire/technologies-de-l-information-th9/securite-des-si-services-et-applications-42315210/securite-des-e-mails-pgp-et-s-mime-h5330/problematique-h5330niv10001.html \ No newline at end of file +* [10] Problématique. (2003). Techniques de l’Ingénieur. https://www.techniques-ingenieur.fr/base-documentaire/technologies-de-l-information-th9/securite-des-si-services-et-applications-42315210/securite-des-e-mails-pgp-et-s-mime-h5330/problematique-h5330niv10001.html diff --git "a/R\303\251seaux/sip_vs_h323.md" "b/R\303\251seaux/sip_vs_h323.md" index 927d6ce..ec9afb7 100644 --- "a/R\303\251seaux/sip_vs_h323.md" +++ "b/R\303\251seaux/sip_vs_h323.md" @@ -3,11 +3,10 @@ layout: default title: Comparatif SIP - H323 parent: Réseaux --- -# Comparatif entre SIP et h323 ## 1. Introduction -### 1.1 ``Qu’est-ce que le protocole SIP`` [^1][^2] : +### 1.1 Qu’est-ce que le protocole SIP? [^1] [^2]       La « Session Initiation Protocol » (SIP) est un protocole TCP/IP de le couche applicative normalisée et standardisé par l’IETF*. Il s’agit d’un protocole de communication standard couramment utilisé dans les télécommunications multimédias. Ce dernier est le plus répandu dans la téléphonie par internet (la VoIP*). @@ -25,7 +24,7 @@ parent: Réseaux * Établissement d’une session * Gestion d’une session -### 1.2 ``Qu’est-ce que le protocole H.323`` [^4][^5][^7]: +### 1.2 Qu’est-ce que le protocole H.323? [^4] [^5] [^7]       Comme le SIP, le H.323 est un protocole conçu pour initier, gérer et terminer des sessions médias. Cependant celui-ci est standarisé par L'IEEE*. @@ -41,13 +40,17 @@ parent: Réseaux ### 1.3 Schéma illustrant une communication VoIP (session + multimédia) -``SIP`` [^1] +#### SIP [^1] -![SIP]("../Assets/Images/SchemaSIP.png") +

+ Conversation SIP +

-``H.323`` [^8] +#### H.323 [^8] -![H323]("../Assets/Images/SchemaH323.png") +

+ Conversation SIP +

Documentation du schéma car ce dernier est plus complexe qu'une communication SIP : @@ -64,9 +67,9 @@ Documentation du schéma car ce dernier est plus complexe qu'une communication S * DRQ = Disengage Request, mettre fin à l'appel * DCF = Disengage Confirm, réponse pour mettre fin à l'appel -## 2. Comparaison entre ces deux protocoles [^1][^2][^3][^4][^5] +## 2. Comparaison entre ces deux protocoles [^1] [^2] [^3] [^4] [^5] -### 2.1 ``Codage des messages`` : +### 2.1 Codage des messages :       Les messages H323 sont encodés dans un format binaire compact. Les messages sont efficacement codés et décodés par des machines (codec). Alors que ceux du protocole SIP, sont plus faciles à lire par l’homme, ils sont encodés au format ASCII. L’avantage du SIP est qu’il ressemble aux protocoles http/SMTP et est beaucoup plus simple que le H323. Cela rend le H323 moins convivial pour les techniciens dans un environnement de dépannage. @@ -74,11 +77,11 @@ Documentation du schéma car ce dernier est plus complexe qu'une communication S       Le SIP est plus léger car il est basé sur une approche similaire au protocole http. -### 2.2 ``En terme de temps`` : +### 2.2 En terme de temps :       Le protocole H323 a été introduit quelques années avant le SIP. L’internet Engineering Task Force (IETF) a développé le protocole SIP basé sur le H323. Comparé au H323, SIP est plus simple, plus évolutif et plus étroitement lié aux applications Internet existantes. -### 2.3 ``Utilisation`` : +### 2.3 Utilisation :       SIP et H323 sont des protocoles de communication utilisés pour les appels multimédia et la téléconférence sur des réseaux basés sur le protocole Internet. @@ -86,9 +89,9 @@ Documentation du schéma car ce dernier est plus complexe qu'une communication S       Cependant, H323 se concentre uniquement sur la conférence multimédia, c'est à dire la possibilité d'interagir à distance à travers une variété de canaux de communication. Par exemple : audio, vidéo et partage à distance d'écrans -### 2.4 ``Utilisation technique`` : +### 2.4 Utilisation technique : -| ``Comparatif`` | ``SIP`` | ``H323`` | +| Comparatif ` | SIP | H323 | | :------------------------------------------- | :-------------------------------------------------- | :----------------------------------------------------------------------------------------------- | | Nombre d'échange pour établir la connexion | 1,5 aller-retour (voir schéma ci-dessus) | 6 à 7 aller-retour (voir schéma ci-dessus) | | Maintenance du code protocolaire | Simple par sa nature textuelle à l'exemple de Http | Complexe et nécessitant un compilateur | @@ -96,7 +99,7 @@ Documentation du schéma car ce dernier est plus complexe qu'une communication S | Détection d'un appel en boucle | Oui | Inexistante sur la version 1, un appel routé sur l'appelant provoque une infinité de requêtes | | Signalisation multicast | Oui, par défaut | Non | -### 2.5 ``Fiabilité`` : +### 2.5 Fiabilité       Le fait que H323 ait une portée limitée le rend moins complexe que SIP. @@ -114,7 +117,7 @@ Documentation du schéma car ce dernier est plus complexe qu'une communication S ### Définition en large permettant de comprendre certains concepts : [^6][^7] -| ``Sujet`` | ``Définition`` | +| Sujet | Définition | | :----------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | *VoIP | « Voice Over Internet Protocol », permet la transmission de la voix par internet. | | *IETF | Ils produisent la plupart des nouveaux standards d’Internet. | diff --git "a/R\303\251seaux/wireshark.md" "b/R\303\251seaux/wireshark.md" index ab9d225..da17ac4 100644 --- "a/R\303\251seaux/wireshark.md" +++ "b/R\303\251seaux/wireshark.md" @@ -3,13 +3,10 @@ layout: default title: Wireshark parent: Réseaux --- -[*]: ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) - Résumé : guide sur les la coloration - Avis sur la ressource : concis et donne des exemples utiles # Wireshark -## Wireshark ? C'est quoi ? [^1][^2][^3][^4] +## Wireshark ? C'est quoi ? [^2] [^4] Wireshark est un analyseur de paquets réseau créé en 1998 par Gerald Combs. C'est un logiciel qui permet d'analyser un réseau et de récupérer tous les paquets (un "paquet" est un message d’un des nombreux protocoles réseau) y passant pour ensuite le décomposer et le traduire en données interprétables par des humains. Wireshark est utilisé notamment pour : @@ -23,7 +20,7 @@ Wireshark est utilisé notamment pour : Aujourd’hui que ce soient des agences gouvernementales, de grandes entreprises ou bien des écoles, tout le monde utilise Wireshark. Car bien qu’il existe des alternatives sur le marché (comme tcpdump ou cloudShark qui sont les principaux concurrents) c’est bien Wireshark qui est le plus populaire et ce grâce à ses très nombreux filtres , ses fonctionnalités variées et le nombres de protocoles que ce dernier peut interpréter (actuellement 1515 selon Wikipédia [^2]). Wireshark est disponible sur tous les OS et une version en ligne de commande, nommé Tshark, existe aussi. -## Fonctionnalités : [^1][^2][^3][^5] +## Fonctionnalités : [^2] [^5] Voici une liste de fonctionnalités non exhaustive de Wireshark mais suffisante pour commencer. @@ -68,7 +65,7 @@ De plus, vous pouvez, dans le packet list, ne faire apparaitre que les paquets u Ici, vous retrouverez le paquet brut au format hexadécimal ou binaire (click droit -> ... comme bits) avec une traduction au format ASCII. Si vous cliquez sur un bit cela sélectionnera dans le packet détails ce à quoi il correspond (et vice versa). -### Les filtres : [^6][^7] +### Les filtres : [^7] Il existe deux types de filtre dans Wireshark : les filtres de capture et les filtres d'affichage. Le premier se met avant une capture et permet de ne capturer que ce qui nous intéresse et de réduire la taille du fichier de capture. Le second lui s'applique après une capture et ne fait que cacher les paquets qui ne nous intéressent pas. @@ -103,7 +100,7 @@ Pour appliquer un filtre de capture, entrez, le filtre ici : Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `and` ou `&&` Si vous souhaitez n'afficher que les paquets qui correspondent à deux filtres, utiliser le mot clé : `or` ou `||` -##### Exemples utiles (trouver ici [^7]) +##### Exemples utiles (trouvés ici [^7]) Pour n'afficher que les paquets possédant un protocole : `TCP` @@ -125,30 +122,33 @@ Vous pouvez ainsi remarquer qu'il est possible d'importer ou d'exporter des règ ## Bibliographie -[^1]: * [Wireshark User’s Guide](https://www.wireshark.org/docs/wsug_html_chunked/), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +[^1]: [Wireshark User’s Guide](https://www.wireshark.org/docs/wsug_html_chunked/), auteur inconnu, date de création inconnu, consulté le (24/05/2022) Résumé : documentation officielle de Wireshark Avis sur la ressource : clair et très complet malgré un design un peu rebutant -[^2]: * [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) +[^2]: [Wireshark](https://fr.wikipedia.org/wiki/Wireshark), wikipedia, consulté le (24/05/2022) Résumé : page Wikipédia Wireshark Avis sur la ressource : très peu complète mais donnes quelques informations de bases -[^3]: * [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) +[^3]: [Comment utiliser Wireshark: tutoriel complet + astuces](https://www.varonis.com/fr/blog/comment-utiliser-wireshark), Jeff Petters, 12 mai 2021, consulté le (24/05/2022) Résumé : petit guide concis sur wireshark Avis sur la ressource : petit guide concis mais clair et agréable à lire -[^4]: * [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) +[^4]: [Network traffic analysis for IR: Alternatives to Wireshark](https://resources.infosecinstitute.com/topic/network-traffic-analysis-for-ir-alternatives-to-wireshark/), Patrick Mallory, 12 novembre 2019, consulté le (24/05/2022) Résumé : alternatives à Wireshark Avis sur la ressource : présente bien les alternatives -[^5]: * [How to Use Wireshark: A Complete Tutorial](https://www.lifewire.com/wireshark-tutorial-4143298), Scott Orgera, 8 juillet 2020, consulté le (24/05/2022) +[^5]: [How to Use Wireshark: A Complete Tutorial](https://www.lifewire.com/wireshark-tutorial-4143298), Scott Orgera, 8 juillet 2020, consulté le (24/05/2022) Résumé : autre guide sur wireshark Avis sur la ressource : très clair mais trop court -[^6]: * [CaptureFilters](https://wiki.wireshark.org/CaptureFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +[^6]: [CaptureFilters](https://wiki.wireshark.org/CaptureFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) Résumé : guide sur les filtres de captures Avis sur la ressource : concis et donne des exemples utiles -[^7]: * [DisplayFilters](https://wiki.wireshark.org/DisplayFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) +[^7]: [DisplayFilters](https://wiki.wireshark.org/DisplayFilters), auteur inconnu, date de création inconnu, consulté le (24/05/2022) Résumé : guide sur les filtres d'affichage Avis sur la ressource : concis et donne des exemples utiles +[^8]: [ColoringRules](https://wiki.wireshark.org/ColoringRules), auteur inconnu, date de création inconnu, consulté le (24/05/2022) + Résumé : guide sur les la coloration + Avis sur la ressource : concis et donne des exemples utiles From 69871a986adf01699e154c3379570cebcb06481b Mon Sep 17 00:00:00 2001 From: severinRobert Date: Mon, 4 Jul 2022 11:56:23 +0200 Subject: [PATCH 180/241] =?UTF-8?q?[SNMP]=20Ajout=20des=20sch=C3=A9mas=20S?= =?UTF-8?q?NMP=20et=20MIB=20&=20description=20des=20versions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Images/SNMP_MIB_OID.png | Bin 0 -> 36937 bytes Assets/Images/SNMP_schema.png | Bin 0 -> 40191 bytes "R\303\251seaux/snmp.md" | 71 +++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 Assets/Images/SNMP_MIB_OID.png create mode 100644 Assets/Images/SNMP_schema.png create mode 100644 "R\303\251seaux/snmp.md" diff --git a/Assets/Images/SNMP_MIB_OID.png b/Assets/Images/SNMP_MIB_OID.png new file mode 100644 index 0000000000000000000000000000000000000000..d63df5c2400ab79403bf9a5ed94ff76598777526 GIT binary patch literal 36937 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 M)78&qol`;+00U!nF8}}l literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/snmp.md" "b/R\303\251seaux/snmp.md" new file mode 100644 index 0000000..eefad88 --- /dev/null +++ "b/R\303\251seaux/snmp.md" @@ -0,0 +1,71 @@ +--- +layout: default +title: SNMP +parent: Réseaux +--- + +# SNMP (Simple Network Management Protocol) + +SNMP est un protocole de monitoring. Il permet de gérer et voir l'état des appareils d'un réseau comme des imprimantes, routers, modems, switchs et ordinateurs de bureau. SNMP est donc très utile pour détecter les pannes, réduire le temps d'intervention et analyser l'utilisation des ressources. + +## Fonctionnement + +SNMP organise le monitoring du réseau par l'intermédiaire d'un serveur de supervision (monitoring server) appelé sobrement le superviseur. Pour que le superviseur puisse collecter des informations sur l'état des appareils du réseau il faut faire tourner un processus en arrière plan sur les machines à superviser. Ce processus deamon est appelé un agent. + +![Schéma du protocole SNMP](../Assets/Images/SNMP_schema.png "Schéma du protocole SNMP") + +### Le superviseur et les agents ont deux façons de communiquer : + +* Le Polling + +C'est ce qui permet une supervision active du réseau. Le superviseur envoi régulièrement des requêtes (GET ou SET) aux agents pour récupérer des informations telles que le taux d'utilisation du CPU, taux de transfert de données sur la carte réseau, les ports actifs,.. Il permet d'avoir une vue globale de l'activité sur le réseau. Par convention il utilise le port UDP 161. Il peut également servir à configurer les appareils. + +* Les Traps + +C'est ce qui permet une supervision passive du réseau. Lorsqu'un évènement prédéfini ce passe, l'agent envoi des informations au superviseur. Par exemple on peut définir une règle tel que si un port ethernet d'un switch est débranché, l'agent envoi une alerte au superviseur. + +Pour savoir quelles données sont accéssibles par le superviseur, les agents stockent des variables (appelées OID) dans une base de données (appelée MIB). + +### L'agent stocke sur son hôte différentes informations : + +* MIB (Management Information Base) Base de donnée des info de supervision + +Fichier texte qui décrit les informations disponibles via SNMP sur l'appareil supervisé. + +* OID (Object Identifiers) + +Suite de nombre permettant de naviguer au sein de la structure du MIB. Identifiant universel + +
+

Schéma de l'arborescence du MIB

+Arborescence du MIB +
Schéma provenant du cours d'Administration des réseaux de Ioura Batugowski
+ +* Community String + +Défini les droits d'accès au MIB de l'appareil et permet de mettre un mot de passe pour l'authentification auprès de l'appareil supervisé. + +## Les différentes versions de SNMP + +### Version 1 +La première version est facile à utiliser et contient les éléments de bases pour la gestion du réseaux. Il est simple à configurer et ne chiffre pas les données donc utilise peu de bande passante. Il est tout de même conseillé de l'utiliser que en réseau local étant donné que les données passent en claire dans le réseau. + +### Version 2 +La deuxième version ajoute la prise en charge des compteurs à 64 bits et l'ajout de l'opération GETBULK qui permet de demander plusieurs informations dans le MIB de l'agent. Il est à noté que la version SNMPv2c n'est pas compatible avec SNMPv1. + +### Version 3 +La version SNMPv3 ajoute enfin de la sécurité au protocol grâce à plusieurs mécanismes: l'authentification, le chiffrement, l'estampillage du temps et la gestion des permissions permettant de restreindre l'accès en lecture ou écriture du MIB. + + + + +## Bibliographie +* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) + - Résumé : ... + - Avis sur la ressource : ... + +* https://www.youtube.com/watch?v=mqzb_4lz_gs +* https://www.frameip.com/snmp/ +* https://www.paessler.com/fr/it-explained/snmp +* Slides du cours d'Administration des réseaux(Théorie) 2021, Maxime Vanlerberghe +* Slides du cours d'Administration des réseaux(Pratique) 2021, Ioura Batugowski \ No newline at end of file From ade4bc0c04600933e077ea6e36a8ee2bbda6032f Mon Sep 17 00:00:00 2001 From: severinRobert Date: Tue, 5 Jul 2022 12:30:09 +0200 Subject: [PATCH 181/241] =?UTF-8?q?ajout=20dans=20l'intro=20et=20am=C3=A9l?= =?UTF-8?q?ioration=20de=20la=20bibliographie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/snmp.md" | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/snmp.md" "b/R\303\251seaux/snmp.md" index eefad88..e026e17 100644 --- "a/R\303\251seaux/snmp.md" +++ "b/R\303\251seaux/snmp.md" @@ -8,6 +8,9 @@ parent: Réseaux SNMP est un protocole de monitoring. Il permet de gérer et voir l'état des appareils d'un réseau comme des imprimantes, routers, modems, switchs et ordinateurs de bureau. SNMP est donc très utile pour détecter les pannes, réduire le temps d'intervention et analyser l'utilisation des ressources. +SNMP est apparu en 1988 et a été développé par un groupe de collaborateur avec le soutien de OSI/IETF/NSF. C'est un protocol de couche OSI Application et passe par les port 161 et 162 ou 10161 et 10162 en sécurisé. + + ## Fonctionnement SNMP organise le monitoring du réseau par l'intermédiaire d'un serveur de supervision (monitoring server) appelé sobrement le superviseur. Pour que le superviseur puisse collecter des informations sur l'état des appareils du réseau il faut faire tourner un processus en arrière plan sur les machines à superviser. Ce processus deamon est appelé un agent. @@ -22,11 +25,11 @@ C'est ce qui permet une supervision active du réseau. Le superviseur envoi rég * Les Traps -C'est ce qui permet une supervision passive du réseau. Lorsqu'un évènement prédéfini ce passe, l'agent envoi des informations au superviseur. Par exemple on peut définir une règle tel que si un port ethernet d'un switch est débranché, l'agent envoi une alerte au superviseur. +C'est ce qui permet une supervision passive du réseau. Lorsqu'un évènement prédéfini ce passe, l'agent envoi des informations au superviseur. Par exemple on peut définir une règle tel que si un port ethernet d'un switch est débranché, l'agent envoi une alerte au superviseur. Les Traps passent par le port 162. -Pour savoir quelles données sont accéssibles par le superviseur, les agents stockent des variables (appelées OID) dans une base de données (appelée MIB). ### L'agent stocke sur son hôte différentes informations : +Pour savoir quelles données sont accéssibles par le superviseur, les agents stockent des variables (appelées OID) dans une base de données (appelée MIB). * MIB (Management Information Base) Base de donnée des info de supervision @@ -60,12 +63,9 @@ La version SNMPv3 ajoute enfin de la sécurité au protocol grâce à plusieurs ## Bibliographie -* [Nom de la ressource](lien vers la ressource), Auteur, Date de création, consulté le (date consultation) - - Résumé : ... - - Avis sur la ressource : ... -* https://www.youtube.com/watch?v=mqzb_4lz_gs -* https://www.frameip.com/snmp/ -* https://www.paessler.com/fr/it-explained/snmp +* https://www.youtube.com/watch?v=mqzb_4lz_gs, Auteur: formip, Date de création: 18 septembre 2019, consulté le 5 juillet 2022 +* https://www.frameip.com/snmp/, Auteur: frameip, Date de création: avant le 23 juin 2018, consulté le 5 juillet 2022 +* https://www.paessler.com/fr/it-explained/snmp, Auteur: paessler, Date de création: Inconnue, consulté le 5 juillet 2022 * Slides du cours d'Administration des réseaux(Théorie) 2021, Maxime Vanlerberghe * Slides du cours d'Administration des réseaux(Pratique) 2021, Ioura Batugowski \ No newline at end of file From fc6d09bdcd62a97c1ea20e15b2093f284bb7eb06 Mon Sep 17 00:00:00 2001 From: severinRobert Date: Thu, 7 Jul 2022 10:00:08 +0200 Subject: [PATCH 182/241] SNMP ajout exemple de trame --- Assets/Images/SNMP_trame_request.png | Bin 0 -> 146608 bytes Assets/Images/SNMP_trame_response.png | Bin 0 -> 151197 bytes "R\303\251seaux/snmp.md" | 26 +++++++++++++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Assets/Images/SNMP_trame_request.png create mode 100644 Assets/Images/SNMP_trame_response.png diff --git a/Assets/Images/SNMP_trame_request.png b/Assets/Images/SNMP_trame_request.png new file mode 100644 index 0000000000000000000000000000000000000000..d3286756e44bdaac7ce9eeb3c757c78dd7cda3fb GIT binary patch literal 146608 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 z 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
O(<@_*C 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

0T<&^-R{nyl7VCw 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 Z{|6@Q!zLyb#5n)}002ovPDHLkV1mN%tDgV> literal 0 HcmV?d00001 diff --git a/Assets/Images/SNMP_trame_response.png b/Assets/Images/SNMP_trame_response.png new file mode 100644 index 0000000000000000000000000000000000000000..00eaa061a30682c5f494575c8730c3f8e6ac55d3 GIT binary patch literal 151197 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 eC@3g=@ca)Xo-i%^l-BtG0000 Date: Sun, 7 Aug 2022 13:06:10 +0200 Subject: [PATCH 183/241] [UPDATE]Adding a new article visioConference --- "R\303\251seaux/visioConference.md" | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 "R\303\251seaux/visioConference.md" diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" new file mode 100644 index 0000000..04bd3e5 --- /dev/null +++ "b/R\303\251seaux/visioConference.md" @@ -0,0 +1,21 @@ +--- +layout: default +title: VisioConference +parent: Réseaux +--- + +# Les Protocoles de visioconférence + +## Que signifie visioconférence [1](https://fr.wikipedia.org/wiki/Visioconférence) + +Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. + +Visioconférence est aussi la combinaison de 2 techniques : + +- La visiophonie ou vidéotéléphonie : qui est l'association de la téléphonie et de la télévision permettant aux utilisateurs de se voir pendant leur conversation téléphonique. + +- La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux + +##### Figure 1. certains protocoles + + \ No newline at end of file From 00f054a542ef397f9df63b8b13bb5997bce2bb69 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sun, 7 Aug 2022 14:24:23 +0200 Subject: [PATCH 184/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 04bd3e5..153bf1c 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -6,16 +6,23 @@ parent: Réseaux # Les Protocoles de visioconférence -## Que signifie visioconférence [1](https://fr.wikipedia.org/wiki/Visioconférence) +## Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. Visioconférence est aussi la combinaison de 2 techniques : -- La visiophonie ou vidéotéléphonie : qui est l'association de la téléphonie et de la télévision permettant aux utilisateurs de se voir pendant leur conversation téléphonique. +- La visiophonie ou vidéotéléphonie : qui est l'association de la téléphonie et de la télévision permettant aux utilisateurs de se voir pendant leur conversation téléphonique. -- La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux +- La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux ##### Figure 1. certains protocoles + - \ No newline at end of file + + +- H.320: + +- H.323: + +- SIP: From a278491cb72122013212252fbd5f168ac0328f1d Mon Sep 17 00:00:00 2001 From: HaAymar Date: Sun, 7 Aug 2022 15:35:17 +0200 Subject: [PATCH 185/241] [update]Update of my article --- "R\303\251seaux/visioConference.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 153bf1c..49ca0e7 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -16,9 +16,10 @@ Visioconférence est aussi la combinaison de 2 techniques : - La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux -##### Figure 1. certains protocoles +##### Figure 1. Ex: visioconférence +##### Figure 2. certains protocoles - H.320: From 5c46f46f1d63f790bfd30b33352ee71395632bae Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sun, 7 Aug 2022 15:54:02 +0200 Subject: [PATCH 186/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 49ca0e7..5fe86bc 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -7,6 +7,8 @@ parent: Réseaux # Les Protocoles de visioconférence ## Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) +##### Figure 1. Ex: visioconférence + Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. @@ -15,15 +17,16 @@ Visioconférence est aussi la combinaison de 2 techniques : - La visiophonie ou vidéotéléphonie : qui est l'association de la téléphonie et de la télévision permettant aux utilisateurs de se voir pendant leur conversation téléphonique. - La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux - -##### Figure 1. Ex: visioconférence - - -##### Figure 2. certains protocoles +##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) -- H.320: +- ### Protocole H.320 +C'est un protocole pour réseau à commutation de circuits qui inclut ses mécanismes de signalisation et comment la voix, la vidéo et d'autres charges de lecture sont transmises sur ISDN(Integrated Service Digital) -- H.323: +- ### Protocole H.323 + C'est un protocole de transfert de données avec une bande passante non garantie appliquée aux vidéoconférences personnelles et de groupe. + -- SIP: +- ### Protocole SIP +C'est un protocole réseau permettant de connecter des applications clientes de différents fournisseurs. SIP a remplacé H.323 et est utilisé dans la visioconférence et la téléphonie IP. + From 244c4f94fea07219de70c1286837bf553ba7dbe7 Mon Sep 17 00:00:00 2001 From: HaAymar Date: Sun, 7 Aug 2022 17:25:48 +0200 Subject: [PATCH 187/241] [UPDATE]update of the Article visioConference --- "R\303\251seaux/visioConference.md" | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 49ca0e7..7274134 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -7,6 +7,8 @@ parent: Réseaux # Les Protocoles de visioconférence ## Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) +##### Figure 1. Ex: visioconférence + Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. @@ -15,15 +17,18 @@ Visioconférence est aussi la combinaison de 2 techniques : - La visiophonie ou vidéotéléphonie : qui est l'association de la téléphonie et de la télévision permettant aux utilisateurs de se voir pendant leur conversation téléphonique. - La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux - -##### Figure 1. Ex: visioconférence - - -##### Figure 2. certains protocoles +##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) -- H.320: +- ### Protocole H.320 +C'est un protocole pour réseau à commutation de circuits qui inclut ses mécanismes de signalisation et comment la voix, la vidéo et d'autres charges de lecture sont transmises sur ISDN(Integrated Service Digital) + +- ### Protocole H.323 + C'est un protocole de transfert de données avec une bande passante non garantie appliquée aux vidéoconférences personnelles et de groupe. + -- H.323: +- ### Protocole SIP +C'est un protocole réseau permettant de connecter des applications clientes de différents fournisseurs. SIP a remplacé H.323 et est utilisé dans la visioconférence et la téléphonie IP. + -- SIP: +## Bibliographie From 5d0993c3695e3a70bffe872e76af809a55fe877b Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Mon, 15 Aug 2022 11:11:05 +0200 Subject: [PATCH 188/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index ad5b9b3..cedb1da 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -7,9 +7,8 @@ parent: Réseaux # Les Protocoles de visioconférence ## Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) -##### Figure 1. Ex: visioconférence - +La visioconférence est une solution de communication à distance sécurisée, via Internet, dans des points multiples, permettant l'échange visuel entre deux individus, ou plusieurs dizaines ou même des centaines ou des milliers de personnes, selon les options et les licences. Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. Visioconférence est aussi la combinaison de 2 techniques : @@ -17,6 +16,10 @@ Visioconférence est aussi la combinaison de 2 techniques : - La visiophonie ou vidéotéléphonie : qui est l'association de la téléphonie et de la télévision permettant aux utilisateurs de se voir pendant leur conversation téléphonique. - La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux + +##### Figure 1. Ex: visioconférence + + ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) From 67b09f4607007fcb87ba66f7de0d4501009cddaf Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Mon, 15 Aug 2022 19:20:52 +0200 Subject: [PATCH 189/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 31 +++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index cedb1da..e8e89a6 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -17,9 +17,10 @@ Visioconférence est aussi la combinaison de 2 techniques : - La conférence multipoints ou conférence à plusieurs : permettant d'effectuer une réunion avec plus de 2 terminaux -##### Figure 1. Ex: visioconférence +Figure 1. Ex: visioconférence - +## Les différents types de prorocoles + ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) @@ -28,13 +29,27 @@ C'est un protocole pour réseau à commutation de circuits qui inclut ses mécan - ### Protocole H.323 C'est un protocole de transfert de données avec une bande passante non garantie appliquée aux vidéoconférences personnelles et de groupe. + - Il a été conçu pa r l'UIT(Union internationale des télécommunication) + - Il utilise le langage informatique du binaire + - Assure des communications multimédias sur différents réseaux. + - il est très complexe, il est possible qu'il y ait des retards. +- ### Protocole H.239 + - ### Protocole SIP C'est un protocole réseau permettant de connecter des applications clientes de différents fournisseurs. SIP a remplacé H.323 et est utilisé dans la visioconférence et la téléphonie IP. - -<<<<<<< HEAD - -## Bibliographie -======= ->>>>>>> 5c46f46f1d63f790bfd30b33352ee71395632bae +- Il a été conçu par l'IETF(Internet Engineering Task Force) +- Il utilise le langage informatique ASCII +- Il est très flexible et simple +- L'agent utilisateur et le serveur réseau constituent deux composantes fonctionnelles principales. +- Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. +- Ressemble au protocole HTTP. +- Il est fonctionnel avec le IPv4 et IPv6 + + +## Bibliographie: +https://trueconf.com/video-conferencing-architecture.html +https://fr.wikipedia.org/wiki/Visioconférence +https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. +https://fr.acervolima.com/protocoles-de-visioconference/ From f649ac1474daccd77c67cdcde387fed3eed54049 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Mon, 15 Aug 2022 19:23:35 +0200 Subject: [PATCH 190/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index e8e89a6..382b2b5 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -19,12 +19,14 @@ Visioconférence est aussi la combinaison de 2 techniques : Figure 1. Ex: visioconférence -## Les différents types de prorocoles +## Difference entre la visioConférence et le streaming video + +### Les différents types de prorocoles ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) -- ### Protocole H.320 +- #### Protocole H.320 C'est un protocole pour réseau à commutation de circuits qui inclut ses mécanismes de signalisation et comment la voix, la vidéo et d'autres charges de lecture sont transmises sur ISDN(Integrated Service Digital) - ### Protocole H.323 @@ -35,9 +37,9 @@ C'est un protocole pour réseau à commutation de circuits qui inclut ses mécan - il est très complexe, il est possible qu'il y ait des retards. -- ### Protocole H.239 +- #### Protocole H.239 -- ### Protocole SIP +- #### Protocole SIP C'est un protocole réseau permettant de connecter des applications clientes de différents fournisseurs. SIP a remplacé H.323 et est utilisé dans la visioconférence et la téléphonie IP. - Il a été conçu par l'IETF(Internet Engineering Task Force) - Il utilise le langage informatique ASCII @@ -46,6 +48,7 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 + ## Bibliographie: From eb9965aaa884eef0d91ba0c712505af73daea2c1 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Mon, 15 Aug 2022 19:32:33 +0200 Subject: [PATCH 191/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 382b2b5..a383be6 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -49,8 +49,6 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 - - ## Bibliographie: https://trueconf.com/video-conferencing-architecture.html https://fr.wikipedia.org/wiki/Visioconférence From 95390c123f09befa5c7685cae1651ebd2d0d9345 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Mon, 15 Aug 2022 19:35:37 +0200 Subject: [PATCH 192/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index a383be6..d1dcf46 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -50,7 +50,7 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Il est fonctionnel avec le IPv4 et IPv6 ## Bibliographie: -https://trueconf.com/video-conferencing-architecture.html -https://fr.wikipedia.org/wiki/Visioconférence -https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. -https://fr.acervolima.com/protocoles-de-visioconference/ +1. https://trueconf.com/video-conferencing-architecture.html +2. https://fr.wikipedia.org/wiki/Visioconférence +3. https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. +4. https://fr.acervolima.com/protocoles-de-visioconference/ From b6ae393e3d5e42101795c57ee3332c508067129c Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:58:34 +0200 Subject: [PATCH 193/241] Create visioConference.md --- "R\303\251seaux/visioConference.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index d1dcf46..4ef2ca2 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -19,8 +19,6 @@ Visioconférence est aussi la combinaison de 2 techniques : Figure 1. Ex: visioconférence -## Difference entre la visioConférence et le streaming video - ### Les différents types de prorocoles ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) @@ -48,9 +46,13 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 +## Streaming video +### Difference entre la visioConférence et le streaming video ## Bibliographie: 1. https://trueconf.com/video-conferencing-architecture.html 2. https://fr.wikipedia.org/wiki/Visioconférence 3. https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. 4. https://fr.acervolima.com/protocoles-de-visioconference/ +5. https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html +6. https://docplayer.fr/508783-Deploiement-de-la-visioconference-ip-dans-un-etablissement-etat-de-l-art-et-evolution-des-protocoles.html From 4df2a5a216c8260d06dc4105849e0759877088cd Mon Sep 17 00:00:00 2001 From: JarodEphec <92374656+JarodEphec@users.noreply.github.com> Date: Fri, 19 Aug 2022 19:58:44 +0200 Subject: [PATCH 194/241] Create Gestionnaire de paquets.md --- Divers/Gestionnaire de paquets.md | 261 ++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 Divers/Gestionnaire de paquets.md diff --git a/Divers/Gestionnaire de paquets.md b/Divers/Gestionnaire de paquets.md new file mode 100644 index 0000000..e117e41 --- /dev/null +++ b/Divers/Gestionnaire de paquets.md @@ -0,0 +1,261 @@ +[Accueil Wiki](https://epheclln.github.io/Wiki-TI/) +# Gestionnaire de paquets +## Qu'est-ce qu'un gestionnaire de paquets ? + +Un gestionnaire de paquets est un outil qui permet à l'utilisateur d'installer, de désinstaller et de mettre à jour des logiciels via des paquets souvent prévus pour une distribution Linux. + +## Pourquoi utiliser un gestionnaire de paquets ? + +### Ils automatisent l'installation d'un logiciel. +Sans eux vous seriez obligé de télécharger le binaires d'une application, mettre ces derniers dans les bons dossiers, mettre à jour la variable d'environnement vous même (pour ne pas devoir donner le chemin absolu d'une application a chaque fois que vous voulez l'exécuter) et surtout ne pas devoir résoudre les dépendances d'une application vous-même. + +### Ils assurent que le logiciel soit 100% compatible avec votre distribution. +Imaginez-vous installer un logiciel qui ne fonctionne pas totalement car il utilise des librairies trop veilles voir même trop récente et que cause a ce dernier de ne pas fonctionner totalement voire même de rendre votre system instable, eh bien tout ces sont éviter grace à des paquets maintenue pour être complètement compatible avec votre distribution. À noter que la plupart des gestionnaires de paquets proposent un serveur avec des versions "instables" des paquets qui permettent à ceux qu'ils le veulent à avoir accès aux dernières nouveautés au prix d'un system peut-être moins stable. + +## Quels sont les principaux gestionnaires de paquets ?[1, 2, 3] + +| Nom du gestionnaire de paquets| APT | DNF | YUM | ZYPPER | Pacman | SNAP | FLATPAK | +|---|---|---|---|---|---|---|---| +| **Distribution liée** | Debian/Ubuntu | Fedora/CentOS/RedHat Linux | RedHat Linux | OpenSUSE | Arch Linux |

/

|

/

| +| **Installeur** | dpkg | RPM | RPM | RPM | pacman | snap | flatpak | +| **Fromat** | .deb | .rpm | .rpm | .rpm | .tar.xx |

/

|

/

| + +### À quoi servent les installeurs ? +Imaginons que, par exemple, vous soyez sur Debian, pour le cours de réseau vous avez besoin de packet tracer, pour ce faire vous allez sur le site de cisco et télécharger packet-tracer.deb, ce fichier est bien un paquet Debian mais il vous faut à présent l'installer, c'est là qu'entre en jeu l'application dpkg pour installer les paquets Debian. + +Un gestionnaire de paquets sans installeur ne ferait que télécharger sur un serveur les paquets demandés par l'utilisateur sans les installers. + +### Le cas Snap et Flatpak +Comme vous avez pu le voir Les gestionnaires de paquets Snap et Flatpak ne sont lié à aucune distribution, pourquoi cela ? + +La raison est que grace à la technologie de containerisation, chaque application vit dans son monde, ces gestionnaires de paquets permettent aux applications de toujours fonctionner dans le même environement et donc de ne pas être dépendant de leur distribution. + +Ces gestionnaires de paquets sont très clairement l'avenir car ils permettent au développeur de maintenir un seul paquet et de ne plus devoir résoudre les bugs spécifiques à une distribution. + +## Comment les utiliser ? + +### APT[4] + +* Mettre à jour les sources : + ``` + apt update + ``` +Permets de mettre à jour la liste des paquets disponible depuis le serveur source. +* Installer la dernière version des paquets installé sur le system : + ``` + apt upgrade + ``` +* Installer un nouveau paquet : + ``` + apt install *nom du paquet* + ``` +* Réinstaller un paquet : + ``` + apt reinstall *nom du paquet* + ``` +* Désinstaller un paquet : + ``` + apt remove *nom du paquet* + ``` + * L'argument `--purge` est souvent ajouté pour ne laisser aucun fichier du paquet désinstallé, mais peut aussi être utiliser pour un paquet déjà désinstallé avec la commande : + ``` + apt purge *nom du paquet* + ``` + +* Rechercher un paquet en particulier : + ``` + apt search *nom du paquet* + ``` +* Lister les paquets installés : + + ``` + apt list --installed + ``` +### DNF/YUM[5] + +* Mettre à jour les sources : + ``` + dnf/yum check-update + ``` +* Installer la dernière version des paquets installée sur le system : + ``` + dnf/yum upgrade + ``` +* Installer un nouveau paquet : + ``` + dnf/yum install *nom du paquet* + ``` +* Réinstaller un paquet : + ``` + dnf/yum reinstall *nom du paquet* + ``` +* Désinstaller un paquet : + ``` + dnf/yum remove *nom du paquet* + ``` + +* Rechercher un paquet en particulier : + ``` + dnf/yum search *nom du paquet* + ``` +* Lister les paquets installée : + + ``` + dnf/yum list --installed + ``` +### ZYPPER[6] + +* Mettre à jour les sources : + ``` + zypper refresh + ``` +* Installer la dernière version des paquets installée sur le system : + ``` + zypper update + ``` +* Installer un nouveau paquet : + ``` + zypper install *nom du paquet* + ``` +* Réinstaller un paquet : + ``` + zypper reinstall *nom du paquet* + ``` +* Désinstaller un paquet : + ``` + zypper remove *nom du paquet* + ``` + +* Rechercher un paquet en particulier : + ``` + zypper search *nom du paquet* + ``` +* Lister les paquets installés : + + ``` + zypper search --installed-only + ``` + +### PACMAN[7] + +* Mettre à jour les sources (non obligatoire) : + ``` + pacman -Syy + ``` +* Installer la dernière version des paquets installée sur le system : + ``` + pacman -Syu + ``` +* Installer ou réinstaller un paquet : + ``` + pacman -S *nom du paquet* + ``` +* Installer un paquet local : + ``` + sudo pacman -U */chemin/vers/le/paquet* + ``` +* Désinstaller un paquet : + ``` + pacman -R *nom du paquet* + ``` + +* Rechercher un paquet en particulier : + ``` + pacman -Ss *nom du paquet* + ``` +* Lister les paquets installés : + + ``` + pacman -Qm + ``` + +### SNAP[8] + Si votre distribution n'inclut pas snap par défaut, il vous faudra l'installer vous-même en fonction de votre distribution. + + Voici le lien : https://snapcraft.io/docs/installing-snapd + +* Mettre à jour les sources et installer la dernière version des paquets installée sur le system (automatique) : + ``` + snap refresh + ``` +* Installer un nouveau paquet : + ``` + snap install *nom du paquet* + ``` + +* Désinstaller un paquet : + ``` + snap remove *nom du paquet* + ``` + +* Rechercher un paquet en particulier : + ``` + snap find *nom du paquet* + ``` +* Lister les paquets installés : + + ``` + snap list + ``` + +### FLATPAK[9] + Comme pour snap, si votre distribution n'inclut pas flatpak par défaut, il vous faudra l'installer vous-même en fonction de votre distribution. + + Voici le lien : https://flatpak.org/setup/ + + L'un des plus gros avantages à souligner de flatpak est qu'il n'est pas obligatoire d'être `root` pour installer des paquets. + +* Mettre à jour les sources et installer la dernière version des paquets installée sur le system : + ``` + flatpak update + ``` +* Installer un nouveau paquet : + ``` + flatpak install *nom du paquet* + ``` + +* Désinstaller un paquet : + ``` + flatpak uninstall *nom du paquet* + ``` + +* Rechercher un paquet en particulier : + ``` + flatpak search *nom du paquet* + ``` +* Lister les paquets installés : + + ``` + flatpak list --app + ``` + +## Bibliographie + +1. [Gestionnaire de paquets](https://fr.wikipedia.org/wiki/Gestionnaire_de_paquets), [auteurs](https://xtools.wmflabs.org/articleinfo/fr.wikipedia.org/Gestionnaire_de_paquets#top-editors), 4 août 2022, consulté le 19 août 2022. + * Résumé : Explications de ce qu'est un gestionnaire de paquets. + * Avis sur la source : Explique très bien ce qu'est un gestionnaire de paquets. +2. [Introduction to Flatpak](https://docs.flatpak.org/en/latest/introduction.html), [auteurs](https://github.com/flatpak/flatpak-docs/blob/master/docs/introduction.rst), 7 avril 2021, consulté le 19 août 2022. + * Résumé : Explication sur ce qu'est flatpak. + * Avis sur la source : Source offiel qui explique bien ce qu'est flatpak. +3. [Everything You Need to Know About Snap and Snap Store](https://www.makeuseof.com/everything-you-need-to-know-about-snap-and-snap-store/), Yash Wate, 21 juin 2021, consulté le 19 août 2022. + * Résumé : Explication sur ce qu'est snap, comment il fonctionne, les avantages, les inconvénients et comment l'installer. + * Avis de la source : Article très complet sans être trop technique. +4. [Ubuntu man apt](https://manpages.ubuntu.com/manpages/jammy/man8/apt.8.html), Canonical, 2019, consulté le 19 août 2022. + * Résumé : Man de apt + * Avis de la source : Documentation officiel ubuntu. +5. [Using the DNF software package manager](https://docs.fedoraproject.org/en-US/quick-docs/dnf/), [auteurs](https://pagure.io/fedora-docs/quick-docs/history/modules/ROOT/pages/dnf.adoc?identifier=master), octobre 2021, consulté le 19 août 2022. + * Résumé : Documentation des commandes du gestionnaire de paquets DNF. + * Avis de la source : Documentation officiel fedora, simple mais efficace. +6. [OpenSUSE : Managing Software with Command Line Tools](https://documentation.suse.com/sles/12-SP4/html/SLES-all/cha-sw-cl.html#:~:text=Zypper%20is%20a%20command%20line,managing%20software%20from%20shell%20scripts.), [auteurs](https://github.com/SUSE/doc-sle/blob/maintenance/SLE12SP4/xml/sw_managing_commandline.xml), 1 août 2019, consulté le 19 août 2022. + * Résumé : Documentation des commandes du gestionnaire de paquets zypper. + * Avis de la source : Documentation officiel openSUSE, très complète. +7. [pacman](https://wiki.archlinux.org/title/pacman), [auteurs](https://wiki.archlinux.org/index.php?title=Pacman&action=history), 1 août 2022, consulté le 19 août 2022. + * Résumé : Documentation des commandes du gestionnaire de paquets pacman. + * Avis de la source : Documentation officiel Arch Linux, très complète. +8. [Getting started](https://snapcraft.io/docs/getting-started), Canonical, juin 2022, consulté le 19 août 2022. + * Résumé : Documentation des commandes snap. + * Avis de la source : Documentation officiel snap, simple mais efficace. +9. [Using Flatpak](https://docs.flatpak.org/en/latest/using-flatpak.html), [auteurs](https://github.com/flatpak/flatpak-docs/blob/master/docs/using-flatpak.rst), 23 juillet 2021, consulté le 19 août 2022. + * Résumé : Documentation des commandes flatpak. + * Avis de la source : Documentation officiel flatpak, très complète. + From d38063f6ab22c89a04904b47fcb50abb2a53c41c Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 07:04:59 +0200 Subject: [PATCH 195/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 4ef2ca2..1d48163 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -19,15 +19,16 @@ Visioconférence est aussi la combinaison de 2 techniques : Figure 1. Ex: visioconférence -### Les différents types de prorocoles + +## Pourquoi la visioconférence ? [3]( https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) +La visioconférence est un vrai levier d’efficacité professionnel qui facilite les échanges entre les collaborateurs dans les entreprise multi sites. + +### Les principaux prorocoles de visioConférence ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) - - -- #### Protocole H.320 -C'est un protocole pour réseau à commutation de circuits qui inclut ses mécanismes de signalisation et comment la voix, la vidéo et d'autres charges de lecture sont transmises sur ISDN(Integrated Service Digital) + -- ### Protocole H.323 +### Protocole H.323 C'est un protocole de transfert de données avec une bande passante non garantie appliquée aux vidéoconférences personnelles et de groupe. - Il a été conçu pa r l'UIT(Union internationale des télécommunication) - Il utilise le langage informatique du binaire @@ -35,9 +36,7 @@ C'est un protocole pour réseau à commutation de circuits qui inclut ses mécan - il est très complexe, il est possible qu'il y ait des retards. -- #### Protocole H.239 - -- #### Protocole SIP +#### Protocole SIP C'est un protocole réseau permettant de connecter des applications clientes de différents fournisseurs. SIP a remplacé H.323 et est utilisé dans la visioconférence et la téléphonie IP. - Il a été conçu par l'IETF(Internet Engineering Task Force) - Il utilise le langage informatique ASCII @@ -46,8 +45,7 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 -## Streaming video - + ### Difference entre la visioConférence et le streaming video ## Bibliographie: 1. https://trueconf.com/video-conferencing-architecture.html From 207b85d1bb35045472f81b58cb9124f664975714 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 08:23:31 +0200 Subject: [PATCH 196/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 1d48163..7c7a626 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -28,7 +28,7 @@ La visioconférence est un vrai levier d’efficacité professionnel qui facilit ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) -### Protocole H.323 +#### Protocole H.323 C'est un protocole de transfert de données avec une bande passante non garantie appliquée aux vidéoconférences personnelles et de groupe. - Il a été conçu pa r l'UIT(Union internationale des télécommunication) - Il utilise le langage informatique du binaire @@ -45,7 +45,7 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 - +### Différentes normes pour la visioconférence [4]( https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) ### Difference entre la visioConférence et le streaming video ## Bibliographie: 1. https://trueconf.com/video-conferencing-architecture.html From 6cd992766e2b0e0cb8fe97bff09d06ee79176922 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 08:40:36 +0200 Subject: [PATCH 197/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 7c7a626..d5b90ad 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -46,7 +46,40 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 ### Différentes normes pour la visioconférence [4]( https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) + +#### Contrôle et la signalisation : +H.225 : il est en en système de communications, est une sous-norme de H.323 [I]( https://fr.wikipedia.org/wiki/H.225). +Ses objectifs : +- Gestion d’un appel : Ce système s'appuie sur le processus de préparation des appels ISDN (Intergrated Services Digital Network) +- Enregistrement, admission et status : RAS qui est le premier canal de signalisation et utilise le UDP comme couche de transport +H.245 : il a été mise en place pour les canaux des médias par H.323, il est ouvert dès le départ à la négociation de codecs communs, veiller à toutes les fonctions de gestion des flux de médias. +RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contrôle des flux RTP, permettant de transmettre des informations de base sur les participants d'une session, ainsi que sur la qualité de service.[II]( https://fr.wikipedia.org/wiki/Real-time_Transport_Control_Protocol ) +#### Voix : +- G.726 : +- G.728 : +- G.729 : +#### Video : +- H.261 : +- H.263 : +- H.265 : H265 ou encore HEVC (High Efficiency Video Coding) un nouveau standard dont l'objectif est d'améliorer de manière significative la compression vidéo, il est en mesure de transmettre la même vidéo que son prédécesseur (H264) pour une vitesse deux fois moins. Il supporte toutes les définitions d’images usuelles et des cadences d’images plus élevées. +#### Données : +- T.123 : +- T.124 : +- T.125 : + ### Difference entre la visioConférence et le streaming video +#### VisioConférence +#### Streaming Video +est un type de technologie multimédia qui offre du contenu vidéo et audio à un dispositif connecté à Internet. C’est un flux vidéo organiser par l’organisateur comme video sur youtube, Netflix etc. +#### Types de streaming video + - Streaming en direct + - streaming video +#### Les protocoles de streaming vidéo: +- HLS +- SRT +- MPEG +- WebRTC + ## Bibliographie: 1. https://trueconf.com/video-conferencing-architecture.html 2. https://fr.wikipedia.org/wiki/Visioconférence From b2b7f69c98e4b3619642ff9247b70efd22652e50 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 09:19:38 +0200 Subject: [PATCH 198/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index d5b90ad..8aa6069 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -6,7 +6,7 @@ parent: Réseaux # Les Protocoles de visioconférence -## Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) +## 1. Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) La visioconférence est une solution de communication à distance sécurisée, via Internet, dans des points multiples, permettant l'échange visuel entre deux individus, ou plusieurs dizaines ou même des centaines ou des milliers de personnes, selon les options et les licences. Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. @@ -20,10 +20,10 @@ Visioconférence est aussi la combinaison de 2 techniques : Figure 1. Ex: visioconférence -## Pourquoi la visioconférence ? [3]( https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) +## 2. Pourquoi la visioconférence ? [3]( https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) La visioconférence est un vrai levier d’efficacité professionnel qui facilite les échanges entre les collaborateurs dans les entreprise multi sites. -### Les principaux prorocoles de visioConférence +### 2.1 Les principaux prorocoles de visioConférence ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) @@ -45,7 +45,8 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 -### Différentes normes pour la visioconférence [4]( https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) +- +### 2.2 Différentes normes pour la visioconférence [4]( https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) #### Contrôle et la signalisation : H.225 : il est en en système de communications, est une sous-norme de H.323 [I]( https://fr.wikipedia.org/wiki/H.225). @@ -67,18 +68,19 @@ RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contr - T.124 : - T.125 : -### Difference entre la visioConférence et le streaming video -#### VisioConférence -#### Streaming Video +## 3 Difference entre la visioConférence et le streaming video +### 3.1 VisioConférence +### 3.2 Streaming Video est un type de technologie multimédia qui offre du contenu vidéo et audio à un dispositif connecté à Internet. C’est un flux vidéo organiser par l’organisateur comme video sur youtube, Netflix etc. -#### Types de streaming video +#### 3.2.1 Types de streaming video - Streaming en direct - streaming video -#### Les protocoles de streaming vidéo: +#### 3.2.2 Les protocoles de streaming vidéo: - HLS - SRT - MPEG - WebRTC +## Conclusion ## Bibliographie: 1. https://trueconf.com/video-conferencing-architecture.html From e9ae68e6973eb90772971f5374db1843f81838f1 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 09:40:14 +0200 Subject: [PATCH 199/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 39 ++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 8aa6069..41c9e7b 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -83,9 +83,36 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u ## Conclusion ## Bibliographie: -1. https://trueconf.com/video-conferencing-architecture.html -2. https://fr.wikipedia.org/wiki/Visioconférence -3. https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. -4. https://fr.acervolima.com/protocoles-de-visioconference/ -5. https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html -6. https://docplayer.fr/508783-Deploiement-de-la-visioconference-ip-dans-un-etablissement-etat-de-l-art-et-evolution-des-protocoles.html +1. [Que signifie visioconférence](https://trueconf.com/video-conferencing-architecture.html) + + - Auteur et date d'expédition + - Date de consultation + - Avis + - Résume + +2. [Pourquoi la visioconférence ?](https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) + + - Auteur et date d'expédition + - Date de consultation + - Avis + - Résum + +3. [Principaux protocoles](https://fr.acervolima.com/protocoles-de-visioconference/) + + - Auteur et date d'expédition + - Date de consultation + - Avis + - Résume + +4. [Differentes normes de visioConférence](https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) + + - Auteur et date d'expédition + - Date de consultation + - Avis + - Résume +5. [Difference entre la visioConférence et le streaming video](https://www.avast.com/fr-fr/c-what-is-streaming) +6. [Protocoles streaming video](https://www.cdnetworks.com/media-delivery-blog/video-streaming-protocols/) + https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. +6. https://fr.acervolima.com/protocoles-de-visioconference/ +7. https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html +8. https://docplayer.fr/508783-Deploiement-de-la-visioconference-ip-dans-un-etablissement-etat-de-l-art-et-evolution-des-protocoles.html From cf9c27a83248c3496e6dab3984412168d0e46a11 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 09:41:19 +0200 Subject: [PATCH 200/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 41c9e7b..cf2df62 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -95,7 +95,7 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u - Auteur et date d'expédition - Date de consultation - Avis - - Résum + - Résume 3. [Principaux protocoles](https://fr.acervolima.com/protocoles-de-visioconference/) @@ -111,7 +111,19 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u - Avis - Résume 5. [Difference entre la visioConférence et le streaming video](https://www.avast.com/fr-fr/c-what-is-streaming) + + - Auteur et date d'expédition + - Date de consultation + - Avis + - Résume + 6. [Protocoles streaming video](https://www.cdnetworks.com/media-delivery-blog/video-streaming-protocols/) + + - Auteur et date d'expédition + - Date de consultation + - Avis + - Résume + https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. 6. https://fr.acervolima.com/protocoles-de-visioconference/ 7. https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html From 816d4b952e320ebf427b4f1ac89d8a7483f98e0f Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 09:51:10 +0200 Subject: [PATCH 201/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index cf2df62..894cc33 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -93,38 +93,38 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u 2. [Pourquoi la visioconférence ?](https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) - Auteur et date d'expédition - - Date de consultation + - Date de consultation : 27 juillet - Avis - Résume 3. [Principaux protocoles](https://fr.acervolima.com/protocoles-de-visioconference/) - Auteur et date d'expédition - - Date de consultation + - Date de consultation : 27 juillet - Avis - Résume 4. [Differentes normes de visioConférence](https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) - Auteur et date d'expédition - - Date de consultation + - Date de consultation : 27 juillet - Avis - Résume 5. [Difference entre la visioConférence et le streaming video](https://www.avast.com/fr-fr/c-what-is-streaming) - - Auteur et date d'expédition - - Date de consultation - - Avis - - Résume + - Auteur et date d'expédition + - Date de consultation : 2 Aout + - Avis : Les types de streaming sont bien expliqué + - Résume : 6. [Protocoles streaming video](https://www.cdnetworks.com/media-delivery-blog/video-streaming-protocols/) - - Auteur et date d'expédition - - Date de consultation - - Avis - - Résume + - Auteur et date d'expédition : Inconnu , December 19, 2021 + - Date de consultation : 8 Aôut 2022 + - Avis : Bien detailler et bien complet avec les explications + - Résume : Differentes protocole du streaming video - https://www.zdnet.fr/lexique-it/visioconference-une-definition-39928673.htm#:~:text=La%20visioconférence%2C%20ou%20vidéoconférence%20(synonyme,selon%20les%20options%20et%20licences. -6. https://fr.acervolima.com/protocoles-de-visioconference/ -7. https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html -8. https://docplayer.fr/508783-Deploiement-de-la-visioconference-ip-dans-un-etablissement-etat-de-l-art-et-evolution-des-protocoles.html +7.Autre liens: + - https://fr.acervolima.com/protocoles-de-visioconference/ + - https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html + - https://docplayer.fr/508783-Deploiement-de-la-visioconference-ip-dans-un-etablissement-etat-de-l-art-et-evolution-des-protocoles.html From b0cd709cc4860cad0df856e416f017d9db4e6992 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 11:51:57 +0200 Subject: [PATCH 202/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 52 ++++++++++++++++------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 894cc33..5f3b9bf 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -48,20 +48,23 @@ C'est un protocole réseau permettant de connecter des applications clientes de - ### 2.2 Différentes normes pour la visioconférence [4]( https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) + + + #### Contrôle et la signalisation : -H.225 : il est en en système de communications, est une sous-norme de H.323 [I]( https://fr.wikipedia.org/wiki/H.225). +H.225 : il est en système de communications, est une sous-norme de H.323 [I]( https://fr.wikipedia.org/wiki/H.225).
Ses objectifs : - Gestion d’un appel : Ce système s'appuie sur le processus de préparation des appels ISDN (Intergrated Services Digital Network) - Enregistrement, admission et status : RAS qui est le premier canal de signalisation et utilise le UDP comme couche de transport H.245 : il a été mise en place pour les canaux des médias par H.323, il est ouvert dès le départ à la négociation de codecs communs, veiller à toutes les fonctions de gestion des flux de médias. RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contrôle des flux RTP, permettant de transmettre des informations de base sur les participants d'une session, ainsi que sur la qualité de service.[II]( https://fr.wikipedia.org/wiki/Real-time_Transport_Control_Protocol ) #### Voix : -- G.726 : -- G.728 : -- G.729 : +- G.726 : C'est une norme de compression audio de l'UIT-T, il est utilisée en telephonie fixe, Il utilise une "modulation impulsive et l'encodage différentiel adaptatif" (MICDA) à 40, 32, 24 ou 16 kbit/s +- G.728 : Ancienne norme decompression audio, Recommandation relative aux protocoles H.320 et H.323 sur l'encodage sonore pour la téléphonie et la vidéoconférence. +- G.729 : Norme qui est sous recommandation, définit l'encodage vocal 8 kbit/s par prédiction linéaire avec excitation par séquences encodées avec structure algébrique conjuguée. #### Video : -- H.261 : -- H.263 : +- H.261 : C'est une évolution de la norme,Elle fut notamment popularisée par la console de jeu PlayStation de Sony, qui l'intégra entièrement dans son moteur de décompression de données +- H.263 : Ce standard est devenu obsolète, sa succession a été assurée par le standard H.263 de meilleure qualité pour VoIP ; pour le codage vidéo pur, nous préférons le standard H.264. - H.265 : H265 ou encore HEVC (High Efficiency Video Coding) un nouveau standard dont l'objectif est d'améliorer de manière significative la compression vidéo, il est en mesure de transmettre la même vidéo que son prédécesseur (H264) pour une vitesse deux fois moins. Il supporte toutes les définitions d’images usuelles et des cadences d’images plus élevées. #### Données : - T.123 : @@ -85,37 +88,38 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u ## Bibliographie: 1. [Que signifie visioconférence](https://trueconf.com/video-conferencing-architecture.html) - - Auteur et date d'expédition - - Date de consultation - - Avis - - Résume + - Auteur et date d'expédition : Inconnu + - Date de consultation : 20 Juillet 2022 + - Avis : l'explicaion est un peu court + - Résume : Explication sur visioConférence et ses protocoles 2. [Pourquoi la visioconférence ?](https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) - - Auteur et date d'expédition - - Date de consultation : 27 juillet - - Avis - - Résume + - Auteur et date d'expédition : Inconnue, 2021 + - Date de consultation : 27 juillet 2O22 + - Avis : Le Résumer trés courte + - Résume: Explication des avantages de la visioConférence 3. [Principaux protocoles](https://fr.acervolima.com/protocoles-de-visioconference/) - - Auteur et date d'expédition - - Date de consultation : 27 juillet - - Avis - - Résume + - Auteur et date d'expédition : Jack Sparrow, 5 juillet de 2022 + - Date de consultation : 27 juillet 2022 + - Avis : très court explication + - Résume : explication des principaux protocoles de la visioconférence 4. [Differentes normes de visioConférence](https://www.dwpro.fr/blog/visioconference/normes-visioconference#:~:text=De%20plus%2C%20la%20norme%20H,les%20systèmes%20de%20visioconférence%204K.) - Auteur et date d'expédition - - Date de consultation : 27 juillet - - Avis - - Résume + - Date de consultation : 27 juillet 2022 + - Avis : Explications sont bien détailler mais peu de contenu + - Résume : Explication sur les normes de visioConférence + 5. [Difference entre la visioConférence et le streaming video](https://www.avast.com/fr-fr/c-what-is-streaming) - - Auteur et date d'expédition - - Date de consultation : 2 Aout + - Auteur et date d'expédition : Alfred Poor, le 28 septembre 2019 + - Date de consultation : 2 Aout 2022 - Avis : Les types de streaming sont bien expliqué - - Résume : + - Résume : Explication et comparaison de visioconférence et streaming vidéo 6. [Protocoles streaming video](https://www.cdnetworks.com/media-delivery-blog/video-streaming-protocols/) From 2e194d08dd82e47ab0d9d8d3669ee2d4872bcfc2 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 13:01:08 +0200 Subject: [PATCH 203/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 5f3b9bf..3a54969 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -67,9 +67,9 @@ RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contr - H.263 : Ce standard est devenu obsolète, sa succession a été assurée par le standard H.263 de meilleure qualité pour VoIP ; pour le codage vidéo pur, nous préférons le standard H.264. - H.265 : H265 ou encore HEVC (High Efficiency Video Coding) un nouveau standard dont l'objectif est d'améliorer de manière significative la compression vidéo, il est en mesure de transmettre la même vidéo que son prédécesseur (H264) pour une vitesse deux fois moins. Il supporte toutes les définitions d’images usuelles et des cadences d’images plus élevées. #### Données : -- T.123 : -- T.124 : -- T.125 : +- T.123 : Audiovisual Protocol Stacks +- T.124 : Generic Conference Control +- T.125 : Multipoint Communication Service ## 3 Difference entre la visioConférence et le streaming video ### 3.1 VisioConférence @@ -79,10 +79,10 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u - Streaming en direct - streaming video #### 3.2.2 Les protocoles de streaming vidéo: -- HLS -- SRT -- MPEG -- WebRTC +- HLS (HTTP Live Streaming): Ce protocole est compatible avec un large éventail d'appareils, navigateurs de bureau, téléviseurs intelligents, boîtes de décodage, appareils mobiles Android et iOS et même les lecteurs vidéo HTML5. Cela permet aux streamers d'atteindre une audience aussi large que possible. +- SRT (Secure Reliable Transport): est un autre protocole open source développé par le fournisseur de technologie de streaming Haivision, les principaux avantages pour lesquels SRT est connu sont la sécurité, la fiabilité, la compatibilité et le streaming à faible latence. +- MPEG-PASH: est l'un des derniers protocoles de streaming, mis au point par le Moving Pictures Expert Group (MPEG), en alternative à la norme HLS. +- WebRTC : est un open source qui vise à offrir la diffusion en continu avec une latence en temps réel. Développé à l'origine pour les applications basées sur le chat et l'utilisation VoIP ## Conclusion ## Bibliographie: From d6a168213b484d155a27b19999300c707f23330c Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 13:04:18 +0200 Subject: [PATCH 204/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 3a54969..60c6849 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -73,6 +73,7 @@ RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contr ## 3 Difference entre la visioConférence et le streaming video ### 3.1 VisioConférence +est mieux défini comme un événement où plusieurs utilisateurs d'ordinateurs peuvent communiquer entre eux simultanément à l'aide de caméras sur Internet. ### 3.2 Streaming Video est un type de technologie multimédia qui offre du contenu vidéo et audio à un dispositif connecté à Internet. C’est un flux vidéo organiser par l’organisateur comme video sur youtube, Netflix etc. #### 3.2.1 Types de streaming video From 0b8902618425b16221051cc7762375e303b392e1 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 14:20:02 +0200 Subject: [PATCH 205/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index 60c6849..ec1cbc9 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -84,8 +84,9 @@ est un type de technologie multimédia qui offre du contenu vidéo et audio à u - SRT (Secure Reliable Transport): est un autre protocole open source développé par le fournisseur de technologie de streaming Haivision, les principaux avantages pour lesquels SRT est connu sont la sécurité, la fiabilité, la compatibilité et le streaming à faible latence. - MPEG-PASH: est l'un des derniers protocoles de streaming, mis au point par le Moving Pictures Expert Group (MPEG), en alternative à la norme HLS. - WebRTC : est un open source qui vise à offrir la diffusion en continu avec une latence en temps réel. Développé à l'origine pour les applications basées sur le chat et l'utilisation VoIP -## Conclusion - +## Conclusion [[C]](https://cefre-uahb.fr.gd/LA-VISIOCONFERENCE.htm#:~:text=Une%20seule%20séance%20de%20visioconférence,la%20perte%20de%20temps%20supprimée.) +Une seule séance de visioconférence permet d'éviter les appels téléphoniques, les courriels, les télécopies, les envois de courrier ou les pires déplacements. +Grâce à la vidéoconférence, les communications s'améliorent, la prise de décisions est facilitée, la productivité augmente, les coûts diminuent et le temps perdu est éliminé. ## Bibliographie: 1. [Que signifie visioconférence](https://trueconf.com/video-conferencing-architecture.html) From 5ab324c56118b8c17ad48ba8481f982adb53ba02 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 23:12:13 +0200 Subject: [PATCH 206/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index ec1cbc9..b28af23 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -20,10 +20,10 @@ Visioconférence est aussi la combinaison de 2 techniques : Figure 1. Ex: visioconférence -## 2. Pourquoi la visioconférence ? [3]( https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) +## 2. Pourquoi la visioconférence ? [2]( https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) La visioconférence est un vrai levier d’efficacité professionnel qui facilite les échanges entre les collaborateurs dans les entreprise multi sites. -### 2.1 Les principaux prorocoles de visioConférence +### 2.1 Les principaux prorocoles de visioConférence [3](https://fr.acervolima.com/protocoles-de-visioconference/) ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) @@ -67,11 +67,11 @@ RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contr - H.263 : Ce standard est devenu obsolète, sa succession a été assurée par le standard H.263 de meilleure qualité pour VoIP ; pour le codage vidéo pur, nous préférons le standard H.264. - H.265 : H265 ou encore HEVC (High Efficiency Video Coding) un nouveau standard dont l'objectif est d'améliorer de manière significative la compression vidéo, il est en mesure de transmettre la même vidéo que son prédécesseur (H264) pour une vitesse deux fois moins. Il supporte toutes les définitions d’images usuelles et des cadences d’images plus élevées. #### Données : -- T.123 : Audiovisual Protocol Stacks -- T.124 : Generic Conference Control -- T.125 : Multipoint Communication Service +- T.123 : Audiovisual Protocol Stacks, piles de protocoles de données spécifiques au réseau pour les conférences multimédias +- T.124 : Contrôle de conférence générique +- T.125 : Service de communication multipoint -## 3 Difference entre la visioConférence et le streaming video +## 3 Difference entre la visioConférence et le streaming video [5](https://www.avast.com/fr-fr/c-what-is-streaming) ### 3.1 VisioConférence est mieux défini comme un événement où plusieurs utilisateurs d'ordinateurs peuvent communiquer entre eux simultanément à l'aide de caméras sur Internet. ### 3.2 Streaming Video @@ -130,7 +130,9 @@ Grâce à la vidéoconférence, les communications s'améliorent, la prise de d - Avis : Bien detailler et bien complet avec les explications - Résume : Differentes protocole du streaming video -7.Autre liens: - - https://fr.acervolima.com/protocoles-de-visioconference/ - - https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html +7.[Autre liens](https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html) + - Auteur et date d'expédition : Inconnu , 15 février 2008 + - Date de consultation : 11 Aôut 2022 + - Avis : Bien detailler et moyennement complet mais avec une tres bonne explication + - Résume : Explication sur l'implémentation H.323 - https://docplayer.fr/508783-Deploiement-de-la-visioconference-ip-dans-un-etablissement-etat-de-l-art-et-evolution-des-protocoles.html From 19df585336b85a7c911a23cd0b262bb858786113 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 23:13:37 +0200 Subject: [PATCH 207/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index b28af23..ab46c5f 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -130,7 +130,7 @@ Grâce à la vidéoconférence, les communications s'améliorent, la prise de d - Avis : Bien detailler et bien complet avec les explications - Résume : Differentes protocole du streaming video -7.[Autre liens](https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html) +7. [Autre liens](https://www.cisco.com/c/fr_ca/support/docs/quality-of-service-qos/qos-packet-marking/21662-video-qos.html) - Auteur et date d'expédition : Inconnu , 15 février 2008 - Date de consultation : 11 Aôut 2022 - Avis : Bien detailler et moyennement complet mais avec une tres bonne explication From dc883d87198106525d4bf3af9a1f2a285422658f Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sat, 20 Aug 2022 23:20:50 +0200 Subject: [PATCH 208/241] Update visioConference.md --- "R\303\251seaux/visioConference.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index ab46c5f..cf9ca58 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -77,8 +77,8 @@ est mieux défini comme un événement où plusieurs utilisateurs d'ordinateurs ### 3.2 Streaming Video est un type de technologie multimédia qui offre du contenu vidéo et audio à un dispositif connecté à Internet. C’est un flux vidéo organiser par l’organisateur comme video sur youtube, Netflix etc. #### 3.2.1 Types de streaming video - - Streaming en direct - - streaming video + - Streaming en direct : Le streaming en direct vous donne accès aux événements au moment où ils se produisent + - streaming video : #### 3.2.2 Les protocoles de streaming vidéo: - HLS (HTTP Live Streaming): Ce protocole est compatible avec un large éventail d'appareils, navigateurs de bureau, téléviseurs intelligents, boîtes de décodage, appareils mobiles Android et iOS et même les lecteurs vidéo HTML5. Cela permet aux streamers d'atteindre une audience aussi large que possible. - SRT (Secure Reliable Transport): est un autre protocole open source développé par le fournisseur de technologie de streaming Haivision, les principaux avantages pour lesquels SRT est connu sont la sécurité, la fiabilité, la compatibilité et le streaming à faible latence. From 3fb626e7a84288d07fdbb058a788ede2140534d9 Mon Sep 17 00:00:00 2001 From: HaAymar <71372488+HaAymar@users.noreply.github.com> Date: Sun, 21 Aug 2022 21:42:10 +0200 Subject: [PATCH 209/241] correction des fautes d'orthographe --- "R\303\251seaux/visioConference.md" | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git "a/R\303\251seaux/visioConference.md" "b/R\303\251seaux/visioConference.md" index cf9ca58..8173aa0 100644 --- "a/R\303\251seaux/visioConference.md" +++ "b/R\303\251seaux/visioConference.md" @@ -9,7 +9,7 @@ parent: Réseaux ## 1. Que signifie visioconférence [[1]](https://fr.wikipedia.org/wiki/Visioconférence) La visioconférence est une solution de communication à distance sécurisée, via Internet, dans des points multiples, permettant l'échange visuel entre deux individus, ou plusieurs dizaines ou même des centaines ou des milliers de personnes, selon les options et les licences. -Il est aussi appelé vidéoconférence, c'est la technique qui permer de voir et dialoguer avec son interlocuteur à travers un moyen numérique. +Elle est aussi appelée vidéoconférence, c'est la technique qui permet de voir et dialoguer avec son interlocuteur à travers un moyen numérique. Visioconférence est aussi la combinaison de 2 techniques : @@ -21,16 +21,16 @@ Figure 1. Ex: visioconférence ## 2. Pourquoi la visioconférence ? [2]( https://www.a2com.fr/blog/6-bonnes-raisons-dutiliser-la-visioconference-en-entreprise/#:~:text=Le%20collaboratif%20est%20au%20cœur,dans%20une%20entreprise%20multi%20sites.) -La visioconférence est un vrai levier d’efficacité professionnel qui facilite les échanges entre les collaborateurs dans les entreprise multi sites. +La visioconférence est un vrai levier d’efficacité professionnel qui facilite les échanges entre les collaborateurs dans les entreprises multi sites. -### 2.1 Les principaux prorocoles de visioConférence [3](https://fr.acervolima.com/protocoles-de-visioconference/) +### 2.1 Les principaux protocoles de visioConférence [3](https://fr.acervolima.com/protocoles-de-visioconference/) ##### Figure 2. certains protocoles [[2]](https://trueconf.com/video-conferencing-architecture.html) #### Protocole H.323 C'est un protocole de transfert de données avec une bande passante non garantie appliquée aux vidéoconférences personnelles et de groupe. - - Il a été conçu pa r l'UIT(Union internationale des télécommunication) + - Il a été conçu par l'UIT(Union internationale des télécommunication) - Il utilise le langage informatique du binaire - Assure des communications multimédias sur différents réseaux. - il est très complexe, il est possible qu'il y ait des retards. @@ -42,7 +42,7 @@ C'est un protocole réseau permettant de connecter des applications clientes de - Il utilise le langage informatique ASCII - Il est très flexible et simple - L'agent utilisateur et le serveur réseau constituent deux composantes fonctionnelles principales. -- Permet de configurer, d'éditer et de mettre fin aux sessions multimédia ou aux appels. +- Permet de configurer, d'éditer et de mettre fin aux sessions multimédias ou aux appels. - Ressemble au protocole HTTP. - Il est fonctionnel avec le IPv4 et IPv6 - @@ -52,18 +52,18 @@ C'est un protocole réseau permettant de connecter des applications clientes de #### Contrôle et la signalisation : -H.225 : il est en système de communications, est une sous-norme de H.323 [I]( https://fr.wikipedia.org/wiki/H.225).
+H.225 : il est en système de communications et c'est une sous-norme de H.323 [I]( https://fr.wikipedia.org/wiki/H.225).
Ses objectifs : - Gestion d’un appel : Ce système s'appuie sur le processus de préparation des appels ISDN (Intergrated Services Digital Network) -- Enregistrement, admission et status : RAS qui est le premier canal de signalisation et utilise le UDP comme couche de transport -H.245 : il a été mise en place pour les canaux des médias par H.323, il est ouvert dès le départ à la négociation de codecs communs, veiller à toutes les fonctions de gestion des flux de médias. +- Enregistrement, admission et status : RAS qui est le premier canal de signalisation et utilise le protocole UDP comme couche de transport +H.245 : il a été mis en place pour les canaux des médias par H.323, il a été ouvert dès le départ à la négociation de codecs communs, veiller à toutes les fonctions de gestion des flux de médias. RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contrôle des flux RTP, permettant de transmettre des informations de base sur les participants d'une session, ainsi que sur la qualité de service.[II]( https://fr.wikipedia.org/wiki/Real-time_Transport_Control_Protocol ) #### Voix : -- G.726 : C'est une norme de compression audio de l'UIT-T, il est utilisée en telephonie fixe, Il utilise une "modulation impulsive et l'encodage différentiel adaptatif" (MICDA) à 40, 32, 24 ou 16 kbit/s -- G.728 : Ancienne norme decompression audio, Recommandation relative aux protocoles H.320 et H.323 sur l'encodage sonore pour la téléphonie et la vidéoconférence. +- G.726 : C'est une norme de compression audio de l'UIT-T qui est utilisée en telephonie fixe, elle utilise une "modulation impulsive et l'encodage différentiel adaptatif" (MICDA) à 40, 32, 24 ou 16 kbit/s +- G.728 : Ancienne norme de compression audio, elle est recommandée aux protocoles H.320 et H.323 sur l'encodage sonore pour la téléphonie et la vidéoconférence. - G.729 : Norme qui est sous recommandation, définit l'encodage vocal 8 kbit/s par prédiction linéaire avec excitation par séquences encodées avec structure algébrique conjuguée. #### Video : -- H.261 : C'est une évolution de la norme,Elle fut notamment popularisée par la console de jeu PlayStation de Sony, qui l'intégra entièrement dans son moteur de décompression de données +- H.261 : C'est une évolution de la norme, elle fut notamment popularisée par la console de jeu PlayStation de Sony, qui l'intégra entièrement dans son moteur de décompression de données - H.263 : Ce standard est devenu obsolète, sa succession a été assurée par le standard H.263 de meilleure qualité pour VoIP ; pour le codage vidéo pur, nous préférons le standard H.264. - H.265 : H265 ou encore HEVC (High Efficiency Video Coding) un nouveau standard dont l'objectif est d'améliorer de manière significative la compression vidéo, il est en mesure de transmettre la même vidéo que son prédécesseur (H264) pour une vitesse deux fois moins. Il supporte toutes les définitions d’images usuelles et des cadences d’images plus élevées. #### Données : @@ -73,9 +73,9 @@ RTCP (Real-time Transport Control Protocol) : Il s'agit d'un protocole de contr ## 3 Difference entre la visioConférence et le streaming video [5](https://www.avast.com/fr-fr/c-what-is-streaming) ### 3.1 VisioConférence -est mieux défini comme un événement où plusieurs utilisateurs d'ordinateurs peuvent communiquer entre eux simultanément à l'aide de caméras sur Internet. +Elle est mieux définie comme un événement où plusieurs utilisateurs d'ordinateurs peuvent communiquer entre eux simultanément à l'aide de caméras sur Internet. ### 3.2 Streaming Video -est un type de technologie multimédia qui offre du contenu vidéo et audio à un dispositif connecté à Internet. C’est un flux vidéo organiser par l’organisateur comme video sur youtube, Netflix etc. +C'est un type de technologie multimédia qui offre du contenu vidéo et audio à un dispositif connecté à Internet. C’est un flux vidéo organisé par l’organisateur comme video sur youtube, Netflix etc. #### 3.2.1 Types de streaming video - Streaming en direct : Le streaming en direct vous donne accès aux événements au moment où ils se produisent - streaming video : From 86e89234c1f0050c3236c32d20a4428217fab21e Mon Sep 17 00:00:00 2001 From: simonNolf Date: Thu, 25 Aug 2022 11:07:39 +0200 Subject: [PATCH 210/241] refonte du l'article SPF --- "R\303\251seaux/Schema_SPF.png" | Bin 0 -> 35440 bytes "R\303\251seaux/domaineauthorise.jpg" | Bin 21922 -> 0 bytes "R\303\251seaux/domainusurpe.jpg" | Bin 20173 -> 0 bytes .../mailtransf\303\251r\303\251.jpg" | Bin 33323 -> 0 bytes "R\303\251seaux/spf.md" | 63 +++++++++--------- 5 files changed, 31 insertions(+), 32 deletions(-) create mode 100644 "R\303\251seaux/Schema_SPF.png" delete mode 100644 "R\303\251seaux/domaineauthorise.jpg" delete mode 100644 "R\303\251seaux/domainusurpe.jpg" delete mode 100644 "R\303\251seaux/mailtransf\303\251r\303\251.jpg" diff --git "a/R\303\251seaux/Schema_SPF.png" "b/R\303\251seaux/Schema_SPF.png" new file mode 100644 index 0000000000000000000000000000000000000000..d2aaf5f1a4d5ba0bce32256e390f67b3f3f0becc GIT binary patch literal 35440 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 literal 0 HcmV?d00001 diff --git "a/R\303\251seaux/domaineauthorise.jpg" "b/R\303\251seaux/domaineauthorise.jpg" deleted file mode 100644 index 0835e8fc43942c28bbf7dc417217effcf5ca80c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21922 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 diff --git "a/R\303\251seaux/domainusurpe.jpg" "b/R\303\251seaux/domainusurpe.jpg" deleted file mode 100644 index 2b67536e749fe6f0fc58193b1d93b273811088d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20173 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 bM3M_F=@ESfO*)7 consulté le 27-05-2022 -* [2] consulté le 27-05-2022 * [3] Qu'est-ce qu'un SPF record? - DMARC Analyzer. (n.d.). DMARC Analyzer. consulté le 05-06-2022 * [RFC SPF] RFC 7208 * [RFC Dmark] RFC 7489 * [4] consulté le 05-06-2022 +* [5] La syntaxe de l'enregistrement SPF expliquée - Un guide simple de la syntaxe SPF. (n.d.). PowerDMARC. consulté le 25-08-2022 From cf3c9c4f5596fbb9d5b996d0ab6d4b60f336b378 Mon Sep 17 00:00:00 2001 From: BaptisteBemel <63234160+BaptisteBemel@users.noreply.github.com> Date: Tue, 30 Aug 2022 12:03:24 +0200 Subject: [PATCH 211/241] Create Systemes_de_detection_d_intrusion.md Note: L'ensemble des informations sont reprises du cours "Introduction to Security and Privacy". --- .../Systemes_de_detection_d_intrusion.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 "S\303\251curit\303\251/Systemes_de_detection_d_intrusion.md" diff --git "a/S\303\251curit\303\251/Systemes_de_detection_d_intrusion.md" "b/S\303\251curit\303\251/Systemes_de_detection_d_intrusion.md" new file mode 100644 index 0000000..dc5f7a2 --- /dev/null +++ "b/S\303\251curit\303\251/Systemes_de_detection_d_intrusion.md" @@ -0,0 +1,46 @@ +--- +layout: default +title: Systemes_de_detection_d_intrusion.md +parent: Sécurité +--- + +# Intrusion Detection Systems + +## Définition +Un système de détection d’intrusion détecte quand une personne n’étant pas censé avoir accès au système est présente sur ledit système. La détection peut avoir lieu à différents niveaux et la réaction de cas de détection d’intrus peut être passive ou active. +## Déploiement +Un IDS peut être déployé soit sur les hôtes d’un réseau, soit sur le réseau ou encore sur les deux. Ces deux IDS, IDS sur l’hôte (HIDS) ou sur le réseau (NIDS), diffèrent notamment sur la façon avec laquelle ils vont détecter un intrus. + +NIDS : L’IDS sur réseau étudie les en-têtes des paquets réseaux et plus particulièrement les adresses IP source et destination, les ports source et destination et les drapeaux IP/TCP. Il étudie aussi la charge utile du paquet. + +HIDS : L’IDS sur hôte, lui, étudie le trafic du réseau, comme il est déchiffré, les logs du système, la liste des processus, les appels système, le système de fichier, l’utilisation de la mémoire vive et du processeur. + +## Réaction +Les IDS sont par définition passifs. Leur but est la détection. En cas de détection, ils alertent ou note la détection d’un intrus dans le log. +Cependant, ils existent aussi des systèmes actifs. Ils sont appelés systèmes de prévention d’intrusion (IPS). Ils peuvent simplement abandonner les paquets notés comme intrus ou bloquer l’adresse IP source dans le firewall, bloquer le compte de l’utilisateur ou empêcher une exécution. + +## Utilisation malveillante et anomalie +L’utilisation malveillante est ce que l’IDS recherche à détecter alors que l’anomalie est la déviation de la norme. Pour que l’utilisation malveillante soit détectée, il faut définir ces utilisations malveillantes et comment les reconnaitre. Pour cela, on essaie de reconnaitre les signatures d’un type d’attaques. + +On peut diviser les résultats de détection en quatre catégories: + +* Le vrai positif, quand il y a une intrusion et qu’elle est détectée. +* Le faux négatif, quand il y a une intrusion mais qu’elle n’est pas détectée. +* Le faux positif, quand il n’y a pas d’intrusion mais que l’IDS croit en avoir détectée une. +* Le vrai négatif, quand il n’y a pas d’intrusion et que rien n’est détecté. + +En fonction de la sensibilité et de la spécificité de l’IDS, on va faire varier les résultats de détection. En augmentant la sensibilité, on augmente les chances de détecter les vrais positifs et en augmentant la spécificité, on diminue les chances de détecter de faux positifs. + +On peut à nouveau diviser les IDS en deux catégories, ceux qui se basent sur la détection d’utilisation malveillante et ceux qui se basent sur la détection d’anomalies. +Ceux basés sur l’utilisation malveillante ne pourront détecter que les attaques connues alors que ceux basés sur les anomalies peuvent détecter des attaques inconnues. + +Pour la détection d’anomalies, les HIDS regardent les traces d’appels système en créant un dictionnaire avec un paterne des appels systèmes utilisés et en détectant les appels systèmes inhabituels alors que les NIDS, qui ont le trafic réseau en clair, analysent la fréquence de caractères au sein de la charge utile du paquet. + + +## Evaluation de la précision +En utilisant des courbes ROC (Caractéristique d'exploitation du récepteur) permettent de comparer entre une sensibilité importante et une spécificité importante. +Ces courbes sont réalisées à partir de mesures sur un système. Il faut cependant faire attention aux taux de vrais positifs et de faux positifs à de l’erreur de taux de base. + +### Source + +* HERRMANN Dominik, “044-Network-Security-II”, Introduction to Security and Privacy, 2022 From 357b92fa7fe3ff0fcc682eff1fdee034623fb36e Mon Sep 17 00:00:00 2001 From: FirminMoyen <64018210+FirminMoyen@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:48:30 +0200 Subject: [PATCH 212/241] Create WSL2.md --- Divers/WSL2.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Divers/WSL2.md diff --git a/Divers/WSL2.md b/Divers/WSL2.md new file mode 100644 index 0000000..3cb870b --- /dev/null +++ b/Divers/WSL2.md @@ -0,0 +1,62 @@ +# Le WLS2 : + +## Qu'est-ce que c'est ? + +Disponible depuis 2016, WSL qui signifie "Windows Subsystem for Linux", est comme son nom l'indique, +un outil permettant de faire tourner un environnement GNU/Linux directement dans Windows. C'est un système bien plus pratique pour accéder à linux +qu'un dual boot où de devoir créer une machine virtuelle. + +Pour en profiter, il suffit d'activer la virtualisation sur son processeur dans le BIOS puis, après la simple commande PowerShell `wsl --install`, +WSL est prêt à être utilisé. Il ne reste donc plus qu'à choisir parmi les distributions disponibles dans le Microsoft store pour pouvoir avoir accès +à une machine linux profondément intégrée à Windows. + +## Comment ça marche ? + +Pour comprendre WSL il faut s'intéresser à ses différentes versions, car en effet le fonctionnement de WSL a changé depuis sa création. + +A son lancement en 2016, WSL1 était une "Couche de compatibilité" pour faire tourner des fichiers binaires exécutables (ELF) nativement sur Windows 10. Aucune recompilation où portage des applications n'est nécessaire. WSL1 fournit un kernel compatible avec linux qui opère par dessus le kernel de Windows et qui va exécuter les fichiers binaires Linux. WSL1 va ensuite traduire les appels systèmes linux en appels systèmes Windows. Les applications Linux tournent dans les distributions qui fournissent toutes les dépendances et paquets nécessaires, un peu comme des conteneurs. + +WSL1 a une approche semblable a Wine, qui est une couche de compatibilité bien connue permettant de faire tourner des exécutables Windows sur Linux en implémentant les appels systèmes et API des Windows dans des librairies. + +En 2019, Microsoft annonce WSL2 qui possède un véritable kernel Linux basé sur la technologie Hyper-V. Ce qui se rapproche plus donc de la virtualisation plus "classique". Cette transition a permis un meilleur support des applications ainsi que de meilleures performances du file systeme. + +Un kernel est une partie du système d’exploitation qui permet de gérer les ressources système et de faire le lien entre le matériel (hardware) et les logiciels (software) + +Le fonctionnement de WSL2 est semblable à celui de Docker, le kernel est partagé entre toutes les instances de linux mais la mémoire et les file systèmes sont différents. Cela permet de lancer une machine très rapidement car tout le système ne doit pas démarrer. + +D’ailleur, en extractant le fichier .tar d’une distribution depuis une image Docker et en l’important dans WSL2, on peut faire tourner d’autres distributions que celles disponibles dans le microsoft store. Un des exemples les plus populaires de cette pratique est la distribution Arch linux. + +## À quoi ça sert ? + +WSL2 a de nombreuses utilisation très pratique qui améliore considérablement le confort d’utilisation de windows, pour le développement notamment. + +De nombreux développeurs préfèrent Linux a Windows pour les options et la liberté qu'il offre. Cependant, beaucoup préfèrent quand même la facilité et le confort de Windows au quotidien. Désormais, grâce à WSL2 il est possible de rester sous windows et de tout de même travailler dans la liberté qu’offre Linux. + +L'intégration de WSL2 et de Windows permet également de faciliter la gestion des fichiers des machines Linux, en effet depuis l’explorateur de fichier WIndows, une section en bas baptisée linux contient l'entièreté du file systeme de chaque distribution installée et permet de facilement retrouver et éditer des fichiers depuis windows. + +Mais cette possibilité fonctionne aussi dans les deux sens, depuis un terminal d’une des machines linux, on retrouve tout le file système de windows comme volume monté dans le répertoire /mtn/c/, cela permet donc de gérer tout son ordinateur windows grâce aux outils puissants que sont les commandes Unix. + +Un outil très pratique pour utiliser WSL2 c’est Vs code. Grâce à une extension fournie par microsoft, vs code permet de centraliser tous les outils pour utiliser WSL2, depuis une même fenêtre, on a accès à un ou plusieurs terminaux, a une arborescence de tous les file systeme de chaque distribution et à un éditeur de texte pour modifier des fichiers de config par exemple. + + + + + + + + + + +## Bibliographie : + +https://docs.microsoft.com/en-us/windows/wsl/compare-versions + +https://www.whitewaterfoundry.com/what-is-wsl#:~:text=WSL%20executes%20unmodified%20Linux%20ELF64,executes%20them%20at%20native%20speed. + +https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro + +https://code.visualstudio.com/docs/remote/wsl + +https://docs.microsoft.com/en-us/windows/wsl/faq + +https://ling123labs.com/posts/WSL-files-in-Windows-and-vice-versa/ From 1919aa7953391c390cee8e8bd99545c059a4785c Mon Sep 17 00:00:00 2001 From: Arthur Schamroth <49406566+ArthurSchamroth@users.noreply.github.com> Date: Tue, 30 Aug 2022 14:31:30 +0200 Subject: [PATCH 213/241] Create Z-Wave.md --- "R\303\251seaux/Z-Wave.md" | 79 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 "R\303\251seaux/Z-Wave.md" diff --git "a/R\303\251seaux/Z-Wave.md" "b/R\303\251seaux/Z-Wave.md" new file mode 100644 index 0000000..3e47428 --- /dev/null +++ "b/R\303\251seaux/Z-Wave.md" @@ -0,0 +1,79 @@ +# Z-Wave c'est quoi ? +![zwave](https://user-images.githubusercontent.com/49406566/186436922-07251c55-3185-4bc0-a917-738a3e38d896.png) + +Créé en 1999, Z-Wave est un protocole de communication radio sécurisé et dédié à une application domotique. Ainsi, ce protocole permet à différents appareils électroniques, pouvant être de marques différentes ou non, d'interagir entre eux au sein d'un domicile via une bande de fréquences isolée du wifi, de la 4G ou encore des ondes radios classiques.
+Il est optimisé pour des échanges à faible bande passante à contrario du Wi-Fi qui est quant à lui optimisé pour des échange à haut débit. Ainsi, les appareils reliés entre eux via ce protocole pourront se faire passer une commande donnée par l'utilisateur dans un périmètre d'environ 50 mètres, en fonction de la localisation intérieure ou extérieure de l'installation.
+En terme d'exemples concrets, nous pourrions citer : +* Si la porte d'entrée s'ouvre entre 10 et 18h, envoyer une notification sur le téléphone du propriétaire, +* Si la luminosité ambiante est trop faible, allumer les lumières de la pièce, +* Si une personne reconnue par le système entre dans la maison, lui lire un message personnalisé ou un rapport concernant les différentes notifications/alertes reçues durant son absence. + +Un des principaux avantages de Z-Wave est qu'il est très simple de créer une routine/scénario simplement et ne nécessite aucunement des connaissances dans le domaine de la programmation. Néanmoins, il est bien évidemment possible de créer des scénarios plus complexes en s'appuyant sur des langages comme Python, Bash, ... + +# Quels avantages et spécificités ? +Z-Wave fonctionne à très faible consommation, ce qui permet d'économiser beaucoup d'énergie. Effectivement, les différents services resteront en état de repos tant qu'ils ne seront pas sollicités avant de se réveiller lors d'une interaction avec eux, ce qui augmente grandement la durée de vie de la batterie.
+Le protocole Z-Wave, à contrario du Wifi et d'un réseau 4G, travaille sur une bande de fréquences, de 868MHz en Europe, totalement isolée du reste du réseau.
+Il travaille également en réseau maillé, ce qui permet de facilement mettre en place une structure non hiérarchiques entre les différents nœuds du réseau. Ce réseau maillé représente un réel avantage au niveau des échanges entre les différents appareils car il permet de facilement pouvoir venir ajouter un retirer un nœud de ce réseau sans devoir retravailler sur l'entièreté de celui-ci. Également, ce réseau maillé permet une alimentation facile entre tous les composants du réseau, de nombreuses routes sont créées à travers ce même réseau tout en augmentant le rayon de ce dernier. Enfin, dernier avantage de ce réseau maillé, lorsqu'un service ne sera plus disponible, les services avoisinant serviront de relais pour transmettre l'instruction aux autres et ainsi ne pas arrêter cette dernière à la moindre erreur d'un service.
+Également, Z-Wave propose une comptabilité complète entre n'importe quel type de matériel, de n'importe quelle marque, tout est fait pour que l'inter compatibilité soit assurée par ce protocole. Évidemment, les services doivent comporter le logo Z-Wave pour tout de même fonctionner dans le réseau du même nom.
+Un autre avantage de ce protocole est la sécurité qu'il offre aux communications, pour ce faire, il se base sur un chiffrement asymétrique AES dont je reparlerai plus tard. + +# Quels sont les désavantages de ce protocole ? +Afin d'assurer la compatibilité de différents appareils les uns avec les autres, ces derniers doivent être soumis à la certification Z-Wave. Une fois cette certification acquise, le logo Z-Wave apparait sur le produit et il est ainsi certifié compatible avec les autres éléments Z-Wave. Néanmoins, tout cette certification a un coût qui se répercute incontestablement sur l'acheteur qui se verra son prix d'achat assez important. Également, les producteurs désirant s'allier à l'environnement Z-Wave doivent passer par cette certification qui leur impose un coût certain. En réalité, ce premier désavantage n'en est pas réellement un pour quelqu'un qui veut s'assurer de la compatibilité de ses devices et de la sécurité de ces derniers.
+Il est également important de se renseigner sur la compatibilité de produits issus de produits différents, effectivement la fréquence de ces derniers varie en fonction des pays où le produit est fabriqué, voici une petite sélection de pays avec lur fréquence Z-Wave entourée : + +![image](https://user-images.githubusercontent.com/49406566/186449411-1f2eb449-0a9e-4da2-af33-5fcd39d9e531.png) + +Il est donc primordial de s'assurer de la bonne compatibilité des produits si ceux-ci proviennent de pays étrangers (en Europe, la majorité des pays sont sur la même fréquence (CEPT dans l'image ci-dessus, 868.4 MHz).
+Le fait d'avoir également une plage de fréquence isolée du Wifi et du réseau 4G représente d'un coté un avantage mais également un inconvénient car le débit maximal de communication s'élève à 100kB/s, ce qui peut empêcher certains services de fonctionner comme des sonnettes connectées.
+Voici la carte des pays dans lesquels nous retrouvons aujourd'hui des produits équipé de Z-Wave. +![image](https://user-images.githubusercontent.com/49406566/186467245-7640a855-00fa-4281-9fb9-ac1e06ac89a0.png) + + +# Comment fonctionne ce protocole +Tous les services Z-Wave sont connectés à un "Hub" général qui va gérer l'ensemble du réseau.
+Le protocole Z-Wave se base sur le standard ITU-T G.9959 qui définit les spécifications des couches physique et MAC pour les émetteurs-récepteurs de radiocommunication numériques à bande étroite et à courte portée et ce, sans donner la liste des fréquences utilisées par les dispositifs.
+Au dessus de ces deux couches, nous retrouvons une couche applicative. Cette couche a pour fonction de présenter les différentes informations utilisées pour le contrôle et la gestion des modules. Voici un schéma présentant la liaison entre ces différentes couches. + +![image](https://user-images.githubusercontent.com/49406566/186417100-6a7cd21c-101f-4428-bc64-12c2e1950546.png) + +Dans la couche applicative : +* Le "header" permet ici d'indiquer de quelle type de trames il s'agit, +* Le "cmd" class permet d'indiquer de quel type de requête il s'agit, +* Le "command" permet d'indiquer une commande à exécuter, +* Les "parameters" sont différents paramètres à prendre en compte ou à utiliser pour la requête. + +Dans la couche MAC : +* Le HomeID indique l'émetteur et la destinataire d'un message. Si la valeur de cet HomeID est à "0xFF", la trame sera de type broadcast et le message sera donc envoyé à chaque équipement du réseau. + +Toutes les communications sont organisées en classes de commande. Ces classes sont utilisées afin de réaliser des actions précises, ces actions sont bien évidemment limitée aux fonctionnalités offertes par les équipements du réseau. Chaque classe peut ensuite définir une ou plusieurs commandes, avec différents paramètres. Par exemple, la classe COMMAND_CLASS_SWITCH_BINARY permet de spécifier différents types de commandes : +* Les commandes SET, qui permettent de définir un état, +* Les commandes GET, qui permettent de récupérer un état, +* Les commandes REPORT, qui permettent de stocker un état en paramètre. + +Si l’on souhaite allumer une lampe, on pourra donc utiliser la commande SET pour définir le nouvel état, en passant en paramètre la valeur de cet état (0xFF pour 1/allumée, 0x00 pour 0/éteinte). Si le contrôleur domotique souhaite connaître l’état du périphérique, il utilisera la même classe, mais avec la commande GET. La lampe enverra ensuite une commande REPORT pour signaler son état en paramètre.
+ +Afin que le contrôleur soit en mesure de savoir s’il doit utiliser la classe de sécurité pour l’envoi des messages, une trame NIF (Node Information Frame) est envoyée lors de l’inclusion d’un module au réseau Z-Wave. Si vous utilisez OpenZWave, la liste des classes reconnues et sécurisées pour les différents périphériques est stockée dans le fichier de configuration zwcfg_[HomeID].xml. + +Afin de chiffrer les communications, une clé dédiée au réseau Z-Wave cible est tout d’abord échangée entre le contrôleur et le périphérique lors de la phase d’inclusion (représentée en bleu dans la figure 3) : + +![image](https://user-images.githubusercontent.com/49406566/186463166-930b0f13-3dee-47bc-a932-7aa13acf5542.png) + + +# Utilités de la couche applicative +Comme expliqué précédemment, la couche applicative du protocole Z-Wave permet de fournir des informations sur le type de classe de commande, la fonction utilisée ainsi qu'une liste de paramètres.
+La couche applicative permet également d'assurer une communication chiffrée en AES 128 bits (Advanced Encryption Standard ou AES ,est un algorithme de chiffrement symétrique. Il s'agit du nouveau standard de chiffrement pour les organisations du gouvernement des États-Unis. Il a été approuvé par la NSA (National Security Agency) dans sa suite B1 des algorithmes cryptographiques. Il est actuellement le plus utilisé et le plus sûr). Pour ce faire, la couche applicative va utiliser la classe de commande "COMMAND_CLASS_SECURITY" qui permet d'encapsuler les données de la couche comme dans l'image ci-dessous : + +![image](https://user-images.githubusercontent.com/49406566/186442112-37e8a875-a6cc-4036-a6a3-df947ab40149.png) + +La couche applicative est ainsi primordiales pour le bon envoi des requêtes ainsi que la sécurisation de ces dernières. + +# Bibliographie +1. [Journal du Net](https://www.journaldunet.fr/web-tech/dictionnaire-de-l-iot/1440712-z-wave-caracteristiques-et-evolution-du-reseau/) +2. [Planète Domotique](https://www.planete-domotique.com/blog/2019/11/15/top-10-z-wave/) +3. [Wikipédia](https://fr.wikipedia.org/wiki/Z-Wave) +4. [Homey](https://homey.app/fr-be/wiki/quest-ce-que-z-wave/) +5. [Diamond Connect](https://connect.ed-diamond.com/MISC/misc-082/la-securite-du-protocole-z-wave) +6. [Clemovernet](https://clemovernet.wordpress.com/2015/08/05/z-wav-debuter-controleur-en-cs/) +7. [Vidéo Youtube](https://www.youtube.com/watch?v=k2qOh1O5tug&ab_channel=EverythingSmartHome) +8. [Silicon Labs](https://www.silabs.com/wireless/z-wave/global-regions) + From a01ac3d7107dd3a66be6bc87b21330bf447c4c0f Mon Sep 17 00:00:00 2001 From: Louis Carlier <63374771+CarlierLouis@users.noreply.github.com> Date: Tue, 30 Aug 2022 17:45:52 +0200 Subject: [PATCH 214/241] Create LoRaWAN.md --- "R\303\251seaux/LoRaWAN.md" | 168 ++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 "R\303\251seaux/LoRaWAN.md" diff --git "a/R\303\251seaux/LoRaWAN.md" "b/R\303\251seaux/LoRaWAN.md" new file mode 100644 index 0000000..e2c0360 --- /dev/null +++ "b/R\303\251seaux/LoRaWAN.md" @@ -0,0 +1,168 @@ +> ### _Carlier Louis_ + +# Article Wiki LoRaWAN - Carlier Louis + +![image](https://user-images.githubusercontent.com/63374771/186425838-bcc3a80a-eccc-464e-b0e1-96ca939edd88.png) + +# Introduction + + + +LoRaWAN (acronyme de "Long Range Wide-area network") est un protocole de télécommunication radio permettant les communications bas débit et ne nécessitant que très peu de consommation énergétique. + +Ce protocole est utilisé dans le cadre de l'internet des objets, c'est à dire l'interconnexion entre internet et des objets, des lieux ou des environnements physiques. Par exemple, il peut être utiliser dans le cadre de monitoring industriel ou encore pour des applications agricoles. + +![image](https://user-images.githubusercontent.com/63374771/186428645-009de9d6-52d1-4146-a6f8-b5bf9ca59d41.png) + +Source: https://knowhow.distrelec.com/fr/telecommunication/quest-ce-que-la-technologie-lora-lorawan/ + +
+ + +Il est est fondé sur la technologie de modulation propriétaire LoRa et est créée en 2009 par la start-up grenobloise Cycléo. L'entreprise a ensuite été rachetée en 2012 pour 21 millions de dollars par le spécialiste américain des semi-conducteurs Semtech. + + + +# LoRa et LoRaWAN + +LoRaWAN est un protocole tandis que LoRa fait référence à la couche physique permettant de connecter des capteurs ou objets nécessitant une longue autonomie de batterie à moindre coût. + +LoRaWAN est la couche logicielle qui détermine la manière dont les appareils utilisent le matériel LoRa, il fait partie des technologies LPWAN (Low Power Wide Area Network) qui assurent une couverture longue portée tout en consommant peu de puissance. Les informations transportées peuvent circuler sur des distances plus longues que sur les réseaux de télécommunication traditionnels. Un objet connecté en LoRaWAN peut envoyer des données à une borne située à une distance d'1 kilomètre en zone urbaine et à plus de 20 kilomètres dans une zone rurale plane. + +![image](https://user-images.githubusercontent.com/63374771/186429090-4da121b3-f2ca-4e84-a057-9c6f36a9438b.png) + +Source: https://knowhow.distrelec.com/fr/telecommunication/quest-ce-que-la-technologie-lora-lorawan/ + +
+ + +Contrairement aux réseaux mobiles "classique" (4G, 5G), LoraWAN n'est pas taillé pour transporter de grande quantité de données, il n'est pas fait pour êtres utiliser pour satisfaire les besoins des smartphones par exemple. La technologie de modulation de fréquence utilisée ne permet de faire circuler que des petites quantité de données, comme par exemple avec les données émises par des capteurs à ultrasons ou de température par exemple. Le débit de transfert est compris entre 0,3 et 50 kilobits par seconde, ce qui est vraiment faible. + +De plus, la spécification LoRaWAN est une norme qui permet une bonne intégration entre les dispositifs d’autres fabricants. Ce simple facteur est l’une des raisons pour lesquelles la technologie LoRa s’est vite accélérée dans le secteur de l’IoT. + +
+ +Tableau comparatif des différentes technologies LPWAN: + +![image](https://user-images.githubusercontent.com/63374771/186467492-5856ac47-fdd2-4550-815f-6fa9df5dc959.png) + +Source: http://cedric.cnam.fr/~bouzefra/cours/cours_Lora.pdf + + +# Fonctionnement et architecture de LoRaWAN + +L’architecture de LoRaWAN est divisé en quatre composants: +* End Nodes +* Passerelle +* Serveur réseau +* Serveur d’applications (dans le cloud) + +![image](https://user-images.githubusercontent.com/63374771/186436742-6159b66e-ef81-455f-a7a3-ff71329d1d86.png) + +Source: https://knowhow.distrelec.com/fr/telecommunication/quest-ce-que-la-technologie-lora-lorawan/ + +
+ + +Les End Nodes (nœuds) sont situés à l’extrémité du réseau, ce sont des microcontrôleurs base consommation. Ils peuvent être déployé sur le terrain pendant de nombreuses années sans aucune maintenance. Ils sont équipés d’un émetteur LoRa pour pouvoir envoyer des paquets de données à la passerelle. + +Les passerelles de LoRaWAN reçoivent les données des Ends Nodes. Les passerelles sont des transporteurs de paquets et elles permettent de faire la liaison entre les dispositifs et le réseau. Une passerelle transmet tous les paquets radio en liaison montante au serveur et inversement, sur la liaison descendante, la passerelle LoRa exécute les demandes de transmission provenant du serveur. + +Le serveur réseau reçoit les données des passerelles et les transferts au serveur d'applications. Un grand nombre de fonctionnalités doivent être implémentées sur ce serveur, comme par exemple le filtrage des paquets en liaison montante en double ou encore l'exécution des mécanismes de gestion du réseau. + +Le serveur d'applications permet d'interpréter les données reçues. C'est ce serveur qui est responsable du cryptage, du décryptage et du traitement des payloads de la couche application. De nombreuses application avec différents type de cryptage ou d'encodage peuvent être prise en compte par ce serveur afin d'assurer la sécurité des données et la qualité de la transmission. + +# Couverture réseau de LoRaWAN + +Chaque opérateur LoRaWAN dispose de son propre réseau et donc de sa propre carte de couverture. Il y a un total de 170 opérateurs dans le monde (chiffre de mai 2022) proposent un réseau LoRaWAN dans plus de 162 pays. En Belgique, le réseau est proposé par Proximus. + +![image](https://user-images.githubusercontent.com/63374771/186466575-e27ad0e2-2fdc-4754-ba5c-3300da29cdc2.png) + +Source: http://cedric.cnam.fr/~bouzefra/cours/cours_Lora.pdf + +
+ + + +# Sécurité du réseau LoRaWAN + +Une sécurité irréprochable est indispensable pour toute conception LPWAN. LoRaWAN utilise un cryptage AES 128 bits et comprend deux couches de sécurité indépendantes : une clé de session réseau (NwkSKey) et une clé de session d'application (AppSKey). + +![image](https://user-images.githubusercontent.com/63374771/186444981-5792bc03-2e4f-4ccd-8bcb-cc5240dd1b6e.png) + +Source: https://www.digikey.be/fr/articles/develop-lora-for-low-rate-long-range-iot-applications + +
+ +_Le flux de données d'un dispositif de terminaison LoRa vers l'application inclut un processus de cryptage et de décryptage au début et à la fin de la chaîne, pour que seuls le capteur du nœud d'extrémité et l'application aient accès aux données en texte brut._ + +
+ +La couche de sécurité du réseau permet de garantir l'authenticité du nœud au sein du réseau tandis que au niveau de l'application, elle garantit l'interdiction d'accès aux données d'application de l'utilisateur final par l'opérateur réseau. + +Logiquement, la clé applicative n’est connue que du fournisseur de l’application en question, évitant ainsi qu’un tiers ne puisse consulter les données. Pour sa part, la clé réseau, est communiquée par l’opérateur du réseau aux fournisseurs d’applications autorisés. + +Ces clés servent à sécuriser les données transmises par les équipements au travers du réseau mais elles sont également indispensables pour leur activation sur le réseau. + +# Activation d’un équipement LoRaWAN + +Avant de pouvoir effectuer une quelconque communication à travers un réseau LoRaWAN, les équipements doivent obtenir les clés de session, 2 méthodes d’activation sont possibles: OTAA (Over-The-Air Activation) ou APB (Activation By Personalization). + +## Activation avec la méthode OTAA + +Pour activer un équipement LoRaWAN avec cette méthode, l’équipement doit transmettre au réseau une demande d’accès ```join request```. Afin de réaliser cela, nous avons besoin de 3 paramètres: +1. Le DevEUI (id unique de l'équipement) +2. L'AppEU (id du fournisseur de l’application) +3. L'AppKey (clé AES 128 déterminée par le fournisseur de l’application) + +L'équipement envoie la requête contenant ces 3 paramètres ainsi qu’un MIC calculé avec l'AppKey. Le serveur d'enregistrement va recevoir cette requête et vérifier le MIC grâce à la clé AppKey et si le serveur accepte la requête de l'équipement, la requête ```join accept``` est transmise en réponse à ce dernier. + +Ensuite, les clés de session vont pouvoir être calculées à partir des données présentes dans la réponse du serveur. + +![image](https://user-images.githubusercontent.com/63374771/186460781-fc8c12ce-b18f-4328-a89b-d8cb49bd9f4e.png) + +Source: https://www.frugalprototype.com/technologie-lora-reseau-lorawan/ + + +A chaque nouvelle session, ces clés sont renouvelées. + +## Activation avec la méthode APB + +Avec cette méthode, les clés de session ainsi que l’adresse de l’équipement sont directement inscrits dans l’équipement LoRaWAN. De cette manière, l'envoi de requête n'est plus nécessaire avant de communiquer sur le réseau. + +Si on suit cette méthode, cela signifie que la communication a lieu sur un réseau spécifique car les clés de session sont connues d'avance. Contrairement à la méthode OTAA, ces clés sont statiques. + +## Laquelle de ces méthodes utiliser ? + +La méthode OTAA est plus sécurisé que la APB, cependant elle est plus complexe à mettre en place. + +Dans le cas d’un prototyoe ou pour une utilisation sur un réseau connu, la méthode APB est largement suffisante. + +Pour un déploiement plus conséquent, il est conseillé d'utiliser la méthode OTAA afin d'assurer plus de sécruité. + + +# Bibliographie + +1) [LoRa / LoRaWAN](https://enless-wireless.com/fr/lora/) - Nom du site: **Enless Wireless** - Auteur: **/** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +2) [LoRaWAN](https://fr.wikipedia.org/wiki/LoRaWAN) - Nom du site: **Wikipédia** - Auteur: **/** - Date de visite: **20/08/2022** - Dernière date de modification: **12/03/2022** + +3) [Internet des objets](https://fr.wikipedia.org/wiki/Internet_des_objets) - Nom du site: **Wikipédia** - Auteur: **/** - Date de visite: **20/08/2022** - Dernière date de modification: **14/06/2022** + +4) [Lora](https://www.journaldunet.fr/web-tech/dictionnaire-de-l-iot/1197635-lora-comment-fonctionne-le-reseau-iot-20220509/) - Nom du site: **JDN** - Auteur: **/** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +5) [M2M, IoT, LoRa, MQTT, …](https://www.atys-concept.com/blog-de-la-performance/articles-cybersecurite-et-reseaux/m2m-iot-lora-mqtt-comment-profiter-simplement-des-objets-connectes/) - Nom du site: **atys concept** - Auteur: **/** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +6) [LoRa et LoRaWAN](https://knowhow.distrelec.com/fr/telecommunication/quest-ce-que-la-technologie-lora-lorawan/) - Nom du site: **knowhow.distrelec** - Auteur: **Chris Rush** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +7) [LoRaWAN](https://iotindustriel.com/technologies-solutions-iiot/sans-fil/lorawan-conception-et-mise-en-oeuvre-pour-liot/) - Nom du site: **IoT Industriel** - Auteur: **Yasmine Aloui** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +8) [Développez avec LoRa pour les applications IoT bas débit, longue portée](https://www.digikey.be/fr/articles/develop-lora-for-low-rate-long-range-iot-applications) - Nom du site: **Digi-Key** - Auteur: **/** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +9) [LoRaWAN](https://www.frugalprototype.com/technologie-lora-reseau-lorawan/) - Nom du site: **Frugal Prototype** - Auteur: **Ali Benfattoum** - Date de visite: **20/08/2022** - Dernière date de modification: **/** + +10) [Cours sur le Réseau LoRaWAN](http://cedric.cnam.fr/~bouzefra/cours/cours_Lora.pdf) - Auteur: **Samia Bouzefrane** - Date de visite: **20/08/2022** + + + + From fbe550cae47ce465de7e226d5ba75ea001930ef3 Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Mon, 8 May 2023 11:51:36 +0200 Subject: [PATCH 215/241] =?UTF-8?q?Int=C3=A9gation=20des=20derniers=20arti?= =?UTF-8?q?cles=20de=202021-2022?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Divers/divers.md | 10 ++++ ...naire de paquets.md => gestion-paquets.md} | 0 index.md | 56 ++----------------- reseaux.md | 10 +++- securite.md | 14 ++++- 5 files changed, 35 insertions(+), 55 deletions(-) create mode 100644 Divers/divers.md rename Divers/{Gestionnaire de paquets.md => gestion-paquets.md} (100%) diff --git a/Divers/divers.md b/Divers/divers.md new file mode 100644 index 0000000..cf92681 --- /dev/null +++ b/Divers/divers.md @@ -0,0 +1,10 @@ +--- +layout: default +title: Divers +nav_order: 2 +has_children: true +--- +# Divers + +- [Gestionnaires de paquets](Divers/gestion-paquets.md) +- [WSL2](Divers/WSL2.md) diff --git a/Divers/Gestionnaire de paquets.md b/Divers/gestion-paquets.md similarity index 100% rename from Divers/Gestionnaire de paquets.md rename to Divers/gestion-paquets.md diff --git a/index.md b/index.md index f879485..9be1b39 100644 --- a/index.md +++ b/index.md @@ -8,54 +8,10 @@ nav_order: 1 Bienvenue sur le Wiki TI. Vous y trouverez une série de ressources et de synthèses liées au cursus TI. -Les informations sont organisées par catégorie : +Les informations sont organisées par catégorie. Chaque catégorie reprend une table des matières spécifiques à son contenu. -## Electronique et traitement du signal - -### Bases d'électricité - -### Electronique - -### Traitement du signal - -## Réseaux - -### Routage et switching - -## Protocoles transport et applicatifs - -- [Délégation DNS](Réseaux/delegation_dns.md) -- [DNSSec](Réseaux/dnssec.md) -- [HTTPS](Réseaux/https.md) -- [IAX](Réseaux/iax.md) -- [LDAP](Réseaux/ldap.md) - -## Administration réseaux - -- [Proxy](Réseaux/proxy.md) -- [Reverse Proxy](Réseaux/reverse_proxy.md) - -## Développement - -### JS et développement Web - -### Python - -### Autres langages - -## Systèmes - -### Concepts d'OS - -### Linux - -### Windows - -### Virtualisation - -### Conteneurs - -## Sécurité - -- [PGP](Sécurité/PGP.md) -- [Etude de cas : Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) +- [Electronique et traitement du signal]() +- [Développement]() +- [Réseaux](reseaux.md) +- [Sécurité](securite.md) +- [Divers](divers.md) diff --git a/reseaux.md b/reseaux.md index 1579abf..ce79364 100644 --- a/reseaux.md +++ b/reseaux.md @@ -6,7 +6,7 @@ has_children: true --- # Réseaux -Cette section regroupe tous les articles concernant le réseau : Protocoles, configuration, outils, bonnes pratiques... +Cette section regroupe tous les articles concernant le réseau : Protocoles, configuration, outils, bonnes pratiques, etc. ## Services et protocoles transport et applicatifs @@ -19,18 +19,21 @@ Cette section regroupe tous les articles concernant le réseau : Protocoles, con - [HTTPS](Réseaux/https.md) - [Le futur d'HTTP](Réseaux/futur_http.md) +- [HTTP2](Réseaux/HTTP2.md) ### Le mail - [POP](Réseaux/POP.md) +- [SPF](Réseaux/spf.md) ### La VoIP - [IAX](Réseaux/iax.md) - [Asterix](Réseaux/asterix.md) - [Comparatif SIP/H323](Réseaux/sip_vs_h323.md) +- [La visioconférence](Réseaux/visioConference.md) -### Autres +### Autres protocoles - [LDAP](Réseaux/ldap.md) - [ICMP](Réseaux/ICMP.md) @@ -39,6 +42,9 @@ Cette section regroupe tous les articles concernant le réseau : Protocoles, con - [Quic et TCP](Réseaux/quic_tcp.md) - [SMB](Réseaux/SMB.md) - [XMPP](Réseaux/XMPP.md) +- [LoRaWAN](Réseaux/LoRaWAN.md) +- [SNMP](Réseaux/snmp.md) +- [Z-Wave](Réseaux/Z-Wave.md) ## Administration réseaux diff --git a/securite.md b/securite.md index ae7f0e6..76cbbac 100644 --- a/securite.md +++ b/securite.md @@ -6,14 +6,22 @@ has_children: true --- # Sécurité +## Protocoles de sécurité - [PGP](Sécurité/PGP.md) -- [Etude de cas : Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) - [HTTPS](Sécurité/https.md) - [IPSec](Sécurité/IPsec.md) - [Protocoles VPN](Sécurité/protocoles_vpn.md) -- [Zabbix](Sécurité/zabbix.md) +- [SPF](Réseaux/spf.md) + -# Concepts liés à la sécurité dans d'autres sections : +# Dispositifs et outils - [Reverse Proxy](Réseaux/reverse_proxy.md) - [Proxy](Réseaux/proxy.md) +- [Zabbix](Sécurité/zabbix.md) +- [Détection d'intrusion](Sécurité/Systemes_de_detection_d_intrusion.md) + + +# Etudes de cas + +- [Compromission d'un serveur Ubuntu](etude_de_cas_hacking.md) From d154e4ec4dab9afe2d9bdcd99abcd7ea6353de5e Mon Sep 17 00:00:00 2001 From: Antho3004 Date: Wed, 24 May 2023 09:31:00 +0200 Subject: [PATCH 216/241] =?UTF-8?q?Synth=C3=A8se=20sur=20le=20DNS=20Filter?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "S\303\251curit\303\251/DNS Filtering.md" | 94 +++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 "S\303\251curit\303\251/DNS Filtering.md" diff --git "a/S\303\251curit\303\251/DNS Filtering.md" "b/S\303\251curit\303\251/DNS Filtering.md" new file mode 100644 index 0000000..55c1abd --- /dev/null +++ "b/S\303\251curit\303\251/DNS Filtering.md" @@ -0,0 +1,94 @@ +--- +layout: default +title: DNS Filtering +parent: Sécurité +--- +# DNS Filtering + +## Introduction + +Le DNS Filtering (ou filtrage DNS en français) est une technique utilisée pour contrôler et restreindre l'accès à Internet en fonction des noms de domaine demandés par les utilisateurs. Le DNS, qui signifie Domain Name System, est le système utilisé sur Internet pour traduire les noms de domaine en adresses IP, permettant ainsi aux utilisateurs d'accéder aux sites web en utilisant des noms conviviaux plutôt que des séries de chiffres. + +Le filtrage DNS s'appuie sur cette infrastructure pour bloquer, rediriger ou autoriser sélectivement les requêtes DNS en fonction de règles préétablies. Il peut être utilisé à différents niveaux, que ce soit au niveau de l'utilisateur individuel, du réseau domestique, de l'entreprise ou même d'un pays entier. + +## Fonctionnement du DNS Filtering [1][2][3][4][5] + +Les requêtes DNS sont dirigées vers un résolveur DNS. Certains résolveurs DNS peuvent agir comme des filtres en refusant de résoudre les requêtes pour certains domaines répertoriés dans une liste de blocage, empêchant ainsi les utilisateurs d'accéder à ces domaines. Le filtrage DNS peut également utiliser une liste d'autorisations au lieu d'une liste de blocage. + +Démontrons par un exemple pour mieux comprendre le fonctionnement du filtrage DNS : supposons qu'un employé reçoive un e-mail de phishing et clique sur un lien menant à malware-website.com. Avant que l'ordinateur de l'employé ne charge le site Web, il envoie une requête au service de résolution DNS de l'entreprise qui utilise le filtrage DNS. Si le site malveillant est présent dans la liste de blocage de l'entreprise, le résolveur DNS bloquera la demande, empêchant ainsi le chargement de malware-website.com et contrant l'attaque de phishing. + +Le filtrage DNS peut bloquer les sites Web soit par leur nom de domaine, soit par leur adresse IP : + +* Par domaine : le résolveur DNS n'effectue pas de recherche ou de résolution d'adresses IP pour certains domaines spécifiques. +* Par adresse IP : le résolveur DNS tente de résoudre les domaines pour toutes les adresses IP, mais s'il trouve une adresse IP figurant sur la liste noire, il ne la renverra pas à l'appareil qui a effectué la demande. + +## Qu'est-ce qu'une liste de blocage ? [1] + +Dans le DNS Filtering, une liste de blocage est une compilation de domaines ou d'adresses IP connus pour être nuisibles. Les fournisseurs de filtrage DNS utilisent ces listes pour empêcher l'accès à des sites dangereux. Ils peuvent se baser sur des listes partagées au sein de la communauté de la cybersécurité, créer leurs propres listes ou faire les deux. Certains filtres DNS analysent les pages Web et ajoutent automatiquement celles qui sont malveillantes à la liste de blocage. Par exemple, si un site comme example.com exécute un code JavaScript malveillant, example.com sera ajouté à la liste de blocage. + +Le filtrage DNS peut également bloquer des domaines qui ne sont pas directement liés à des logiciels malveillants ou à des attaques de phishing, mais qui hébergent du contenu interdit ou inapproprié. Par exemple, une entreprise peut décider d'ajouter des sites pour adultes à sa liste de blocage de filtrage DNS. + +En revanche, une liste blanche est une compilation de domaines ou d'adresses IP autorisés. Seuls les domaines ou adresses IP présents sur cette liste sont autorisés, tandis que tous les autres sont bloqués. + +## Utilisation du DNS Filtering [1][3][4] + +Bien que le filtrage DNS ne doive pas être la seule solution pour protéger les données de votre entreprise, il reste une mesure de sécurité très efficace. + +Il y a trois principaux cas d'utilisation du filtrage DNS. + +1. Bloquer les sites Web hébergeant des logiciels malveillants : +Les sites Web contenant des logiciels malveillants peuvent causer des dommages à votre entreprise. Une fois que les réseaux gérés par votre entreprise sont infectés par des logiciels malveillants, vous pouvez vous attendre à ce que vos opérations et votre productivité soient gravement perturbées. Le filtrage DNS est souvent la première ligne de défense contre de telles infections. +Les employés peuvent être induits en erreur ou redirigés vers des sites Web malveillants où des logiciels malveillants sont téléchargés sur leurs appareils. À partir de là, ces logiciels peuvent se propager dans toute l'infrastructure de l'entreprise et, s'ils ne sont pas contrôlés, finir par paralyser les opérations de l'entreprise. C'est pourquoi le filtrage DNS est une mesure judicieuse pour prévenir les violations de données de l'entreprise. + +2. Bloquer les sites de phishing : +Les attaques de phishing sont courantes pour compromettre l'ensemble du réseau d'une entreprise. Dans ce cas, les attaquants essaient de tromper vos employés pour qu'ils divulguent leurs informations de connexion. La protection contre le phishing est un cas d'utilisation connexe où les attaquants tentent d'escroquer les employés en les redirigeant vers un site Web qui semble légitime et qui demande un nom d'utilisateur et un mot de passe. Ces sites ressemblent souvent visuellement aux vrais sites, mais leurs noms de domaine et adresses IP sont différents. +Le filtrage DNS agit comme un filet de sécurité pour les employés qui pourraient involontairement tomber dans le piège du phishing. + +3. Bloquer l'accès aux sites Web interdits : +Vous souhaitez maximiser la productivité de votre équipe. Parfois, certains sites Web peuvent entraver cette productivité, ce qui peut avoir un impact sur votre entreprise. Vous pouvez utiliser des outils de filtrage DNS pour appliquer des politiques de contenu et de navigation sur Internet en bloquant l'accès aux adresses IP des sites Web que vous ne souhaitez pas que votre équipe visite. + +## Limitations du DNS Filtering [6] + +Le filtrage DNS présente certaines limites qui nécessitent l'utilisation d'autres méthodes complémentaires. Voici quelques exemples de ce qu'il ne peut pas faire ou de ses limitations : + +* Le filtrage DNS fonctionne de manière similaire aux logiciels antivirus traditionnels, en s'appuyant sur une base de données généralement gérée par le fournisseur de services. Cependant, cela signifie que les utilisateurs ne seront pas protégés contre les sites récemment créés qui ne sont pas encore répertoriés dans la base de données. La réactivité du fournisseur est cruciale pour assurer une protection efficace. + +* Les utilisateurs peuvent toujours accéder à des sites distrayants ou à du contenu illégal en utilisant le réseau de téléphonie mobile, contournant ainsi les filtres DNS. + +* Il est possible de contourner les filtres DNS en utilisant des mesures telles que l'utilisation d'un serveur DNS public ou d'un proxy. Ces méthodes doivent être bloquées à l'aide d'un pare-feu fiable. + +* Bloquer un grand nombre de sites Web peut agacer les travailleurs qui souhaitent effectuer des activités personnelles limitées et raisonnables pendant une pause ou un déjeuner. + +* L'utilisation du filtrage DNS sur les appareils personnels (BYOD) peut poser des problèmes lorsqu'il s'agit d'utiliser l'appareil de manière sécurisée à des fins personnelles, voire de se connecter à un réseau personnel dans certains cas. + +* Bien que les faux positifs soient rares avec le filtrage DNS moderne, ils peuvent toujours se produire. Cette limitation du filtrage DNS réside dans son blocage global au niveau du domaine. Un "faux positif" peut également indiquer une compromission du site auquel vous tentez d'accéder. Dans ce cas, il peut être difficile pour le propriétaire du site de le retirer de la liste bloquée. Si un site réputé est soudainement bloqué, il est recommandé de contacter son propriétaire pour l'en informer. + +* Les cybercriminels peuvent facilement changer de nom de domaine, créant ainsi une sorte de "course aux armements" entre les fournisseurs de filtrage et les escrocs. La plupart des cybercriminels abandonnent rapidement les sites qui ont été mis sur liste noire. + +* Le filtrage DNS n'est pas compatible avec DNSSEC, qui vise à protéger les utilisateurs contre les redirections malveillantes et les techniques de phishing utilisant ce que l'on appelle "l'empoisonnement DNS". Il est donc nécessaire de prendre en compte l'importance relative de ces deux aspects pour votre entreprise. Bien que le filtrage DNS soit plus utile pour de nombreuses entreprises, il est important de réfléchir à leur pertinence en fonction de votre secteur d'activité et du type de données traitées. + +## Filtrage DNS vs Filtrage Web [1][5] + +Il y a deux types de filtrage de contenu : le filtrage DNS et le filtrage Web. Le filtrage DNS restreint l'accès aux sites Web en se basant sur les requêtes DNS, tandis que le filtrage Web bloque l'accès à des sites Web spécifiques en fonction de leurs URL. Le filtrage DNS est souvent plus efficace que le filtrage Web, car il peut empêcher l'accès aux sites Web avant même qu'ils ne soient chargés. + +En général, les filtres DNS sont plus précis que les filtres Web. Les requêtes DNS sont souvent plus précises que les URL. Par exemple, une requête DNS pour "example.com" renverra toujours la même adresse IP. En revanche, selon votre région, l'URL example.com peut changer. De plus, votre connexion peut également influencer ces changements. + +Le filtrage Web prend généralement plus de temps que le filtrage DNS. Les requêtes DNS sont généralement résolues plus rapidement que les URL. De plus, le filtrage DNS peut entraver l'accès aux sites Web qui utilisent des connexions sécurisées (HTTPS). + +## Conclusion + +En conclusion, le DNS Filtering est une mesure de sécurité efficace pour contrôler et restreindre l'accès à Internet. Il permet de bloquer les sites malveillants, de prévenir les attaques de phishing et d'optimiser la productivité des utilisateurs. Cependant, il présente certaines limitations et doit être complété par d'autres méthodes pour renforcer la sécurité. + +## Bibliographie + +* [1] CloudFlare, [What is DNS filtering? | Secure DNS servers](https://www.cloudflare.com/learning/access-management/what-is-dns-filtering/), consultée le 23 mai 2023 + +* [2] Malwarebytes, [What is DNS filtering?](https://www.malwarebytes.com/cybersecurity/business/what-is-dns-filtering), consultée le 23 mai 2023 + +* [3] Cezarina Dinu, [What Is DNS Filtering and Why Does Your Business Need It?](https://heimdalsecurity.com/blog/dns-filtering/), version du 9 septembre 2022, consultée le 23 mai 2023 + +* [4] GoodAcces, [How DNS Filtering Can Help Secure Your Business](https://www.goodaccess.com/dns-filtering-explained-how-it-works-and-its-usage), consultée le 23 mai 2023 + +* [5] Beloslava Petrova, [What is DNS filtering? Do you need it?](https://www.cloudns.net/blog/what-is-dns-filtering-do-you-need-it/), version du 22 février 2022, consultée le 23 mai 2023 + +* [6] Paul William, [The Importance of DNS Filtering](https://www.appliedi.net/blog/the-importance-of-dns-filtering/), consultée le 23 mai 2023 \ No newline at end of file From 786065f95557164daa928b8c1431a6b7a15caf7b Mon Sep 17 00:00:00 2001 From: PFLY Date: Thu, 25 May 2023 14:15:12 +0200 Subject: [PATCH 217/241] =?UTF-8?q?Synth=C3=A8se=20DNSSEC=20(pratique)=20+?= =?UTF-8?q?=20Synth=C3=A8se=20DDoS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/DNSSEC-implementation.md" | 231 ++++++++++++++++++++++ "S\303\251curit\303\251/DDoS.md" | 160 +++++++++++++++ 2 files changed, 391 insertions(+) create mode 100644 "R\303\251seaux/DNSSEC-implementation.md" create mode 100644 "S\303\251curit\303\251/DDoS.md" diff --git "a/R\303\251seaux/DNSSEC-implementation.md" "b/R\303\251seaux/DNSSEC-implementation.md" new file mode 100644 index 0000000..dbfcc23 --- /dev/null +++ "b/R\303\251seaux/DNSSEC-implementation.md" @@ -0,0 +1,231 @@ +# Mise en œuvre pratique de DNSSEC: Implémentation (Bind9) et tests associés + récapitulatif DNS + +## Récapitulatif +### Le DNS en entreprise + +Le réseau d'une entreprise comprend généralement, le résolveur placé en interne/Trusted zone avec un SOA interne et un SOA externe placé dans la DMZ. + +Le rôle principal de résolveur placé en interne/Trusted zone est de recevoir les requêtes venant des utilisateurs et de les transmettre aux SOA approprié pour obtenir les réponses voulues. Il va interroger le SOA interne pour résoudre les noms de domaine internes, par exemple lorsque des clients envoient un requête pour le serveur web interne (ou autre), afin d'obtenir l'adresse ip qui correspond. Cela permet aux utilisateurs en interne d'accéder directement à ces services sans passer par internet et offrir du coup une meilleure performance et sécurité. +Le SOA interne permet donc de gérer les zones DNS internes, qui contiennent les infos spécifiques à l'entreprise. Il répond aux requêtes DNS internes en résolvant les noms de domaine internes et fournis les réponses adéquates. En plaçant ce serveur dans le réseau interne, ça permet de limiter l'accès aux informations sensibles et de renforcer la sécurité globale du réseau. + +Quant à lui, le SOA externe est placé en DMZ. Pour rappel la DMZ est une zone conçue pour isoler les services accessibles publiquement. +Le SOA externe gère les zones DNS publiques de l'entreprise et est utilisé pour les services accessibles depuis l'Internet. Il répond aux requêtes DNS externes provenant des clients externes. En plaçant celui-ci dans la DMZ, on réduit les menaces et vulnérabilités car les attaquants ne peuvent pas accéder directement au réseau interne de l'entreprise. + +### Les types de requêtes: +Il y'a trois types de requêtes DNS : + +1. Récursive: Globalement, quand un pc ou un résolveur effectue une requête récursive, il demande au serveur DNS de lui fournir directement la réponse complète. Cela veut dire que le serveur DNS interroge les autres serveurs DNS de manière itérative jusqu’à quand il obtient la réponse souhaitée. + +2. Itérative: la personne/pc qui fait la requête demande au serveur DNS de lui fournir la meilleure réponse qu'il possède, même si ce n'est pas la réponse complète. Si le serveur DNS ne trouve pas l'info demandée, il renverra une indication sur le serveur de noms ayant l'autorité sur le domaine. Le demandeur devra alors continuer à interroger des autres serveurs DNS pour obtenir la réponse complète. + +3. Non récursive: Généralement utilisé par les résolveurs DNS pour chercher une IP spécifique qui n'est pas présente dans leur cache. Le résolveur envoie une requête à un serveur DNS spécifique et se contente d'une seule réponse. Il ne poursuit pas le processus de requête récursive pour obtenir une réponse complète, cela permet de limiter l'utilisation de la bande passante. + +### Gestion des noms de domaine public et réservation via les registars : + +Quand une entreprise souhaite réserver un nom de domaine accessible publiquement, elle doit passer par un registar (permet de gérer et réserver des noms de domaine) autorisé par le registry du TLD (Top Level Domain) qui correspond à son choix de nom de domaine. Les registars sont très important car ils permettent la gestion des noms de domaine en facilitant la réservation et le renouvellement des noms de domaine. C'est en fait des intermédiaires entre les entreprise et les registries (Registry: base de donnée de tout les sous domaines d'un TLD). + +### Délégation de zone + +Délégation de zone : + +_"La délégation DNS est le processus par lequel un serveur DNS autorise un autre serveur DNS à effectuer des actions faisant autorité au nom de ce serveur. Cela permet une utilisation plus efficace des ressources, en particulier lorsqu'il s'agit de déploiements à grande échelle."_ (1) + +C'est un mécanisme qui permet de diviser la gestion du DNS en différentes zones responsables de sous-domaines. Quand une entreprise va réserver un nom de domaine publique, elle doit configurer la délégation de zone pour indiquer au système DNS publique comment trouver la zone correspondante à son nom de domaine. Il faut pour cela ajouter des enregistrements NS au domaine parent. +Exemple: `domaineParent.com. IN NS ns1.domaineParent.com.` + +### Menaces courantes liées au DNS et mesures de protection (DNSSEC) + +Parmi les menaces courantes liées au DNS, on retrouve: + +* Cache poisoning: + +_"le cache poisoning est une technique permettant de leurrer les afin de leur faire croire qu'ils reçoivent une réponse valide à une requête qu'ils effectuent, alors qu'elle est frauduleuse."_ (4) + +C'est en fait une attaque dans laquelle un attaquant modifie les infos stockées dans le cache du serveur DNS. L'objectif est de redirigé le trafic vers des sites Web malveillants. L'attaquant envoie des fausses réponses DNS au serveur DNS cible en les faisant passer pour des réponses légitimes provenant de serveurs DNS autoritaires. L'attaquant force donc le serveur DNS à stocker ces fausses informations dans son cache. + +* Pharming: + +Même principe que le cache poisoning, l'attaquant redirige le trafic d'un utilisateur vers un site Web malveillant en modifiant les paramètres DNS mais généralement utilisé pour voler des informations telles que les identifiants de connexion/données personnelles. + +* ID spoofing: + +Cette attaque vise à tromper un serveur DNS en modifiant l'identifiant (ID) des requêtes DNS. D'habitude, quand un client envoie une requête DNS à un serveur, celui-ci attribue un ID unique à cette requête. L'ID est utilisé pour faire correspondre les réponses aux requêtes correspondantes. +Lors d'une attaque d'ID spoofing, un attaquant essaie de prédire ou de deviner l'ID d'une requête DNS valide pour fournir une fausse réponse avant que le serveur DNS n'ait la chance de recevoir la véritable réponse. +L'objectif reste de tromper les utilisateurs et de les rediriger vers des sites Web malveillants de l'attaquant. + +* DoS: + +Attaque qui a pour but de rendre un service indisponible en submergeant le serveur DNS de requêtes. + +* Tunneling DNS: + +Méthode qui permet de contourner les firewalls en utilisant le trafic DNS pour établir des communications avec des machines infectées derrière le firewal en contournant la sécuritée. + + +Pour contrer ces menaces, des mesures de protection doivent être mises en place. Une solution efficace est l'utilisation du DNSSEC. + +## Configuration de DNSSEC dans Bind9 + +### DNSSEC c'est quoi ? + +Le DNSSEC est une sécuritée qui ajoute des mécanismes de protection supplémentaires au DNS. Il utilise des signatures pour garantir "l'intégrité et l'authenticité des données DNS". + +En utilisant DNSSEC, les entreprise peuvent renforcer la sécurité de leurs infrastructures DNS et protéger les utilisateurs contre les attaques malveillantes. C'est pourquoi je vais expliquer comment configurer DNSSEC sur bind9... + +### Configuration du DNSSEC (SOA externe) + +Voici les étapes pour configurer DNSSEC sur bind9 de manière éfficace. + +1. Avant tout, il faut activer DNSSEC dans les `options{ }` de votre fichier `named.conf.options` où `named.conf` en fonction de votre configuration: +* Ouvrir avec l'éditeur nano le fichier contenant les options de named.conf: `nano /etc/bind/named.conf.options` et insérer les lignes suivantes dans les options: +``` +dnssec-enable yes; +dnssec-validation yes; +dnssec-lookaside auto; +``` + +2. Créer une ZSK (Zone Signing Key) et une KSK (Key Signing Key): + +* ZSK: Utilisée pour signer les enregistrements de ressources dans la zone de domaine donnée, _"assurant ainsi l'intégrité des données et la validité des réponses DNS."_ (23) + +`dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com` + +KSK: signature plus puissante utilisée pour signer la ZSK + +`dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com` + +3. Le répertoire aura maintenant 4 clés - des paires privées/publiques de ZSK et KSK. Il faut maintenant ajouter les clés publiques qui contiennent l'enregistrement DNSKEY au fichier de zone. On va utiliser cette boucle: +``` +for key in `ls Kexample.com*.key` +do +echo "\$INCLUDE $key">> example.com.zone +done +``` + +4. Maintenant que les clés sont ajoutées au fichier de zone, on va signer la zone avec cette commande : + +`dnssec-signzone -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -A -N INCREMENT -o -t ` + +L'output devrait ressembler à ceci: +``` +root@ubuntu:/var/cache/bind# dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o l2-4.ephec-ti.be -t l2-4.ephec-ti.be.zone +Verifying the zone using the following algorithms: NSEC3RSASHA1. +Zone signing complete: +Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked + ZSKs: 1 active, 0 stand-by, 0 revoked +example.com.zone.signed +Signatures generated: 14 +Signatures retained: 0 +Signatures dropped: 0 +Signatures successfully verified: 0 +Signatures unsuccessfully verified: 0 +Signing time in seconds: 0.046 +Signatures per second: 298.310 +Runtime in seconds: 0.056 +``` + +5. Charger la zone signée: + +* Modifier le fichier `named.conf.local` où `named.conf` en fonction de votre configuration: + + +`nano /etc/bind/named.conf.local` + +* Changer l'option file de la zone concernée: + +``` +zone "example.com" IN { + ///// zone option ///// + file "example.com.zone.signed"; +}; +``` + +6. Redémarrer Bind9: + +`sudo systemctl restart bind9 ` + + +## Tests de DNSSEC + +Option 1: `Dig` + +`dig A example.com.` + +``` +; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> A example.com. @localhost +noadditional +dnssec +multiline +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32902 +;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5 +;; WARNING: recursion requested but not available + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags: do; udp: 4096 +;; QUESTION SECTION: +;example.com. IN A + +;; ANSWER SECTION: +example.com. 86400 IN A 93.184.216.119 +example.com. 86400 IN RRSIG A 7 2 86400 20131227171405 ( + 20131127171405 40400 example.com. + JCoL8L7As1a8CXnx1W62O94eQl6zvVQ3prtNK7BWIW9O + lir/4V+a6c+0tbt4z4lhgmb0sb+qdvqRnlI7CydaSZDb + hlrJA93fHqFqNXw084YD1gWC+M8m3ewbobiZgBUh5W66 + 1hsVjWZGvvQL+HmobuSvsF8WBMAFgJgYLg0YzBAvwHIk + 886be6vbNeAltvPl9I+tjllXkMK5dReMH40ulgKo+Cwb + xNQ+RfHhCQIwKgyvL1JGuHB125rdEQEVnMy26bDcC9R+ + qJNYj751CEUZxEEGI9cZkD44oHwDvPgF16hpNZGUdo8P + GtuH4JwP3hDIpNtGTsQrFWYWL5pUuuQRwA== ) + +;; AUTHORITY SECTION: +example.com. 86400 IN NS master.example.com. +example.com. 86400 IN NS slave.example.com. +example.com. 86400 IN RRSIG NS 7 2 86400 20131227171405 ( + 20131127171405 40400 example.com. + hEGzNvKnc3sXkiQKo9/+ylU5WSFWudbUc3PAZvFMjyRA + j7dzcVwM5oArK5eXJ8/77CxL3rfwGvi4LJzPQjw2xvDI + oVKei2GJNYekU38XUwzSMrA9hnkremX/KoT4Wd0K1NPy + giaBgyyGR+PT3jIP95Ud6J0YS3+zg60Zmr9iQPBifH3p + QrvvY3OjXWYL1FKBK9+rJcwzlsSslbmj8ndL1OBKPEX3 + psSwneMAE4PqSgbcWtGlzySdmJLKqbI1oB+d3I3bVWRJ + 4F6CpIRRCb53pqLvxWQw/NXyVefNTX8CwOb/uanCCMH8 + wTYkCS3APl/hu20Y4R5f6xyt8JZx3zkZEQ== ) + +;; Query time: 0 msec +;; SERVER: 127.0.0.1#53(127.0.0.1) +;; WHEN: Thu Nov 28 00:01:06 2013 +;; MSG SIZE rcvd: 1335 +``` + +Si le DNSSEC est fonctionnel, les RRSIG record devraient être présent dans la section `ANSWER` + +Option 2: Utiliser un site d'analyse DNS tel que [celui ci](https://dnssec-analyzer.verisignlabs.com): + +![image](https://github.com/thePFLy/spotifyDisplayer/assets/92318644/3b07e69b-1475-42a4-a4d0-62e2d7dc37dd) + +Si le DNSSEC est fonctionnel, l'analyse du site devrait afficher des RRSIG et DNSKEY validés. + +## Bibliographie +1. Ahona Rudra, [Délégation de sous-domaines](https://powerdmarc.com/fr/dmarc-subdomain-delegation/), 5 aout 2022, consulté le 23/05/2023 +2. Michael Buckbee, [Qu’est-ce que le DNS, comment fonctionne-t-il et quelles sont ses vulnérabilités ?](https://www.varonis.com/fr/blog/dns-kezako), 7 mars 2019, consulté le 23/05/2023 +3. nameShield, [DNS Cache Poisoning](https://www.nameshield.com/ressources/lexique/dns-cache-poisoning/), consulté le 24/05/2023 +4. Wikipedia, [Empoisonnement du cache DNS](https://fr.wikipedia.org/wiki/Empoisonnement_du_cache_DNS), 18 janvier 2023, consulté le 24/05/2023 +5. Praveen N, [SOA Servers Configuration and DMZ ](http://praveensreenivas.blogspot.com/2016/03/dmz-computing.html), 8 mars 2016, consulté le 23/05/2023 +6. Ahona Rudra ,[Types de DNS : Explication des types de requêtes, serveurs et enregistrements DNS](https://powerdmarc.com/fr/dns-types-queries-and-servers/amp/), il y'a 5 mois, consulté le 23/05/2023 +7. One ,[What is a registry, registrar and registrant?](https://help.one.com/hc/en-us/articles/115005588149-What-is-a-registry-registrar-and-registrant-), consulté le 23/05/2023 +8. Perrin Varin ,[Comprendre la hiérarchie des institutions Registre, Bureau d’Enregistrement (Registrar), Revendeur (Reseller) et Registrant. ](https://blog.netim.com/fr/news-netim/comprendre-la-hierarchie-des-institutions-registre-bureau-denregistrement-registrar-revendeur-reseller-et-registrant-1414/), 16 juillet 2019, consulté le 23/05/2023 +9. Mathieu ,[La délégation NS d'un sous-domaine, cet illustre inconnu](https://uname.pingveno.net/blog/index.php/post/2019/03/02/La-d%C3%A9l%C3%A9gation-NS-d-un-sous-domaine%2C-cet-illustre-inconnu), 5 mars 2019, consulté le 23/05/2023 +10. Romain Guichard, [Délégation d'une zone DNS](http://blog.vsense.fr/delegation-dune-zone-dns.html), 4 mars 2013, consulté le 23/05/2023 +11. Kaspersky, [Qu’est-ce que le pharming et comment l’éviter ?](https://www.kaspersky.fr/resource-center/definitions/pharming), consulté le 24/05/2023 +12. Wikipedia ,[Pharming](https://fr.wikipedia.org/wiki/Pharming), 1 mars 2023,consulté le 24/05/2023 +13. Inet, [Le DNS ID spoofing](https://www.inetdoc.net/guides/tutoriel-secu/tutoriel.securite.attaquesprotocoles.dns.html), , consulté le 24/05/2023 +14. Erez Hasson ,[DNS Spoofing](https://www.imperva.com/learn/application-security/dns-spoofing/), 2 mai 2023, consulté le 24/05/2023 +15. Wikipedia ,[DNS spoofing](https://en.wikipedia.org/wiki/DNS_spoofing), 13 avril 2023, consulté le 24/05/2023 +16. Michael Buckbee, [Qu’est-ce que le DNS Tunneling ? Guide de détection](https://www.varonis.com/fr/blog/quest-ce-que-le-dns-tunneling-guide-de-detection), 6 avril 2023, consulté le 24/05/2023 +17. Jaromil ,[Qu’est-ce que le DNS Tunneling ? Guide Complet](https://www.ambient-it.net/dns-tunneling-implementation/), 11 janvier 2023, consulté le 24/05/2023 +18. Icann, [DNSSEC – Qu'est-ce que c'est et pourquoi est-ce important ?](https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-20-fr), consulté le 23/05/2023 +19. Wikipedia, [Domain Name System Security Extensions](https://fr.wikipedia.org/wiki/Domain_Name_System_Security_Extensions), 8 juillet 2022, consulté le 23/05/2023 +20. CloudFlare ,[Comment fonctionne DNSSEC](https://www.cloudflare.com/fr-fr/dns/dnssec/how-dnssec-works/), consulté le 24/05/2023 +21. Jesin A,[How To Setup DNSSEC on an Authoritative BIND DNS Server](https://www.digitalocean.com/community/tutorials/how-to-setup-dnssec-on-an-authoritative-bind-dns-server-2), 19 mars 2014, consulté le 24/05/2023 +22. Klinsmann Öteyo,[How To Secure BIND DNS Server With DNSSec Keys](https://computingforgeeks.com/secure-bind-dns-server-with-dnssec-keys/), 22 octobre 2022, consulté le 24/05/2023 +23. Computer Security Resource Center ,[Zone Signing Key (ZSK)](https://csrc.nist.gov/glossary/term/zone_signing_key), consulté le 24/02/2023 \ No newline at end of file diff --git "a/S\303\251curit\303\251/DDoS.md" "b/S\303\251curit\303\251/DDoS.md" new file mode 100644 index 0000000..38bf0f9 --- /dev/null +++ "b/S\303\251curit\303\251/DDoS.md" @@ -0,0 +1,160 @@ +# Attaques par déni de service distribué (DDoS) et protection + +## C'est quoi une attaque DDoS +### Qu'est ce que c'est ? +Une attaque DDoS c'est une cyberattaque qui a pour objectf de rendre un site web ou un service indisponible en envoyant énormément de trafic sur celui-ci. Cela surcharge les ressources du système et le rend inaccessible aux utilisateurs. + +Le but d'une attaque DDoS est donc de perturber les services et de rendre un site ou un service inutilisable en envoyant une énorme quantité de demandes simultanées au service. Une possibilitée est d'utiliser plusieurs ordinateurs hacké par l'attaquant qui agissent ensemble. +Les attaquants envoient en fait une grande quantité de trafic/données falsifié à partir de différentes sources pour saturer le site ou le service qui est ciblé. + +![DDoS example](https://images.frandroid.com/wp-content/uploads/2023/03/attaque-ddos-1200x675.jpg) + +### Plus en détail +Ces attaques ont pour cible les infrastructures informatiques vulnérables et surchargent les serveurs et réseaux avec un trafic très élevé. Elles peuvent avoir différents formes comme les attaques volumétriques, qui innondent la cible avec un haut débit de données ou des attaques "d'épuisdement des ressources", qui visent à consommer toutes les ressources disponibles du système (CPU, upload...), ou encore des attaques sur des applications qui vont dans ce cas exploiter les failles spécifiques d'une app web. + +![Surcharge trafic](https://cf-assets.www.cloudflare.com/slt3lc6tev37/7xwaGxGINeyxavVbrXO6M1/24f139faac6094044adaa84c82394962/ddos_attack_traffic_metaphor.png) + +Pour mener une attaque DDoS, les attaquants utilisent souvent des botnets, c'est des réseaux d'ordinateurs infectés/hack qui sont contrôlés à distance. +Ces ordinateurs souvent obtenus par l'aide de logiciels malveillants, agissent sous le contrôle de l'attaquant sans que leur propriétaire ne s'en rende forcément compte. Les botnets permettent aux attaquants de mettre en place de manière coordonnée les attaques à grande échelle, ce qui donne plus de mal à la cible de détecter et contrer l'attaque + +Les mesures de protection contre les attaques DDoS demandent en général l'utilisation d'un pare-feu, un systèmes qui va détecter les intrus (système d'intrusion), des filtres de trafic... +Les fournisseurs de services Internet (alias FSI) et les hébergeurs peuvent aussi mettre en place des protections au niveau du réseau pour détecter et bloquer le trafic malveillant. + +En conclusion, une attaque DDoS est une cyberattaque qui vise à rendre un site web ou un service online indisponible en noyant ses ressources avec un trafic excessif qui vient de plusieurs ordinateurs infectés. Ces attaques exploitent les vulnérabilités de systèmes et elles peuvent causer des problèmes importants. La protection contre le DDoS nécessite des mesures de sécurité assez élevé pour garantir la disponibilité des services. + + + +### Objectif & conséquences +Les attaques DDoS peuvent avoir des conséquences négatives pour les organisations ciblées par l'attaquant. Ce que je veux dire par là c'est que les entreprises peuvent avoir des pertes de revenus, des atteinte à la réputation car si une entreprise de sécurité est DDoS elle serait directement moins bien vue que les autres tandis qu'un entreprise qui va résister à une attaque DDoS sera alors mise en avant, une perturbation des ventes qui frustrait les utilisateurs. Elles peuvent être lancées par des individus malveillants, des groupes organisés ou des organisations criminelles. + +Les attaques DDoS peuvent être utilisées à différentes fins, voici quelques raisons possibles d'une attaque DDoS: + +* La concurrence: +Un attaquant peut DDoS pour se débarrasser de la concurrence, c'est donc dû à des raisons financières. En mettant en œuvre une attaque DDoS, il empêche le site Web des concurrents de faire des affaires. +Une entreprise peut aussi se servir d’une attaque DDoS pour diminuer grandement l’activité d’une entreprise ou un magasin concurrent, et le couler financièrement. + +* Raisons politiques: +Cela peut être peut-être parce que l’attaquant n’aime pas une organisation politique et veut endommager son serveur. +On retrouve aussi les attaques DDoS dans des actions politiques. Les "hacktivistes" peuvent utiliser l’attaque DDoS pour "punir" à leur manière un service d’état ou couper la communication d’un groupe adverse. +Enfin, certains pays utilisent l’attaque DDoS pour contraindre les services d’un autre pays, et donc de cette manière déstabiliser l’action du gouvernement qui est ciblé. +Aux tout début de la guerre en Ukraine, la Russie a été accusée d’avoir lancé beaucoup d'attaques DDoS contre les services administratifs et bancaires ukrainiens.(21) + +* Chantage financier: +Un chantage financier peut être lancé par une organisation criminelle contre la promesse de ne pas paralyser des services d'une entreprise ou autre. + +* Leurre: +L’attaque DDoS sert parfois de leurre à une autre attaque, comme p.ex l’installation d’un ransomware/malware ou le vol de données privées. + +* Amusement: +Il se peut aussi qu’un attaquant le fasse parce qu’il le trouve drôle ou alors c'est simplement une façon de faire passer le temps. + + +## Techniques + +Avant de comprendre comment les différentes attaques DDoS fonctionnent, il faut savoir comment la connexion réseau est établie. +Le modèle OSI, ci-dessous, _"est un cadre conceptuel utilisé pour décrire la connectivité réseau en sept couches distinctes."_ (4) + +![OSI](https://cf-assets.www.cloudflare.com/slt3lc6tev37/6ZH2Etm3LlFHTgmkjLmkxp/59ff240fb3ebdc7794ffaa6e1d69b7c2/osi_model_7_layers.png) + + +Les attaques DDoS sont devenues plus sophistiquées au fil du temps, en utilisant des techniques comme l'amplification du trafic, l'utilisation de botnets, etc... + +### Attaques sur la couche d'application +Objectif de l'attaque : + +Parfois appelées attaques DDoS couche 7, ces attaques ont pour but d'épuiser les ressources de la cible pour créer un déni de service. + +Les attaques visent la couche où les pages Web sont créees sur le serveur et données en réponse aux requêtes HTTP. +Une requête HTTP ne coûte pas cher à exécuter du côté client, mais elle peut être cher pour le serveur cible qui pour y répondre doit souvent charger plusieurs fichiers et exécuter des requêtes de base de données afin de créer la page web. + +Ca n'est pas simple de se défendre contre les attaques visant la couche 7 car il peut être compliqué de différencier le trafic malveillant du trafic habituel. + +![Http flood](https://cf-assets.www.cloudflare.com/slt3lc6tev37/3jlyZeWRy9eBz3tyEk9mxA/96eab064524495e8f6b2647f1f7b9d60/application_layer_ddos_example.png) + +Exemple: +* HTTP flood: +Cette attaque est un peu comme si on actualiserait sans cesse un naviguateur web sur un grand nombre d'ordinateur à la fois. Cela donne lieu à un grand nombre de requête et submerge le serveur ce qui provoque un DDOS. + +Les mises en œuvre les plus simples peuvent accéder à une URL avec la même plage d'adresses IP, de référents et d'agents utilisateurs malveillants. Les versions plus compliquées peuvent utiliser énormément d'adresses IP malveillantes et cibler des URL random. + +### Attaques protocolaires +Les attaques protocolaires exploitent des faiblesses des couches 3 et 4 pour rendre la cible inaccessible. +Aussi appelées "attaques par épuisement des tables d'état", elles créent une interruption de services en consommant trop de ressources des serveurs ou les ressources comme le pare-feu. + +![SYN FLOOD](https://cf-assets.www.cloudflare.com/slt3lc6tev37/38KdcqNuv0l0jF4ohUI7bj/44a3f60c5352984258f72a1e69e1bbdd/syn_flood_ddos_example.png) +Exemple: +* SYN flood: +_"Dans le cas d'une attaque SYN Flood la situation est comparable à celle d'un employé qui travaille dans la réserve et qui reçoit les demandes du comptoir du magasin. +L'employé reçoit une demande, va chercher le paquet et attend une confirmation avant de le transmettre au comptoir. Il reçoit ensuite de nombreuses autres demandes de colis sans confirmation jusqu'à ce qu'il ne puisse plus transporter aucun colis, qu'il soit débordé et que les demandes commencent à rester sans réponse."_ (4) +Elle permet l'envoie à une cible d'un grand nombre de paquet SYN de requête d'initialisation de connexion TCP avec des IP sources illégales. La machine ciblée va alors répondre à chaques demande de connexion et ensuite attendre la dernière étape qui n'a jamais lieu à cause du grand nombre de demande d'initialisation. + +### Attaques volumétriques +Les attaques volumétriques utilisent des botnets qui sont créés à partir de plusieurs systèmes infecté par des malwares. Ils sont donc contrôlé par un attaquant et des bots sont utilisés pour DDoS la cible avec un trafic qui sature toute la bande passante disponnible. +![Aplification DNS](https://cf-assets.www.cloudflare.com/slt3lc6tev37/1FIBEeoyzoa64lVGlWKaRV/3b878bb03df1729b48cd3f667cdfe3de/amplification_ddos_example.png) + + + +## Mécanismes de protection contre les attaques DDoS +Il est important de mettre en place des mesures/mécanismes de protection contre les attaques DDoS pour prévenir ces problèmes. +Cela inclut la configuration correcte des infrastructures réseau, la surveillance du trafic, l'utilisation de pare-feu et de systèmes de filtrage du trafic. + +Filtrage du trafic : +Le filtrage du trafic est une technique souvent utilisée pour détecter et bloquer les attaques DDoS. Il consiste à analyser le flux de données entrant et filtrer les paquets en fonction de critères défini par l'entreprise. +Les filtres peuvent être basés sur des adresses IP, des protocoles ou même des ports. Les solutions de filtrage du trafic peuvent être mis en place au niveau du réseau, des serveurs ou des dispositifs de protection DDoS montés par l'entreprise si besoin. Les black lists et white lists sont aussi utilisées pour autoriser ou bloquer certaines adresses IP ou plages d'IP en fonction de leur réputation. + +Limitation de bande passante : +La limitation de bande passante permet de contrôler la quantité de trafic permis sur un réseau ou un système. Cette technique permet de réduire l'impact des attaques DDoS en limitant la bande passante allouée à certains types de trafic comme par exemple les requêtes qui proviennent de sources suspectes ou les trop grosses requêtes. + +Pare-feu : +Les pare-feu jouent un grand rôle dans la protection contre les attaques DDoS car ils surveillent et contrôlent le flux de trafic entre les réseaux. +Ils peuvent eux aussi être configurés pour bloquer les connexions suspectes ou les requêtes excessives liées aux attaques DDoS. Les pare-feu utilisent des "règles de filtrage "pour autoriser/bloquer le trafic en fonction de critères (adresses IP source, ports, protocoles ou motifs de trafic). + +Équilibrage de charge : +C'est une technique pour répartir la charge du trafic sur plusieurs serveurs. En répartissant équitablement les requêtes entrantes, ca réduit la vulnérabilité d'un serveur seul face à une attaque DDoS. + +Distribution géographique des serveurs : +"La distribution géographique des serveurs" consiste à déployer des serveurs dans différentes régions géographiques. En répartissant les serveurs dans des endroits différents, les attaques DDoS qui ciblent un seul emplacement ont moins de chance de réussir. De plus, cette approche permet de réduire la latence pour les utilisateurs éloignés (Cours théorique Dev3). + +## Exemples réels + +Les attaques DDoS ont eu un impact sur de nombreuses organisations ou entreprises et services en ligne. Quelques exemples concret d'attaques DDoS et les mesures de protection qui ont été mises en place : + +* Attaque DDoS contre GitHub (en 2018) : + GitHub a subis une technique d'amplification basée sur le protocole Memcached pour générer un trafic massif vers les serveurs de GitHub. + L'attaque a atteint un pic de 1,35 térabits par seconde (Tbps), ce qui a rendu les services de GitHub indisponibles pendant plusieurs minutes. Même si ca peut parraître minime, plusieurs minutes multiplié par le nombre d'utilisateurs c'est finalement assez énorme. + Pour se défendre contre cette attaque, GitHub a rapidement réagi en mettant en place un système de filtre du trafic et en travaillant en collaboration avec les fournisseurs de services Internet pour filtrer le trafic malveillant. Ils ont aussi mis en place une surveillance continue pour détecter et diminuer grandement les futures attaques. + +* Attaque DDoS contre Dyn DNS (en 2016) : + Cette attaque a ciblé les serveurs DNS de Dyn qui est un important fournisseur de services DNS et a perturbé l'accès à de nombreux sites Web connus tels que Twitter, Reddit et Netflix. L'attaque a été réalisée en exploitant des milliers d'appareils IoT mal sécurisés, tels que des caméras de surveillance, pour inonder les serveurs DNS de requêtes. Les mesures de protection mises en place après cette attaque par Dyn ont inclus: + l'amélioration de la sécurité des appareils IoT et la mise en place de mécanismes de détection des flux de trafic anormaux et l"a diversification des infrastructures DNS pour réduire l'impact potentiel d'attaques futures." + +Ces exemples d'attaques DDoS mettent en avant l'importance de la réactivité et la miste en place de protection solide contre les attaques extérieures. + +## Conclusion +En conclusion, les attaques DDoS représentent une menace pour les organisations/entreprises et les services en ligne. Il est très important de mettre en place des mécanismes de protection fonctionnels et robustes (section "Mécanismes de protection contre les attaques DDoS" ci dessus). +De plus, la préparation est un aspects clé pour contrer les attaques DDoS. + +Je pense pour ma part qu'il est important de rester à jour avec les dernières techniques d'attaque et de défense contre les attaques DDoS car les attaquants malveillant continuent d'évoluer leurs stratégies. + +## Bibliographie +1. Akamai ,[ Qu'est-ce qu'une attaque DDoS ? ](https://www.akamai.com/fr/glossary/what-is-ddos), consulté le 24/05/2023 +2. Kaspersky ,[Qu'est-ce qu'une attaque DDoS ?](https://www.kaspersky.fr/resource-center/threats/ddos-attacks), consulté le 24/05/2023 +3. Mathilde Saliou ,[C'est quoi, une attaque collective par saturation de service ?](https://www.numerama.com/cyberguerre/1099384-quest-ce-quune-attaque-ddos.html), 25 septembre 2022, consulté le 24/05/2023 +4. Cloudfare ,[Comment fonctionne une attaque DDoS](https://www.cloudflare.com/fr-fr/learning/ddos/what-is-a-ddos-attack/), consulté le 25/05/2023 +5. One ,[Qu’est-ce que le DDoS ?](https://www.one.com/fr/securite-de-site-web/qu-est-ceque-attaques-force-brute-ddos), consulté le 24/05/2023 +6. Frandroid ,[Qu’est-ce qu’une attaque DDoS ?](https://www.frandroid.com/culture-tech/securite-applications/1628765_quest-ce-quune-attaque-ddos), 22 mai 2023, consulté le 24/05/2023 +7. Combell ,[Qu’est-ce qu’une attaque DDoS, et comment puis-je m’en protéger ?](https://www.combell.com/fr/blog/comment-proteger-votre-site-web-contre-les-attaques-ddos/), 12 mai 2021, consulté le 24/05/2023 +8. ANSSI ,[Comprendre et anticiper les attaques DDoS](https://www.ssi.gouv.fr/uploads/2015/03/NP_Guide_DDoS.pdf), consulté le 24/05/2023 +9. Christophe Auberger ,[Comment se protéger des attaques DDoS](https://www.journaldunet.com/solutions/dsi/1150228-comment-se-proteger-des-attaques-ddos/), 17 février 2015, consulté le 24/05/2023 +10. Ahona Rudra ,[Mesures à prendre pour prévenir les attaques DDoS](https://powerdmarc.com/fr/steps-to-prevent-ddos-attacks/), 29 septembre 2022, consulté le 24/05/2023 +11. AfricaCyberMag ,[Comprendre et se protéger des DDoS](https://cybersecuritymag.africa/index.php/comprendre-et-se-proteger-des-ddos), 21 avril 2023, consulté le 24/05/2023 +12. Cloudflare ,[Famous DDoS attacks | The largest DDoS attacks of all time](https://www.cloudflare.com/learning/ddos/famous-ddos-attacks/), consulté le 25/05/2023 +13. Lily Hay Newman ,[GitHub Survived the Biggest DDoS Attack Ever Recorded](https://www.wired.com/story/github-ddos-memcached/), 1 mars 2018, consulté le 25/05/2023 +14. Wikipedia ,[Cyberattaque de 2016 contre Dyn](https://fr.wikipedia.org/wiki/Cyberattaque_de_2016_contre_Dyn), 25 mai 2022, consulté le 25/05/2023 +15. Jérôme Cartegini ,[GitHub subit une attaque DDoS massive sans précédent](https://www.lesnumeriques.com/informatique/github-subit-attaque-ddos-massive-sans-precedent-n72155.html), 6 mars 2018, consulté le 25/05/2023 +16. Fabrice Clerc ,[Retour sur l’attaque DDoS contre DYN DNS](http://www.mtom-mag.com/article2905.html), octobre 2016, consulté le 25/05/2023 +17. Jean Elyan ,[10 choses à savoir sur les attaques DDoS massives contre Dyn](https://www.lemondeinformatique.fr/actualites/lire-10-choses-a-savoir-sur-les-attaques-ddos-massives-contre-dyn-66325.html), 25 octobre 2016, consulté le 25/05/2023 +18. Wikipedia ,[Cloudflare](https://fr.wikipedia.org/wiki/Cloudflare), 16 septembre 2022, consulté le 25/05/2023 +19. DataNews ,[Cloudflare enregistre le plus grande attaque DDoS à ce jour](https://datanews.levif.be/actualite/cloudflare-enregistre-le-plus-grande-attaque-ddos-a-ce-jour/), 14 février 2022, consulté le 25/05/2023 +20. OVH ,[ Qu’est-ce qu’une attaque DDoS ? ](https://www.ovhcloud.com/fr/security/anti-ddos/ddos-definition/), consulté le 25/05/2023 +21. Steve Holland , [ Russia responsible for cyberattack against Ukrainian banks](https://www.reuters.com/world/us-says-russia-was-responsible-cyberattack-against-ukrainian-banks-2022-02-18/), 18 février 2022, consulté le 25/05/20223 \ No newline at end of file From 369750a0c3f81f71c6d95311d7dceadb3c93b66d Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Thu, 25 May 2023 16:53:19 +0200 Subject: [PATCH 218/241] Create SSH Implementing a new article of ssh --- "S\303\251curit\303\251/SSH" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "S\303\251curit\303\251/SSH" diff --git "a/S\303\251curit\303\251/SSH" "b/S\303\251curit\303\251/SSH" new file mode 100644 index 0000000..8b13789 --- /dev/null +++ "b/S\303\251curit\303\251/SSH" @@ -0,0 +1 @@ + From d63f2855017a91c977f3542be32ec41b9db2ea61 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Thu, 25 May 2023 16:54:37 +0200 Subject: [PATCH 219/241] Rename SSH to SSH.md --- "S\303\251curit\303\251/SSH" => "S\303\251curit\303\251/SSH.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "S\303\251curit\303\251/SSH" => "S\303\251curit\303\251/SSH.md" (100%) diff --git "a/S\303\251curit\303\251/SSH" "b/S\303\251curit\303\251/SSH.md" similarity index 100% rename from "S\303\251curit\303\251/SSH" rename to "S\303\251curit\303\251/SSH.md" From 0ba71803e3d3e52e250b13d547c06043a065f10d Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Thu, 25 May 2023 18:29:31 +0200 Subject: [PATCH 220/241] Update SSH.md --- "S\303\251curit\303\251/SSH.md" | 86 +++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index 8b13789..fd7080b 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -1 +1,87 @@ +--- +layout: default +title: SSH +parent: Sécurité +--- +# Article sur SSH +![download](https://github.com/HaAymar/Wiki-TI/assets/71372488/d67e13d1-c6d2-4202-958a-9b9b8283d461) + +## SSH c'est quoi +SSH (Secure Shell) : Protocole de communication sécurisé nécessitant un échange de clés de chiffrement en début de connexion pour assurer une communication protégée entre un client et un serveur distant. Il permet l'authentification sécurisée de l'utilisateur, le chiffrement des données transmises et l'exécution de commandes à distance. Le SSH est largement utilisé pour l'accès distant à des systèmes informatiques, offrant une connexion fiable et sécurisée pour des tâches telles que l'administration système, le transfert de fichiers et le tunneling de ports. + +## Protocoles SSH +Il existe 2 principales protocole SSH: +- SSH1 +- SSH2 + +### Difference entre SSH1 et SSH2 +- SSH1 : C'est la première version du protocole SSH qui a été développée. Elle utilise principalement l'algorithme de chiffrement asymétrique RSA pour l'authentification et le chiffrement des données. Cependant, SSH1 a été largement remplacé par SSH2 en raison de problèmes de sécurité et de vulnérabilités connues. Il est recommandé d'éviter d'utiliser SSH1 et de privilégier SSH2. +- SSH2 : C'est la version actuelle et largement utilisée du protocole SSH. Elle offre des améliorations significatives en termes de sécurité, de performances et de fonctionnalités. + +### Fonction principale +- Authentification sécurisée +- Chiffrement des données +- Transfert de fichiers sécurisé +- Exécution de commandes à distance + +## Utilisation du Sécure Shell +Le Secure Shell (SSH) est couramment utilisé pour accéder de manière sécurisée à des systèmes distants et exécuter des commandes à distance. +L'utilisation de SSH peut se faire avec un logiciel PuTTY ou sur le terminal macOs ou linux + +### PuTTY +![011500xnlg6t64fqgeggzz](https://github.com/HaAymar/Wiki-TI/assets/71372488/a37d7438-c048-4b4a-b085-317d4cf2ee23) + +PuTTY est un client SSH gratuit et open-source largement utilisé pour se connecter à des serveurs distants en utilisant le protocole SSH. Il est principalement utilisé sur les systèmes Windows, mais il existe également des versions disponibles pour d'autres plateformes. + +Utilisation de PuTTY s'effectue apres le telechargement de celui-ci [ici](https://www.putty.org/), apres il faudra selectionneé le protocole SSH, par defaut celui-ci est defini sur le port 22. +Pour plus d'information vous pouvez consulter ce site en [cliquant ici](https://www.hostinger.fr/tutoriels/connexion-ssh-windows-putty) + +![connect-config 399589842237e1bd21e24efe4d8052b5a5a77440462e3ab2f51a4c5019b74f19](https://github.com/HaAymar/Wiki-TI/assets/71372488/e1ffa45e-1abd-4610-bcfb-95f1a2fb9df6) + +### Utilisation sur le terminal (Linux et MacOs) +Apres avoir ouvert le terminal, il existe plusieur commandes à effectuer pour se connecter en mode SSH : +- Connection SSH: + ``` + ssh username@hostname +``` + En fonction de la configuration du serveur distant, vous devrez vous authentifier. Vous pouvez utiliser un mot de passe ou une clé SSH. Si vous utilisez une clé SSH, votre clé publique devra se trouver dans le fichier `~/.ssh/authorized_keys` + +### Comment se connecter avec la clé SSH +![61c1b963247368113bbeef17_Secure Shell work](https://github.com/HaAymar/Wiki-TI/assets/71372488/bf0ed866-8e78-43eb-ad93-4301dffc07b2) + +Pour se connecter avec la clé ssh sur le serveur distant il faut creer la clé publique en suivant ces etapes: +- Creation d'une nouvelle clé sur le terminale: + ``` +ssh-keygen -t rsa +``` +En suite on suit les étapes en creant le passphrase par défaut le fichier pour la clé privé et publique doit se trouvé dans les fichiers. +Pour la clé privé + ``` +.ssh/id_rsa +``` +Pour la clé publique + ``` +.ssh/id_rsa.pub +``` +Enfin il faut copier cette clé publique dans le serveur distant. + +## Les avantages pour l'utilisations de SSH +- Protection contre les attaques par force brute : SSH intègre des mécanismes de protection contre les attaques par force brute, ce qui signifie que si un attaquant essaie de deviner le mot de passe, le serveur SSH peut limiter le nombre de tentatives de connexion et bloquer automatiquement l'adresse IP source. + +- Tunneling sécurisé : SSH permet la création de tunnels sécurisés, ce qui signifie que le trafic réseau entre le client et le serveur peut être acheminé à travers un canal chiffré. Cela est particulièrement utile lorsque vous devez accéder à des services distants (tels que des bases de données) via des réseaux non sécurisés. + +- Administration à distance : SSH facilite l'administration à distance des serveurs. Vous pouvez vous connecter à un serveur distant via SSH et exécuter des commandes, modifier des fichiers de configuration, gérer des utilisateurs, etc. Cela permet aux administrateurs système de gérer leurs systèmes à distance de manière sécurisée. + +- Portabilité : SSH est un protocole standard et est largement pris en charge sur différentes plateformes, y compris Linux, macOS et Windows. Cela signifie que vous pouvez utiliser SSH pour vous connecter à des serveurs distants depuis différentes machines, indépendamment du système d'exploitation utilisé. + +## Bibliographie +1. https://www.hostinger.fr/tutoriels/connexion-ssh-windows-putty +2. https://docs.digitalocean.com/products/droplets/how-to/connect-with-ssh/putty/ +3. https://www.ibm.com/docs/fr/sia?topic=kbaula-enabling-rsa-key-based-authentication-unix-linux-operating-systems-2 +4. https://www.putty.org/ +5. https://www.paessler.com/it-explained/ssh +6. https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/ + + + From 94d0fdb5538cba0782a50c50f33626510b196a01 Mon Sep 17 00:00:00 2001 From: zCargan <64102236+zCargan@users.noreply.github.com> Date: Thu, 25 May 2023 22:28:04 +0200 Subject: [PATCH 221/241] root-servers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit synthèses sur les root-servers - Carlier Logan --- "R\303\251seaux/dns.txt" | 156 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 "R\303\251seaux/dns.txt" diff --git "a/R\303\251seaux/dns.txt" "b/R\303\251seaux/dns.txt" new file mode 100644 index 0000000..d997f98 --- /dev/null +++ "b/R\303\251seaux/dns.txt" @@ -0,0 +1,156 @@ +--- +layout: default +title: roots servers +parent: Réseaux +--- + + +# Introduction : + +Dès que l'on recherche un élément en ligne, que l'on communique avec un service en ligne, le serveur racine (du DNS) joue un rôle important dans la résolution de nom. Comment, sur base d'une adresse IP, il est possible d'arriver sur Google, Youtube ou encore Facebook? + +## Histoire : + +Avant le DNS, la résolution de nom sur internet se faisait grâce à un fichier texte que l'on recopiait sur les ordinateurs, par transfert de fichier. + +Ce fichier portait le nom de: HOSTS.TXT(5). + +En 1982, ce système montre ses premières limites, et plusieurs propositions de remplacements voient le jour. Les premières idées ne sont pas gardées. Un certain Paul Mockapetris(6) fut désigné responsable quand au développement d'un autre système de résolution de nom. +Il est responsable du DNS, une architecture qu'il proposera en 1983 dans les RFC 882 et RFC 883. + +Ce dernier est également l'inventeur du premier serveur de courrier électionnique basé sur le protocole SMTP. + +## Explications des root-servers + +Afin de nous rendre sur nos sites web préférés, nous utilisons la résolution de noms DNS, qui passe par les serveurs racines (roots-servers). + +Un serveur racine est un élément primordiale pour la résolution de nom. Il répond aux requêtes ou demandes des clients dans la zone racine du DNS (Cette zone marque le niveau le plus élevé, au premier niveau de l'espace de nom DNS). +Ces derniers n'exécutent pas eux même la résolution de nom, mais informent à la place le client des autres serveurs DNS à consulter de manière plus précis afin d'obtenir une meilleure réponse. (1) + +Cependant, afin de pouvoir aller interroger un serveur racine, il faut également posséder des informations à son propos. Quels est l'adresse IP du serveur racine responsable de la zone que je cherche à joindre? +Pour ce faire, il existe un fichier, appelé "fichier de zone racine", qui contient tout les noms et toutes les adresses IP des domaines de premier niveau. +Ce fichier est téléchargé lors de l'installation d'un client DNS, comme Bind9 par exemple. +Ce dernier se trouve dans le repertoire /etc/bind, sous le nom de db.root. (2) + +La gestion de base du serveur racine est à la responsabilité de l'ICANN (Internet Corporation for Assigned Names and Numbers). + +Il n'y a plus, contrairement à la croyance populaire, uniquement 13 serveurs racine uniques du DNS . +En effet, nous devons plutôt parler de 13 "identitées de serveur". Ces "identitées", ayant chacunes une adresse IP, sont souvent considérées comme des serveurs racines. + +Lettre des serveurs racine du DNS | Adresse IPv4 | Adresse IPv6 | Opérateurs +--- | ------------- | ---------- | -------------- +A | 198.41.0.4 | 2001:503:ba3e::2:30 | VeriSign | +B | 192.228.79.201 | 2001:478:65::53 | USC-ISI | +C | 192.33.4.12 | 2001:500:2::c | Cogent Communications | +D | 199.7.91.13 | 2001:500:2d::d | University of Maryland | +E | 192.203.230.10 | | NASA | +F | 192.5.5.241 | 2001:500:2f::f | ISC | +G | 192.112.36.4 | | U.S. DoD NIC | +H | 128.63.2.53 | 2001:500:1::803f:235 | US Army Research Lab | +I | 192.36.148.17 | 2001:7FE::53 | Autonomica | +J | 192.58.128.30 | 2001:503:c27::2:30 | VeriSign | +K | 193.0.14.129 | 2001:7fd::1 | RIPE NCC | +L | 199.7.83.42 | 2001:500:3::42 | ICANN | +M | 202.12.27.33 | 2001:dc3::35 | WIDE Project | + +(4) + +Lors d'une tentative de résolution de nom, on va tout d'abord interroger un serveur racine, afin d'obtenir plus d'informations sur le domaine de premier niveau (TLD, Top Level Domain). + +Par la suite, grâce à la réponse du TLD, nous allons interroger le SOA de la zone recherchée, afin d'obtenir l'IP recherchée. (1) + +C'est de cette manière que nous parvenons à accéder aux contenus de certains sites. Sans le fichier db.root, toute la résolution de nom du DNS global ne marcherait pas. Les serveurs DNS racines sont les piliers du DNS. + +## Attaques sur les serveurs racines : + +Il y a déja eu, durant son histoire, de nombreuses attaques sur les serveurs racines. Etant la base de la résolution de nom, si le service tombe en panne, c'est tout internet qui tombe en panne. (4) + +### Attaque de 2002 : + +Lors de cette attaque, 7 serveurs sur les 13 ont été touchés, et on vu leurs performances dégradées à cause de cette dernière. Les auteurs de cette attaque l'ont effectués à l'aide d'un DDoS. Ils ont réussis à générer un volume de requêtes 40x supérieurs à la normal. +Suite à cette attaque, le systeme anycast a été mis en place : + +"Anycast est une technique d'adressage et de routage permettant de rediriger les données vers le serveur informatique le « plus proche » ou le « plus efficace » selon la politique de routage." +[source](https://fr.wikipedia.org/wiki/Anycast). + +### Attaque de 2007 : + +Les serveurs F, G, L et M ont été attaqués pendant 24h. + +Lors de cette attaque, l'impact sur M a été moindre grâce à anycast. + +5000 machines, essentiellement basées en corée du sud, ont générées du traffic en direction des Etats-Unis. (4) + +### Attaque de 2015 : + +5 millions de requêtes par seconde prennant la route vers les 13 serveurs racines. L'attaque était destinée à chaques serveurs racine de chaque lettre. La durée totale de cette attaque n'a pas dépassée 4 heures, mais les serveurs DNS racines ont été confrontés à environ 1 trillion de requêtes erronnées. (3) + +## Conclusion : + +Les root-servers / serveurs racines sont un élément essentiel à la résolution de nom sur internet. Ils représentent le fondement du fonctionnement du service DNS. Sans eux, nous ne pourrions plus aller sur un site sur base de son url. Ce service a, de nombreuses fois, été attaqué pour essayer de le faire tomber, mais ils n'y sont jamais arrivé. +Le service est super robuste, pas étonnant vu son importance dans la société à l'heure actuel. + + +## Bibliographie: + + +### source 1 : + +[URL](https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-serveur-racine-definition-et-fonctionnement/) de l'article + +Auteur : Know-how + +Titre de l'article : Qu’est-ce qu’un serveur racine ? Définition et fonctionnement + +Date de consultation : 25 mai 2023 + +### source 2 : + +[URL](https://linux.developpez.com/formation_debian/serveur-dns.html) +Auteur : ? + +Titre de l'article : Chapitre 9. Monter un serveur DNS + +Date de consultation : 25 mai 2023 + +### source 3 : + +[URL](https://news.sophos.com/fr-fr/2015/12/12/serveurs-dns-racine-attaque-ddos-massive/) de l'article + +Auteur : Sophos France + +Titre de l'article : Des serveurs DNS racine résistent à une attaque DDoS massive + +Date de consultation : 25 mai 2023 + +### source 4 : + +[URL](https://fr.wikipedia.org/wiki/Serveur_racine_du_DNS) de l'article + +Auteur : ? + +Titre de l'article : Serveur racine du DNS + +Date de consultation : 25 mai 2023 + +### source 5 : + +[URL](https://fr.wikipedia.org/wiki/Serveur_racine_du_DNS](https://www.techno-science.net/glossaire-definition/Domain-Name-System-page-2.html)) de l'article + +Auteur : [liste ici](http://fr.wikipedia.org/w/index.php?title=Domain%20Name%20System&action=history) + +Titre de l'article : Domain Name System + +Date de consultation : 25 mai 2023 + +### source 6 : + +[URL](https://fr.wikipedia.org/wiki/Paul_Mockapetris) de l'article + +Auteur : [ici]([http://fr.wikipedia.org/w/index.php?title=Domain%20Name%20System&action=history](https://fr.wikipedia.org/wiki/Utilisateur:Bot_de_pluie)) + +Titre de l'article : Paul Mockapetris + +Date de consultation : 25 mai 2023 + + From a2c313f94b7342ee2eec97acf9a773519b06ade5 Mon Sep 17 00:00:00 2001 From: zCargan <64102236+zCargan@users.noreply.github.com> Date: Fri, 26 May 2023 13:44:51 +0200 Subject: [PATCH 222/241] Update and rename dns.txt to dns.md changement de nom pour le bon format et correction de l'orthographe --- .../dns.txt" => "R\303\251seaux/dns.md" | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) rename "R\303\251seaux/dns.txt" => "R\303\251seaux/dns.md" (72%) diff --git "a/R\303\251seaux/dns.txt" "b/R\303\251seaux/dns.md" similarity index 72% rename from "R\303\251seaux/dns.txt" rename to "R\303\251seaux/dns.md" index d997f98..567a2d9 100644 --- "a/R\303\251seaux/dns.txt" +++ "b/R\303\251seaux/dns.md" @@ -15,29 +15,29 @@ Avant le DNS, la résolution de nom sur internet se faisait grâce à un fichie Ce fichier portait le nom de: HOSTS.TXT(5). -En 1982, ce système montre ses premières limites, et plusieurs propositions de remplacements voient le jour. Les premières idées ne sont pas gardées. Un certain Paul Mockapetris(6) fut désigné responsable quand au développement d'un autre système de résolution de nom. +En 1982, ce système montre ses premières limites, et plusieurs propositions de remplacement voient le jour. Les premières idées ne sont pas gardées. Un certain Paul Mockapetris(6) fut désigné responsable quant au développement d'un autre système de résolution de nom. Il est responsable du DNS, une architecture qu'il proposera en 1983 dans les RFC 882 et RFC 883. -Ce dernier est également l'inventeur du premier serveur de courrier électionnique basé sur le protocole SMTP. +Ce dernier est également l'inventeur du premier serveur de courrier électronique basé sur le protocole SMTP. ## Explications des root-servers -Afin de nous rendre sur nos sites web préférés, nous utilisons la résolution de noms DNS, qui passe par les serveurs racines (roots-servers). +Afin de nous rendre sur nos sites web préférés, nous utilisons la résolution de nom DNS, qui passe par les serveurs racines (roots-servers). -Un serveur racine est un élément primordiale pour la résolution de nom. Il répond aux requêtes ou demandes des clients dans la zone racine du DNS (Cette zone marque le niveau le plus élevé, au premier niveau de l'espace de nom DNS). -Ces derniers n'exécutent pas eux même la résolution de nom, mais informent à la place le client des autres serveurs DNS à consulter de manière plus précis afin d'obtenir une meilleure réponse. (1) +Un serveur racine est un élément primordial pour la résolution de nom. Il répond aux requêtes ou demandes des clients dans la zone racine du DNS (Cette zone marque le niveau le plus élevé, au premier niveau de l'espace de nom DNS). +Ces derniers n'exécutent pas eux-même la résolution de nom, mais informent à la place le client des autres serveurs DNS à consulter de manière plus précise afin d'obtenir une meilleure réponse. (1) -Cependant, afin de pouvoir aller interroger un serveur racine, il faut également posséder des informations à son propos. Quels est l'adresse IP du serveur racine responsable de la zone que je cherche à joindre? -Pour ce faire, il existe un fichier, appelé "fichier de zone racine", qui contient tout les noms et toutes les adresses IP des domaines de premier niveau. +Cependant, afin de pouvoir interroger un serveur racine, il faut également posséder des informations à son propos. Quel est l'adresse IP du serveur racine responsable de la zone que je cherche à joindre? +Pour ce faire, il existe un fichier, appelé "fichier de zone racine", qui contient tous les noms et toutes les adresses IP des domaines de premier niveau. Ce fichier est téléchargé lors de l'installation d'un client DNS, comme Bind9 par exemple. Ce dernier se trouve dans le repertoire /etc/bind, sous le nom de db.root. (2) La gestion de base du serveur racine est à la responsabilité de l'ICANN (Internet Corporation for Assigned Names and Numbers). -Il n'y a plus, contrairement à la croyance populaire, uniquement 13 serveurs racine uniques du DNS . -En effet, nous devons plutôt parler de 13 "identitées de serveur". Ces "identitées", ayant chacunes une adresse IP, sont souvent considérées comme des serveurs racines. +Il n'y a plus, contrairement à la croyance populaire, uniquement 13 serveurs racines uniques du DNS . +En effet, nous devons plutôt parler de 13 "identités de serveur". Ces "identités", ayant chacune une adresse IP, sont souvent considérées comme des serveurs racines. -Lettre des serveurs racine du DNS | Adresse IPv4 | Adresse IPv6 | Opérateurs +Lettre des serveurs racines du DNS | Adresse IPv4 | Adresse IPv6 | Opérateurs --- | ------------- | ---------- | -------------- A | 198.41.0.4 | 2001:503:ba3e::2:30 | VeriSign | B | 192.228.79.201 | 2001:478:65::53 | USC-ISI | @@ -63,11 +63,11 @@ C'est de cette manière que nous parvenons à accéder aux contenus de certains ## Attaques sur les serveurs racines : -Il y a déja eu, durant son histoire, de nombreuses attaques sur les serveurs racines. Etant la base de la résolution de nom, si le service tombe en panne, c'est tout internet qui tombe en panne. (4) +Il y a déjà eu, durant son histoire, de nombreuses attaques sur les serveurs racines. Étant la base de la résolution de nom, si le service tombe en panne, c'est tout internet qui tombe en panne. (4) ### Attaque de 2002 : -Lors de cette attaque, 7 serveurs sur les 13 ont été touchés, et on vu leurs performances dégradées à cause de cette dernière. Les auteurs de cette attaque l'ont effectués à l'aide d'un DDoS. Ils ont réussis à générer un volume de requêtes 40x supérieurs à la normal. +Lors de cette attaque, 7 serveurs sur les 13 ont été touchés, et on vu leurs performances dégradées à cause de cette dernière. Les auteurs de cette attaque l'ont effectué à l'aide d'un DDoS. Ils ont réussi à générer un volume de requêtes 40x supérieurs à la normale. Suite à cette attaque, le systeme anycast a été mis en place : "Anycast est une technique d'adressage et de routage permettant de rediriger les données vers le serveur informatique le « plus proche » ou le « plus efficace » selon la politique de routage." @@ -83,12 +83,12 @@ Lors de cette attaque, l'impact sur M a été moindre grâce à anycast. ### Attaque de 2015 : -5 millions de requêtes par seconde prennant la route vers les 13 serveurs racines. L'attaque était destinée à chaques serveurs racine de chaque lettre. La durée totale de cette attaque n'a pas dépassée 4 heures, mais les serveurs DNS racines ont été confrontés à environ 1 trillion de requêtes erronnées. (3) +5 millions de requêtes par seconde prennant la route vers les 13 serveurs racines. L'attaque était destinée à chaque serveur racine de chaque lettre. La durée totale de cette attaque n'a pas dépassé 4 heures, mais les serveurs DNS racines ont été confrontés à environ 1 trillion de requêtes erronées. (3) ## Conclusion : -Les root-servers / serveurs racines sont un élément essentiel à la résolution de nom sur internet. Ils représentent le fondement du fonctionnement du service DNS. Sans eux, nous ne pourrions plus aller sur un site sur base de son url. Ce service a, de nombreuses fois, été attaqué pour essayer de le faire tomber, mais ils n'y sont jamais arrivé. -Le service est super robuste, pas étonnant vu son importance dans la société à l'heure actuel. +Les root-servers / serveurs racines sont un élément essentiel à la résolution de nom sur internet. Ils représentent le fondement du fonctionnement du service DNS. Sans eux, nous ne pourrions plus aller sur un site sur base de son url. Ce service a, de nombreuses fois, été attaqué pour essayer de le faire tomber, mais ils n'y sont jamais arrivés. +Le service est super robuste, pas étonnant vu son importance dans la société à l'heure actuelle. ## Bibliographie: From 2303ff6b25478017de47548f0ef9eade9819b453 Mon Sep 17 00:00:00 2001 From: Antho3004 Date: Fri, 26 May 2023 14:55:16 +0200 Subject: [PATCH 223/241] =?UTF-8?q?Synth=C3=A8se=20sur=20le=20protocole=20?= =?UTF-8?q?SMTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "R\303\251seaux/SMTP.md" | 140 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 "R\303\251seaux/SMTP.md" diff --git "a/R\303\251seaux/SMTP.md" "b/R\303\251seaux/SMTP.md" new file mode 100644 index 0000000..9baa2c1 --- /dev/null +++ "b/R\303\251seaux/SMTP.md" @@ -0,0 +1,140 @@ +--- +layout: default +title: SMTP +parent: Réseaux +--- +# Protocole SMTP + +## Qu'est ce que SMTP (Simple Mail Transfer Protocol) ? [2][3][4] + +Le Simple Mail Transfer Protocol (SMTP) est un protocole utilisé pour transmettre des courriers électroniques sur un réseau. Il permet aux ordinateurs et aux serveurs d'échanger des données de manière normalisée, indépendamment de leur configuration matérielle ou logicielle. Le SMTP facilite la circulation des e-mails entre l'expéditeur et le destinataire, de manière similaire à l'adressage standardisé sur une enveloppe utilisé par le service postal. Cela rend possible la transmission de courriers électroniques à grande échelle. + +Cependant, il est important de noter que le SMTP est un protocole de transmission des e-mails et non de réception. Tout comme le service postal dépose le courrier dans une boîte aux lettres, le serveur SMTP transmet l'e-mail au serveur du fournisseur de messagerie. Le destinataire doit ensuite utiliser d'autres protocoles (POP/IMAP) pour récupérer l'e-mail depuis le serveur afin de le lire. + +## Comment fonctionne le SMTP ? [1][2][3][4][5] + +Les protocoles de mise en réseau suivent tous une procédure établie pour l'échange de données. Le protocole SMTP, par exemple, définit la manière dont les données sont échangées entre un client de messagerie et un serveur de messagerie. Le client de messagerie est l'interface permettant à un utilisateur d'interagir avec l'application de messagerie utilisée pour lire et envoyer des e-mails, qu'il s'agisse d'une application de bureau ou web. Le serveur de messagerie est un ordinateur spécialisé dans l'envoi, la réception et le transfert des e-mails. Les utilisateurs n'interagissent pas directement avec ces serveurs. + +Voici les étapes qui se déroulent entre le client de messagerie et le serveur de messagerie pour envoyer un e-mail : + +1. **Ouverture de la connexion SMTP** : étant donné que le SMTP utilise le protocole TCP (Transmission Control Protocol) comme protocole de transport, la première étape consiste à établir une connexion TCP entre le client et le serveur. Ensuite, le client de messagerie lance le processus d'envoi de l'e-mail en exécutant une commande spéciale appelée "Hello" (HELO ou EHLO). + +2. **Transfert des données de l'e-mail** : le client envoie une série de commandes au serveur, accompagnées du contenu de l'e-mail lui-même. Cela comprend l'en-tête de l'e-mail (contenant notamment le destinataire et l'objet), le corps de l'e-mail et les éventuelles pièces jointes. + +3. **Exécution de l'Agent de Transfert de Courrier (Mail Transfer Agent)** : le serveur exécute un programme appelé Mail Transfer Agent (MTA), qui vérifie le domaine de l'adresse e-mail du destinataire. Si ce domaine est différent de celui de l'expéditeur, le MTA interroge le DNS (Domain Name System) pour obtenir l'adresse IP du destinataire. Cela peut être comparé à la recherche du code postal d'un destinataire par les services postaux. + +4. **Fermeture de la connexion** : une fois que le client a terminé la transmission des données, il informe le serveur, qui clôt alors la connexion. À ce stade, le serveur ne reçoit plus de données supplémentaires concernant l'e-mail, sauf si le client établit une nouvelle connexion SMTP. + +Le premier serveur de messagerie n'est généralement pas la destination finale de l'e-mail. Une fois que le client a envoyé l'e-mail au premier serveur, ce dernier répète la procédure de connexion SMTP avec un autre serveur de messagerie. Ce processus se répète jusqu'à ce que l'e-mail atteigne finalement la boîte de réception du destinataire, sur un serveur de messagerie contrôlé par le fournisseur de messagerie du destinataire. + +Pour mieux comprendre on peut comparer ce processus à la façon dont un courrier estcheminé entre l'expéditeur et le destinataire. Le facteur ne transporte pas directement une lettre de l'expéditeur au destinataire, mais la remet d'abord à son bureau de poste. Ensuite, le bureau de poste envoie la lettre à un bureau situé dans une autre ville, qui la renvoie à un autre bureau, et ainsi de suite, jusqu'à ce que la lettre atteigne sa destination. De la même manière, les e-mails passent d'un serveur à l'autre via le protocole SMTP jusqu'à ce qu'ils parviennent à la boîte de réception du destinataire. + +## Les commandes SMTP [2][3][4] + +Les commandes SMTP sont des instructions prédéfinies sous forme de texte, utilisées pour indiquer à un client ou à un serveur ce qu'il doit faire et comment traiter les données accompagnant un e-mail. On peut les comparer à des boutons sur lesquels le client peut appuyer pour s'assurer que le serveur accepte les données correctement. + +Voici les commandes principaux : + +* **HELO/EHLO** : Ces commandes permettent d'établir la connexion SMTP entre le client et le serveur en disant "Bonjour" (HELO) ou en utilisant une version spécialisée du SMTP (EHLO). + +* **MAIL FROM** : Cette commande informe le serveur de l'expéditeur de l'e-mail. Par exemple, si Alice souhaite envoyer un e-mail à son ami Bob, le client enverrait la commande "MAIL FROM:alice@exemple.com". + +* **RCPT TO** : Cette commande spécifie la liste des destinataires de l'e-mail. Si l'e-mail a plusieurs destinataires, le client peut envoyer cette commande plusieurs fois. Dans l'exemple précédent, le client de courrier électronique d'Alice enverrait "RCPT TO:bob@exemple.com". + +* **DATA** : Cette commande précède le contenu de l'e-mail. + +* **RSET** : Cette commande réinitialise la connexion et supprime toutes les informations précédemment transférées, sans mettre fin à la connexion SMTP. Elle est utilisée lorsque le client a envoyé des informations incorrectes. + +* **QUIT** : Cette commande met fin à la connexion SMTP. + +Voici un exemple pour mieux comprendre les différentes commandes : + +![image](https://d6x8u9i2.rocketcdn.me/blog/wp-content/uploads/2017/11/SMTP-sequence-diagram.png) + +_source : https://www.afternerd.com/blog/smtp/_ + +## Qu'est-ce qu'un serveur SMTP ? [1][4][5] + +Un serveur SMTP est un serveur de messagerie qui permet l'envoi et la réception d'e-mails en utilisant le protocole SMTP. Lorsqu'un client souhaite envoyer un e-mail, il se connecte directement au serveur SMTP fourni par le service de messagerie. Le serveur SMTP exécute différents programmes : + +* **Mail Submission Agent (MSA)** : Il reçoit les e-mails envoyés par le client de courrier électronique. + +* **Mail Transfer Agent (MTA)** : Il transfère les e-mails vers le serveur suivant dans la chaîne d'acheminement. Si nécessaire, il peut consulter le système de noms de domaine (DNS) pour trouver l'enregistrement MX (Mail eXchange) du domaine du destinataire. + +* **Mail Delivery Agent (MDA)** : Il reçoit les e-mails envoyés par les MTA et les stocke dans la boîte de réception du destinataire. + +## Quel port le protocole SMTP utilise-t-il ? [4][7] + +Dans le domaine des réseaux, un port fait référence à un point virtuel de réception des données réseau. On peut le comparer au numéro d'appartement dans une adresse postale. Les ports permettent aux ordinateurs de trier et de transmettre les données réseau vers les applications appropriées. Les mesures de sécurité réseau, comme les pare-feu, peuvent bloquer les ports inutilisés afin d'empêcher l'envoi et la réception de données malveillantes. + +Historiquement, le protocole SMTP utilisait uniquement le port 25. Ce port est toujours utilisé aujourd'hui par le protocole SMTP, mais il peut également utiliser les ports 465, 587 et 2525. + +* Le port 25 est principalement utilisé pour les connexions entre serveurs SMTP. De nos jours, les pare-feu des réseaux des utilisateurs finaux bloquent souvent ce port, car les spammeurs tentent de l'utiliser de manière abusive pour envoyer d'importantes quantités de contenu indésirable. + +* Le port 465 était autrefois assigné à l'utilisation du protocole SMTP avec chiffrement Secure Sockets Layer (SSL). Le SSL a depuis été remplacé par le protocole Transport Layer Security (TLS) et les systèmes de messagerie modernes n'utilisent plus ce port. Il est principalement présent dans les systèmes plus anciens (obsolètes). + +* Le port 587 est désormais le port par défaut pour l'envoi d'e-mails. Les communications SMTP effectuées via ce port utilisent le chiffrement TLS. + +* Le port 2525 n'est pas officiellement associé au protocole SMTP, mais certains services de messagerie proposent l'utilisation de la transmission SMTP via ce port en cas de blocage des ports mentionnés ci-dessus. + +## Les inconvénients du protocole SMTP [3] + +Le protocole SMTP présente deux inconvénients. + +Le premier est qu'il ne fournit pas de confirmation d'expédition consultable lors de l'envoi d'un email. Bien que les spécifications du protocole prévoient une telle notification, son format n'est pas défini par défaut, ce qui signifie qu'en général, seul un message d'erreur en anglais incluant l'en-tête du message non délivré est renvoyé. Par conséquent, il est difficile de déterminer la cause de l'échec de la transmission, comme une adresse incorrecte ou une boîte de réception saturée du côté du destinataire. + +Le deuxième inconvénient du SMTP est l'absence d'authentification des utilisateurs lors de l'établissement d'une connexion, ce qui rend l'identité de l'expéditeur d'un email peu fiable. Les relais SMTP ouverts sont souvent utilisés de manière abusive pour l'envoi massif de spams. Les expéditeurs utilisent des adresses d'expéditeurs fictives, ce qui rend leur traçabilité impossible (spoofing d'email). Aujourd'hui, de nombreuses techniques de sécurité sont mises en œuvre pour prévenir une utilisation abusive des serveurs SMTP. Par exemple, les emails suspects sont rejetés ou placés en quarantaine (dossier spam). Le protocole d'identification DomainKeys, le Sender Policy Framework (SPF) et le Greylisting sont utilisés à cette fin. De plus, il est devenu courant de recevoir des emails non seulement via le port traditionnel 25/TCP, mais aussi via d'autres ports. + + ## Qu'est-ce que l'Extended SMTP (ESMTP) ? [3][4] + +L'ESMTP (Extended Simple Mail Transfer Protocol) est une version améliorée du protocole de transfert de courrier électronique, qui étend les fonctionnalités de la version initiale. Il permet notamment l'envoi de pièces jointes et l'utilisation du TLS, entre autres fonctionnalités. Contrairement au SMTP classique, la plupart des clients et services de messagerie utilisent l'ESMTP. + +L'ESMTP introduit des commandes supplémentaires, telles que la commande "EHLO" qui permet l'envoi d'un message de salutation étendu (extended hello), afin d'activer l'utilisation de l'ESMTP dès le début de la connexion. + +## Sécurisation du protocole SMTP [8] + +Dans tous les protocoles de communication sur Internet, garantir l'intégrité, la confidentialité et l'authenticité des données est une priorité en matière de sécurité de communication. Il existe 2 techniques pour sécuriser le protocole SMTP. + +1. **Le chiffrement des mails** : La technique de chiffrement des données est utilisée par les utilisateurs du protocole SMTP pour éviter d'envoyer des e-mails en clair sur le réseau. Elle permet de créer un canal de communication sécurisé entre le client de messagerie et les serveurs SMTP. + +Parmi les méthodes de chiffrement les plus couramment utilisées, on trouve le Protocole TLS (Transport Layer Security) et le standard S/MIME (Secure/Multipurpose Internet Mail Extensions). Ces méthodes garantissent la confidentialité et l'intégrité des données échangées, empêchant ainsi leur lecture par des tiers. + +2. **L’authentification SMTP** : L'authentification SMTP, également connue sous le nom de SMTP AUTH, est une extension conçue pour protéger un serveur de messagerie contre une utilisation non autorisée. Afin d'envoyer un e-mail via le serveur SMTP et de procéder à son envoi, l'expéditeur doit s'authentifier en utilisant un compte valide. Cela réduit la possibilité d'envoi de spam à partir de clients non autorisés. + +Cependant, il est important de noter que l'extension SMTP AUTH ne contrôle que l'envoi de l'e-mail et non l'ensemble de ses informations. Par conséquent, elle ne garantit pas l'identité de l'expéditeur affichée dans l'en-tête "From". Il est donc possible pour une personne malveillante de se faire passer pour quelqu'un d'autre, malgré cette couche de sécurité. + +## Comment tester un serveur SMTP ? [6][9] + +Pour effectuer un test sur un serveur SMTP, la méthode la plus recommandée consiste à utiliser Telnet, un protocole largement utilisé dans les réseaux TCP/IP. + +Voici un exemple qui illustre comment effectuer un test de connexion SMTP depuis un client interne vers un serveur, en utilisant une authentification standard sous Windows : + +1. Ouvrez l'invite de commande en recherchant le terme "cmd" dans la barre de recherche. + +2. Tapez la commande "telnet smtp.exemple.com 25" pour vous connecter au serveur SMTP via le port 25. Remplacez "smtp.exemple.com" par l'adresse de votre propre serveur SMTP. + +3. Si le serveur est accessible, il renverra un rapport avec les codes d'état 220 et "smtp.example.com ESMTP Postfix", ou un message en texte clair équivalent. Cela indique qu'il n'y a pas d'erreur de connexion de la part du serveur SMTP. + +Ensuite, vous pouvez vous authentifier et, si nécessaire, envoyer un e-mail de test pour mieux cerner la cause du problème. Si malgré une connexion fonctionnelle, l'e-mail n'atteint pas sa destination, le problème est probablement lié au fournisseur ou au destinataire. + +Si vous ne recevez aucune réponse ou seulement un message d'erreur du serveur, il est donc possible que votre pare-feu ou votre programme antivirus bloque la transmission d'e-mails. + +## Bibliographie + +* [1] Numa, [SMTP : définition, serveurs, protocole… Le guide pour s’y retrouver !](https://www.brevo.com/fr/blog/smtp-definition-protocole-serveurs/), version du 23 août 2017, consultée le 25 mai 2023 + +* [2] Wikipedia, [Simple Mail Transfer Protocol](https://fr.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol), version du 26 juillet 2022, consultée le 25 mai 2023 + +* [3] Ionos, [Qu’est-ce que SMTP ? Définition et principes de bases](https://www.ionos.fr/digitalguide/email/aspects-techniques/smtp/), version du 25 juin 2019, consultée le 25 mai 2023 + +* [4] CloudFlare, [Qu'est-ce que le Simple Mail Transfer Protocol (SMTP) ?](https://www.cloudflare.com/fr-fr/learning/email-security/what-is-smtp/), consultée le 25 mai 2023 + +* [5] ActiveTrail, [SMTP: Définition Et À Quoi Ça Sert ?](https://www.activetrail.fr/blog_marketing/email_marketing_articles_fr/smtp-definition-et-a-quoi-ca-sert/), version du 9 août 2022, consultée le 25 mai 2023 + +* [6] AUDREY TIPS, [Compte SMTP (SMTP)](https://audreytips.com/glossaire-web/compte-smtp/), version du 16 juillet 2020, consultée le 25 mai 2023 + +* [7] Florian Burnel, [Messagerie : découverte des protocoles SMTP, POP, IMAP et MAPI](https://www.it-connect.fr/messagerie-decouverte-des-protocoles-smtp-pop-imap-et-mapi/), version du 7 janvier 2021, consultée le 25 mai 2023 + +* [8] Anne Quan, [Tout ce que vous devez savoir sur la sécurité SMTP](https://pacomail.io/blog/securite-smtp/), version du 5 september 2022, consultée le 25 mai 2023 + +* [9] Ionos, [Serveur SMTP : définition et fonctionnement](https://www.ionos.fr/digitalguide/email/aspects-techniques/serveur-smtp/), version du 26 juin 2019, consultée le 25 mai 2023 \ No newline at end of file From e3b13ee60cc4ef59f516abf11a167d6aaf4f8caa Mon Sep 17 00:00:00 2001 From: Antho3004 Date: Fri, 26 May 2023 15:03:07 +0200 Subject: [PATCH 224/241] Correction mise en page --- "R\303\251seaux/SMTP.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/R\303\251seaux/SMTP.md" "b/R\303\251seaux/SMTP.md" index 9baa2c1..ac5dedd 100644 --- "a/R\303\251seaux/SMTP.md" +++ "b/R\303\251seaux/SMTP.md" @@ -85,7 +85,7 @@ Le premier est qu'il ne fournit pas de confirmation d'expédition consultable lo Le deuxième inconvénient du SMTP est l'absence d'authentification des utilisateurs lors de l'établissement d'une connexion, ce qui rend l'identité de l'expéditeur d'un email peu fiable. Les relais SMTP ouverts sont souvent utilisés de manière abusive pour l'envoi massif de spams. Les expéditeurs utilisent des adresses d'expéditeurs fictives, ce qui rend leur traçabilité impossible (spoofing d'email). Aujourd'hui, de nombreuses techniques de sécurité sont mises en œuvre pour prévenir une utilisation abusive des serveurs SMTP. Par exemple, les emails suspects sont rejetés ou placés en quarantaine (dossier spam). Le protocole d'identification DomainKeys, le Sender Policy Framework (SPF) et le Greylisting sont utilisés à cette fin. De plus, il est devenu courant de recevoir des emails non seulement via le port traditionnel 25/TCP, mais aussi via d'autres ports. - ## Qu'est-ce que l'Extended SMTP (ESMTP) ? [3][4] +## Qu'est-ce que l'Extended SMTP (ESMTP) ? [3][4] L'ESMTP (Extended Simple Mail Transfer Protocol) est une version améliorée du protocole de transfert de courrier électronique, qui étend les fonctionnalités de la version initiale. Il permet notamment l'envoi de pièces jointes et l'utilisation du TLS, entre autres fonctionnalités. Contrairement au SMTP classique, la plupart des clients et services de messagerie utilisent l'ESMTP. From f72da1bf0d608b0d7e5334c5d93afa337d2c4ba1 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 16:35:34 +0200 Subject: [PATCH 225/241] Create SpamAssassin.md Adding an Article SpamAssassin --- "R\303\251seaux/SpamAssassin.md" | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 "R\303\251seaux/SpamAssassin.md" diff --git "a/R\303\251seaux/SpamAssassin.md" "b/R\303\251seaux/SpamAssassin.md" new file mode 100644 index 0000000..997d5f4 --- /dev/null +++ "b/R\303\251seaux/SpamAssassin.md" @@ -0,0 +1,104 @@ +--- +layout: default +title: SpamAssassin +parent: Réseau +--- + +# SpamAssassin + +![spam-assasin-logo-transparent](https://github.com/HaAymar/Wiki-TI/assets/71372488/1942bfb7-2f7b-4608-86ca-b60ff8112e35) + +## Définission SpamAssassin +SpamAssassin est un logiciel de filtrage du courrier indésirable (spam) largement utilisé, il analyse les en-têtes et le contenu des e-mails pour détecter les signes de spam. +- Il utilise des listes noires pour identifier les expéditeurs et les serveurs de messagerie non fiables associés au spam +- SpamAssassin peut également analyser les pièces jointes et les URL dans les e-mails pour détecter les contenus suspects +- Il attribue des scores aux messages en fonction des règles et des analyses effectuées. + +Il peut être intégré avec des serveurs de messagerie utilisant les protocoles POP, IMAP et SMTP. + +POP/IMAP : sont les protocoles de messagerie utilisés pour récupérer les e-mails à partir d'un serveur de messagerie. + +SMTP : est un protocole standard utilisé pour l'envoi d'e-mails à travers les réseaux. Il est principalement utilisé pour l'envoi de mails à partir d'un client de messagerie vers un serveur de messagerie sortant. + +## Pourquoi utilisé le SpamAssassin + +Les principales raisons qui poussent à l'utilisation de SpamAssassin sont les suivantes: + +- Protection contre les menaces : SpamAssassin est capable de détecter et de marquer les e-mails contenant des liens malveillants, des pièces jointes dangereuses ou d'autres éléments associés à des attaques de phishing, de malware ou d'autres menaces en ligne. Cela contribue à renforcer la sécurité du système de messagerie. + +- Réduction du temps de traitement : En filtrant automatiquement les e-mails indésirables, SpamAssassin permet de réduire la quantité de courrier indésirable qui atteint les boîtes de réception des utilisateurs. Cela permet aux utilisateurs de passer moins de temps à trier manuellement les e-mails non sollicités. + +- Personnalisation des règles : SpamAssassin permet aux utilisateurs de personnaliser les règles de filtrage en fonction de leurs besoins spécifiques. Ils peuvent ajouter, supprimer ou ajuster les règles pour mieux s'adapter à leurs préférences et à leur environnement de messagerie. + +## Installation et configuration de SpamAssassin +Avant de pouvoir configurer SpamAssassin il faut d'abord installer ça sur une machine. +Voici les étapes de configuration sous linux: + +Installation spamAssassin + +``` +sudo apt-get install spamassassin +``` + +Après l'installation de toutes les dépendances, il faudra créer un utilisateur système qui pourra communiquer avec le démon `spamd` + +``` +adduser --disabled-login --home /var/spamd spamd +``` + +Configuration pour le fichier ```/etc/default/spamassassin``` on place le CRON à 1: + +``` +CRON=1 +``` +Aprés indiquer à Postfix qu'on utilise SpamAssassin dans le fichier `/etc/postfix/master.cf`on ajoutant: +``` +smtp inet n - - - - smtpd +-o content_filter=spamassassin +``` +Et les deux lignes à la fin de ce même fichier: + +``` +spamassassin unix - n n - - pipe + user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} +``` +En suite demarrer le SpamAssassin avec la commande: +``` +systemctl start spamassassin +postfix reload +``` +[Sources](https://www.hostnextra.com/kb/install-spamassassin-with-postfix-on-ubuntu/) + +- [Utilisation SpamAssassin windows](https://cwiki.apache.org/confluence/display/spamassassin/UsingOnWindows) +- [Utilisation SpamAssassin avec centOs](https://archives.microlinux.fr/spamassassin-centos-7/) + +## Comment integrer SpamAssassin dans les protocoles POP/IMAP et SMTP + +Pour intégrer SpamAssassin dans les protocoles POP/IMAP, il faut suivre ces étapes suivantes : +- Installez SpamAssassin sur la machine (voir l'étape précedente) +- Configurez votre serveur de messagerie pour acheminer les e-mails via SpamAssassin. +- Activez le support SpamAssassin dans la configuration du serveur de messagerie. +- Configurez le serveur de messagerie pour appliquer les filtres SpamAssassin aux e-mails entrants. +- Définissez des actions en fonction des résultats du filtrage (marquage, déplacement des e-mails indésirables). +Il est possible de consulter la documaentation en suivant ce lien en cliquant [ici](https://doc.ubuntu-fr.org/serveur_mail_avec_postfix_et_courier-imap) + +Pour intégrer SpamAssassin dans SMTP, vous pouvez suivre les étapes suivantes : +Pour faire la configuration, il faut ouvrir le fichier sur le serveur SMTP qui se trouve dans `/etc/postfix/main.cf` +On ajoute une ligne : +``` +content_filter = smtp:[127.0.0.1]:10025 +``` +On ajoute une nouvelle section pour définir le filtrage des e-mails avec SpamAssassin +``` +smtpd_proxy_filter = inet:127.0.0.1:10026 +``` +On enregistre les modifications et redémarrez le serveur SMTP pour appliquer la configuration +``` +systemctl restart postfix +``` +Enfin on démarre le démon SpamAssassin sur le port 10026 +``` +sudo spamd -d -c -m5 -H -s spamd -u spamd -x -r /var/run/spamd.pid +``` + + From bcf1e6a0f5b61e1568afb000ca3db46f421e364c Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 16:38:50 +0200 Subject: [PATCH 226/241] Update SpamAssassin.md Adding a conclusion --- "R\303\251seaux/SpamAssassin.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/SpamAssassin.md" "b/R\303\251seaux/SpamAssassin.md" index 997d5f4..8529e50 100644 --- "a/R\303\251seaux/SpamAssassin.md" +++ "b/R\303\251seaux/SpamAssassin.md" @@ -100,5 +100,6 @@ Enfin on démarre le démon SpamAssassin sur le port 10026 ``` sudo spamd -d -c -m5 -H -s spamd -u spamd -x -r /var/run/spamd.pid ``` - +## Conclusion + SpamAssassin est une solution efficace et largement utilisée pour filtrer le courrier indésirable dans les services de messagerie. Avec son intégration transparente avec les protocoles POP, IMAP et SMTP, SpamAssassin offre une protection complète contre les spams, les e-mails malveillants et les menaces en ligne From 595e2c481c4540244945694ef942f2b94e8407cc Mon Sep 17 00:00:00 2001 From: Shayann <71373280+Shayann37@users.noreply.github.com> Date: Fri, 26 May 2023 17:09:39 +0200 Subject: [PATCH 227/241] Create DKIM.md --- "S\303\251curit\303\251/DKIM.md" | 131 +++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 "S\303\251curit\303\251/DKIM.md" diff --git "a/S\303\251curit\303\251/DKIM.md" "b/S\303\251curit\303\251/DKIM.md" new file mode 100644 index 0000000..a7997cc --- /dev/null +++ "b/S\303\251curit\303\251/DKIM.md" @@ -0,0 +1,131 @@ +*** +# Synthèse sur DKIM + +## Qu'est-ce que DKIM et à quoi ça sert ? + +DKIM (DomainKeys Identified Mail) est une méthode d'authentification utilisée pour empêcher la falsification des adresses électroniques et renforcer la sécurité des courriers électroniques. +Elle offre un moyen fiable pour le serveur de messagerie du destinataire de vérifier l'authenticité du domaine de l'expéditeur. L'un des objectifs principaux de DKIM est de protéger +l'expéditeur contre les risques liés au spam en démontrant aux filtres anti-spam qu'il n'est pas un spammeur malveillant. En utilisant DKIM, les expéditeurs légitimes peuvent établir +leur crédibilité et améliorer l'envoi des courriers électroniques. + + +## Comment ça fonctionne ? + +Lorsqu'un courrier électronique voyage des serveurs de l'expéditeur à la boîte de réception du destinataire, il passe par différents serveurs intermédiaires. +Ce parcours expose le courrier électronique à des vulnérabilités potentielles, telles que des modifications non autorisées. DKIM agit comme une norme mondiale d'authentification des courriers électroniques, +sécurisant ainsi le contenu du courrier de l'expéditeur au destinataire à l'aide d'une signature cryptographique du corps du message. Cette signature garantit que le domaine de l'expéditeur +est légitime et que le message n'a pas été altéré pendant son transit. DKIM opère au niveau de la couche application du modèle OSI, offrant ainsi une protection pour les protocoles de messagerie tels que SMTP, +IMAP et POP, même lorsqu'ils sont utilisés de manière sécurisée. + +Une fois qu'un courrier électronique est envoyé depuis un domaine configuré avec DKIM, le serveur de messagerie de l'expéditeur génère une signature DKIM en utilisant une clé privée associée à la clé publique +enregistrée dans le DNS du domaine d'expédition. Cette signature est ajoutée au courrier électronique sous la forme d'un en-tête DKIM-Signature. + + +*** +Voici un exemple de signature DKIM dans un mail. + + +

+ +

+ +*** + +Lorsque le courrier électronique est reçu par le serveur de messagerie du destinataire, celui-ci extrait l'en-tête DKIM-Signature et utilise la clé publique récupérée à partir de l'enregistrement DKIM dans le DNS +pour vérifier la signature. Si la vérification réussit, cela confirme que le courrier électronique provient bien du domaine indiqué et qu'il n'a pas été modifié pendant le transit. +Cette vérification de l'authenticité du domaine de l'expéditeur offre une protection contre la falsification des adresses électroniques. Les destinataires peuvent avoir confiance que l'expéditeur +est réellement le propriétaire légitime du domaine mentionné dans l'en-tête DKIM-Signature. Cela permet de réduire les risques liés au spam, à l'hameçonnage +et à d'autres formes de courriers électroniques malveillants. + +En plus de l'authentification de l'expéditeur, DKIM assure également l'intégrité du message. Si le contenu du courrier électronique est modifié en cours de route, +la signature DKIM ne correspondra plus et la vérification échouera. Cela permet de détecter toute modification indésirable du message et d'alerter le destinataire. + + +## Comment configurer DKIM ? + +* La première étape consiste à générer une paire de clés DKIM composée d'une clé privée et d'une clé publique. La clé privée est utilisée pour signer les courriers électroniques sortants, +tandis que la clé publique est placée dans le DNS pour permettre la vérification des signatures par les serveurs de messagerie entrants. Vous pouvez utiliser des outils tels que [Dkim Core Tool](https://dkimcore.org/tools/) +ou d'autres outils spécifiques à votre serveur de messagerie pour générer les clés. + +Exemple d'une clé privée : + +![cléPrivée](https://github.com/Shayann37/Wiki-TI/assets/71373280/3ba86e12-28ef-4fc1-8b0d-fb6a3a36f127) + +Exemple de clé publique : + +![cléPublique](https://github.com/Shayann37/Wiki-TI/assets/71373280/ae201da0-149a-4a6c-9666-0fed72254255) + +*** + +* Une fois les clés générées, vous devez configurer votre serveur de messagerie pour utiliser DKIM. Les étapes précises varient en fonction du serveur de messagerie que vous utilisez. En général, +vous devrez ajouter des lignes de configuration spécifiques à DKIM dans les fichiers de configuration de votre serveur de messagerie. + +Voici un exemple de commande et de configuration que vous devez faire pour un serveur mail utilisant "Postfix" : + +1. Installer le paquet "OpenDkim" sur votre système +```code +apt-get install opendkim opendkim-tools +``` + +2. Ajouter les lignes suivantes dans le fichier de configuration Postfix +```code +milter_default_action = accept +milter_protocol = 2 +smtpd_milters = inet:localhost:8891 +non_smtpd_milters = inet:localhost:8891 +``` + +3. Ajouter les lignes suivante dans le fichier "/etc/opendkim.conf" +```code +Domain example.com //example.com doit évidement être changé par votre propre nom de domaine +KeyFile /path/to/private/key //changer le chemin par votre chemin d'accès à votre clé privée +Selector default +``` + +4. Définir la variable SOCKET dans le fichier "/etc/default/opendkim" +```code +SOCKET="inet:8891" +``` + +Si vous désirez avoir une explication et une démonstration plus approfondie sur la configuration de DKIM, n'hésitez pas à jeter un coup d'oeil sur ce [lien](https://fr-wiki.ikoula.com/fr/Installer_DKIM_sur_Postfix_sous_Debian). + +*** + + +* Maintenant votre serveur de messagerie configuré, vous devez ajouter un enregistrement DKIM au système DNS associé au domaine d'expédition. +Cet enregistrement est généralement un enregistrement TXT qui contient les informations de la clé publique DKIM, y compris le sélecteur DKIM. +Vous devez copier le contenu de la clé publique générée précédemment dans cet enregistrement TXT. + +*** + +* Dès la configuration effectuée, il est recommandé de tester et de vérifier que DKIM fonctionne correctement. Vous pouvez envoyer des courriers électroniques depuis votre domaine +configuré avec DKIM vers des adresses externes et vérifier les en-têtes des courriers électroniques reçus pour voir si les signatures DKIM sont présentes et valides (image d'exemple observable dans +la partie "Comment ça fonctionne ?). +Vous pouvez également utiliser des outils en ligne tel que [MxToolBox](https://mxtoolbox.com) pour vérifier la configuration DKIM de votre domaine. + +## Conclusion + +En résumé, DKIM est une méthode d'authentification qui ajoute des signatures cryptographiques aux messages électroniques, protégeant ainsi contre la falsification des adresses électroniques. +En permettant au serveur de messagerie du destinataire de vérifier l'authenticité du domaine de l'expéditeur, DKIM renforce la sécurité des courriers électroniques,prévient la manipulation +des messages et réduit les risques de spam et d'attaques de phishing. + +# Sources + +* Mantra, [SPF, DKIM et DMARC : pourquoi sont-ils importants et comment les configurer ?](https://fr.mantra.ms/blog/spf-dkim-dmarc-explication-parametrage). Consulté le 26 mai 2023 + +* Wikipédia, [DomainKeys Identified Mail](https://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail). Consulté le 26 mai 2023 + +* Youtube, Docteur Internet, [Le DKIM c'est quoi ?](https://www.youtube.com/watch?v=nlAx8WMM5Z4). Consulté le 26 mai 2023 + +* DigitaWeb, Corentin Jacquemin, [DKIM : Comment le configurer ?](https://www.digitaweb.com/blog/dkim-comment-configurer). Consulté le 26 mai 2023 + +* Hostinger Tutorials, Roua K., 18 avril 2023, [C’est quoi DKIM ? Le Guide du Débutant (2023)](https://www.hostinger.fr/tutoriels/enregistrement-dkim). Consulté le 26 mai 2023 + +* Ikoula, [Installer DKIM sur Postfix sous Debian](https://fr-wiki.ikoula.com/fr/Installer_DKIM_sur_Postfix_sous_Debian). Consulté le 26 mai 2023 + +* OpenAi, [ChatGTP](https://chat.openai.com). Consulté le 26 mai 2023 + +*** + +Fait le 26 mai 2023 par GONZALEZ Shayann 2TL2 + From e9d8e4b9af57e2c6b426162f3160fa775bb1d9aa Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 17:20:18 +0200 Subject: [PATCH 228/241] Update SpamAssassin.md Update --- "R\303\251seaux/SpamAssassin.md" | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git "a/R\303\251seaux/SpamAssassin.md" "b/R\303\251seaux/SpamAssassin.md" index 8529e50..fe5bcdc 100644 --- "a/R\303\251seaux/SpamAssassin.md" +++ "b/R\303\251seaux/SpamAssassin.md" @@ -9,7 +9,7 @@ parent: Réseau ![spam-assasin-logo-transparent](https://github.com/HaAymar/Wiki-TI/assets/71372488/1942bfb7-2f7b-4608-86ca-b60ff8112e35) ## Définission SpamAssassin -SpamAssassin est un logiciel de filtrage du courrier indésirable (spam) largement utilisé, il analyse les en-têtes et le contenu des e-mails pour détecter les signes de spam. +SpamAssassin est un logiciel de filtrage du courrier indésirable (spams) qui est trés utilisé, il analyse les en-têtes et le contenu des e-mails pour détecter les signes de spam. - Il utilise des listes noires pour identifier les expéditeurs et les serveurs de messagerie non fiables associés au spam - SpamAssassin peut également analyser les pièces jointes et les URL dans les e-mails pour détecter les contenus suspects - Il attribue des scores aux messages en fonction des règles et des analyses effectuées. @@ -101,5 +101,12 @@ Enfin on démarre le démon SpamAssassin sur le port 10026 sudo spamd -d -c -m5 -H -s spamd -u spamd -x -r /var/run/spamd.pid ``` ## Conclusion - SpamAssassin est une solution efficace et largement utilisée pour filtrer le courrier indésirable dans les services de messagerie. Avec son intégration transparente avec les protocoles POP, IMAP et SMTP, SpamAssassin offre une protection complète contre les spams, les e-mails malveillants et les menaces en ligne - +SpamAssassin est une solution efficace et largement utilisée pour filtrer le courrier indésirable dans les services de messagerie. Avec son intégration transparente avec les protocoles POP, IMAP et SMTP, SpamAssassin offre une protection complète contre les spams, les e-mails malveillants et les menaces en ligne + +## Bibliographie +- [1] [C'est quoi spamAssassin](https://en.wikipedia.org/w/index.php?title=Apache_SpamAssassin&action=history) consulté le 25/05/2023 +- [2] [Installation et configuration de SpamAssassin](https://www.hostnextra.com/kb/install-spamassassin-with-postfix-on-ubuntu/)consulté le 25/05/2023 +- [3] [Comment integrer SpamAssassin dans les protocoles POP/IMAP et SMTP](https://siguillaume.developpez.com/tutoriels/linux/mise-place-systeme-messagerie-electronique-sous-linux/?page=page-1)consulté le 25/05/2023 +- [4] [Configuration smtp avec SpamAssassin](https://www.malekal.com/installer-configurer-spamassassin-debian/)consulté le 25/05/2023 +- [5] [Protocole SMTP ET POP/IMAP](https://www.cleanfox.io/blog/divers/les-protocoles-de-messagerie/#:~:text=Les%20protocoles%20sortants%20(SMTP)%20servent,et%20de%20distribution%20des%20messages) consulté le 26/05/2023 +- [6] [Pourquoi utilisé SpamAssassin](https://www.hostpapa.com/knowledgebase/fr/knowledge-base/comment-utiliser-spamassassin/) consulté le 26/05/2023 From 681a4a797d4790402aa176172a56e9998c23641d Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 17:25:45 +0200 Subject: [PATCH 229/241] Update SpamAssassin.md Updating --- "R\303\251seaux/SpamAssassin.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/R\303\251seaux/SpamAssassin.md" "b/R\303\251seaux/SpamAssassin.md" index fe5bcdc..72e0366 100644 --- "a/R\303\251seaux/SpamAssassin.md" +++ "b/R\303\251seaux/SpamAssassin.md" @@ -15,11 +15,13 @@ SpamAssassin est un logiciel de filtrage du courrier indésirable (spams) qui es - Il attribue des scores aux messages en fonction des règles et des analyses effectuées. Il peut être intégré avec des serveurs de messagerie utilisant les protocoles POP, IMAP et SMTP. - +### Difference entre POP/IMAP et SMTP + POP/IMAP : sont les protocoles de messagerie utilisés pour récupérer les e-mails à partir d'un serveur de messagerie. SMTP : est un protocole standard utilisé pour l'envoi d'e-mails à travers les réseaux. Il est principalement utilisé pour l'envoi de mails à partir d'un client de messagerie vers un serveur de messagerie sortant. +Afin de restreindre la propagation de spam, des filtres sont employés à divers niveaux comme : MUA, MTA, MDA ... ## Pourquoi utilisé le SpamAssassin Les principales raisons qui poussent à l'utilisation de SpamAssassin sont les suivantes: From 86d2ad92f1a9f7d430d36f5babf9a8eab0c288df Mon Sep 17 00:00:00 2001 From: PFLY Date: Fri, 26 May 2023 17:29:17 +0200 Subject: [PATCH 230/241] Filtrage du spam lors de l'envoi d'un mail --- "R\303\251seaux/Filtrage_spam.md" | 133 ++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 "R\303\251seaux/Filtrage_spam.md" diff --git "a/R\303\251seaux/Filtrage_spam.md" "b/R\303\251seaux/Filtrage_spam.md" new file mode 100644 index 0000000..6154ef3 --- /dev/null +++ "b/R\303\251seaux/Filtrage_spam.md" @@ -0,0 +1,133 @@ +# Importance du filtrage de spam dans les services de messagerie +Malgré la diminution des courriers indésirables ces dernières années (de +- 90% à +- 50% des mails), la quantitée de courrier indésirable reste un problème. C'est pourquoi il est essentiel de setup des mécanismes de filtrage qui vont être efficaces pour avoir une expérience utilisateur positive mais aussi pour protéger les utilisateurs contres les menaces du spam. + +![Diminution_spam](https://www.altospam.com/actualite/wp-content/img/2019/05/stats-spam-05-2019-1024x667.png) + +Le spam se réfère aux messages généralement commerciaux qui sont envoyés par grand nombre à beaucoup d'utilisateurs en même temps. Ils peuvent inclure de la pub, des offres frauduleuses, escroqueries, contenir des logiciels malveillants ou encore des liens vers de sites web dangereux. + +C'est la raison pour laquelle le filtrage de spam est un "outil" essentiel des services de messagerie. Il cherche en fait à indentifier et à séparer les e-mails habituels des courriers indésirables, ce qui permet de cette manière aux utilisateurs de se focus sur les messages importants et éviter le spam de leur faire perdre du temps où encore d'être atteints par des mails contenant des menaces. + +# Les composants du système de messagerie et leur rôle dans le filtrage de spam + +## MUA (Mail User Agent) +Le MUA est le composant du système de messagerie qui permet aux utilisateurs d'accéder et rédiger un mail pour l'envoyer au MTA/MSA mais aussi à organiser les mails et intègre souvent des filtres de spam. + +### Interaction avec les filtres de spam +L'un de ses rôles est de travailler avec les filtres de spam pour aider à identifier et à gérer les e-mails indésirables. +Les MUA ont souvent des outils d'aide de filtrage de spam qui utilisent plusieurs techniques pour calculer la probabilité qu'un e-mail soit du spam. Ce n'est pas le MUA qui filtre les spams mais il utilise des techniques pour aider à filtrer les messages. +* L'analyse des en-têtes et contenus: +Les MUA scannent si demandé les en-têtes et les contenus des e-mails pour trouver des signes de spam. +Ca inclut des en-têtes de courrier électronique qui sont suspects, des liens ou images suspects, et même des mots qui sont souvent utilisé dans les spams. +* L'analyse des Black lists: +C'est l'utilisation des listes noires qui répertorient les IP ou les domaines connus pour envoyer du spam. +Les MUA peuvent consulter ces listes pour vérifier si l'expéditeur d'un e-mail est répertorié justement dans ces listes, ce qui peut contribuer à l'identification des spams. +* Règles de filtrage personnalisées: +Elles permettent aux utilisateurs de marquer et gérer les e-mails. Par exemple, l'utilisateur peut s'il le souhaite créer une règle/filtre pour marquer les mails provenant d'un adresse spécifique comme spam. + +L'utilisateur peut jouer un rôle important dans le filtre de spams parce-que il fournit des infos importantes aux filtres pour les aider à améliorer leurs critères de détection. Ils peuvent signaler les spams avec le MUA. + +## MSA (Mail Submission Agent) +Le MSA est le composant du système de messagerie responsable de la soumission des e-mails. Il intervient lorsqu'un utilisateur envoie un e-mail à partir de son MUA pour qu'il soit transmis aux destinataires. + +Même si le MSA est principalement chargé de la transmission des e-mails, il peut aussi jouer un rôle dans le filtrage de spam. + +### Techniques de filtrage de spam +Le MSA peut s'aider de techniques de filtrage de spam pour mesurer le danger des e-mails soumis avant de les transmettre aux destinataires (d'abord au MTA). +Ces techniques peuvent inclure l'analyse des en-têtes, du contenu et d'autres caractéristiques des e-mails pour détecter les signes de spam. Le MSA peut utiliser des mécanismes tels que les listes noires, les règles de filtrage, l'analyse heuristique et d'autres méthodes pour évaluer la chance qu'un e-mail soit du spam. + +### Validation des règles de filtre avant l'envoi des e-mails +Avant de transmettre les e-mails aux destinataires, le MSA peut valider les règles de filtrage de spam configurées. +Ces règles peuvent être données par l'administrateur du système de messagerie. Ils spécifient les critères à utiliser pour identifier les e-mails indésirables. Le MSA vérifie si les e-mails soumis sont OK par rapport aux critères donnés dans les règles de filtrage. Si un e-mail est identifié comme spam en fonction de ces règles, le MSA peut prendre le rejeter de l'e-mail et le placer dans le dossier de spam. + +## MTA (Mail Transfer Agent) +### Rôle dans le filtrage de spam +Le MTA joue un rôle dans le filtrage de spam lors de la transmission des e-mails. En fait, il est considéré comme l'élément le plus important du système de messagerie en ce qui concerne le filtrage de spam. + +Le principal rôle du MTA est de transférer les e-mails d'un serveur à un autre. Lorsqu'un e-mail est envoyé depuis le MUA (Mail User Agent) d'un expéditeur ou venant d'un MSA, il est responsable de son acheminement vers le MTA du destinataire. Cependant, avant de transmettre l'e-mail au destinataire, le MTA applique des techniques de filtrage de spam pour mesurer la qualité de l'e-mail. +### Utilisation de techniques de filtrage +Quand le MTA effectue le filtrage de spam lors de la transmission des e-mails, il peut utiliser plusieurs techniques pour évaluer la probabilité qu'un e-mail soit du spam. + +Quelques techniques et leur mécanisme : + +1. Filtres basés sur les politiques de sécurité : +Les politiques de sécurité sont les règles et les critères de filtrage à appliquer en fonction des préférences utilisateur. +Ces politiques peuvent être des règles comme l'interdiction d'e-mails venant de certaines adresses IP ou de domaines ou aussi le blocage de certains types de pièces jointes dangereuses ou encore l'exigence d'une authentification SPF ou DKIM pour vérifier l'origine des e-mails. + +2. Analyse heuristique : +C'est une technique de filtrage qui utilise des algorithmes d'apprentissage automatique pour détecter les spams. Comme vu précédemment, Le MTA peut analyser les caractéristiques des e-mails (mots-clés suspects, structures de phrases inhabituelles, liens ou d'images suspectes,...) et les comparer à des modèles de mails spam pour savoir si le mail est du spam ou non. + +3. Listes de réputation : +Les listes de réputation fournissent des infos sur la réputation du coup des expéditeurs en se basant sur des critères: l'historique de l'adresse IP, la conformité aux normes de messagerie, la fréquence de l'envoi de spam, etc... +Le MTA peut consulter ces listes pour savoir à quel point ou pas faire confiance à l'expéditeur. +Si l'expéditeur est enregistré comme ayant une mauvaise réputation en raison de l'envoi de spam, le MTA peut augmenter la chance que l'e-mail soit classé comme spam. + +4. Analyse de contenu et de structure : +Comme le MUA, Le MTA peut analyser le contenu et la structure des e-mails pour trouver des caractéristiques communes aux spams. L'analyse inclut en-têtes, mots-clés spécifiques, structures de phrases inhabituelles, des liens ou images suspects. + +5. Blacklist: +Lorsqu'un MTA reçoit un e-mail du MSA ou MUA, il peut vérifier ces listes noires pour voir si l'expéditeur ou l'adresse IP source de l'e-mail est répertorié. +Si oui ca indique que l'expéditeur est considéré comme non fiable ou a été signalé pour l'envoi de spam. +La présence d'une adresse IP ou d'un domaine dans une liste noire peut elle aussi déclencher plusieurs actions de filtrage, telles que le rejet pur et simple de l'e-mail, le marquage comme spam, ou une évaluation supplémentaire à l'aide d'autres techniques de filtrage. +Les listes noires peuvent venir de différentes sources comme par exemple les organisations spécialisées dans la lutte contre le spam, des fournisseurs d'accès Internet ou des initiatives communautaires. Il existe des listes noires publiques et privées. Les administrateurs de MTA peuvent choisir celles qu'ils souhaitent utiliser en fonction de ce qu'ils ont besoin et de leurs politiques de sécurité. + +6. Le filtrage bayésien: +Cette technique consiste à analyser le contenu des e-mails et à calculer la probabilité qu'ils soient des spams. Comment il fait, c'est assez simple: le MTA utilise un modèle de classification bayésienne déja entraîné. +Le modèle est construit en se basant sur pleins d'e-mails d'apprentissage préalablement catégorisés comme spams ou pas. +À partir de ces exemples, le MTA définit "les probabilités conditionnelles des différentes caractéristiques présentes dans les e-mails". + + +En utilisant ces techniques, le MTA est en position de détecter et bloquer les mails indésirables avant qu'ils n'atteignent le ou les destinataires finales. Cela contribue à maintenir la qualité et la sécurité du service de messagerie en empêchant le spam. + +## MDA (Mail Delivery Agent) +## Stockage des mails +Il joue aussi un rôle dans le filtrage de spam lors de la transmission des e-mails, ainsi que dans le stockage des e-mails. Une fois que les utilisateurs ont été définis, il est important de spécifier où et comment les e-mails sont stockés, de manière à ce que le MDA puisse y accéder pour les déposer. + +En ce qui concerne le stockage des e-mails, deux formats sont souvent utilisés: le format mbox et le format Maildir. + +Le format mbox est un format de boîte mail Unix, dans laquelle tous les e-mails sont concaténés dans un seul fichier. +Malheureusement ce format est vraiment pas pratique quand la boîte devient assez volumineuse parce-qu'il faut alors logiquement parcourir tout les fichiers pour accéder à un mail. +En plus, lorsqu'un e-mail est déposé ou consulté, le fichier doit être bloqué en écriture pour éviter les problèmes de cohérence. + +En revanche, le format Maildir a été proposé à l'origine pour le serveur QMail. Dans ce format, chaque e-mail est stocké dans un fichier différent et chaque message est placé dans un répertoire dédié. Contrairement au format mbox il est plus éfficace car il permet un accès individuel à chaque message sans avoir besoin de parcourir un fichier entier. +Cela facilite le traitement et la manipulation des e-mails, tout en offrant de meilleures performances en termes d'accès et de gestion des boîtes aux lettres. + +### Rôle dans le filtrage de spam +En ce qui concerne le filtrage de spam, le MDA peut aussi encore une fois appliquer des règles et des mécanismes de filtrage (analyse des en-têtes, du contenu et des caractéristiques des e-mails pour détecter les signes de spam) +Le MDA peut aussi interagir avec d'autres composants du système de messagerie dont MTA pour appliquer des stratégies de filtrage à différentes étapes du processus d'envoi de mails. + +## MRA (Mail Retrieval Agent) +### Interaction avec les filtres de spam lors de la récupération des e-mails par les utilisateurs + Lorsque le MRA récupère les e-mails du serveur de messagerie, il peut interagir avec le filtres de spam de la classification des e-mails en tant que spam ou non spam pour appliquer des règles de filtrage supplémentaires. + + +# SpamAssassin pour Bind9 +SpamAssassin est un en gros un outil de filtrage spam qui est open-source. +Il utilise plusieurs techniques pour analyser les e-mails et déterminer s'ils sont du spam ou non. Dont des règles préconfigurées, des algorithmes d'apprentissage automatique et d'autres méthodes. + +## Intégration de SpamAssassin avec Bind9 +L'intégration de SpamAssassin avec Bind9 peut se faire en configurant Bind9 pour consulter la base de données de réputation de SpamAssassin quand il reçoit une demande de livraison d'un e-mail. +Si l'adresse IP de l'expéditeur est répertoriée comme étant associée à du spam dans la base de données de réputation, Bind9 peut refuser la livraison de l'e-mail, empêchant de cette manière l'e-mail spam d'atteindre le serveur de messagerie. + +L'intégration se fait principalement au niveau du MTA et MDA. + +En ce qui concerne le MUA, la configuration de SpamAssassin peut varier. +Certains MUA peuvent avoir une intégration directe avec SpamAssassin, ce qui permet aux utilisateurs d'appliquer des règles de filtrage en plus au niveau du client pour marquer ou trier les e-mails en fonction de leur probabilité d'être du spam. + + +# Bibliographie +1. Oktey, [Statistiques sur les spams et le phishing, les virus et ransomwares et les publicités](https://www.globalsecuritymag.fr/Statistiques-sur-les-spams-et-le,20190603,87692.html), juin 2019, consulté le 26/05/2023 +2. Jyothiikaa Moorthy, [23 Email Spam Statistics to Know in 2023](https://www.mailmodo.com/guides/email-spam-statistics/), 24 Mars 2023, consulté le 26/05/2023 +3. Wikipedia, [Spam](https://fr.wikipedia.org/wiki/Spam), 4 avril 2023, consulté le 26/05/2023 +4. Wikipedia, [Email Spam](https://en.wikipedia.org/wiki/Email_spam), 9 février 2023, consulté le 26/05/2023 +5. Yevgen Tsvetukhin, [What is an MTA?](https://mailtrap.io/blog/mail-transfer-agent/), 28 octobre 2019, consulté le 26/05/2023 +6. The warmup inbox team, [MTA and spam](https://blog.warmupinbox.com/mail-transfer-agent/), 15 octobre 2021, consulté le 26/05/2023 +7. Emma, [Everything about spam filters](https://myemma.com/blog/everything-you-ever-wanted-to-know-about-spam-filters/), 2015, consulté le 26/05/2023 +8. Ivan LaBianca, [How spam filters work](https://www.theseventhsense.com/blog/how-spam-filters-work-and-how-to-stop-emails-going-to-spam), 4 mars 2022, consulté le 26/05/2023 +9. itDepartement, [How email filtering works](https://www.your-itdepartment.co.uk/knowledge-bank/how-email-filtering-works/), 5 aout 2019, consulté le 26/05/2023 +10. Wikipedia, [Maildir](https://fr.wikipedia.org/wiki/Maildir), 30 mars 2022, consulté le 26/05/2023 +11. Wikipedia, [Mbox](https://fr.wikipedia.org/wiki/Mbox), 12 février 2023, consulté le 26/05/2023 +12. Wikipedia, [Analyse heuristique](https://fr.wikipedia.org/wiki/Analyse_heuristique), 8 février 2021, consulté le 26/05/2023 +13. Ionos, [Email blacklist ou blocklist, tout sur la liste noire anti-spam](https://www.ionos.fr/digitalguide/email/securite-email/quest-ce-que-le-blacklisting/), 6 février 2023, consulté le 26/05/2023 +14. Maxime CHARLÈS, [Filtrage bayésien : technique pour lutter contre le SPAM](https://blog.provectio.fr/filtrage-bayesien-technique-pour-lutter-contre-le-spam/), 1er janvier 2018, consulté le 26/05/2023 +15. Wikipedia, [Filtrage bayésien du spam](https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam), 7 mars 2023, consulté le 26/05/2023 +16. Wikipedia, [SpamAssassin](https://fr.wikipedia.org/wiki/SpamAssassin), 16 mai 2023, consulté le 26/05/2023 \ No newline at end of file From 64c8de48a9d0035541b01b20f2ffa2a0e9e8e579 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 17:54:00 +0200 Subject: [PATCH 231/241] Update SSH.md Correction d'orthographe --- "S\303\251curit\303\251/SSH.md" | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index fd7080b..2330256 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -8,7 +8,7 @@ parent: Sécurité ![download](https://github.com/HaAymar/Wiki-TI/assets/71372488/d67e13d1-c6d2-4202-958a-9b9b8283d461) ## SSH c'est quoi -SSH (Secure Shell) : Protocole de communication sécurisé nécessitant un échange de clés de chiffrement en début de connexion pour assurer une communication protégée entre un client et un serveur distant. Il permet l'authentification sécurisée de l'utilisateur, le chiffrement des données transmises et l'exécution de commandes à distance. Le SSH est largement utilisé pour l'accès distant à des systèmes informatiques, offrant une connexion fiable et sécurisée pour des tâches telles que l'administration système, le transfert de fichiers et le tunneling de ports. +SSH (Secure Shell) : Protocole de communication sécurisé qui nécessite l'échange de clés de cryptage en début de connexion pour garantir une communication sécurisée entre un client et un serveur à distance. Il permet d'authentifier l'utilisateur en toute sécurité, de chiffrer les données transmises et d'exécuter des commandes à distance. SSH est très utilisé pour accéder à distance à des systèmes informatiques, qui fourni une connexion fiable et sécurisée pour des tâches comme l'administration du système, le transfert de fichiers et le tunnel de port. ## Protocoles SSH Il existe 2 principales protocole SSH: @@ -19,7 +19,7 @@ Il existe 2 principales protocole SSH: - SSH1 : C'est la première version du protocole SSH qui a été développée. Elle utilise principalement l'algorithme de chiffrement asymétrique RSA pour l'authentification et le chiffrement des données. Cependant, SSH1 a été largement remplacé par SSH2 en raison de problèmes de sécurité et de vulnérabilités connues. Il est recommandé d'éviter d'utiliser SSH1 et de privilégier SSH2. - SSH2 : C'est la version actuelle et largement utilisée du protocole SSH. Elle offre des améliorations significatives en termes de sécurité, de performances et de fonctionnalités. -### Fonction principale +### Fonctions principales du SSH - Authentification sécurisée - Chiffrement des données - Transfert de fichiers sécurisé @@ -34,13 +34,13 @@ L'utilisation de SSH peut se faire avec un logiciel PuTTY ou sur le terminal mac PuTTY est un client SSH gratuit et open-source largement utilisé pour se connecter à des serveurs distants en utilisant le protocole SSH. Il est principalement utilisé sur les systèmes Windows, mais il existe également des versions disponibles pour d'autres plateformes. -Utilisation de PuTTY s'effectue apres le telechargement de celui-ci [ici](https://www.putty.org/), apres il faudra selectionneé le protocole SSH, par defaut celui-ci est defini sur le port 22. +L'utilisation de PuTTY s'effectue après avoir téléchargé celui-ci [ici](https://www.putty.org/), après l'installation, il faudra sélectionner le protocole SSH. Par défaut, celui-ci est défini sur le port 22. Pour plus d'information vous pouvez consulter ce site en [cliquant ici](https://www.hostinger.fr/tutoriels/connexion-ssh-windows-putty) ![connect-config 399589842237e1bd21e24efe4d8052b5a5a77440462e3ab2f51a4c5019b74f19](https://github.com/HaAymar/Wiki-TI/assets/71372488/e1ffa45e-1abd-4610-bcfb-95f1a2fb9df6) ### Utilisation sur le terminal (Linux et MacOs) -Apres avoir ouvert le terminal, il existe plusieur commandes à effectuer pour se connecter en mode SSH : +Après avoir ouvert le terminal, il existe plusieur commandes à effectuer pour se connecter en mode SSH : - Connection SSH: ``` ssh username@hostname @@ -67,21 +67,20 @@ Pour la clé publique Enfin il faut copier cette clé publique dans le serveur distant. ## Les avantages pour l'utilisations de SSH -- Protection contre les attaques par force brute : SSH intègre des mécanismes de protection contre les attaques par force brute, ce qui signifie que si un attaquant essaie de deviner le mot de passe, le serveur SSH peut limiter le nombre de tentatives de connexion et bloquer automatiquement l'adresse IP source. +- Protection contre des attaques de force brutale : SSH intègre des mécanismes pour protéger contre les attaques de force brutale. c'est-à-dire que si un attaquant essaie de deviner le mot de passe, le serveur SSH limite le nombre de tentatives de connexion et bloque automatiquement l'adresse IP source. -- Tunneling sécurisé : SSH permet la création de tunnels sécurisés, ce qui signifie que le trafic réseau entre le client et le serveur peut être acheminé à travers un canal chiffré. Cela est particulièrement utile lorsque vous devez accéder à des services distants (tels que des bases de données) via des réseaux non sécurisés. +- Tunneling sécurisé. : SSH permet de créer des tunnels sécurisés, ce qui signifie que le trafic réseau entre le client et le serveur peut être acheminé par un canal crypté. Ceci est particulièrement utile lorsque vous avez besoin d'accéder à des services à distance (comme des bases de données) par l'intermédiaire de réseaux non sécurisés. -- Administration à distance : SSH facilite l'administration à distance des serveurs. Vous pouvez vous connecter à un serveur distant via SSH et exécuter des commandes, modifier des fichiers de configuration, gérer des utilisateurs, etc. Cela permet aux administrateurs système de gérer leurs systèmes à distance de manière sécurisée. +- Administration à distance : SSH permet de gérer facilement les serveurs à distance. Vous pouvez vous connecter à un serveur à distance par SSH et exécuter des commandes, éditer des fichiers de configuration, gérer les utilisateurs, etc. Ceci permet aux administrateurs système de gérer leurs systèmes à distance de façon sécurisée. -- Portabilité : SSH est un protocole standard et est largement pris en charge sur différentes plateformes, y compris Linux, macOS et Windows. Cela signifie que vous pouvez utiliser SSH pour vous connecter à des serveurs distants depuis différentes machines, indépendamment du système d'exploitation utilisé. +- Portabilité: SSH est un protocole standard et est largement soutenu sur diverses plates-formes, y compris Linux, macOS et Windows. Ceci signifie que vous pouvez utiliser SSH pour vous connecter à des serveurs distants à partir de différentes machines, peu importe le système d'exploitation utilisé. ## Bibliographie -1. https://www.hostinger.fr/tutoriels/connexion-ssh-windows-putty -2. https://docs.digitalocean.com/products/droplets/how-to/connect-with-ssh/putty/ -3. https://www.ibm.com/docs/fr/sia?topic=kbaula-enabling-rsa-key-based-authentication-unix-linux-operating-systems-2 -4. https://www.putty.org/ -5. https://www.paessler.com/it-explained/ssh -6. https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/ - +- [1] [Definition ssh](https://fr.wikipedia.org/wiki/Secure_Shell) Consulté le 24/05/2023 +- [2] [Fonctions principales](https://www.paessler.com/fr/it-explained/ssh) Consulté le 24/05/2023 +- [3] [Difference entre SSH1 et SSH2](https://waytolearnx.com/2017/12/difference-entre-ssh1-et-ssh2.html#:~:text=SSH2%20n'est%20plus%20un,chiffrer%20les%20flux%20de%20donn%C3%A9es) Consulté le 24/05/2023 +- [4] [Se connecter avec PuTTy](https://www.putty.org/](https://kinsta.com/fr/blog/se-connecter-via-ssh/) Consulté le 25/05/2023 +- [5] [Comment se connecter avec la clé SSH](https://lecrabeinfo.net/se-connecter-en-ssh-par-echange-de-cles-ssh.html)Consulté le 25/05/2023 +- [6] [Les avantages pour l'utilisations de SSH](https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/](https://www.paessler.com/fr/it-explained/ssh) Consulté le 26/05/2023 From 871a26eba3ca598b4583b62c7448b0105542ad56 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 17:54:51 +0200 Subject: [PATCH 232/241] Update SSH.md UPdate --- "S\303\251curit\303\251/SSH.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index 2330256..10fe393 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -80,7 +80,7 @@ Enfin il faut copier cette clé publique dans le serveur distant. - [2] [Fonctions principales](https://www.paessler.com/fr/it-explained/ssh) Consulté le 24/05/2023 - [3] [Difference entre SSH1 et SSH2](https://waytolearnx.com/2017/12/difference-entre-ssh1-et-ssh2.html#:~:text=SSH2%20n'est%20plus%20un,chiffrer%20les%20flux%20de%20donn%C3%A9es) Consulté le 24/05/2023 - [4] [Se connecter avec PuTTy](https://www.putty.org/](https://kinsta.com/fr/blog/se-connecter-via-ssh/) Consulté le 25/05/2023 -- [5] [Comment se connecter avec la clé SSH](https://lecrabeinfo.net/se-connecter-en-ssh-par-echange-de-cles-ssh.html)Consulté le 25/05/2023 -- [6] [Les avantages pour l'utilisations de SSH](https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/](https://www.paessler.com/fr/it-explained/ssh) Consulté le 26/05/2023 +- [5] [Comment se connecter avec la clé SSH](https://lecrabeinfo.net/se-connecter-en-ssh-par-echange-de-cles-ssh.html)Consulté le 25/05/2023) +- [6] [Les avantages pour l'utilisations de SSH](https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/](https://www.paessler.com/fr/it-explained/ssh) Consulté le 26/05/2023) From 11bcadf8fbe59c14a85cc2c570385a9e2e11a3d0 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 26 May 2023 17:57:10 +0200 Subject: [PATCH 233/241] Update SSH.md UPD --- "S\303\251curit\303\251/SSH.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index 10fe393..60d266f 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -79,8 +79,8 @@ Enfin il faut copier cette clé publique dans le serveur distant. - [1] [Definition ssh](https://fr.wikipedia.org/wiki/Secure_Shell) Consulté le 24/05/2023 - [2] [Fonctions principales](https://www.paessler.com/fr/it-explained/ssh) Consulté le 24/05/2023 - [3] [Difference entre SSH1 et SSH2](https://waytolearnx.com/2017/12/difference-entre-ssh1-et-ssh2.html#:~:text=SSH2%20n'est%20plus%20un,chiffrer%20les%20flux%20de%20donn%C3%A9es) Consulté le 24/05/2023 -- [4] [Se connecter avec PuTTy](https://www.putty.org/](https://kinsta.com/fr/blog/se-connecter-via-ssh/) Consulté le 25/05/2023 -- [5] [Comment se connecter avec la clé SSH](https://lecrabeinfo.net/se-connecter-en-ssh-par-echange-de-cles-ssh.html)Consulté le 25/05/2023) -- [6] [Les avantages pour l'utilisations de SSH](https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/](https://www.paessler.com/fr/it-explained/ssh) Consulté le 26/05/2023) +- [4] [Se connecter avec PuTTy](https://kinsta.com/fr/blog/se-connecter-via-ssh/) Consulté le 25/05/2023 +- [5] [Comment se connecter avec la clé SSH](https://lecrabeinfo.net/se-connecter-en-ssh-par-echange-de-cles-ssh.html) Consulté le 25/05/2023 +- [6] [Les avantages pour l'utilisations de SSH](https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/) Consulté le 26/05/2023 From b788fad8e4fac8125a9c7930a9cb5317881780b1 Mon Sep 17 00:00:00 2001 From: thePFLy <92318644+thePFLy@users.noreply.github.com> Date: Wed, 31 May 2023 00:22:15 +0200 Subject: [PATCH 234/241] Update Filtrage_spam.md bind9 -> postfix correction --- "R\303\251seaux/Filtrage_spam.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/R\303\251seaux/Filtrage_spam.md" "b/R\303\251seaux/Filtrage_spam.md" index 6154ef3..9f03781 100644 --- "a/R\303\251seaux/Filtrage_spam.md" +++ "b/R\303\251seaux/Filtrage_spam.md" @@ -100,13 +100,13 @@ Le MDA peut aussi interagir avec d'autres composants du système de messagerie d Lorsque le MRA récupère les e-mails du serveur de messagerie, il peut interagir avec le filtres de spam de la classification des e-mails en tant que spam ou non spam pour appliquer des règles de filtrage supplémentaires. -# SpamAssassin pour Bind9 +# SpamAssassin pour Postfix SpamAssassin est un en gros un outil de filtrage spam qui est open-source. Il utilise plusieurs techniques pour analyser les e-mails et déterminer s'ils sont du spam ou non. Dont des règles préconfigurées, des algorithmes d'apprentissage automatique et d'autres méthodes. -## Intégration de SpamAssassin avec Bind9 -L'intégration de SpamAssassin avec Bind9 peut se faire en configurant Bind9 pour consulter la base de données de réputation de SpamAssassin quand il reçoit une demande de livraison d'un e-mail. -Si l'adresse IP de l'expéditeur est répertoriée comme étant associée à du spam dans la base de données de réputation, Bind9 peut refuser la livraison de l'e-mail, empêchant de cette manière l'e-mail spam d'atteindre le serveur de messagerie. +## Intégration de SpamAssassin avec Postfix +L'intégration de SpamAssassin avec Postfix peut se faire en configurant Postfix pour consulter la base de données de réputation de SpamAssassin quand il reçoit une demande de livraison d'un e-mail. +Si l'adresse IP de l'expéditeur est répertoriée comme étant associée à du spam dans la base de données de réputation, Postfix peut refuser la livraison de l'e-mail, empêchant de cette manière l'e-mail spam d'atteindre le serveur de messagerie. L'intégration se fait principalement au niveau du MTA et MDA. @@ -130,4 +130,4 @@ Certains MUA peuvent avoir une intégration directe avec SpamAssassin, ce qui pe 13. Ionos, [Email blacklist ou blocklist, tout sur la liste noire anti-spam](https://www.ionos.fr/digitalguide/email/securite-email/quest-ce-que-le-blacklisting/), 6 février 2023, consulté le 26/05/2023 14. Maxime CHARLÈS, [Filtrage bayésien : technique pour lutter contre le SPAM](https://blog.provectio.fr/filtrage-bayesien-technique-pour-lutter-contre-le-spam/), 1er janvier 2018, consulté le 26/05/2023 15. Wikipedia, [Filtrage bayésien du spam](https://fr.wikipedia.org/wiki/Filtrage_bay%C3%A9sien_du_spam), 7 mars 2023, consulté le 26/05/2023 -16. Wikipedia, [SpamAssassin](https://fr.wikipedia.org/wiki/SpamAssassin), 16 mai 2023, consulté le 26/05/2023 \ No newline at end of file +16. Wikipedia, [SpamAssassin](https://fr.wikipedia.org/wiki/SpamAssassin), 16 mai 2023, consulté le 26/05/2023 From a9153f5423d753e3340821cb3f9c235bc41a216e Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 2 Jun 2023 15:00:26 +0200 Subject: [PATCH 235/241] Correcting an article SSH to respond PR comments --- "S\303\251curit\303\251/SSH.md" | 37 ++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index 60d266f..3d3637a 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -50,22 +50,44 @@ Après avoir ouvert le terminal, il existe plusieur commandes à effectuer pour ### Comment se connecter avec la clé SSH ![61c1b963247368113bbeef17_Secure Shell work](https://github.com/HaAymar/Wiki-TI/assets/71372488/bf0ed866-8e78-43eb-ad93-4301dffc07b2) -Pour se connecter avec la clé ssh sur le serveur distant il faut creer la clé publique en suivant ces etapes: -- Creation d'une nouvelle clé sur le terminale: +Pour configurer l'authentification par clé SSH, vous devez prendre quelques étapes spécifiques. En premier lieu, vous avez besoin de générer une paire de clés publiques ou privées sur votre machine locale. Pour ce faire, il est possible d'utiliser l'utilitaire ssh-keygen en exécutant la commande suivante sur votre terminal: +- Creation d'une nouvelle clé sur le terminal: ``` ssh-keygen -t rsa ``` -En suite on suit les étapes en creant le passphrase par défaut le fichier pour la clé privé et publique doit se trouvé dans les fichiers. -Pour la clé privé +En suite on suit les étapes en creant le passphrase. Vous devrez ensuite préciser un emplacement pour sauvegarder la clé privée. Par défaut, elle est généralement sauvegardée dans le répertoire ~/.ssh/ avec le nom "id_rsa". Cliquez sur "Entrée" pour accepter l'emplacement par défaut. + +Vous devrez aussi définir un mot de passe afin de protéger la clé privée. Il est conseillé de choisir un mot de passe solide pour une sécurité optimale. +Pour la clé privéé +La clé privée est un fichier crucial pour l'authentification par clé SSH. Elle est générée sur votre machine locale et doit être gardée en sécurité. Voici l'emplacement de la clé privée: ``` -.ssh/id_rsa +cat ~/.ssh/id_rsa ``` Pour la clé publique +La clé publique est dérivée de la clé privée et doit être partagée avec les serveurs à distance auxquels vous voulez vous connecter. Voici comment obtenir la clé publique. + +Une fois que vous avez généré la clé privée avec la commande précédente avec "ssh-keygen", vous pouvez afficher la clé publique en exécutant la commande suivante avec ".pub" qui signifie "publique" ``` -.ssh/id_rsa.pub +cat ~/.ssh/id_rsa.pub +``` +La clé publique sera affichée dans votre terminal. Vous pouvez la copier intégralement. + +Après avoir généré votre clé privée et obtenu la clé publique, vous devez fournir la clé publique au serveur distant avec lequel vous souhaitez vous connecter. Généralement, le serveur SSH conserve la liste des clés publiques autorisées dans un fichier appelé "authorized_keys". + +Voici comment ajouter votre clé publique au fichier "authorized_keys" +1. Connectez-vous au serveur distant via SSH +``` +ssh username@IP_ADDRESS +``` + Ensuite entrez votre mot de passe.
+ +2. Une fois connecté, exécutez les commandes suivantes pour ajouter votre clé publique à l'authentification par clé +``` +mkdir -p ~/.ssh +echo "VOTRE_CLÉ_PUBLIQUE" >> ~/.ssh/authorized_keys ``` -Enfin il faut copier cette clé publique dans le serveur distant. +En suivant ces étapes, vous avez configuré SSH Key Authentication en utilisant les fichiers appropriés à l'emplacement correct.Ceci renforcera la sécurité de vos connexions SSH via une méthode d'authentification basée sur des clés asymétriques. ## Les avantages pour l'utilisations de SSH - Protection contre des attaques de force brutale : SSH intègre des mécanismes pour protéger contre les attaques de force brutale. c'est-à-dire que si un attaquant essaie de deviner le mot de passe, le serveur SSH limite le nombre de tentatives de connexion et bloque automatiquement l'adresse IP source. @@ -82,5 +104,6 @@ Enfin il faut copier cette clé publique dans le serveur distant. - [4] [Se connecter avec PuTTy](https://kinsta.com/fr/blog/se-connecter-via-ssh/) Consulté le 25/05/2023 - [5] [Comment se connecter avec la clé SSH](https://lecrabeinfo.net/se-connecter-en-ssh-par-echange-de-cles-ssh.html) Consulté le 25/05/2023 - [6] [Les avantages pour l'utilisations de SSH](https://www.opportunites-digitales.com/ssh-tout-ce-que-vous-devez-savoir/) Consulté le 26/05/2023 +- [7][Se connecter sur un serveur distant](https://www.hostinger.fr/tutoriels/generer-cle-ssh) Consulté le 02/06/2023 From ff5b8bbf6f66d65ba49a59e2849f64da6f64d3e0 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 2 Jun 2023 16:17:59 +0200 Subject: [PATCH 236/241] Resolving the article spamAssassin to respond PR comments --- "R\303\251seaux/SpamAssassin.md" | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git "a/R\303\251seaux/SpamAssassin.md" "b/R\303\251seaux/SpamAssassin.md" index 72e0366..2db76ed 100644 --- "a/R\303\251seaux/SpamAssassin.md" +++ "b/R\303\251seaux/SpamAssassin.md" @@ -84,6 +84,31 @@ Pour intégrer SpamAssassin dans les protocoles POP/IMAP, il faut suivre ces ét - Définissez des actions en fonction des résultats du filtrage (marquage, déplacement des e-mails indésirables). Il est possible de consulter la documaentation en suivant ce lien en cliquant [ici](https://doc.ubuntu-fr.org/serveur_mail_avec_postfix_et_courier-imap) +Aprés avoir fait tous ces étapes, vous pouvez commencer à intégrer SpamAssassin dans POP/IMAP en suivant les étapes suivantes: +1. À partir de votre serveur, ouvrez le fichier de configuration Dovecot sur votre serveur. Sur Ubuntu, le fichier de configuration principal de Dovecot se trouve généralement dans "/etc/dovecot/dovecot.conf" ou dans "/etc/dovecot/conf.d/10-mail.conf". +2. Cherchez la section dans le fichier de configuration Dovecot qui définit le protocole POP ou IMAP, en fonction de celui que vous souhaitez intégrer à SpamAssassin. +3. Ajouter les lignes de configuration suivantes dans la section correspondante afin de permettre le filtrage SpamAssassin : +- Pour POP3 +``` +mail_plugins = $mail_plugins antispam +pop3_uidl_format = %08Xu%08Xv +pop3_client_workarounds = outlook-no-nuls oe-ns-eoh +``` +- Pour IMAP: +``` +mail_plugins = $mail_plugins antispam +imap_client_workarounds = delay-newmail +``` +4. Cherchez la section qui définit les plugins dans le fichier de configuration de Dovecot et ajoutez la ligne suivante pour permettre le plugin antispam: +``` +mail_plugins = $mail_plugins antispam +``` +5. Enregistrer les changements dans le fichier de configuration Dovecot et redémarrer le service Dovecot afin d'appliquer les changements : +``` +service dovecot restart +``` +6. Assurez-vous que SpamAssassin est correctement intégré en envoyant un email de spam à une adresse hébergée sur votre serveur POP/IMAP. L'e-mail doit être signalé en tant que spam dans le dossier approprié. + Pour intégrer SpamAssassin dans SMTP, vous pouvez suivre les étapes suivantes : Pour faire la configuration, il faut ouvrir le fichier sur le serveur SMTP qui se trouve dans `/etc/postfix/main.cf` On ajoute une ligne : From 506ac8839ab84d4e6d51282650d0890987055b1f Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 2 Jun 2023 18:33:14 +0200 Subject: [PATCH 237/241] Correction d'orthographe --- "S\303\251curit\303\251/SSH.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index 3d3637a..3f150dd 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -25,7 +25,7 @@ Il existe 2 principales protocole SSH: - Transfert de fichiers sécurisé - Exécution de commandes à distance -## Utilisation du Sécure Shell +## Utilisation du Secure Shell Le Secure Shell (SSH) est couramment utilisé pour accéder de manière sécurisée à des systèmes distants et exécuter des commandes à distance. L'utilisation de SSH peut se faire avec un logiciel PuTTY ou sur le terminal macOs ou linux From b9174eaf061b10e31c310752800b2fd81ba87b4e Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 2 Jun 2023 18:55:28 +0200 Subject: [PATCH 238/241] Update SpamAssassin.md correcting errors --- "R\303\251seaux/SpamAssassin.md" | 33 ++++++++------------------------ 1 file changed, 8 insertions(+), 25 deletions(-) diff --git "a/R\303\251seaux/SpamAssassin.md" "b/R\303\251seaux/SpamAssassin.md" index 2db76ed..b37667b 100644 --- "a/R\303\251seaux/SpamAssassin.md" +++ "b/R\303\251seaux/SpamAssassin.md" @@ -8,8 +8,8 @@ parent: Réseau ![spam-assasin-logo-transparent](https://github.com/HaAymar/Wiki-TI/assets/71372488/1942bfb7-2f7b-4608-86ca-b60ff8112e35) -## Définission SpamAssassin -SpamAssassin est un logiciel de filtrage du courrier indésirable (spams) qui est trés utilisé, il analyse les en-têtes et le contenu des e-mails pour détecter les signes de spam. +## Définition SpamAssassin +SpamAssassin est un logiciel de filtrage du courrier indésirable (spams) qui est très utilisé, il analyse les en-têtes et le contenu des e-mails pour détecter les signes de spam. - Il utilise des listes noires pour identifier les expéditeurs et les serveurs de messagerie non fiables associés au spam - SpamAssassin peut également analyser les pièces jointes et les URL dans les e-mails pour détecter les contenus suspects - Il attribue des scores aux messages en fonction des règles et des analyses effectuées. @@ -53,7 +53,7 @@ Configuration pour le fichier ```/etc/default/spamassassin``` on place le CRON ``` CRON=1 ``` -Aprés indiquer à Postfix qu'on utilise SpamAssassin dans le fichier `/etc/postfix/master.cf`on ajoutant: +Après il faut indiquer à Postfix qu'on utilise SpamAssassin dans le fichier `/etc/postfix/master.cf`on ajoutant: ``` smtp inet n - - - - smtpd -o content_filter=spamassassin @@ -64,7 +64,7 @@ Et les deux lignes à la fin de ce même fichier: spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} ``` -En suite demarrer le SpamAssassin avec la commande: +Ensuite, il faut démarrer SpamAssassin avec la commande: ``` systemctl start spamassassin postfix reload @@ -74,17 +74,18 @@ postfix reload - [Utilisation SpamAssassin windows](https://cwiki.apache.org/confluence/display/spamassassin/UsingOnWindows) - [Utilisation SpamAssassin avec centOs](https://archives.microlinux.fr/spamassassin-centos-7/) -## Comment integrer SpamAssassin dans les protocoles POP/IMAP et SMTP +## Comment intégrer SpamAssassin aux serveurs POP/IMAP et SMTP -Pour intégrer SpamAssassin dans les protocoles POP/IMAP, il faut suivre ces étapes suivantes : +Pour intégrer SpamAssassin au serveur POP/IMAP, il faut suivre ces étapes suivantes : - Installez SpamAssassin sur la machine (voir l'étape précedente) - Configurez votre serveur de messagerie pour acheminer les e-mails via SpamAssassin. - Activez le support SpamAssassin dans la configuration du serveur de messagerie. - Configurez le serveur de messagerie pour appliquer les filtres SpamAssassin aux e-mails entrants. - Définissez des actions en fonction des résultats du filtrage (marquage, déplacement des e-mails indésirables). -Il est possible de consulter la documaentation en suivant ce lien en cliquant [ici](https://doc.ubuntu-fr.org/serveur_mail_avec_postfix_et_courier-imap) +Il est possible de consulter la documentation en suivant ce lien en cliquant [ici](https://doc.ubuntu-fr.org/serveur_mail_avec_postfix_et_courier-imap) Aprés avoir fait tous ces étapes, vous pouvez commencer à intégrer SpamAssassin dans POP/IMAP en suivant les étapes suivantes: + 1. À partir de votre serveur, ouvrez le fichier de configuration Dovecot sur votre serveur. Sur Ubuntu, le fichier de configuration principal de Dovecot se trouve généralement dans "/etc/dovecot/dovecot.conf" ou dans "/etc/dovecot/conf.d/10-mail.conf". 2. Cherchez la section dans le fichier de configuration Dovecot qui définit le protocole POP ou IMAP, en fonction de celui que vous souhaitez intégrer à SpamAssassin. 3. Ajouter les lignes de configuration suivantes dans la section correspondante afin de permettre le filtrage SpamAssassin : @@ -109,24 +110,6 @@ service dovecot restart ``` 6. Assurez-vous que SpamAssassin est correctement intégré en envoyant un email de spam à une adresse hébergée sur votre serveur POP/IMAP. L'e-mail doit être signalé en tant que spam dans le dossier approprié. -Pour intégrer SpamAssassin dans SMTP, vous pouvez suivre les étapes suivantes : -Pour faire la configuration, il faut ouvrir le fichier sur le serveur SMTP qui se trouve dans `/etc/postfix/main.cf` -On ajoute une ligne : -``` -content_filter = smtp:[127.0.0.1]:10025 -``` -On ajoute une nouvelle section pour définir le filtrage des e-mails avec SpamAssassin -``` -smtpd_proxy_filter = inet:127.0.0.1:10026 -``` -On enregistre les modifications et redémarrez le serveur SMTP pour appliquer la configuration -``` -systemctl restart postfix -``` -Enfin on démarre le démon SpamAssassin sur le port 10026 -``` -sudo spamd -d -c -m5 -H -s spamd -u spamd -x -r /var/run/spamd.pid -``` ## Conclusion SpamAssassin est une solution efficace et largement utilisée pour filtrer le courrier indésirable dans les services de messagerie. Avec son intégration transparente avec les protocoles POP, IMAP et SMTP, SpamAssassin offre une protection complète contre les spams, les e-mails malveillants et les menaces en ligne From 6c36418bef262e81a1bdf504706d53aaabfa8901 Mon Sep 17 00:00:00 2001 From: Aymar <71372488+HaAymar@users.noreply.github.com> Date: Fri, 2 Jun 2023 19:08:53 +0200 Subject: [PATCH 239/241] Update SSH --- "S\303\251curit\303\251/SSH.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/S\303\251curit\303\251/SSH.md" "b/S\303\251curit\303\251/SSH.md" index 3f150dd..96c2064 100644 --- "a/S\303\251curit\303\251/SSH.md" +++ "b/S\303\251curit\303\251/SSH.md" @@ -55,16 +55,16 @@ Pour configurer l'authentification par clé SSH, vous devez prendre quelques ét ``` ssh-keygen -t rsa ``` -En suite on suit les étapes en creant le passphrase. Vous devrez ensuite préciser un emplacement pour sauvegarder la clé privée. Par défaut, elle est généralement sauvegardée dans le répertoire ~/.ssh/ avec le nom "id_rsa". Cliquez sur "Entrée" pour accepter l'emplacement par défaut. +Ensuite, suivez les étapes. Vous devrez préciser un emplacement pour sauvegarder la clé privée. Par défaut, elle est généralement sauvegardée dans le répertoire ~/.ssh/ avec le nom "id_rsa". Cliquez sur "Entrée" pour accepter l'emplacement par défaut. -Vous devrez aussi définir un mot de passe afin de protéger la clé privée. Il est conseillé de choisir un mot de passe solide pour une sécurité optimale. -Pour la clé privéé -La clé privée est un fichier crucial pour l'authentification par clé SSH. Elle est générée sur votre machine locale et doit être gardée en sécurité. Voici l'emplacement de la clé privée: +Vous devrez aussi définir un mot de passe(passphrase) afin de protéger la clé privée. Il est conseillé de choisir un mot de passe solide pour une sécurité optimale. +### Clé privée +C'est un fichier crucial pour l'authentification par clé SSH. Elle est générée sur votre machine locale et doit être gardée en sécurité. Voici l'emplacement de la clé privée: ``` cat ~/.ssh/id_rsa ``` -Pour la clé publique -La clé publique est dérivée de la clé privée et doit être partagée avec les serveurs à distance auxquels vous voulez vous connecter. Voici comment obtenir la clé publique. +### Clé publique +Elle est dérivée de la clé privée et doit être partagée avec les serveurs à distance auxquels vous voulez vous connecter. Voici comment obtenir la clé publique. Une fois que vous avez généré la clé privée avec la commande précédente avec "ssh-keygen", vous pouvez afficher la clé publique en exécutant la commande suivante avec ".pub" qui signifie "publique" ``` From 20131944f91e1b66cd46c4e722fc5b1920ea063b Mon Sep 17 00:00:00 2001 From: Virginie Van den Schrieck Date: Wed, 3 Apr 2024 17:15:42 +0200 Subject: [PATCH 240/241] Update README.md Ajout d'un paragraphe sur l'intelligence artificielle --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc9bf1d..7a3aa2e 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,8 @@ Le Wiki TI est en français. Le français sera également la langue utilisée p - Date de consultation de la ressource (si ressource Web) - Un petit paragraphe résumant les informations que la ressource contient - Un avis critique sur la qualité de la ressource -- En cas de synthèse sur un sujet, le rédacteur indique soigneusement les ressources utilisées selon les pratiques bibliographiques habituelles, et référence la source de chaque information directement dans le texte (par ex : "Le DNS tourne par dessus UDP [3]" pour indiquer que cette information a été tirée de la troisième ressource de la bibliographie). En cas de citation / extrait, le rédacteur n'oublie bien entendu pas l'utilisation des guillements pour bien indiquer qu'il n'est pas l'auteur de l'élément de texte concerné. +- En cas de synthèse sur un sujet, le rédacteur indique soigneusement les ressources utilisées selon les pratiques bibliographiques habituelles, et référence la source de chaque information directement dans le texte (par ex : "Le DNS tourne par dessus UDP [3]" pour indiquer que cette information a été tirée de la troisième ressource de la bibliographie). En cas de citation / extrait, le rédacteur n'oublie bien entendu pas l'utilisation des guillements pour bien indiquer qu'il n'est pas l'auteur de l'élément de texte concerné. +- L'utilisation d'une **intelligence artificielle** est bien sûr possible, à condition que le texte produit soit majoritairement votre contribution, et à condition de le référencer explicitement et d'annexer les échanges avec le chatbot (prompts utilisés, résultats obtenus et comment ils ont été exploités, ...). From e7a2c8c5f7721cc4158c533b0437167c9f7f0be8 Mon Sep 17 00:00:00 2001 From: Justin Stas <73880234+Sleeeee@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:53:11 +0100 Subject: [PATCH 241/241] Add files via upload --- "S\303\251curit\303\251/TLS.md" | 109 ++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 "S\303\251curit\303\251/TLS.md" diff --git "a/S\303\251curit\303\251/TLS.md" "b/S\303\251curit\303\251/TLS.md" new file mode 100644 index 0000000..a95ad1e --- /dev/null +++ "b/S\303\251curit\303\251/TLS.md" @@ -0,0 +1,109 @@ +--- +layout: default +title: TLS +parent: Sécurité +--- + +# Transport Layer Security + +## Introduction +Transport Layer Security, ou TLS, a pour objectif de sécuriser les échanges effectués sur la couche transport. Il offre une surcouche à TCP, et permet aux protocoles applicatifs de bénéficier de conversations chiffrées de bout en bout [[1]](#bib1). Son cas d'utilisation le plus répandu est HTTPS (Hyper Text Transfer Protocol Secure), permettant la sécurité des opérations effectuées sur le web, mais TLS reste tout de même un standard populaire pour d'autres applications nécessitant un transport sécurisé, comme par exemple l'email, la messagerie, ou encore la téléphonie sur IP (VoIP). + +Voici les principales caractéristiques de TLS permettant d'assurer un transport des données de manière sécurisée : +- Chiffrement : protège la session grâce à une combinaison d'algorithmes symmétriques et asymmétriques, rendant les données inexploitables sans possession des clés cryptographiques. +- Authentification : permet d'assurer que les partis communiquants sont réellement qui ils prétendent être, grâce à des certificats TLS. +- Intégrité : vérifie la validité de chaque paquet grâce à son Message Authentication Code (MAC), permettant de détecter une altération ou perte de données. + +La première version de TLS a été initialement publiée en 1999 dans le [RFC 2246](https://datatracker.ietf.org/doc/html/rfc2246), et visait à succéder à SSL (Secure Sockets Layer), dont la dernière version, 3.0, a été dépréciée en 2015 ([RFC 7568](https://datatracker.ietf.org/doc/html/rfc7568)), pour des raisons d'obsolescence (insécurité, capacités limitées). + +La classification de TLS dans le modèle OSI est assez ambigüe en raison de ses caractéristiques. En effet, puisqu'il opère au dessus de TCP, il devrait se trouver dans une couche supérieure à la couche 4. Cependant, il transporte de manière fiable des données applicatives, cela pourrait définir un protocole de couche 4. En raison de ses objectifs de chiffrement, TLS est généralement classé dans la couche présentation [[2]](#bib2) [[3]](#bib3), responsable de la traduction des données. Notons cependant que le modèle OSI est plus complexe à appliquer dans ce cas-ci, et qu'il peut ne pas représenter la réalité qui est parfois impossible à généraliser. + +## Historique +Au début de l'ère d'Internet, les communications étaient effectuées en clair. De ce fait, des protocoles comme HTTP étaient extrêmement vulnérables, puisque les données étaient potentiellement exploitables par quiconque parvenait à mettre la main dessus. Il a fallu attendre le milieu des années 90 pour disposer de moyens permettant de sécuriser le traffic circulant sur Internet. + +### SSL 1.0 +En 1994, Netscape Communications s'apprêtait à publier la première version de son protocole Secure Sockets Layer, apportant une couche de sécurité au protocole TCP. Cependant, des vulnérabilités critiques ont rapidement été détectées, et cette version 1.0 n'a jamais été publiée. + +> "The actual history of SSL was that SSL 1.0 was so bad that Alan Schiffman and myself broke it in ten minutes when Marc Andressen presented it at the MIT meeting." [Phillip Hallam-Baker](https://en.wikipedia.org/wiki/Phillip_Hallam-Baker) [[4]](#bib4) + +### SSL 2.0 +En 1995, le protocole SSL a enfin été rendu disponible au public avec la version 2.0, et a servi de base à l'arrivée de la sécurité sur le web, avec la sortie du protocole HTTPS. Malheureusement, comme pour la version 1.0, des failles de sécurités ont rapidement été détectées dans SSLv2, comme par exemple de faibles algorithmes de chiffrement, ou bien une grande vulnérabilité aux attaques de type Man-In-The-Middle (interception du flux de données, permettant de prendre possession des clés, et donc de déchiffrer l'information). Ces raisons ont mené à sa dépréciation en 2011 ([RFC 6176](https://www.rfc-editor.org/rfc/rfc6176)). + +### SSL 3.0 +Les défauts des précédentes versions de SSL ont nécessité une reconception intégrale du protocole. C'est en 1996 que la version 3.0 voit le jour. Cette dernière, plus robuste, a été largement employée pendant des années. Certaines failles ont été détectées au fil du temps ([BEAST](https://learn.microsoft.com/en-us/archive/blogs/kaushal/taming-the-beast-browser-exploit-against-ssltls), [BREACH](https://www.breachattack.com/)), et c'est en 2014 que la découverte de l'attaque POODLE ([CVE 2014-3566](https://nvd.nist.gov/vuln/detail/CVE-2014-3566)) a officiellement mis un terme à la pertinence de SSLv3, qui a été déprécié en 2015 ([RFC 7568](https://www.ietf.org/rfc/rfc7568)). + +### TLS 1.0 +En janvier 1999, l'IETF (Internet Engineering Task Force) a inauguré la première version de TLS ([RFC 2246](https://datatracker.ietf.org/doc/html/rfc2246)), visant à succéder à SSL. Bien que TLS se base sur les spécifications du protocole SSL de Netscape, et les deux protocoles étant globalement assez similaire, l'apport principal de cette refonte intégrale est le passage vers un standard beaucoup plus libre. Il a été déprécié en 2021 ([RFC 8996](https://datatracker.ietf.org/doc/html/rfc8996)) + +### TLS 1.1 +Cette révision ([RFC 4346](https://datatracker.ietf.org/doc/html/rfc4346)) de TLS 1.0, datant de 2006, apporte des améliorations de sécurité et d'autres rectifications mineures. La vulnérabilité principale à l'origine de ce patch concernait le CBC (Cipher Block Chaining), mécanisme de défense dont la valeur pouvait être prédite, autorisant donc des attaques. TLS 1.1 a également été déprécié en 2021 par le [RFC 8996](https://datatracker.ietf.org/doc/html/rfc8996). + +### TLS 1.2 +En 2008, la version 1.2 de TLS a été publiée ([RFC 5246](https://datatracker.ietf.org/doc/html/rfc5246)). Cette dernière visait à améliorer la complexité cryptographique du protocole, notamment par une migration de certaines étapes de chiffrement de MD5/SHA-1 vers d'autres alternatives beaucoup plus puissants comme SHA-256. La négociation des algorithmes de chiffrement a également été améliorée. + +Depuis sa publication initiale, TLS 1.2 a subi des améliorations visant à conserver sa pertinence dans le temps ([RFC 6176](https://datatracker.ietf.org/doc/html/rfc6176), [RFC 8446](https://datatracker.ietf.org/doc/html/rfc8446#section-1.3)). TLS 1.2 est aujourd'hui la plus ancienne version encore supportée (99.9% en date du 02 mai 2024 [[5]](#bib5)), et sa dépréciation n'a pas encore été prévue. + +### TLS 1.3 +En août 2018, le [RFC 8446](https://datatracker.ietf.org/doc/html/rfc8446) annonce l'arrivée de TLS 1.3, avec un grand nombre d'améliorations, notamment : +- La dépréciation d'un bon nombre d'algorithmes de chiffrement (MD5, SHA-224, ...) et fonctionnalités (compression, renégociation) devenus obsolètes +- La séparation des mécanismes d'authentification et d'échange de clés au niveau des cipher suites (ensemble prédéfini d'algorithmes de chiffrement [[6]](#bib6)) +- L'instauration du mode [0-RTT](https://techdocs.akamai.com/property-mgr/docs/early-data-0rtt) (Zero Round-Trip Time) permettant au client récemment authentifié d'envoyer des paquets de données pendant l'initialisation de la session TLS ([handshake](#tls-handshake)). Cette addition élimine la nécessité d'attendre la réponse du serveur avant de commencer l'émission de données, mais le protocole devient alors sensible à de potentielles attaques Replay (duplication de paquets). + +TLS 1.3 est aujourd'hui la version la plus récente et robuste du protocole. Cette dernière est supportée à 70.1% en date du 02 mai 2024 [[5]](#bib5). Aujourd'hui, elle ne supporte que des algorithmes dont aucune vulnérabilité n'est connue. Malheureusement, il n'est pas à écarter l'option que des failles soient découvertes, et que TLS 1.3 devienne obsolète. + +## Fonctionnement +L'échange TLS est caractérisé par deux phases : +- La poignée de main/handshake, servant à initier la session, lors de laquelle le serveur procure son certificat permettant de vérifier son identité +- Le transfert de données chiffrées sous forme de Records, et dont l'intégrité et l'authenticité sont assurées par un Message Authentication Code (MAC) + +### Certificats +Pour parvenir à communiquer via TLS, un serveur a besoin d'une preuve d'identité, permettant au client de s'assurer que son interlocuteur est réellement qui il prétend être. Pour cela, TLS emploie des certificats (SSL en utilisait également, d'où la persistence de l'expression SSL certificate). + +Les certificats sont générés par des autorités tierces (Certificate Authorities ou CA) telles que [Let's Encrypt](https://letsencrypt.org/) ou [GlobalSign](https://www.globalsign.com), et octroyés après validation de l'authenticité du demandant. Un certificat contient des champs tels que le nom de domaine, la CA correspondante et sa signature, et une clé publique [[7]](#bib7) . + +Bien que principalement utilisés par les serveurs, les certificats TLS existent également pour les clients. Leur objectif d'authentification reste le même, et ils peuvent être utilisés notamment lorsqu'un serveur souhaite restreindre l'accès à des clients vérifiés, de manière plus sécurisée qu'un simple mot de passe. + +###
Handshake + +L'initialisation de la session TLS est représentée par une four-way handhsake (poignée de main en quatre étapes). Elle a pour objectifs de négocier les algorithmes de chiffrement utilisés lors de la session, de valider l'authenticité du serveur (grâce à son certificat), et d'assurer l'échange des clés cryptographiques qui seront utilisées lors du transfert de données [[8]](#bib8) [[9]](#bib9) . Voici les échanges effectués lors cette four-way handshake : +1. ClientHello : Le client débute la conversation par un message ClientHello, contenant des informations telles que sa version de TLS, un nombre aléatoire qui servira à générer les clés de session et une cipher suite (liste ordonnée d'algorithmes supportés pour les différentes étapes de la conversation). +2. ServerHello / Certificate : Le serveur analyse le ClientHello et choisit la plus récente version de TLS supportée, une cipher suite correspondant à la proposition du client, et génère à son tour un nombre aléatoire. Il envoie également son certificat pour prouver son identité, ainsi qu'un ServerKeyExchange (si demandé par l'algorithme sélectionné pour l'échange de clés). +3. ClientKeyExchange / Finished : Le client envoie un message permettant l'échange de clés et un Finished indiquant qu'il est prêt à échanger de l'information chiffrée sous forme de Records. +4. Finished : Le serveur répond à son tour avec un Finished. Tout échange ultérieur nécessitera les clés cryptographiques pour être déchiffré. + +Notons que les étapes de la poignée de main son sujettes à plusieurs variantes. Par exemple, certains environnements nécessitent aussi une authentification du client (via son propre certificat) , et/ou le premier record pourrait être réceptionné avant le ServerHello si la mécanique 0-RTT est activée. + +Comme expliqué ci-dessus, plusieurs clés interviennent lors de la four-way handshake. Voici de brèves explications pour clarifier la terminologie employée dans le cadre de TLS : +- Clé publique : Il s'agit de la clé contenue dans le certificat du serveur, et est accessible à tout le monde. +- Clé privée : Seul le serveur possède cette clé qui lui a été conférée lors de la création de son certificat. Il l'utilise pour déchiffrer les messages chiffrés par sa clé publique. Elle n'a d'utilité que lors de la poignée de main qui permet de générer d'autres clés. +- Pre-Master Secret : Cette information est calculée grâce à une combinaison du ServerKeyExchange (si l'algorithme le demande), du ClientKeyExchange et de la clé publique. +- Master Secret : Cette clé est dérivée sur base du Pre-Master-Secret grâce à une PRF (Pseudo Random Function). La dérivation a pour objectif d'améliorer la sécurité cryptographique des clés, mais également d'assurer l'unicité du Master Secret pour chaque session. +- Clés de session : Le serveur et le client partagent une paire de clés symmétriques (deux clés identiques), qu'ils utilisent à la fois pour chiffrer et déchiffrer les Records. Elles sont générées par dérivation du Master Secret par une PRF, utilisant les nombres aléatoires partagés par le client et le serveur pour assurer des clés uniques en cas de Master Secret identique (reprise de connexion). + +### Message Authentication code (MAC) +Une fois que la session est initiée, le client et le serveur peuvent à présent envoyer et recevoir des données. Pour vérifier la validité de l'information, chaque Record sera accompagné d'un code d'authentification ou MAC. Lorsque le récepteur reçoit le message, il aura comme tâche de calculer son MAC en employant sa clé de session, afin d'assurer qu'il correspond à celui inclus dans le Record. + +Les deux partis doivent se mettre d'accord sur la méthode employée pour calculer les MAC. En effet, l'ordre des opérations à effectuer diffère pour les algorithmes MAC-then-Encrypt (d'abord calculer le MAC) et Encrypt-then-MAC (d'abord chiffrer le message). Notons qu'avec MAC-then-Encrypt, si le MAC n'est pas valide (pour quelconque raison), le récepteur aura effectué deux opérations avant de se débarasser du message. Encrypt-then-MAC propose une solution permettant d'écarter directement les Records altérés [[8]](#bib8) . + +## Alternatives +TLS est naturellement un standard très répandu dans le domaine des échanges applicatifs chiffrés. Cependant, il existe plusieurs alternatives permettant de répondre à des besoins similaires ou légèrement différents. En voici une liste non exhaustive : +- DTLS, Datagram Transport Layer Security (initialement décrit dans [RFC 4347](https://www.rfc-editor.org/rfc/rfc4347)) : tourne sur UDP, et offre donc un support pour différents protocoles applicatifs tels que SIP (Session Initiation Protocol) qui est utilisé notamment pour la VoIP et la communication vidéo. +- QUIC : protocole développé par Google pour permettre à HTTP de tourner par dessus UDP, utilisant un chiffrement similaire à TLS, et permettant de limiter la quantité d'information nécessaire à établir la connexion (assez lourde avec TCP). +- SSH, Secure Shell (initialement décrit dans [RFC 4253](https://datatracker.ietf.org/doc/html/rfc4253)) : protocole offrant un canal de communication sécurisé dans un environnement distant non sécurisé, dont les cas d'utilisation sont assez distincts de TLS, mais ayant recours à des méthodes très similaires pour atteindre ses objectifs. + +Ces protocoles, mais également bien d'autres plus ou moins répandus, permettent d'assurer différents types de communication de manière sécurisée. Notons qu'aucun n'a réellement pour objectif de remplacer TLS, qui dispose de ses cas d'usage bien définis, mais plutôt d'étendre les possibilités pour couvrir un maximum de cas de figure, et ainsi procurer des options sécurisées quels que soient les besoins de l'application. + +## Bibliographie +- [TLS Basics](https://www.internetsociety.org/deploy360/tls/basics/) [1], Internet Society, consulté le 10/12/2024 +- [A high level view of TLS/SSL](https://www.ibm.com/docs/en/informix-servers/15.0.0?topic=tls-high-level-view-tlsssl) [2], IBM, dernière modification le 19/11/2024, consulté le 10/12/2024 +- [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security) [3], Wikipedia, dernière modification le 12/12/2024, consulté le 12/12/2024 +- [Crypto Standards v.s. Engineering habits](https://www.metzdowd.com/pipermail/cryptography/2013-October/018041.html) [4], Phillip Hallam-Baker, 04/10/2010, consulté le 11/12/2024 +- [SSL Pulse](https://www.ssllabs.com/ssl-pulse/) [5], Qualys Inc, 02/05/2024, consulté le 11/12/2024 +- [What are cipher suites?](https://www.networking4all.com/en/support/faq/what-are-cipher-suites) [6], Networking4all, consulté le 11/12/2024 +- [What is an SSL/TLS Certificate?](https://aws.amazon.com/what-is/ssl-certificate/) [7], Amazon Web Services Inc, consulté le 11/12/2024 +- [Computer Networking : Principles, Protocols and Practice](https://beta.computer-networking.info/syllabus/default/protocols/tls.html) [8], Olivier Bonaventure, dernière modification le 12/12/2024, consulté le 12/12/2024 +- [What happens during a TLS handshake?](https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/) [9], Cloudflare Inc, consulté le 12/12/2024 +- [SSL and TLS Protocols](https://wiki.openssl.org/index.php/SSL_and_TLS_Protocols), OpenSSL, dernière modification le 27/06/2017, consulté le 12/12/2024 +- [The Illustrated TLS Connection](https://tls12.xargs.org/), consulté le 12/12/2024 +- [The POODLE Attack and the End of SSL 3.0](https://blog.mozilla.org/security/2014/10/14/the-poodle-attack-and-the-end-of-ssl-3-0/), Richard Barnes (Mozilla Corporation), dernière modification le 14/10/2014, consulté le 11/12/2024 +- [What is TLS (Transport Layer Security)?](https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/), Cloudflare Inc, consulté le 11/12/2024