Commit c7b03fdd authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

update securité logicielle

parent f27ba4e7
...@@ -12,6 +12,19 @@ git submodule update --recursive --remote ...@@ -12,6 +12,19 @@ git submodule update --recursive --remote
bash develop_server.sh start bash develop_server.sh start
``` ```
## faire tourner les slides en local
```bash
cd content && npm install
```
```bash
<VirtualHost *:80>
DocumentRoot "/opt/lampp/htdocs/limos/content"
ServerName slides
</VirtualHost>
```
## see also ## see also
* [https://limos.isima.fr/~mazenod/blog-et-pages-perso-au-limos.html](https://limos.isima.fr/~mazenod/blog-et-pages-perso-au-limos.html) * [https://limos.isima.fr/~mazenod/blog-et-pages-perso-au-limos.html](https://limos.isima.fr/~mazenod/blog-et-pages-perso-au-limos.html)
Title: ZZ2 F5 Privacy & Crypto Title: ZZ2 F5 - Securité logicielle (1/2) - Privacy & Crypto
Date: 2018-02-16 10:55 Date: 2019-11-16 10:55
Category: <i class='fa fa-graduation-cap' aria-hidden='true'></i> &Eacute;tudiants Category: <i class='fa fa-graduation-cap' aria-hidden='true'></i> &Eacute;tudiants
Tags: cours Tags: cours
...@@ -21,13 +21,13 @@ Tags: cours ...@@ -21,13 +21,13 @@ Tags: cours
* [tls](slides/privacy/tls.html) * [tls](slides/privacy/tls.html)
* [pgp](slides/privacy/pgp.html) * [pgp](slides/privacy/pgp.html)
* [tls vs pgp](slides/privacy/TLSvsPGP.html) * [tls vs pgp](slides/privacy/TLSvsPGP.html)
* [tor](slides/privacy/tor.html) * [tor](slides/privacy/tor.html) / [tor pour les moldus](slides/privacy/tor_lite.html)
* [bitcoin](slides/privacy/bitcoin.html) * [bitcoin](slides/privacy/bitcoin.html)
## Evaluation ## Evaluation
* Examen écrit en fin de session (/10) * Examen écrit en fin de session
## Environnement de TP ## Environnement de TP
...@@ -35,22 +35,22 @@ Tags: cours ...@@ -35,22 +35,22 @@ Tags: cours
### déployer et configurer TLS avec Apache ### déployer et configurer TLS avec Apache
* ... * [https://gitlab.isima.fr/vimazeno/tp-www-ssl](https://gitlab.isima.fr/vimazeno/tp-www-ssl)
## Mini projet en binôme (/10) ## Mini projet en binôme
* Donnez une manière de générer un [QR-code permettant d'importer directement une clé publique PGP avec OpenKeyChain](https://github.com/open-keychain/open-keychain/wiki/QR-Codes) (5 points) * Donnez une manière de générer un [QR-code permettant d'importer directement une clé publique PGP avec OpenKeyChain](https://github.com/open-keychain/open-keychain/wiki/QR-Codes)
* listez les outils utilisés * listez les outils utilisés
* détaillez les commandes à effectuer pour passer de la clé publique au QR-Code * détaillez les commandes à effectuer pour passer de la clé publique au QR-Code
* détaillez comment vous avecz tester le contenu de votre QR-Code * détaillez comment vous avecz tester le contenu de votre QR-Code
* joignez le QR-Code de votre clé PGP au message * joignez le QR-Code de votre clé PGP au message
* Publiez votre clé PGP sur https://pgp.mit.edu puis envoyez moi l'url de votre clé (1 point) * Publiez votre clé PGP sur https://pgp.mit.edu puis envoyez moi l'url de votre clé
* Signez ma clé PGP isima https://fc.isima.fr/~mazenod/pages/pgp.html ou https://pgp.mit.edu/pks/lookup?op=vindex&search=0x408A4E510DCD0D14 et envoyez là moi en pièce jointe de votre message (2 points) * Signez ma clé PGP isima https://fc.isima.fr/~mazenod/pages/pgp.html ou https://pgp.mit.edu/pks/lookup?op=vindex&search=0x408A4E510DCD0D14 et envoyez là moi en pièce jointe de votre message (2 points)
* Votre message devra être chiffré, signé et comporter votre clé publique en pièce jointe (2 points) * Votre message devra être chiffré, signé et comporter votre clé publique en pièce jointe
* Rendu le 26/03/2018 à 23h59 dernier délais * Rendu le 25/03/2019 à 23h59 dernier délais
* à [vincent.mazenod@isima.fr](mailto:vincent.mazenod@isima.fr) * à [vincent.mazenod@uca.fr](mailto:vincent.mazenod@uca.fr)
* ```[TP privacy crypto]``` dans le sujet du mail ... sinon je vous perds ;) * ```[TP privacy crypto]``` dans le sujet du mail ... sinon je vous perds ;)
...@@ -58,6 +58,4 @@ Tags: cours ...@@ -58,6 +58,4 @@ Tags: cours
## Evaluation du cours ## Evaluation du cours
Vous avez aimé ou vous avez détesté ce cours ... donnez moi votre avis et aidez moi à l'améliorer (en tout anonymat) Vous avez aimé ou vous avez détesté ce cours ... [donnez moi votre avis et aidez moi à l'améliorer (en tout anonymat)](https://docs.google.com/forms/d/1w65KH2cnL_DbTKrUT-2AMvQ_p0Ht-wfSJT2YLEB8l7E/prefill)
https://docs.google.com/forms/d/e/1FAIpQLSeiJQZRjRmiP2_oH30fx3_n7lLfdmEmGFgDqsdkvF-4IYsZRA/viewform
Title: ZZ2 F5 WebSec Title: ZZ2 F5 - Securité logicielle (2/2) - sécurité des applications web
Date: 2017-11-20 10:55 Date: 2019-11-20 10:55
Category: <i class='fa fa-graduation-cap' aria-hidden='true'></i> &Eacute;tudiants Category: <i class='fa fa-graduation-cap' aria-hidden='true'></i> &Eacute;tudiants
Tags: cours Tags: cours
...@@ -7,15 +7,9 @@ Tags: cours ...@@ -7,15 +7,9 @@ Tags: cours
## Plan du cours ## Plan du cours
* Introduction
* [Contexte](https://doc.m4z3.me/_/1337/contexte.htm)
* [Cadre juridique](https://doc.m4z3.me/_/1337/droit.htm)
* Architecture * Architecture
* [HTTP](https://doc.m4z3.me/_/1337/HTTP.htm) * [HTTP](slides/1337/http.htm)
* [TLS/SSL](https://doc.m4z3.me/_/1337/TLS.htm)
* Pentesting * Pentesting
...@@ -224,15 +218,17 @@ Ce bug est dû à la numérotation fantaisiste d'Ubuntu des interfaces réseau . ...@@ -224,15 +218,17 @@ Ce bug est dû à la numérotation fantaisiste d'Ubuntu des interfaces réseau .
## Evaluation ## Evaluation
* Examen écrit en fin de session (/10) * Examen écrit en fin de session
## Mini projet en binôme ## Mini projet en binôme
* [Enoncé](https://drive.mesocentre.uca.fr/f/55715c2cdd44476fbb6f/?dl=1) * [Enoncé](https://drive.mesocentre.uca.fr/f/d9e76a8e45934a069890/?dl=1)
<!-- * [Enoncé](https://drive.mesocentre.uca.fr/f/54bdd1a80c184bbcb63e/?dl=1) -->
* Rendu le 26/03/2018 à 23h59 dernier délais * Rendu le 25/03/2019 à 23h59 dernier délais
* à [vincent.mazenod@isima.fr](mailto:vincent.mazenod@isima.fr) * à [vincent.mazenod@uca.fr](mailto:vincent.mazenod@uca.fr)
* ```[TP websec]``` dans le sujet du mail ... sinon je vous perds ;) * ```[TP websec]``` dans le sujet du mail ... sinon je vous perds ;)
...@@ -240,9 +236,8 @@ Ce bug est dû à la numérotation fantaisiste d'Ubuntu des interfaces réseau . ...@@ -240,9 +236,8 @@ Ce bug est dû à la numérotation fantaisiste d'Ubuntu des interfaces réseau .
## Evaluation du cours ## Evaluation du cours
Vous avez aimé ou vous avez détesté ce cours ... donnez moi votre avis et aidez moi à l'améliorer (en tout anonymat) Vous avez aimé ou vous avez détesté ce cours ... [donnez moi votre avis et aidez moi à l'améliorer (en tout anonymat)](https://docs.google.com/forms/d/1w65KH2cnL_DbTKrUT-2AMvQ_p0Ht-wfSJT2YLEB8l7E/prefill)
https://docs.google.com/forms/d/e/1FAIpQLSdt93c8g306J60v2ANMCzVajo00udaFJApaGWt_TSugshbBmw/viewform
## See also ## See also
......
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>HTTP</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? '../../node_modules/reveal.js/css/print/pdf.css' : '../../node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown="md/http.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
// More info about config & dependencies:
// - https://github.com/hakimel/reveal.js#configuration
// - https://github.com/hakimel/reveal.js#dependencies
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: false,
dependencies: [
{ src: '../../node_modules/reveal.js/plugin/markdown/marked.js' },
{ src: '../../node_modules/reveal.js/plugin/markdown/markdown.js',
condition: function() { return !!document.querySelector( '[data-markdown]' ); },
callback: function() {
Array.prototype.forEach.call(document.querySelectorAll('section > li'), function(ele){
var fragIndex = ele.innerHTML.indexOf("--")
if (fragIndex != -1){
ele.innerHTML = ele.innerHTML.replace("--", "");
ele.className = 'fragment';
}
});
}
},
{ src: '../../node_modules/reveal.js/plugin/notes/notes.js', async: true },
{ src: '../../node_modules/reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
});
</script>
</body>
</html>
![alt text](images/http/http-slash-slash.png "http slash slash")
## client / serveur
![alt text](images/http/client-serveur.png "Client Serveur")
# HTTP
* le serveur est typiquement un __serveur web__
* le truc est typiquement une _ressource_ associée a une __URI__
* le client est typiquement
* un __navigateur web__
* une __web app__
* un __objet connecté__
* __n'importe quoi__ qui consomme de l'API...
# HTTP
* inventé par [Tim Berners-Lee](http://fr.wikipedia.org/wiki/Tim_Berners-Lee) en 1989
* en [version 1.1](https://www.ietf.org/rfc/rfc2616.txt) depuis 1999
* version 2.0 en cours de standardisation
* basée sur [SPDY](http://fr.wikipedia.org/wiki/SPDY) de Google
Note:
- périmètre de sécurité élargi browser / responsive / web app / API -> installé sur les mobiles
- Tim Berners Lee a également inventé les adresses web et le langage HTML qui forment le web
- URI terme le plus générique
- URN sans le protocole
- URL emplacement à suivre ne gère pas le déplacement de la ressource
## requête HTTP
* une URI (Unified Resource Identifier)
* quelques [en-têtes / headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
* contraintes sur le contenu demandé
* informations contextuelles
* sous la forme clé: valeur
* un verbe HTTP décrivant l'action
* une ligne vide
* un corps servant à éventuellement envoyer des données
Note:
- dans la préhistoire le verbe est appelé méthode
## requête HTTP de la vraie vie
<pre><code data-trim>
GET / HTTP/1.1
Host: perdu.com
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Tue, 02 Mar 2010 18:52:21 GMT
If-None-Match: "cc-480d5dd98a340"
Cache-Control: max-age=0
useless data
</code></pre>
Note:
- Connection: keep-alive multiplexage de requête - envoyer plusieurs requêtes HTTP via la même connexion TCP (SPDY utilise ça)
- Accept-Encoding: gzip, deflate commpressions supportées par le navigateur
- le reste du cache
## verbes HTTP
agissent sur une URI
* __GET__: récupérer une _ressource_ ou une collection de _ressources_
* __POST__: créer un nouvelle _ressource_
* __PUT__: mettre à jour une _ressource_ existante ou créer une nouvelle _ressource_ à une URI donnée
* __DELETE__: supprimer une _ressources_ données
* __PATCH__: mettre à jour partiellement une _ressource_ existante
## verbes HTTP
* [Seuls GET et POST son implémentés dans les navigateurs](http://www.w3.org/TR/html5/forms.html#attr-fs-action)
* Must read: [Please do not patch like an idiot](http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/)
* c.f. REST plus loin dans cette présentation
Note:
- La liste n'est pas exhaustive: HEAD, OPTIONS, TRACE, CONNECT
- tous idempotents sauf POST
- PATCH n'est pas dans la spec
## réponse HTTP
composée
* d'un code HTTP
* de quelques [en-têtes / headers](http://en.wikipedia.org/wiki/List_of_HTTP_header_fields)
* informations sur le contenu servi
* sous la forme clé: valeur
* du contenu envoyé
## réponse HTTP de la vraie vie
<pre>
<code data-trim>
HTTP/1.1 304 Not Modified
Date: Fri, 20 Feb 2015 15:15:01 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=2, max=100
Etag: "cc-480d5dd98a340"
Vary: Accept-Encoding
&#x3C;html&#x3E;
&#x3C;head&#x3E;&#x3C;title&#x3E;Vous Etes Perdu ?&#x3C;/title&#x3E;&#x3C;/head&#x3E;
&#x3C;body&#x3E;
&#x3C;h1&#x3E;Perdu sur l&#x27;Internet ?&#x3C;/h1&#x3E;
&#x3C;h2&#x3E;Pas de panique, on va vous aider&#x3C;/h2&#x3E;
&#x3C;strong&#x3E;* &#x3C;----- vous êtes ici &#x3C;/strong&#x3E;
&#x3C;/body&#x3E;
&#x3C;/html&#x3E;
</code>
</pre>
Note:
- Notez le header server qui donne déjà de l'information utile
- Etag, vary concerne le cache
## les codes HTTP
* __1xx__ Informational
* __2xx__ Successful
* __200__ OK
* __201__ Created
* __204__ No Content
* __3xx__ Redirections
* __301__ Moved Permanently
* __302__ Found
* __304__ Not Modified
Note:
- 201 typique aprè un post
- 204 signifie un body de requête vide
- 301 vs 302 on change d'URI ou pas (definitif temporaire)
- 304 aucun besoin de recharger le contenu body vide
## les codes d'erreur HTTP
* __4xx__ Client Error
* __400__ Bad Request
* __401__ Unauthorized
* __403__ Forbidden
* __404__ Not Found
* __405__ Method Not Allowed
* __406__ Not Acceptable
* __409__ Conflict
* __415__ Unsupported Media Type
* __418__ I’m a teapot
## les codes d'erreur HTTP
* __5xx__ Server Error
* __500__ Internal Server Error
liste complète sur [httpstatus.es](httpstatus.es)
## paramètres HTTP
deux types
* ceux passés via la query string de l'URL
* accessible via __$_GET__ en _PHP_
* ceux passés via le corps de la requête
* accessible via __$_POST__ en _PHP_
* tous les paramètres sont disponibles dans __$_REQUEST__ en _PHP_
## REpresentational State Transfer
![alt text](images/http/richardson.png "Richardson Maturity Model")
## REpresentational State Transfer
Must read:
* [Haters gonna HATEOAS](http://timelessrepo.com/haters-gonna-hateoas).
* [L’architecture REST expliquée en 5 règles](https://blog.nicolashachet.com/niveaux/confirme/larchitecture-rest-expliquee-en-5-regles/)
* [Architectural Styles and
the Design of Network-based Software Architectures](https://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm) by Roy Thomas Fielding 2000
Note:
- Level 0 - HTTP comme protocole de transfert uniquement (transport only). Style RPC (SOAP, XML-RPC) on pourrait utiliser autre chose comme protocole
- Level 1 - Structure en Ressources individuelles, notion d'id sur les objet
- Level 2 - le Client utilise les verbes HTTP & les serveur les codes HTTP
- Level 3 - Hypermedia Controls = Content Negotiation + HATEOAS
- Level 3 - Content Negotiation -> sélectionner le format de représentation pour une ressource (json, xml, etc ..) le serveur tente de répondre au mieux autant que faire se peut.
- Level 3 - HATEOAS -> découvarbilité de l'API l'app est vue comme une machine à états
- on est loin du site web au sens CMS, pourautant ces services sont soumis au mêmes vulnérabilités
## HTTP est "__stateless__"
![alt text](images/http/stateless.jpg "Stateless")
Note:
- Http est amnésique
- chaque requête est traitée comme une requête indépendante sans relation avec les précédentes
## les cookies
* introduits par Netscape en 1994 pour fiabiliser l'implémentation du panier d'achat virtuel
* envoyés sous forme d'en tête HTTP par le serveur
<pre><code class="http">Set-Cookie: name=value[; Max-Age=age][; expires=date]
[; domain=domain_name][; path=some_path][; secure]
[; HttpOnly]
</code></pre>
* renvoyés inchangés par le client à chaque requête
<pre><code class="http">Cookie: name=value</code></pre>
## les cookies
* accessibles via __$_COOKIE__ en _PHP_
* cloisonnés par domaine
* accessibles via les sous domaines
* blocable par l'option _domain_
* [tracking cookie](../privacy/tracking.html)
* êtes vous en [conformité avec la loi?](http://www.cnil.fr/vos-obligations/sites-web-cookies-et-autres-traceurs/que-dit-la-loi/)
Note:
- https://www.owasp.org/index.php/HttpOnly -> pas de manipulation client side ANTI-XSS
- https://www.owasp.org/index.php/SecureFlag -> accessible en https uniquement
- sous domaine, google maps / google play / google.com
## les sessions
* données gérées côté serveur
* transimission de l'ID de session uniquement
<pre><code data-trim>
Cookie: PHPSESSID=hr0ms75gs6f7vlph0hhct2bjj3
</code></pre>
* accessibles via __$_SESSION__ en _PHP_
## [__SOP__ Same Origin Policy](https://developer.mozilla.org/fr/docs/Web/JavaScript/)
* concerne [XMLHttpRequest](https://fr.wikipedia.org/wiki/XMLHttpRequest) / [Ajax](https://fr.wikipedia.org/wiki/Ajax_(informatique%29)
* restreint les interactions d'une app web aux ressources ayant la même origine
* origine
* le protocole
* le port (si spécifié)
* l'hôte
## [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
* Cross Origin Resource Sharing
* contrôler les accès en mode cross-site
* effectuer des transferts de données sécurisés
### client
<pre><code data-trim>
Origin: http://www.foo.com
</code></pre>
### serveur
<pre><code data-trim>
Access-Control-Allow-Origin: http://www.foo.com
</code></pre>
## [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
* <span style="color:red">* </span> dans le cas d'une ressource 100% publique
* autorise tous les verbes HTTP
* remplace [JSONP](https://en.wikipedia.org/wiki/JSONP)
* qui n'autorisait que la méthode GET
[MDN|Contrôle d'accès HTTP](https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS)
Note:
- l'introduction de cette nouvelle possibilité implique nécessairement que les serveurs doivent gérer de nouvelles entêtes, et doivent renvoyer les ressources avec de nouvelles entêtes également
- doit être supporté par le navigateur
- la valeur * est possible mais risquée
- requêtes simples, pré-vérifiées avec le verbe OPTIONS, avec habilitations en forcant l'envoie du cookie
## header, cookie, body, query string, script ...
![alt text](images/http/illuminati.jpg "Don't trust anyone")<!-- .element: width="35%" -->
<li><a href="privacy/jnarac.html">je n'ai rien &agrave; cacher</a></li> <li>
<li><a href="privacy/jnarac_history.html">je n'ai jamais rien eu &agrave; cacher</a></li> <a href="privacy/jnarac.html">je n'ai rien &agrave; cacher</a>
<ul>
<li><a href="1337/http.html">HTTP</a></li>
</ul>
</li>
<li><a href="privacy/passwords.html">mots de passes</a></li> <li><a href="privacy/passwords.html">mots de passes</a></li>
<li><a href="privacy/tracking.html">tracking</a></li> <li><a href="privacy/tracking.html">tracking</a></li>
<li><a href="privacy/sovereignty.html">souverainet&eacute;</a></li> <li><a href="privacy/sovereignty.html">souverainet&eacute;</a></li>
......
...@@ -56,6 +56,12 @@ ...@@ -56,6 +56,12 @@
data-separator-notes="^Note:" data-separator-notes="^Note:"
data-charset="utf-8"> data-charset="utf-8">
</section> </section>
<section data-markdown="md/jnarac/ssi.md"
data-separator="^\n\n\n"
data-separator-vertical="^\n\n"
data-separator-notes="^Note:"
data-charset="utf-8">
</section>
<section data-markdown="md/jnarac/law.md" <section data-markdown="md/jnarac/law.md"
data-separator="^\n\n\n" data-separator="^\n\n\n"
data-separator-vertical="^\n\n" data-separator-vertical="^\n\n"
......
...@@ -29,6 +29,12 @@ Note: ...@@ -29,6 +29,12 @@ Note:
- en général il n'est pas compliqué - en général il n'est pas compliqué