forked from LINCnil/Guide-RGPD-du-developpeur
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1505 lines (1427 loc) · 178 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<title></title>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
</style>
<style type="text/css">
body {
font-family: Helvetica, arial, sans-serif;
font-size: 14px;
line-height: 1.6;
padding-top: 10px;
padding-bottom: 10px;
background-color: white;
color: #333;
text-align: justify;
margin: auto;
}
* {
margin: 0;
padding: 0;
align-items: baseline;
background-size: cover;
background-repeat: no-repeat;
background-position: center;
}
body > *:first-child {
margin-top: 0 !important;
}
body > *:last-child {
margin-bottom: 0 !important;
}
.line {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-flow: row wrap;
flex-flow: row wrap;
}
.tableofcontent {
position:fixed;
width:25%;
height:100%;
}
.greyed{
color:#555;
}
#toc{
padding-right:30px;
padding-bottom: 50px;
text-align: left;
}
.level2{
font-size: 90%;
margin-top: 0px !important;
margin-bottom: 0px !important;
}
.level1{
margin-top: 15px !important;
}
@media all and (min-width: 1000px) {
.content{
margin-left: 25%;
padding:5%;
width:65%
}
}
@media all and (max-width: 1000px) {
.content{
padding:6%;
width:88%;
margin-left: 0%;
}
.tableofcontent {
display:none;
}
}
a {
color: #4183C4;
text-decoration: none;
}
a.absent {
color: #cc0000;
}
a.anchor {
display: block;
padding-left: 30px;
margin-left: -30px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
bottom: 0;
}
h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
cursor: text;
position: relative;
text-align: left;
}
h2:first-child, h1:first-child, h1:first-child + h2, h3:first-child, h4:first-child, h5:first-child, h6:first-child {
margin-top: 0;
padding-top: 0;
}
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
text-decoration: none;
}
h1 tt, h1 code {
font-size: inherit;
}
h2 tt, h2 code {
font-size: inherit;
}
h3 tt, h3 code {
font-size: inherit;
}
h4 tt, h4 code {
font-size: inherit;
}
h5 tt, h5 code {
font-size: inherit;
}
h6 tt, h6 code {
font-size: inherit;
}
h1 {
font-size: 2em;
color: black;
padding-top:50px;
}
h2 {
font-size: 1.7em;
border-bottom: 1px solid #cccccc;
color: black;
}
h3 {
font-size: 1.3px;
}
h4 {
font-size: 1.14em;
}
h5 {
font-size: 1em;
}
h6 {
color: #777777;
font-size: 1em;
}
p, blockquote, ul, ol, dl, li, table, pre {
margin: 15px 0;
}
hr {
border: 0 none;
color: #cccccc;
height: 4px;
padding: 0;
}
body > h2:first-child {
margin-top: 0;
padding-top: 0;
}
body > h1:first-child {
margin-top: 0;
padding-top: 0;
}
body > h1:first-child + h2 {
margin-top: 0;
padding-top: 0;
}
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
margin-top: 0;
padding-top: 0;
}
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}
h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
margin-top: 0;
}
li p.first {
display: inline-block;
}
ul, ol {
padding-left: 30px;
}
ul :first-child, ol :first-child {
margin-top: 0;
}
ul :last-child, ol :last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777;
}
blockquote > :first-child {
margin-top: 0;
}
blockquote > :last-child {
margin-bottom: 0;
}
table {
padding: 0;
}
table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
table tr th {
font-weight: bold;
border: 1px solid #cccccc;
text-align: left;
margin: 0;
padding: 6px 13px;
}
table tr td {
border: 1px solid #cccccc;
text-align: left;
margin: 0;
padding: 6px 13px;
}
table tr th :first-child, table tr td :first-child {
margin-top: 0;
}
table tr th :last-child, table tr td :last-child {
margin-bottom: 0;
}
img {
max-width: 100%;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {
TableOfContents();
}
);
function TableOfContents(container, output) {
var toc = "";
var level = 0;
var container = document.querySelector(container) || document.querySelector('#contents');
var output = output || '#toc';
//Inspiration from here: https://stackoverflow.com/questions/187619/is-there-a-javascript-solution-to-generating-a-table-of-contents-for-a-page
container.innerHTML = container.innerHTML.replace(/<h([\d]) id=".*">([^<]+)?<\/h([\d])>/gi, function (str, openLevel, titleText, closeLevel) {
console.log(str,openLevel)
if (openLevel != closeLevel || openLevel>2) {
return str;
}
if (openLevel > level) {
toc += (new Array(openLevel - level + 1)).join('<ul>');
} else if (openLevel < level) {
toc += (new Array(level - openLevel + 1)).join('</li></ul>');
} else {
toc += (new Array(level+ 1)).join('</li>');
}
level = parseInt(openLevel);
var anchor = titleText.replace(/ /g, "_");
if(level ==2){
toc += '<li class="level'+level+'"><a class="greyed" href="#' + anchor + '">' + titleText
+ '</a>';
}else{
toc += '<li class="level'+level+'"><a href="#' + anchor + '">' + titleText
+ '</a>';
}
return '<h' + openLevel + '><a href="#' + anchor + '" id="' + anchor + '">'
+ titleText + '</a></h' + closeLevel + '>';
}
);
if (level) {
toc += (new Array(level + 1)).join('</ul>');
}
document.querySelector(output).innerHTML += toc;
};
</script>
</head>
<body>
<div class="line">
<div class="tableofcontent">
<div style="overflow-y: scroll; height: 100%;">
<div id="toc">
</div>
</div>
</div>
<div id="contents" class="content">
<p align="center">
<img src="https://github.com/LINCnil/Guide-RGPD-du-developpeur/raw/main/templates/BANNIERE.JPG" width="100%" align="middle" alt="Logo Guide RGPD CNIL pour l'équipe de développement">
</p>
<h1 id="guide-rgpd-de-léquipe-de-développement">Guide RGPD de l'équipe de développement</h1>
<h4 id="la-cnil-publie-un-guide-rgpd-pour-les-développeuses-et-développeurs">La CNIL publie un guide RGPD pour les développeuses et développeurs</h4>
<p>Afin de vous accompagner dans la mise en conformité de vos développements projet web ou applicatif, la CNIL a élaboré un guide de bonnes pratiques des développements en open source.</p>
<p>Ce guide est publié sous <a href="https://www.gnu.org/licenses/gpl-3.0.html">licence GPLv3</a> et sous <a href="https://www.etalab.gouv.fr/wp-content/uploads/2017/04/ETALAB-Licence-Ouverte-v2.0.pdf">licence ouverte 2.0</a> (explicitement compatible avec <a href="https://creativecommons.org/licenses/by/4.0/deed.fr">CC-BY 4.0 FR</a>). Vous pouvez donc librement contribuer à son enrichissement.</p>
<h4 id="ce-guide-sadresse-t-il-uniquement-aux-développeuses-et-développeurs">Ce guide s’adresse-t-il uniquement aux développeuses et développeurs ?</h4>
<p>Que vous travailliez seul(e) ou en équipe au développement d'un projet, que vous soyez amené(e) à gérer une équipe de développement, que vous soyez un prestataire, ou simplement curieux, ce guide contient une première approche des grands principes du RGPD et des différents points d’attention à prendre en compte dans le déploiement d’applications respectueuse de la vie privée de ses utilisateurs.</p>
<p>Il propose des conseils et des bonnes pratiques, et offre ainsi des clés de compréhension du RGPD utiles pour tous les acteurs, quelle que soit la taille de leur structure. Il peut également faire l’objet d’échanges au sein des services et dans la relation avec vos clients.</p>
<h4 id="que-contient-le-guide">Que contient le guide ?</h4>
<p>Ce guide est découpé en <strong>18 fiches thématiques</strong> et complété par <strong>des exemples de codes</strong> qui couvrent la plupart des besoins des développeuses et développeurs pour les accompagner à chaque étape de leur projet, de la préparation du développement au déploiement de nouveaux services.</p>
<p>Le règlement général sur la protection des données (ou RGPD) précise que la protection des droits et libertés des personnes physiques exige de prendre des <strong>« mesures techniques et organisationnelles appropriées afin de garantir que les exigences du présent règlement sont respectées »</strong> (considérant 78).</p>
<p>La détermination de ces mesures est forcément <strong>liée au contexte des traitements mis en place</strong>, et le responsable de traitement (l'entité publique ou privée qui traite des données personnelles) doit à ce titre assurer la sécurité des données qu'il est amené à traiter.</p>
<p>Les bonnes pratiques de ce guide <strong>n’ont donc pas vocation à couvrir l’ensemble des exigences des règlementations ni à être à prescriptives</strong>, elles apportent un premier niveau de mesures permettant de prendre en compte les problématiques de protection de la vie privée dans les développements informatiques qui ont vocation à être appliquées à tous les projets traitant des données. En fonction de la nature des traitements opérés, des mesures complémentaires devront être mises en œuvre dans certains cas afin de respecter pleinement la réglementation.</p>
<h2 id="tables-des-matières">Tables des matières</h2>
<ol start="0" style="list-style-type: decimal">
<li><p><a href="#Fiche_n°0%c2%a0:_Développer_en_conformité_avec_le_RGPD">Développer en conformité avec le RGPD</a></p></li>
<li><p><a href="#Fiche_n°1%c2%a0:_Identifier_les_données_à_caractère_personnel">Identifier les données à caractère personnel</a></p></li>
<li><p><a href="#Fiche_n°2%c2%a0:_Préparer_son_développement">Préparer son développement</a></p></li>
<li><p><a href="#Fiche_n°3%c2%a0:_Sécuriser_son_environnement_de_développement">Sécuriser son environnement de développement</a></p></li>
<li><p><a href="#Fiche_n°4%c2%a0:_Gérer_son_code_source">Gérer son code source</a></p></li>
<li><p><a href="#Fiche_n°5%c2%a0:_Faire_un_choix_éclairé_de_son_architecture">Faire un choix éclairé de son architecture</a></p></li>
<li><p><a href="#Fiche_n°6%c2%a0:_Sécuriser_vos_sites_web,_vos_applications_et_vos_serveurs">Sécuriser vos sites web, vos applications et vos serveurs</a></p></li>
<li><p><a href="#Fiche_n°7%c2%a0:_Minimiser_les_données_collectées">Minimiser les données collectées</a></p></li>
<li><p><a href="#Fiche_n°8%c2%a0:_Gérer_les_utilisateurs">Gérer les profils utilisateurs</a></p></li>
<li><p><a href="#Fiche_n°9%c2%a0:_Maîtriser_vos_bibliothèques_et_vos_SDK">Maîtriser vos bibliothèques et vos SDK</a></p></li>
<li><p><a href="#Fiche_n°10%c2%a0:_Veiller_à_la_qualité_de_votre_code_et_sa_documentation">Veiller à la qualité de votre code et sa documentation</a></p></li>
<li><p><a href="#Fiche_n°11%c2%a0:_Tester_vos_applications">Tester vos applications</a></p></li>
<li><p><a href="#Fiche_n°12%c2%a0:_Informer_les_personnes">Informer les utilisateurs</a></p></li>
<li><p><a href="#Fiche_n°13%c2%a0:_Préparer_l’exercice_des_droits_des_personnes">Préparer l'exercice des droits des personnes</a></p></li>
<li><p><a href="#Fiche_n°14%c2%a0:_Gérer_la_durée_de_conservation_des_données">Gérer la durée de conservation des données</a></p></li>
<li><p><a href="#Fiche_n°15%c2%a0:_Prendre_en_compte_les_bases_légales_dans_l’implémentation_technique">Prendre en compte les bases légales dans l’implémentation technique</a></p></li>
<li><p><a href="#Fiche_n°16%c2%a0:_Analyser_les_traceurs">Analyser les pratiques en matière de traceurs sur vos sites et vos applications</a></p></li>
<li><p><a href="#Fiche_n°17%c2%a0:_Mesurer_la_fréquentation_de_vos_sites_web_et_de_vos_applications">Mesurer la fréquentation de vos sites web et de vos applications</a></p></li>
<li><p><a href="#Fiche_n°18%c2%a0:_Se_prémunir_contre_les_attaques_informatiques">Se prémunir contre les attaques informatiques</a></p></li>
</ol>
<h2 id="comment-contribuer-à-ce-guide">Comment contribuer à ce guide ?</h2>
<p><strong>Ce guide est disponible en deux versions</strong> :</p>
<ul>
<li>Une <a href="https://cnil.fr/developpeur">version web sur le site de la CNIL</a>, et un export PDF dans l'onglet <a href="https://github.com/LINCnil/Guide-RGPD-du-developpeur/releases">"Releases"</a> de ce repository ;</li>
<li>Cette <a href="https://github.com/LINCnil/Guide-RGPD-du-developpeur">version GitHub</a>, qui offre la possibilité à tous d’y contribuer.</li>
</ul>
<p><strong>La contribution se fait en quelques étapes</strong> :</p>
<ul>
<li>Inscrivez-vous sur la plateforme Github ;</li>
<li>Rendez-vous sur la page du projet ;</li>
<li>Vous pouvez :
<ul>
<li>Utiliser l’onglet "Issue" pour ouvrir des commentaires ou participer à la discussion</li>
<li>Utiliser l'option "Fork" pour faire vos propres modifications et proposer leur inclusion via le bouton "Pull Requests"</li>
</ul></li>
</ul>
<p><strong>Votre proposition de contribution sera examinée par la CNIL avant sa publication</strong>. La version web du guide RGPD de l'équipe de développement sera régulièrement mise à jour.</p>
<h2 id="usage">Usage</h2>
<p>Pour faire vous-même une « release » de ce repository, vous pouvez utiliser l’outil <strong>Pandoc</strong>. Cet outil vous permettra de convertir les fiches en un fichier docx ou bien un document HTML.</p>
<p>Vous pouvez retrouver les instructions pour installer cet outil <a href="https://pandoc.org/installing.html">ici</a></p>
<ul>
<li><p><strong>Pour générer un fichier .docx</strong> :</p>
<pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">pandoc</span> -s --toc --toc-depth=1 -o Guide_RGPD_developpeur.docx [0-9][0-9]*.md</code></pre></li>
<li><p><strong>Pour générer un fichier .html</strong> :</p>
<pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">pandoc</span> -s --template=<span class="st">"templates/mytemplate.html"</span> -H templates/pandoc.css -o index.html README.md [0-9][0-9]*.md</code></pre></li>
</ul>
<h1 id="fiche-n0-développer-en-conformité-avec-le-rgpd">Fiche n°0 : Développer en conformité avec le RGPD</h1>
<h4 id="que-vous-travailliez-seule-ou-en-équipe-au-développement-dun-projet-que-vous-soyez-amenée-à-gérer-une-équipe-de-développement-ou-que-vous-soyez-un-prestataire-réalisant-des-développements-pour-des-tiers-il-est-indispensable-de-sassurer-durant-toute-la-vie-du-projet-que-les-données-de-vos-utilisateurs-ainsi-que-toutes-les-opérations-effectuées-sur-celles-ci-soient-protégées-en-permanence.">Que vous travailliez seul⋅e ou en équipe au développement d’un projet, que vous soyez amené⋅e à gérer une équipe de développement, ou que vous soyez un prestataire réalisant des développements pour des tiers, il est indispensable de s’assurer durant toute la vie du projet que les données de vos utilisateurs ainsi que toutes les opérations effectuées sur celles-ci soient protégées en permanence.</h4>
<p>Les étapes suivantes vous aideront dans le développement d’applications ou de sites web respectueux de la vie privée :</p>
<ol style="list-style-type: decimal">
<li><p><strong>Sensibilisez-vous aux grands principes du RGPD</strong>. Si vous travaillez en équipe, nous vous recommandons d’identifier une personne chargée du pilotage de sa conformité. Si votre entreprise dispose d’un <a href="https://www.cnil.fr/fr/designer-un-pilote">délégué à la protection des données (DPO)</a>, celui-ci constitue alors un atout majeur pour <a href="https://www.cnil.fr/fr/designation-dpo">comprendre et respecter les obligations du RGPD</a>. Sa désignation peut par ailleurs être obligatoire dans certains cas, notamment si vos programmes ou vos applications traitent des données dites « sensibles » (cf. <a href="#Fiche_n°1%c2%a0:_Identifier_les_données_à_caractère_personnel">les exemples</a>) à grande échelle ou réalisent un suivi régulier et systématique à grande échelle.</p></li>
<li><p><strong>Cartographiez et catégorisez les données et les traitements de votre système</strong>. Recenser de façon précise les traitements réalisés par votre programme ou votre application vous aidera à vous assurer qu’ils respectent bien les obligations légales en la matière. La tenue d’un <a href="https://www.cnil.fr/fr/RGDP-le-registre-des-activites-de-traitement">registre des activités de traitement</a> (dont vous trouvez un exemple sur le <a href="https://www.cnil.fr/sites/default/files/atoms/files/registre-traitement-simplifie.ods">site de la CNIL</a>), vous permet d’avoir une vision globale sur ces données, d’identifier et de hiérarchiser les risques associés. En effet, des données personnelles peuvent être présentes dans des endroits inattendus comme dans les journaux de serveurs, les fichiers de cache, les fichiers Excel, etc. Sa tenue est obligatoire dans la plupart des cas.</p></li>
<li><p><strong>Priorisez les actions à mener</strong>. Sur la base du registre des activités de traitement, identifiez en amont du développement les actions à mener pour vous conformer aux obligations du RGPD et priorisez les points d’attention au regard des risques pour les personnes concernées par la collecte de données. Ces points d’attention concernent notamment <a href="#Fiche_n°7%c2%a0:_Minimiser_les_données_collectées">la nécessité et les types de données collectées et traitées</a> par votre programme, <a href="#Fiche_n°7%c2%a0:_Minimiser_les_données_collectées">la base légale</a> sur laquelle se fonde vos traitements de données, <a href="#Fiche_n°12%c2%a0:_Informer_les_personnes">les mentions d’information</a> de votre programme ou de votre application, <a href="#Fiche_n°5%c2%a0:_Faire_un_choix_éclairé_de_son_architecture">les clauses contractuelles</a> vous liant à vos sous-traitants, les modalités d’<a href="#Fiche_n°13%c2%a0:_Préparer_l’exercice_des_droits_des_personnes">exercice des droits</a>, les mesures mises en place pour <a href="#Fiche_n°6%c2%a0:_Sécuriser_vos_sites_web,_vos_applications_et_vos_serveurs">sécuriser vos traitements</a>.</p></li>
<li><p><strong>Gérez les risques</strong>. Lorsque vous identifiez que des traitements de données personnelles sont susceptibles d’engendrer des risques élevés pour les personnes concernées, assurez-vous que vous gérez ces risques de façon appropriée au regard du contexte. Une <a href="https://www.cnil.fr/fr/RGPD-analyse-impact-protection-des-donnees-aipd">analyse d’impact relative à la protection des données (AIPD)</a> peut vous accompagner dans la maîtrise de ces risques. La CNIL a élaboré une <a href="https://www.cnil.fr/sites/default/files/atoms/files/cnil-pia-1-fr-methode.pdf">méthode</a>, des <a href="https://www.cnil.fr/sites/default/files/atoms/files/cnil-pia-2-fr-modeles.pdf">modèles de documents</a> et un <a href="https://www.cnil.fr/fr/outil-pia-telechargez-et-installez-le-logiciel-de-la-cnil">outil</a> qui vous aideront à identifier ces risques ainsi qu’un <a href="https://www.cnil.fr/sites/default/files/atoms/files/cnil-pia-3-fr-basesdeconnaissances.pdf">catalogue de bonnes pratiques</a> qui vous accompagnera dans la mise en place de mesures permettant de traiter les risques identifiés. Par ailleurs, la réalisation d’une analyse d’impact relative à la protection des données est obligatoire pour tous les traitements susceptibles d’engendrer des risques élevés pour les droits et libertés des personnes concernées. La CNIL propose, sur son <a href="https://www.cnil.fr/sites/default/files/atoms/files/liste-traitements-aipd-requise.pdf">site web</a>, une liste des types d’opérations de traitement pour lesquelles une AIPD est requise ou, au contraire, non requise.</p></li>
<li><p><strong>Organisez des processus internes</strong> pour vous assurer d’être en conformité durant toutes les étapes du développement, veillez à ce que des procédures internes garantissent la prise en compte de la protection des données sur tous les aspects de votre projet et prenant en compte l’ensemble des événements qui peuvent survenir (ex. : faille de sécurité, gestion des demandes de rectification ou d’accès, modification des données collectées, changement de prestataire, violation de données, etc.). Les exigences du <a href="https://www.cnil.fr/sites/default/files/atoms/files/formulaire_de_demande_labels-gouvernance-re.docx">label gouvernance</a> (même si celui-ci n'est plus octroyé par la CNIL depuis l’entrée en application du RGPD) peuvent constituer une base d’inspiration utile pour vous aider à mettre en place l’organisation nécessaire.</p></li>
<li><p><strong>Documentez la conformité de vos développements</strong> pour prouver votre conformité au RGPD à tout moment : <a href="https://www.cnil.fr/fr/documenter-la-conformite">les actions réalisées et les documents produits à chaque étape du développement doivent être maîtrisés</a>. Cela implique notamment un réexamen et une actualisation réguliers de la documentation de vos développements afin qu’elle soit en permanence en cohérence avec les fonctionnalités déployées sur votre programme.</p></li>
</ol>
<p>Le site de la CNIL fournit de nombreuses <a href="https://www.cnil.fr/fr/mediatheque">fiches pratiques</a> qui vous accompagneront dans la mise en place de traitements respectueux de la loi suivant votre secteur d’activité.</p>
<h1 id="fiche-n1-identifier-les-données-à-caractère-personnel">Fiche n°1 : Identifier les données à caractère personnel</h1>
<h4 id="comprendre-les-notions-de-données-personnelles-de-finalité-et-de-traitement-est-indispensable-pour-le-développement-dune-application-respectueuse-de-la-loi-et-des-données-des-utilisateurs.-attention-à-ne-pas-confondre-anonymisation-et-pseudonymisation-qui-ont-des-définitions-précises-dans-le-rgpd.">Comprendre les notions de « données personnelles », de « finalité » et de « traitement » est indispensable pour le développement d’une application respectueuse de la loi et des données des utilisateurs. Attention, à ne pas confondre « anonymisation » et « pseudonymisation » qui ont des définitions précises dans le RGPD.</h4>
<h2 id="définition">Définition</h2>
<ul>
<li><p>La notion de <strong>données à caractère personnel</strong> (couramment désignées comme “données personnelles”) est définie dans le <a href="https://www.cnil.fr/fr/comprendre-le-rgpd">règlement général sur la protection des données</a> (RGPD) comme « <a href="https://www.cnil.fr/fr/reglement-europeen-protection-donnees/chapitre1#Article4">toute information se rapportant à une personne physique identifiée ou identifiable (dénommée “personne concernée”)</a> ». Elle couvre un large périmètre qui comprend à la fois des données directement identifiantes (nom et prénom par exemple) et indirectement identifiantes (numéro de téléphone, plaque d’immatriculation, identifiant de terminal, etc.).</p></li>
<li><p>Toute opération sur ce type de données (collecte, enregistrement, transmission, modification, diffusion, etc.) constitue <strong>un traitement au sens du RGPD</strong> et doit donc répondre aux exigences fixées par ce règlement. Ces traitements doivent être licites et avoir un objectif (une « finalité ») déterminée. Les données personnelles collectées et traitées doivent être pertinentes et limitées à ce qui est strictement nécessaire pour atteindre la finalité.</p></li>
</ul>
<h2 id="exemples-de-données-à-caractère-personnel">Exemples de données à caractère personnel</h2>
<ul>
<li>Lorsqu’elles sont relatives à des personnes physiques, <strong>les données suivantes sont des données à caractère personnel</strong> :
<ul>
<li>nom, prénom, pseudonyme, date de naissance ;</li>
<li>photos, enregistrements sonores de voix ;</li>
<li>numéro de téléphone fixe ou portable, adresse postale, adresse e-mail ;</li>
<li>adresse IP, identifiant de connexion informatique ou identifiant de cookie ;</li>
<li>empreinte digitale, réseau veineux ou palmaire de la main, empreinte rétinienne ;</li>
<li>numéro de plaque d’immatriculation, numéro de sécurité sociale, numéro d’une pièce d’identité ;</li>
<li>données d’usage d’une application, des commentaires, etc.</li>
</ul></li>
<li><strong>L’identification des personnes physiques peut se réaliser</strong> :
<ul>
<li>à partir d’une seule donnée (exemples : nom et prénom) ;</li>
<li>à partir du croisement d’un ensemble de données (exemple : une femme vivant à telle adresse, née tel jour et membre de telle association).</li>
</ul></li>
<li><p>Certaines données sont considérées comme <strong>particulièrement sensibles</strong>. Le RGPD interdit de recueillir ou d’utiliser ces données, sauf, notamment, si la personne concernée a donné son consentement exprès (démarche active, explicite et de préférence écrite, qui doit être libre, spécifique, et informée).</p></li>
<li>Ces exigences concernent les données suivantes :
<ul>
<li>les données relatives à la <strong>santé des individus</strong> ;</li>
<li>les données concernant la <strong>vie sexuelle</strong> ou l’<strong>orientation sexuelle</strong> ;</li>
<li>les données qui révèlent une prétendue <strong>origine raciale</strong> ou <strong>ethnique</strong> ;</li>
<li>les <strong>opinions politiques</strong>, les <strong>convictions religieuses</strong>, <strong>philosophiques</strong> ou l’<strong>appartenance syndicale</strong> ;</li>
<li>les <strong>données génétiques</strong> et <strong>biométriques utilisées aux fins d’identifier une personne de manière unique</strong>.</li>
</ul></li>
</ul>
<h2 id="lanonymisation-des-données-à-caractère-personnel">L’anonymisation des données à caractère personnel</h2>
<ul>
<li><p>Un <strong>processus d’anonymisation de données à caractère personnel</strong> vise à rendre impossible toute identification des individus au sein de jeux de données. Il s’agit donc d’un processus irréversible. Lorsque cette anonymisation est effective, les données ne sont plus considérées comme des données personnelles et les exigences du RGPD ne sont plus applicables.</p></li>
<li>Par défaut, nous vous recommandons de ne <strong>jamais considérer des jeux de données brutes comme anonymes</strong>. Un jeu de données anonyme doit nécessairement résulter d’un processus d’anonymisation qui éliminera toute possibilité de ré-identification des individus, que ce soit par :
<ul>
<li><em>individualisation</em> : il n’est pas possible d’isoler une partie ou la totalité des enregistrements relatifs à un individu ;</li>
<li><em>corrélation</em> : le jeu de données ne permet pas de relier deux enregistrements se rapportant à une même personne ou à un groupe de personnes ;</li>
<li><em>inférence</em> : il est impossible de déduire la valeur d’un attribut d’une personne depuis des informations internes ou externes au jeu de données.</li>
</ul></li>
<li><p>Ces traitements de données impliquent dans la plupart des cas une <strong>perte de qualité sur le jeu de données produit</strong>. L’<a href="https://www.cnil.fr/fr/le-g29-publie-un-avis-sur-les-techniques-danonymisation">avis G29 sur les techniques d’anonymisation</a> décrit les principales techniques d’anonymisation utilisées aujourd’hui, ainsi que des exemples de jeux de données considérés à tort comme anonymes. Il est important de signaler qu’il n’existe pas de solution universelle pour l’anonymisation des données à caractère personnel. Le choix d’anonymiser ou non les données ainsi que la sélection d’une technique d’anonymisation doit se faire au cas par cas selon les contextes d’usage et de besoin (nature des données, utilité des données, risques pour les personnes, etc.).</p></li>
</ul>
<p><details> <summary> <em> En savoir plus sur les techniques d'anonymisation </em> </summary> <br></p>
<p>Le <a href="https://linc.cnil.fr/fr/cabanon-un-projet-dexploration-et-de-visualisation-de-donnees-anonymisees">projet CabAnon</a>, développé par le Laboratoire d'Innovation Numérique de la CNIL en 2017, évalue les performances de différentes techniques d’anonymisation sur des trajets des taxis tels que rendus publics par la New-York TLC. Ce projet présente <a href="https://linc.cnil.fr/fr/cabanon-quels-usages-pour-les-donnees-anonymisees">différents scénarios d’usages</a> pour lesquels les techniques d'anonymisation utilisées n’altèrent pas significativement la qualité du résultat final. Le code utilisé pour anonymiser ces données est également publié sous <a href="https://github.com/LINCnil/Cabanon/tree/master/Anon">licence libre</a>. </details></p>
<h2 id="la-pseudonymisation-des-données-à-caractère-personnel">La pseudonymisation des données à caractère personnel</h2>
<ul>
<li><p>La <strong>pseudonymisation constitue un compromis entre la conservation de données brutes et la production de jeux de données anonymisées</strong>.</p></li>
<li><p>Elle se réfère à un traitement de données personnelles réalisé de manière à ce qu’<strong>on ne puisse plus attribuer les données relatives à une personne physique sans avoir recours à des informations supplémentaires</strong>. Le RGPD insiste sur le fait que ces informations supplémentaires doivent être conservées séparément et être soumises à des mesures techniques et organisationnelles afin d’éviter la ré-identification des personnes concernées. Contrairement à l’anonymisation, la pseudonymisation est un processus réversible.</p></li>
<li><p>En pratique, un processus de pseudonymisation consiste à <strong>remplacer les données directement identifiantes (nom, prénom, etc.) d’un jeu de données par des données indirectement identifiantes</strong> (alias, numéro dans un classement, etc.) afin d’en réduire leur sensibilité. Elles peuvent résulter d’un <a href="https://www.cnil.fr/fr/comprendre-les-grands-principes-de-la-cryptologie-et-du-chiffrement">hachage cryptographique des données</a> des individus, tels que son adresse IP, son identifiant utilisateur, son adresse e-mail.</p></li>
<li><p>Les données résultant d’une pseudonymisation sont considérées comme des <strong>données à caractère personnel et restent donc soumises aux obligations du RGPD</strong>. Toutefois, le règlement européen encourage l’utilisation de la pseudonymisation dans le cadre du traitement des données à caractère personnel. Par ailleurs le RGPD considère que la pseudonymisation permet de réduire les risques pour les personnes concernées et de contribuer à la mise en conformité au règlement.</p></li>
</ul>
<h1 id="fiche-n2-préparer-son-développement">Fiche n°2 : Préparer son développement</h1>
<h4 id="les-principes-de-la-protection-des-données-à-caractère-personnel-doivent-être-intégrés-aux-développements-informatiques-dès-les-phases-de-conception-afin-de-protéger-la-vie-privée-des-personnes-dont-vous-allez-traiter-les-données-et-de-leur-offrir-une-meilleure-maîtrise-de-leurs-données-et-de-limiter-les-erreurs-pertes-modifications-non-autorisées-ou-mauvais-usages-de-celles-ci-dans-les-applications.">Les principes de la protection des données à caractère personnel doivent être intégrés aux développements informatiques dès les phases de conception afin de protéger la vie privée des personnes dont vous allez traiter les données, et de leur offrir une meilleure maîtrise de leurs données et de limiter les erreurs, pertes, modifications non autorisées, ou mauvais usages de celles-ci dans les applications.</h4>
<h2 id="choix-méthodologiques">Choix méthodologiques</h2>
<ul>
<li><p><strong>Mettez la protection de la vie privée au cœur de vos développements</strong> en adoptant une méthodologie de <a href="https://edpb.europa.eu/our-work-tools/public-consultations-art-704/2019/guidelines-42019-article-25-data-protection-design_en">Privacy By Design</a>.</p></li>
<li><p>Si vous utilisez des méthodes agiles pour vos développements, pensez à <strong>intégrer la sécurité au cœur de votre processus</strong>. L’ANSSI a rendu disponible un guide <a href="https://www.ssi.gouv.fr/uploads/2018/11/guide-securite-numerique-agile-anssi-pa-v1.pdf">« sécurité & agilité numériques »</a> qui indique comment conduire vos développements dans le cadre d’une méthode agile tout en prenant en compte les aspects sécurité. N’hésitez pas à vous en inspirer.</p></li>
<li><p>Pour tout développement à destination du grand public, <strong>menez une réflexion sur les paramètres relatifs à la vie privée</strong>, et notamment sur le paramétrage par défaut, par exemple les caractéristiques et les contenus des utilisateurs visibles par défaut.</p></li>
<li><p><strong>Réalisez une <a href="https://www.cnil.fr/fr/RGPD-analyse-impact-protection-des-donnees-aipd">analyse d’impact sur la protection des données (AIPD)</a></strong>. Pour <a href="https://www.cnil.fr/sites/default/files/atoms/files/liste-traitements-avec-aipd-requise-v2.pdf">certaines opérations de traitement</a>, elle est obligatoire. Dans les autres cas c’est une bonne pratique qui vous permettra d’identifier et de traiter tous les risques en amont de vos développements. La CNIL dispose d’une section spéciale sur son site et elle met à disposition un <a href="https://www.cnil.fr/fr/outil-pia-telechargez-et-installez-le-logiciel-de-la-cnil">logiciel gratuit</a> consacré à ce type d’analyse.</p></li>
</ul>
<h2 id="choix-technologiques">Choix technologiques</h2>
<h4 id="architecture-et-fonctionnalités">Architecture et fonctionnalités</h4>
<ul>
<li><p><strong>Intégrez la protection de la vie privée, y compris les exigences de sécurité des données, dès la conception de l’application ou du service</strong>. Ces exigences doivent influer sur les <a href="#Fiche_n°5%c2%a0:_Faire_un_choix_éclairé_de_son_architecture">choix d’architecture</a> (par exemple décentralisée vs centralisée) ou de fonctionnalités (par exemple anonymisation à bref délai, minimisation des données). Le paramétrage par défaut de l’application doit respecter les exigences minimales de sécurité et être en conformité avec la loi. Par exemple, la complexité par défaut des mots de passe doit respecter à minima la <a href="https://www.legifrance.gouv.fr/affichCnil.do?oldAction=rechExpCnil&id=CNILTEXT000033929210&fastReqId=1726469546&fastPos=3">recommandation de la CNIL relative aux mots de passe</a>.</p></li>
<li><p><strong>Gardez la maîtrise de votre système</strong>. Il est important de garder la maîtrise de votre système, autant afin d’en assurer le bon fonctionnement que de garantir un haut niveau de sécurité. Garder un système simple permet d’en comprendre précisément les rouages et d’identifier ses points de fragilité. Dans le cas où une certaine complexité est nécessaire, il est conseillé de démarrer d’un système simple, correctement conçu et sécurisé. Ensuite, il est possible d’en augmenter la complexité petit à petit, tout en continuant de sécuriser les nouveautés qui s’ajoutent.</p></li>
<li><p><strong>Ne vous reposez pas sur une seule ligne de défense</strong>. Malgré toutes les dispositions prises pour concevoir un système sécurisé, il peut arriver que certains composants rajoutés ultérieurement ne soient pas suffisamment sécurisés. Pour minimiser les risques sur les utilisateurs finaux, il est conseillé de défendre le système en profondeur. Exemple : contrôler les données entrées dans un formulaire en ligne fait partie des défenses de périphérie. Dans le cas où cette défense est détournée, une protection des requêtes en base de données pourra prendre le relais.</p></li>
</ul>
<h4 id="outils-et-pratiques">Outils et pratiques</h4>
<ul>
<li><p><strong>Utilisez des normes de programmation prenant en compte la sécurité</strong>. Souvent, des listes de normes, bonnes pratiques ou guides de codage améliorant la sécurité de vos développements sont déjà disponibles. Des outils annexes peuvent également être intégrés dans vos environnements de développement intégrés (« <strong>IDE</strong> » en anglais) afin de vérifier automatiquement que votre code respecte les différentes règles faisant partie de ces normes ou bonnes pratiques. Vous trouverez facilement sur internet des listes de bonnes pratiques pour votre langage de programmation favori. Par exemple <a href="https://wiki.sei.cmu.edu/confluence/display/seccode/SEI+CERT+Coding+Standards">ici</a> pour C, C++ ou Java. Pour le développement d’application web, des guides de bonnes pratiques spécifiques existent, tels que ceux publiés par <a href="https://www.owasp.org/index.php/Main_Page">l’OWASP.</a></p></li>
<li><p><strong>Le choix des technologies utilisées est crucial</strong>. Un certain nombre de points sont à prendre en compte :</p>
<ul>
<li><p>En fonction du domaine d’application ou de la fonctionnalité développée, un langage ou une technologie peut être plus approprié qu’une autre.</p></li>
<li><p>Les langages et technologies éprouvés sont plus sûrs. Ils ont fait, en général, l’objet d’audits afin de corriger les vulnérabilités les plus connues. Il faut cependant faire attention à utiliser les dernières versions de chacune des briques technologiques que vous utiliserez.</p></li>
<li><p>Il faut à tout prix éviter de coder sa solution définitive dans un langage tout juste appris et pas encore maîtrisé. Dans le cas contraire, vous vous exposez à un risque accru de faille de sécurité du fait du manque d’expérience.</p></li>
</ul></li>
<li><p><strong>Mettez en place un environnement de développement sécurisé et permettant le versionnage du code</strong>, en suivant la <a href="#Fiche_n°3%c2%a0:_Sécuriser_son_environnement_de_développement">fiche dédiée</a> de ce guide.</p></li>
</ul>
<h1 id="fiche-n3-sécuriser-son-environnement-de-développement">Fiche n°3 : Sécuriser son environnement de développement</h1>
<h4 id="la-sécurité-des-serveurs-de-production-de-développement-dintégration-continue-ainsi-que-les-postes-de-travail-des-développeuses-et-développeurs-doit-être-une-priorité-car-ils-centralisent-laccès-à-un-grand-nombre-de-données.">La sécurité des serveurs de production, de développement, d'intégration continue ainsi que les postes de travail des développeuses et développeurs doit être une priorité car ils centralisent l'accès à un grand nombre de données.</h4>
<h2 id="évaluez-vos-risques-et-adoptez-les-mesures-de-sécurité-adéquates">Évaluez vos risques et adoptez les mesures de sécurité adéquates</h2>
<ul>
<li><p><strong>Évaluez les risques</strong> dans les outils et les processus utilisés pour vos développements. Recensez vos mesures de sécurité existantes et définissez un plan d'action permettant d'améliorer la couverture de vos risques. Désignez une personne responsable de sa mise en œuvre.</p></li>
<li><p>Pensez à prendre compte les risques sur tous les outils que vous utilisez, notamment les risques liés aux <strong>outils SaaS</strong> (<em>Software as a Service</em>) et collaboratifs dans le <em>cloud</em> (type <a href="https://slack.com">Slack</a>, <a href="https://trello.com">Trello</a>, <a href="https://github.com">GitHub</a>, etc.).</p></li>
</ul>
<h2 id="sécurisez-vos-serveurs-et-vos-postes-de-travail-dune-façon-homogène-et-reproductible">Sécurisez vos serveurs et vos postes de travail d'une façon homogène et reproductible</h2>
<ul>
<li><p>Des listes de <strong>recommandations</strong> concernant la sécurisation des serveurs, postes de travail et réseaux internes sont disponibles dans les <a href="https://www.cnil.fr/fr/principes-cles/guide-de-la-securite-des-donnees-personnelles">fiches n°5 à 8</a> du <strong>guide sécurité des données personnelles</strong> de la CNIL.</p></li>
<li><p>Rédigez un <strong>document regroupant ces mesures et expliquant leur configuration</strong> : il permet de s'assurer d'une mise en place homogène des mesures de sécurité sur les serveurs et les postes de travail. Afin de réduire la charge de travail, des <strong>outils de gestion de configuration</strong>, tels qu'<a href="https://github.com/ansible/ansible">Ansible</a>, <a href="https://github.com/puppetlabs/puppet">Puppet</a> ou <a href="https://github.com/chef/chef">Chef</a>, peuvent être utilisés.</p></li>
<li><p>Mettez à jour les serveurs et postes de travail, si possible de manière automatique. Vous pouvez vous constituer une liste de veille recensant les vulnérabilités les plus importantes, par exemple les <a href="https://www.cert.ssi.gouv.fr/alerte/">alertes de sécurité</a>, <a href="https://www.cert.ssi.gouv.fr/avis/">avis de sécurité</a> et les <a href="https://www.cert.ssi.gouv.fr/actualite/">bulletins d'actualité</a> du CERT-FR.</p></li>
</ul>
<h2 id="maîtrisez-vos-accès-et-tracez-les-opérations">Maîtrisez vos accès et tracez les opérations</h2>
<ul>
<li>Documentez la gestion de vos <strong>clés SSH</strong> (utilisation d'algorithmes de cryptographie et de longueur de clés à l'état de l'art, protection des clés privées par une <em>passphrase</em>, rotation des clés). Pour des exemples de bonnes pratiques, consulter <a href="https://www.ssi.gouv.fr/uploads/2014/01/NT_OpenSSH.pdf">le document sur l'usage sécurisé d'(open)SSH</a>.</li>
</ul>
<p><details> <summary> <em>La gestion de clés SSH en pratique</em></summary> <br></p>
<p>Si vous devez vous connecter à un service en ligne ou à l'un de vos serveurs, faites le choix d'algorithme asymétriques, ECDSA ou bien RSA.</p>
<p>Par exemple en utilisant l'outil ssh-keygen (disponible sous linux et OSX), utiliser les commandes :</p>
<pre class="sourceCode bash"><code class="sourceCode bash"><span class="kw">ssh-keygen</span> -t ed25519</code></pre>
<p>Cette commande va créer ou utiliser votre répertoire de clés SSH, par exemple sur Linux <code>/home/username/.ssh/</code>), et y écrire deux éléments : une clé privée et une clé publique.</p>
<p>Vous pouvez alors soit envoyer la clé publique au serveur pour le configurer (si vous avez un moyen d'authentification préexistant), soit la copier dans votre presse-papier pour la fournir au service que vous souhaitez utiliser :</p>
<pre class="sourceCode bash"><code class="sourceCode bash"><span class="co">#Pour envoyer :</span>
<span class="kw">ssh-copy-id</span> -i ~/.ssh/key.pub user@host
<span class="co">#Pour copier sur des systèmes Debian ou Ubuntu:</span>
<span class="kw">sudo</span> apt install xclip
<span class="kw">xclip</span> -sel clip <span class="kw"><</span> ~/.ssh/key.pub</code></pre>
<p>La clé privée ne doit jamais être envoyée ou partagée avec un tiers. Pour plus d'info sur les mesures organisationnelles à mettre en place pour une bonne gestion des clés, voir la norme <a href="https://nvlpubs.nist.gov/nistpubs/ir/2015/NIST.IR.7966.pdf">NISTIR 7966</a>.</p>
<p></details> <br></p>
<ul>
<li><p>Favorisez une <strong>authentification forte</strong> sur les services utilisés par l'équipe de développement.</p></li>
<li><p><strong>Tracez</strong> les accès à vos machines et, si possible, mettez en place une <strong>analyse automatique des journaux</strong>. Afin de conserver des traces fiables, l'usage de compte générique est à proscrire.</p></li>
<li><p>La plupart des services centralisés (Gitlab ou Jenkins par exemple) nécessite la création de jetons individuels pour authentifier les requêtes (“Webhook”). Il est recommandé d'associer une durée de vie limitée à ces jetons et de les révoquer lorsqu'ils ne sont plus utilisés.</p></li>
</ul>
<h1 id="fiche-n4-gérer-son-code-source">Fiche n°4 : Gérer son code source</h1>
<h4 id="quelle-que-soit-lampleur-de-votre-projet-il-est-très-fortement-recommandé-dutiliser-un-outil-de-gestion-de-code-source-pour-suivre-dans-le-temps-ses-différentes-versions.">Quelle que soit l’ampleur de votre projet, il est très fortement recommandé d’utiliser un outil de gestion de code source pour suivre dans le temps ses différentes versions.</h4>
<h2 id="paramétrez-efficacement-votre-gestionnaire-de-code-source-en-pensant-à-sa-sécurité">Paramétrez efficacement votre gestionnaire de code source, en pensant à sa sécurité</h2>
<ul>
<li><p>Un gestionnaire de code source est un logiciel permettant de stocker <strong>l’ensemble de votre code source et des fichiers associés</strong>, tout en conservant la <strong>chronologie de toutes les modifications</strong> qui ont été apportées. Un simple serveur FTP ne constitue pas un gestionnaire de code source.</p></li>
<li><p>Paramétrez correctement votre environnement en utilisant les fonctionnalités proposées par votre gestionnaire de code source. Il est recommandé de mettre en place une <strong>authentification forte</strong> et/ou une <strong>authentification par clés SSH</strong> dès le début de votre projet.</p></li>
</ul>
<p><details> <summary><em> Mise en place d'une authentification forte sur les services de gestion de développement de logiciels </em></summary> <br></p>
<ul>
<li><p>Le logiciel libre <a href="https://docs.gitlab.com/">GitLab</a> offre des fonctionnalités de <a href="https://docs.gitlab.com/ee/user/profile/account/two_factor_authentication.html">double authentification</a> et <a href="https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html">d'accès par jeton d'authentification avec gestion des droits</a>. Ces deux fonctionnalités se retrouvent également sur des services web comme <a href="https://help.github.com/en/github/authenticating-to-github/configuring-two-factor-authentication">GitHub</a>.</p></li>
<li><p><strong>Pensez à sauvegarder vos codes de récupération dans un endroit sûr</strong>, par exemple un gestionnaire de mot de passe ou conservez leur impression dans un endroit sécurisé.</p></li>
</ul>
<p></details> <br></p>
<ul>
<li><p>Par ailleurs, attribuez aux utilisateurs de votre gestionnaire de code source des <em>niveaux d’accès</em> à votre projet et définissez pour chacun des niveaux les <strong>permissions</strong> correspondantes (par exemple, un niveau « invité » avec des droits limités en lecture, un niveau « équipe de développement » avec des droits en écriture, etc.).</p></li>
<li><p>Faites des <strong>sauvegardes</strong> régulières de votre système de gestion de code source. En particulier, pensez à sauvegarder votre serveur principal où toutes les modifications sont enregistrées.</p></li>
<li><p>Mettez en place des procédures de développement pour travailler efficacement même si <strong>plusieurs personnes développent en même temps</strong>. Par exemple, vous pouvez décider de ne pas travailler sur la même branche (<em>master</em> ou <em>main</em>), mais de mettre en place des branches par fonctionnalité, qui seront fusionnées dans la branche principale au fur et à mesure du développement. De telles stratégies de développement sont déjà bien documentées, par exemple dans <a href="https://nvie.com/posts/a-successful-git-branching-model/">Git Flow</a>. Par ailleurs, certains gestionnaires de code source proposent de configurer des <strong>branches protégées</strong> qui empêchent des modifications non autorisées sur les fichiers contenus dans ces branches.</p></li>
</ul>
<h2 id="soyez-vigilant-sur-le-contenu-de-votre-code-source">Soyez vigilant sur le contenu de votre code source</h2>
<ul>
<li><p>Mettez en œuvre des <strong>outils de métriques de qualité de code</strong> qui scanneront votre code dès son <em>commit</em> pour vérifier sa bonne qualité. Vous pouvez également ajouter des scripts de contrôle de ces métriques dans la <a href="https://git-scm.com/book/uz/v2/Customizing-Git-Git-Hooks">configuration du gestionnaire de code source</a> : le <em>commit</em> sera alors annulé si le code source n’est pas d’une qualité suffisante.</p></li>
<li><p>Conservez vos secrets et mots de passe en dehors de votre dépôt de code source :</p>
<ul>
<li><p>dans des <strong>fichiers à part, qui n’ont pas fait l’objet d’un <em>commit</em></strong>. Pensez à utiliser les fichiers spéciaux de votre gestionnaire de code source (tels que <em>.gitignore</em> pour <em>Git</em>) afin de ne pas <em>commiter</em> les fichiers sensibles par erreur.</p></li>
<li><p>dans des <strong>variables d’environnement</strong>, en prenant soin de vérifier que les variables d’environnement ne sont pas accidentellement écrites dans des <em>logs</em> ou affichées lors d’une erreur de l’application.</p></li>
<li><p>en les stockant dans des <strong>enclaves sécurisées</strong> ou des <strong>dépots séparés avec accès restreint</strong> que vous pourrez appeler comme dépendance externe de votre projet.</p></li>
<li><p>en utilisant des <strong>logiciels spécifiques de gestion de secrets ou de gestion de configuration</strong> (par exemple <a href="https://github.com/hashicorp/vault">Vault</a> de la société HashiCorp, <a href="https://square.github.io/keywhiz">Keywhiz</a> de la société Square ou <a href="https://github.com/pinterest/knox">Knox</a> de la société Pinterest).</p></li>
<li><p>Enfin, si vous devez inclure de telles données dans votre dépôt, pensez à <strong>chiffrer/déchiffrer automatiquement</strong> les fichiers en utilisant un <em>greffon</em> de votre gestionnaire de code source (par exemple <a href="https://github.com/AGWA/git-crypt"><em>git-crypt</em></a>).</p></li>
</ul></li>
<li><p>Après un <em>commit</em> qui contient des données personnelles ou d’autres données critiques, n’oubliez pas de <a href="https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History">purger</a> <a href="https://help.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository#purging-a-file-from-your-repositorys-history">complètement</a> le dépôt de code source : même après modification, les données peuvent rester disponibles dans l’historique de votre dépôt.</p></li>
<li><p>Faites preuve de prudence avant de <strong>publier en ligne</strong> votre code source. Passez en revue <strong>l’intégralité de son contenu</strong> afin de vous assurer qu’aucune donnée personnelle, mot de passe ou autre secret n’est présent, y compris dans tout l’historique des modifications.</p></li>
</ul>
<h2 id="exemples-doutils">Exemples d’outils</h2>
<ul>
<li><p>À l’inverse d’outils tels que <a href="https://subversion.apache.org/">Subversion</a>, qui ont besoin d’un serveur central pour fonctionner, les principaux gestionnaires de code source (<a href="https://git-scm.com/">Git</a>, <a href="https://www.mercurial-scm.org/">Mercurial</a> par exemple) sont <strong>décentralisés</strong>.</p></li>
<li><p>Pour la plupart de ces outils, une <strong>interface web et des outils annexes</strong> (gestion des bugs, wiki pour votre documentation, etc.) sont proposés. Ces solutions peuvent soit être accessibles par internet (<a href="https://github.com/">GitHub</a>, <a href="https://bitbucket.org/">Bitbucket</a>, etc.), soit être installées en interne sur vos serveurs (<a href="https://about.gitlab.com/">GitLab</a>).</p></li>
</ul>
<h1 id="fiche-n5-faire-un-choix-éclairé-de-son-architecture">Fiche n°5 : Faire un choix éclairé de son architecture</h1>
<h4 id="lors-de-la-conception-de-larchitecture-de-votre-application-vous-devez-identifier-les-données-personnelles-qui-seront-collectées-et-définir-un-parcours-et-un-cycle-de-vie-pour-chacune-dentre-elles.-le-choix-des-supports-de-données-stockage-local-serveur-service-cloud-est-une-étape-cruciale-qui-doit-être-adaptée-à-vos-besoins-mais-aussi-à-vos-connaissances-techniques.-le-registre-des-activités-de-traitement-et-une-analyse-dimpact-peuvent-vous-accompagner-dans-ce-choix.">Lors de la conception de l’architecture de votre application, vous devez identifier les données personnelles qui seront collectées et définir un parcours et un cycle de vie pour chacune d’entre elles. Le choix des supports de données (stockage local, serveur, service cloud) est une étape cruciale, qui doit être adaptée à vos besoins, mais aussi à vos connaissances techniques. Le registre des activités de traitement et une analyse d’impact peuvent vous accompagner dans ce choix.</h4>
<h2 id="étudier-le-parcours-de-ses-données">Étudier le parcours de ses données</h2>
<ul>
<li><p>Représentez et décrivez en amont du projet le fonctionnement attendu de votre projet, avec un schéma des flux de données et la description détaillée des processus mis en œuvre et des supports utilisés.</p></li>
<li><p>Lorsque les données sont uniquement <strong>stockées sur le terminal de l’utilisateur</strong> (stockage local) ou restent <strong>confinées sur des réseaux de communication intégralement sous la maîtrise de l’utilisateur</strong> (par exemple, le Wi-Fi ou autre réseau local), le principal point d’attention est celui de la sécurité des données. Les durées de conservation sur ces données peuvent être déterminées par la personne elle-même ; elle doit cependant être en mesure de supprimer ces données à tout moment.</p></li>
<li><p><strong>Lorsque les données doivent transiter par un service en ligne</strong>, le choix d’héberger soi-même ces données ou de passer par un prestataire doit se faire en fonction de vos connaissances en sécurité et de la qualité de service attendue. Les offres de cloud reconnues peuvent présenter des niveaux de sécurité supérieurs. Cependant, elles génèrent de nouveaux risques qui doivent être maîtrisées. Pour vous aider, vous pouvez vous appuyer sur la <a href="https://www.cnil.fr/sites/default/files/typo/document/Recommandations_pour_les_entreprises_qui_envisagent_de_souscrire_a_des_services_de_Cloud.pdf">recommandation de la CNIL sur le Cloud computing</a>.</p></li>
</ul>
<p><details> <summary> <em> Quelques exemples d'étude du parcours de la donnée par la CNIL</em> </summary> <br></p>
<p>Les packs de conformité sectoriels sur les <a href="https://www.cnil.fr/sites/default/files/typo/document/Pack_de_Conformite_COMPTEURS_COMMUNICANTS.pdf">compteurs communicants</a>, <a href="https://www.cnil.fr/sites/default/files/atoms/files/pack_vehicules_connectes_web.pdf">les véhicules connectés</a> et <a href="https://www.cnil.fr/sites/default/files/atoms/files/pack_silver_economie_v4.pdf">la silver économie</a>, ainsi que le <a href="https://www.cnil.fr/sites/default/files/atoms/files/cnil_livre-blanc-assistants-vocaux.pdf">livre blanc sur les assistants vocaux</a> peuvent vous accompagner dans l'identification des parcours de données de votre produit.</p>
<p>Chaque cas d'usage met ainsi en œuvre des parcours distincts pour lesquels la création d'un compte et l'intervention d'un ou plusieurs acteurs externes peuvent être nécessaires.</p>
<p>La conformité de ces parcours est étudiée suivant 3 étapes :</p>
<ul>
<li>l'identification du traitement, du responsable et de sa base légale,</li>
<li>l'identification des données collectées ainsi que de leur durée de conservation,</li>
<li>l'information et la garantie des droits des personnes concernées.</li>
</ul>
<p>Ces analyses peuvent vous accompagner dans l'identification des développements à prévoir, suivant les caractéristiques du traitement, la base juridique applicable et l'identification des données qui nécessitent une attention particulière du fait de leur caractère sensible.</p>
<p></details></p>
<h2 id="en-cas-de-recours-à-un-prestataire-pour-lhébergement">En cas de recours à un prestataire pour l’hébergement</h2>
<ul>
<li><p><strong>Choisir un prestataire garantissant la mise en place de mesures de sécurité et de confidentialité appropriées, et suffisamment transparentes</strong>. La CNIL vous propose des <a href="https://www.cnil.fr/sites/default/files/typo/document/Recommandations_pour_les_entreprises_qui_envisagent_de_souscrire_a_des_services_de_Cloud.pdf">modèles de clauses de confidentialité</a>.</p></li>
<li><p><strong>S’assurer de connaître la localisation géographique des serveurs qui vont héberger vos données</strong>. Vous pouvez être amené⋅e à effectuer des transferts de données hors de l’Union européenne (UE) et de l’espace économique européen (EEE). Si les données peuvent circuler librement dans l’UE/EEE, les transferts hors de cet espace sont possibles, à condition d’assurer un <a href="https://www.cnil.fr/fr/transferer-des-donnees-hors-de-lue">niveau de protection des données suffisant et approprié</a>. La CNIL fournit sur site une carte permettant de visualiser les <a href="https://www.cnil.fr/fr/la-protection-des-donnees-dans-le-monde">différents niveaux de protection des données des pays dans le monde</a>.</p></li>
<li><p><strong>Si vous devez recourir à un prestataire pour héberger des données de santé</strong>, assurez-vous que celui-ci est <a href="https://esante.gouv.fr/labels-certifications/hds/liste-des-herbergeurs-certifies">certifié</a> ou <a href="https://esante.gouv.fr/labels-certifications/hds/liste-des-herbergeurs-agrees">agréé</a> pour cette activité.</p></li>
<li>Les autres points de vigilance sont notamment :
<ul>
<li>l’existence d’une politique de sécurité accessible ;</li>
<li>les mesures de sécurité et sûreté physique sur le site d’hébergement ;</li>
<li>le chiffrement des données et les autres procédés garantissant que le prestataire n’a pas accès aux données qui lui sont confiées ;</li>
<li>la gestion des mises à jour, la gestion des habilitations, l’authentification des personnels et la sécurité des développements applicatifs ;</li>
<li>la réversibilité/portabilité aisée des données dans un format structuré et couramment utilisé, sur demande et à tout moment.</li>
</ul></li>
</ul>
<h1 id="fiche-n6-sécuriser-vos-sites-web-vos-applications-et-vos-serveurs">Fiche n°6 : Sécuriser vos sites web, vos applications et vos serveurs</h1>
<h4 id="tout-site-web-application-ou-serveur-doit-intégrer-les-règles-élémentaires-de-sécurité-à-létat-de-lart-tant-sur-les-communications-que-sur-les-authentifications-ou-son-infrastructure.">Tout site web, application ou serveur doit intégrer les règles élémentaires de sécurité à l’état de l’art, tant sur les communications que sur les authentifications ou son infrastructure.</h4>
<h2 id="sécuriser-les-communications">Sécuriser les communications</h2>
<ul>
<li><p><strong>Mettez en œuvre le protocole TLS version 1.2 ou 1.3</strong> (en remplacement de SSL) sur tous les sites web et pour les transmissions de données de vos applications mobiles en utilisant uniquement les versions les plus récentes et en vérifiant sa bonne mise en œuvre.</p></li>
<li><p><strong>Rendez l’utilisation de TLS obligatoire</strong> pour toutes les pages de votre site et pour vos applications mobiles.</p></li>
<li><p><strong>Limitez les ports de communication</strong> strictement nécessaires au bon fonctionnement des applications installées. Si l’accès à un serveur web n’est possible qu’à l’aide du protocole HTTPS, seul le ports 443 de ce serveur, et éventuellement le port 80 afin de rediriger vers le protocole HTTPS, doit être accessible sur Internet. Les autres ports doivent alors être bloqués au niveau du pare-feu.</p></li>
<li><p><strong>L’ANSSI a publié sur son site des <a href="https://www.ssi.gouv.fr/entreprise/bonnes-pratiques/">recommandations spécifiques</a></strong> pour <a href="https://www.ssi.gouv.fr/entreprise/guide/recommandations-de-securite-relatives-a-tls/">mettre en œuvre TLS</a> ou <a href="https://www.ssi.gouv.fr/uploads/2013/05/anssi-guide-recommandations_mise_en_oeuvre_site_web_maitriser_standards_securite_cote_navigateur-v2.0.pdf">pour sécuriser un site web</a>.</p></li>
</ul>
<p><details> <summary> <em> En savoir plus sur la mise en place de TLS</em> </summary> <br></p>
<p>La sécurisation des communications des sites et applications mobiles nécessite d'utiliser le protocole "TLS". La combinaison de ce protocole avec le protocole "HTTP" permet un échange par "HTTPS". Certains algorithmes cryptographiques employés dans TLS, et ses versions précédentes "SSL", sont réputées vulnérables à différentes attaques. Vous pouvez vous faire accompagner dans le choix de ces algorithmes au moyen de <strong>générateurs de configuration TLS</strong>. Celui de <a href="https://ssl-config.mozilla.org/">Mozilla</a> supporte par exemple de très nombreux serveurs.</p>
<p>Deux exemples de configuration <a href="annexes/conf_tls_apache.txt">Apache</a> et <a href="annexes/conf_tls_nginx.txt">Nginx</a> commentés sont disponibles en annexe de ce guide. Vous pouvez vous référer au <a href="https://wiki.mozilla.org/Security/Server_Side_TLS">Wiki Mozilla</a> pour plus de détails.</p>
<p></details></p>
<h2 id="sécuriser-les-authentifications">Sécuriser les authentifications</h2>
<ul>
<li><strong>Suivez <a href="https://www.cnil.fr/fr/mots-de-passe-des-recommandations-de-securite-minimales-pour-les-entreprises-et-les-particuliers">les recommandations de la CNIL sur les mots de passe</a></strong>. Pensez notamment à limiter le nombre de tentatives d’accès.</li>
</ul>
<p><details> <summary><em>Voir une implémentation Frontend de vérification de force de mot de passe</em></summary> <br></p>
<p>Dans sa délibération du 10 janvier 2017 portant adoption d'une recommandation relative aux mots de passe, la CNIL spécifie que si le mot de passe n'est pas utilisé en conjonction avec un second facteur, et sans blocage de fréquence ("frequency capping"), un mot de passe devrait être constitué de 12 caractères et comprendre majuscule, minuscule, chiffres et caractères spéciaux.</p>
<p>En conséquence, pour vérifier l'adhérence à ces règles, le code suivant est adéquat :</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript"><span class="kw">function</span> <span class="fu">checkPassword</span>(pass) {
<span class="kw">if</span> (!pass)
<span class="kw">return</span> <span class="kw">false</span>;
<span class="kw">var</span> expectations = [
<span class="ot">/</span><span class="bn">\d</span><span class="ot">/</span>.<span class="fu">test</span>(pass),
<span class="ot">/</span><span class="bn">[a-z]</span><span class="ot">/</span>.<span class="fu">test</span>(pass),
<span class="ot">/</span><span class="bn">[A-Z]</span><span class="ot">/</span>.<span class="fu">test</span>(pass),
<span class="ot">/</span><span class="bn">\W</span><span class="ot">/</span>.<span class="fu">test</span>(pass),
<span class="ot">pass</span>.<span class="fu">length</span>>=<span class="dv">12</span>
];
<span class="kw">return</span> !<span class="ot">expectations</span>.<span class="fu">includes</span>(<span class="kw">false</span>);
}</code></pre>
<p>Cela doit également s'accompagner d'une vérification backend de la force du mot de passe.</p>
<p></details></p>
<ul>
<li><strong>Ne stockez jamais les mots de passe en clair</strong>. Stockez-les sous forme de hachage (hash) au moyen d’une librairie éprouvée, comme <em>Argon2</em>, <em>yescrypt</em>, <em>scrypt</em>, <em>balloon</em>, <em>bcrypt</em> et, dans une moindre mesure, <em>PBKDF2</em>.</li>
</ul>
<p><details> <summary><em>Voir des modalités pratiques de hashage des mots de passe</em></summary> <br></p>
<p>Il ne faut jamais stocker les mots de passe des utilisateurs en clair dans vos bases de données, il faut systématiquement les hasher, avec un sel specifique. En pratique, bcrypt est sans doute la solution la plus simple d'utilisation. Elle utilise un sel aléatoire pour chaque hash et l'inclue dans le hash résultant pour la vérification d'un mot de passe.</p>
<p>Par exemple en node.js :</p>
<pre class="sourceCode javascript"><code class="sourceCode javascript">#Pour installer:
npm install bcrypt
#Pour utiliser:
<span class="kw">const</span> bcrypt = <span class="fu">require</span>(<span class="st">'bcrypt'</span>);
<span class="kw">const</span> saltRounds = <span class="dv">10</span>; <span class="co">// Niveau de difficulté de bcrypt</span>
#Enregistrer un mot de passe en DB
<span class="kw">const</span> passwordAStocker = <span class="st">'*********'</span>;
<span class="ot">bcrypt</span>.<span class="fu">genSalt</span>(saltRounds, <span class="kw">function</span>(err, salt) {
<span class="ot">bcrypt</span>.<span class="fu">hash</span>(passwordAStocker, salt, <span class="kw">function</span>(err, hash) {
<span class="co">// stockez le résultat 'hash' en DB</span>
});
});
#Verifier un mot de passe
<span class="kw">const</span> passwordAVerifier = <span class="st">'*********'</span>;
<span class="ot">bcrypt</span>.<span class="fu">compare</span>(passwordAVerifier, hash, <span class="kw">function</span>(err, result) {
<span class="co">// 'result' vaut true si le mot de passe est le bon</span>
});</code></pre>
<p></details></p>
<p><details> <summary> <em> En savoir plus sur les fonctions de hachage à clé </em> </summary> <br></p>
<ul>
<li><p>Les fonctions de hachage permettent d’assurer <strong>l’intégrité des données</strong>. Elles doivent reposer sur un algorithme <strong>reconnu et sûr</strong>. La famille de fonctions <em>SHA-2</em> (par exemple <em>SHA-256</em> et <em>SHA-512</em>) comporte des fonctions de hachage génériques qu’il ne faut pas utiliser directement pour certaines tâches spécifiques.En revanche, elles sont tout à fait acceptables comme fonction de base pour des fonctions de hachage spécialisées. Par exemple, la fonction HMAC utilisée avec SHA-256 ou SHA-512 est adaptée à la signature numérique.</p></li>
<li><p>Pour stocker les mots de passe, les fonctions adaptées sont les suivantes : <em>Argon2</em>, <em>yescrypt</em>, <em>scrypt</em>, <em>balloon</em>, <em>bcrypt</em> et, dans une moindre mesure, <em>PBKDF2</em>. À noter que les fonctions <em>balloon</em> et <em>PBKDF2</em> peuvent êtres utilisées avec plusieurs fonctions de hachage sous-jacentes, le choix devant donc être fait sur une fonction reconnue (par exemple une fonction des familles <em>SHA-2</em>, <em>SHA-3</em>, <em>Blake2</em> ou <em>Blake3</em>).</p></li>
<li><p>N'utilisez jamais d'algorithmes obsolètes, comme les chiffrements DES et 3DES ou les fonctions de hachage MD5 et SHA1. Leur utilisation peut permettre à un attaquant ayant connaissance du mot de passe haché de déchiffrer celui-ci sans difficulté et en un temps très court.</p></li>
<li><p>Les fonctions de hachage à clé permettent de rendre le calcul de l’empreinte différent en fonction de la clé utilisée. Pour deux clés différentes <strong>l’empreinte obtenue sur un même message sera différente</strong>.</p></li>
<li><p>Utilisez <strong>des tailles de clés suffisantes</strong>, <em>au minimum de 128 bits</em> suivant l'algorithme utilisé. Protégez ces clés secrètes, au minimum par la <strong>mise en œuvre de droits d’accès restrictifs</strong> et d’<strong>un mot de passe sûr</strong>.</p></li>
<li><p>Rédiger une procédure indiquant la manière dont les clés vont être gérés en prenant en compte <strong>les cas d’oubli de mot de passe de déverrouillage</strong>.</p></li>
<li><p>Par exemple, le code Python suivant permet de <strong>générer un sel aléatoire et un haché d'un mot de passe ainsi que de vérifier la validité de celui-ci</strong> depuis la bibliothèque <a href="https://pypi.org/project/bcrypt/">bcrypt</a> :</p></li>
</ul>
<pre class="sourceCode python"><code class="sourceCode python"><span class="ch">import</span> bcrypt <span class="co">#importation de la bibliothèque bcrypt</span>
sel = bcrypt.gensalt() <span class="co">#Génération d'un sel aléatoire à conserver de manière sécurisée</span>
hache_du_mot_de_passe = bcrypt.hashpw(mot_de_passe, sel) <span class="co">#Génération du hachage du mot de passe avec le sel généré</span>
mot_de_passe_valide = bcrypt.checkpw(mot_de_passe, hache_du_mot_de_passe) <span class="co">#Test de la validité du mot de passe depuis son haché</span></code></pre>
<p></details></p>
<ul>
<li><p><strong>Dans le cas où des cookies sont utilisés pour permettre l’authentification</strong>, il est recommandé :</p>
<ul>
<li><p>de protéger les cookies contre des lectures via des canaux de non chiffrées, en forcant l’utilisation d’HTTPS via l’<a href="https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security">HSTS</a>, ainsi que par l'utilisation des indicateurs <code>Secure</code> et <code>HttpOnly</code> ;</p></li>
<li><p>d'utiliser des protections contre des <a href="https://www.cert.ssi.gouv.fr/information/CERTA-2008-INF-003">injections de requêtes illégitimes par rebond</a> (cross-site request forgery ou CSRF) en utilisant des mesures de protection comme le CSRF Token et l'indicateur <code>SameOrigin</code> sur les requêtes. L'indicateur <code>SameSite</code> des cookies doit avoir la valeur <code>Strict</code> lorsque c'est possible ;</p></li>
<li><p>d'utiliser un sous-domaine spécifique pour déposer le token d'authentification avec l'indicateur <code>domain</code> des cookies laissés vides pour exclure les domaines tiers dans le cas où de la délégation de sous-domaine est utilisée (par exemple à travers l'usage de CNAME), ou bien des serveurs avec un faible niveau de sécurité sont destinataires des requêtes HTTP sur le domaine principal.</p></li>
</ul></li>
<li><p><strong>Testez les suites cryptographiques installées sur les systèmes</strong> et désactivez les suites obsolètes (RC4, MD4, MD5, SHA1, etc.). Favorisez l’utilisation de l’AES256. <a href="https://www.ssi.gouv.fr/uploads/2021/03/anssi-guide-selection_crypto-1.0.pdf">Lire la note de l’ANSSI sur le sujet</a>.</p></li>
<li><p><strong>Adoptez une politique spécifique de mots de passe pour les administrateurs</strong>. Changez les mots de passe, au moins, lors de chaque départ d’un administrateur et en cas de suspicion de compromission. Favorisez l’authentification forte lorsque c’est possible.</p></li>
<li><p><strong>Limitez l’accès aux outils et interfaces d’administration aux seules personnes habilitées.</strong> Favoriser l’usage des comptes de moindres privilèges pour les opérations courantes.</p></li>
<li><p><strong>L’accès depuis Internet aux interfaces d’administration doit faire l’objet de mesures de sécurité renforcées.</strong> Par exemple, pour les serveurs internes, la mise en œuvre d’un VPN avec authentification forte de l’utilisateur ainsi que du poste qu’il utilise peut être une bonne solution.</p></li>
</ul>
<h2 id="limiter-la-divulgation-dinformation-sur-les-comptes-existants">Limiter la divulgation d’information sur les comptes existants</h2>
<p>Concevoir les processus d'authentification, de réinitialisation des mots de passe et de création de compte de manière à ce qu'un attaquant ne puisse savoir si une adresse mail spécifique possède un compte utilisateur.</p>
<ul>
<li><strong>Généraliser les messages d'erreurs d'authentification</strong> pour ne pas divulguer d'information sur l'existence d'un compte : <em>"ce couple identifiant/mot de passe est inconnu"</em>.</li>
<li><strong>Ne pas confirmer l'existence d'un compte utilisateur</strong> en cas d'utilisation de la fonctionnalité de réinitialisation des mots de passe : <em>"Si un compte existe avec cette adresse un mail de réinitialisation lui a été envoyé"</em></li>
<li><strong>Faire valider l'adresse mail du compte utilisateur en tant que première étape de la création d'un compte utilisateur</strong> avant toute collecte d'autres données personnelles, et envoyer soit un mail de validation de l'adresse si celle-ci ne dispose pas encore d'un compte, soit un mail de réinitialisation du mot de passe si l'adresse existe, en n'affichant qu'un message générique sur le service : <em>"un mail de validation de votre adresse ou de réinitialisation de votre mot de passe vous a été envoyé"</em></li>
</ul>
<h2 id="sécuriser-les-infrastructures">Sécuriser les infrastructures</h2>
<ul>
<li><p><strong>Effectuez des sauvegardes, si possible chiffrées et vérifiées régulièrement</strong>. C’est particulièrement utile en cas d’attaque d’un rançongiciel sur vos systèmes, le fait de disposer de sauvegardes pour tous vos systèmes sera la seule mesure qui pourra vous permettre de remettre en état vos systèmes.</p></li>
<li><p><strong>Limitez le nombre de composants mis en œuvre,</strong> et pour chacun de ces composants :</p>
<ul>
<li><p><strong>installez les mises à jour critiques</strong> sans délai en programmant une vérification automatique hebdomadaire ;</p></li>
<li><p><strong>automatisez une veille des vulnérabilités</strong> par exemple en s’inscrivant au bulletin <a href="https://www.cert.ssi.gouv.fr/">CERT-FR</a>.</p></li>
</ul></li>
<li><p><strong>Utilisez des outils de détection des vulnérabilités</strong> pour les traitements les plus critiques afin de détecter d’éventuelles failles de sécurité. Des systèmes de détection et prévention des attaques sur des systèmes ou serveurs critiques peuvent aussi être utilisés. Ces tests doivent être menés régulièrement et avant toute mise en production d’une nouvelle version logicielle.</p></li>
</ul>
<p><details> <summary> <em> Choisir et utiliser des outils de détection des vulnérabilités</em> </summary> <br></p>
<p>Les <strong>outils de détection des vulnérabilités</strong>, comme <a href="https://github.com/greenbone/openvas">OpenVAS</a> et <a href="https://github.com/rapid7/metasploit-framework">Metasploit</a>, permettent d'identifier certaines vulnérabilités connus au sein d'applications. Certaines solutions se spécialisent sur des services particuliers, par exemple <a href="https://github.com/wpscanteam/wpscan">Wordpress</a> ou <a href="https://github.com/rezasp/joomscan">Joomla</a>.</p>
<p>Il est recommandé de vérifier l'état et la fraicheur des bases de données des vulnérabilités. Ces analyses peuvent également nuire au bon fonctionnement des serveurs, elles sont donc plutôt à réaliser sur des environnements en préproduction. </details></p>
<ul>
<li><strong>Restreignez ou interdisez l’accès physique et logique aux ports de diagnostic et de configuration à distance.</strong> Vous pouvez par exemple lister l’ensemble des ports ouverts au moyen de l’outil <a href="https://fr.wikipedia.org/wiki/Netstat"><em>netstat</em></a>.</li>
</ul>
<p><details> <summary> <em> Auditer les ports ouverts en pratique</em> </summary> <br></p>
<p>La commande <em>netstat</em> permet de lister les ports TCP ou UDP ouverts sur un serveur. Sur l'exemple suivant, les ports standards HTTP, HTTPS et SSH d'un serveur sont ouverts vers l'extérieur, un serveur de base de données (MariaDB) est en écoute local et des tentatives connexions sont en cours sur les ports SSH et HTTPS :</p>
<pre><code>$ netstat -alpe --ip
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN mysql 14492 -
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN root 50278 -
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN root 12948 -
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN root 50280 -
tcp 0 0 mon-serveur.fr:https adresse1.fr:38056 TIME_WAIT root 0 -
tcp 0 0 mon-serveur.fr:ssh adresse2.com:45302 TIME_WAIT root 0 -
tcp 0 0 mon-serveur.fr.:https adresse3.eu:56277 FIN_WAIT2 root 0 -
tcp 0 0 mon-serveur.fr:https adresse4.be:56306 ESTABLISHED www-data 380689 -
tcp 0 524 mon-serveur.fr:ssh adresse1.fr:65137 ESTABLISHED root 382490 -</code></pre>
<p>Le logiciel <a href="https://nmap.org/">Nmap</a> permet de réaliser cette analyse depuis un réseau de communication. Sur l'exemple suivant, le protocole d'administration SSH du serveur est accessible sur Internet.</p>
<pre><code>$ nmap mon-serveur.fr
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-11 18:13 CEST
Nmap scan report for mon-serveur.fr
Host is up (0.011s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 4.99 seconds</code></pre>
<p>Il nécessite donc une attention particulière, comme l'utilisation d'une authentification forte et/ou d'un filtrage par IP.</p>
<p></details> <br></p>
<ul>
<li><p><strong>Protégez les bases de données que vous rendez accessibles sur Internet</strong>, au moins en restreignant au maximum les accès (par exemple par filtrage IP) et en changeant le mot de passe par défaut du compte administrateur.</p></li>
<li><p>En matière de gestion de bases de données, les bonnes pratiques sont notamment de :</p>
<ul>
<li><p><strong>utiliser des comptes nominatifs</strong> pour l’accès aux bases de données et créer des comptes spécifiques à chaque application ;</p></li>
<li><p><strong>révoquer les privilèges d’administration</strong> des comptes nominatifs ou applicatifs pour empêcher la modification de la structure de la base de données des applications (tables, vues, procédures, etc.) ;</p></li>
<li><p>mettre en œuvre des mesures contre les attaques par injection de code SQL, de scripts, etc. ;</p></li>
<li><p>favoriser le chiffrement des données sur les disques de stockage et dans les bases de données.</p></li>
</ul></li>
<li><p>Compartimentez vos différents environnements d’exécution afin d'être en mesure d'appliquer le <a href="https://www.ssi.gouv.fr/uploads/2017/12/guide_cloisonnement_systeme_anssi_pg_040_v1.pdf">principe de moindre privilège sur chaque sous-partie des ces environnements</a>.</p></li>
</ul>
<h1 id="fiche-n7-minimiser-les-données-collectées">Fiche n°7 : Minimiser les données collectées</h1>
<h4 id="vous-ne-devez-collecter-que-les-données-personnelles-qui-sont-adéquates-pertinentes-et-nécessaires-au-regard-des-finalités-de-votre-traitement-telles-que-définies-au-moment-de-la-collecte.">Vous ne devez collecter que les données personnelles qui sont adéquates, pertinentes et nécessaires au regard des finalités de votre traitement telles que définies au moment de la collecte.</h4>
<h2 id="avant-la-collecte-pensez-aux-différents-types-de-données-que-vous-devez-collecter-et-essayez-de-restreindre-votre-collecte-au-strict-nécessaire">Avant la collecte, pensez aux différents types de données que vous devez collecter et essayez de restreindre votre collecte au strict nécessaire</h2>
<ul>
<li><p>Réfléchissez aux différents <strong>types de données</strong> qui devront être collectées avant la mise en place d’une application et <strong>documentez</strong> cette réflexion.</p></li>
<li><p>Si des données spécifiques ne sont pas <strong>nécessaires pour une certaine catégorie de personnes</strong>, ne les collectez pas.</p></li>
<li><p>Traitez et stockez les données de façon à <strong>réduire leur précision</strong> (à l’instar de la pseudonymisation). Par exemple, stockez seulement l’année de naissance au lieu d’une date de naissance complète si l’application n’a besoin que de l’année.</p></li>
<li><p>En cas de collecte de données particulièrement sensibles, par exemple celles relatives à la <strong>santé ou à des condamnations pénales</strong>, veillez bien à ne collecter que le <strong>minimum requis</strong>. En raison de ces contraintes réglementaires, le plus simple est encore de <strong>ne pas les collecter</strong> si vous pouvez vous en passer.</p></li>
<li><p>Minimisez la quantité de données collectées également dans les <strong>données de journalisation</strong> et n’y stockez pas de données sensibles ou critiques (données de santé, mots de passe, etc.).</p></li>
<li><p>Certaines fonctionnalités peuvent permettre d’améliorer l’expérience utilisateur, mais ne sont <strong>pas strictement nécessaires au bon fonctionnement de votre application</strong> (par exemple la géolocalisation afin de simplifier une recherche géographique). Dans ce cas, l’utilisateur final doit pouvoir <strong>choisir d’utiliser ou non</strong> cette fonctionnalité. Dans le cas où il l’utilise, les données que vous êtes amené à collecter pour son fonctionnement ne doivent être conservées que pendant la durée strictement nécessaire à son fonctionnement et ne jamais être utilisées à d’autres fins.</p></li>
<li><p>Pensez à associer des <strong>durées de conservation</strong> pour chaque catégorie de données, en fonction de la finalité du traitement et des obligations légales ou réglementaires relative à leur conservation. Les journaux doivent également avoir une durée de conservation. Documentez les durées de conservation définies. Vous devrez être en mesure de les justifier.</p></li>
</ul>
<h2 id="une-fois-les-données-collectées-mettez-en-place-des-mécanismes-deffacement-automatique">Une fois les données collectées, mettez en place des mécanismes d’effacement automatique</h2>
<ul>
<li>Mettez en œuvre un système de <strong>purge automatique</strong> à l’expiration de la durée de conservation. Vous pouvez également mettre en place des revues manuelles des données stockées de façon périodique.</li>
</ul>
<p><details> <summary><em>Exemple d'implémentation de purge automatique en MySQL</em></summary> <br></p>
<p>En MySQL, l'<em>event scheduler</em> permet de supprimer les données périmées automatiquement. Par exemple :</p>
<pre class="sourceCode sql"><code class="sourceCode sql"><span class="kw">CREATE</span> EVENT e_mensuel
<span class="kw">ON</span> SCHEDULE
EVERY <span class="dv">30</span> <span class="dt">DAY</span>
<span class="kw">COMMENT</span> <span class="st">'supprime automatiquement les lignes inscrites de plus d un an'</span>
DO
<span class="kw">BEGIN</span>
<span class="kw">DELETE</span> <span class="kw">from</span> votreTable
<span class="kw">WHERE</span> datediff(now(), votreTable.votreColonneDate) > <span class="dv">365</span>;
<span class="kw">END</span></code></pre>
<p>Son pré-requis est d'associer une date d'inscription à chacune des lignes de la base de données afin de permettre le calcul de sa date de péremption.</p>
<p></details> <br></p>
<ul>
<li><p>Afin de garantir un effacement complet, effacez <strong>physiquement</strong> toutes les données qui ne sont plus nécessaires grâce à des outils spécialisés ou en détruisant les supports physiques.</p></li>
<li><p>Si les données sont encore utiles, vous pouvez réduire leur sensibilité en les <strong>pseudonymisant</strong>, voire en les <strong>anonymisant</strong>. En cas de pseudonymisation, ces données restent soumises à la réglementation sur les données personnelles (<a href="#Fiche_n°1%c2%a0:_Identifier_les_données_à_caractère_personnel">voir la fiche 1</a>).</p></li>
<li><p>Journalisez les <strong>procédures d’effacement automatique</strong>. Les journaux correspondants pourront être utilisés comme <strong>preuve d’effacement</strong> d’une donnée.</p></li>
</ul>
<h1 id="fiche-n8-gérer-les-utilisateurs">Fiche n°8 : Gérer les utilisateurs</h1>
<h4 id="la-manière-de-gérer-les-profils-de-vos-collaborateurs-et-de-vos-utilisateurs-finaux-doit-être-pensée-en-amont-de-vos-développements.-elle-consiste-à-définir-différents-profils-daccès-et-dhabilitation-afin-que-chaque-personne-ne-puisse-accéder-quaux-seules-données-dont-il-a-effectivement-besoin.">La manière de gérer les profils de vos collaborateurs et de vos utilisateurs finaux doit être pensée en amont de vos développements. Elle consiste à définir différents profils d’accès et d’habilitation afin que chaque personne ne puisse accéder qu’aux seules données dont il a effectivement besoin.</h4>
<h2 id="les-bonnes-pratiques-de-gestion-des-utilisateurs">Les bonnes pratiques de gestion des utilisateurs</h2>
<ul>
<li><p>Tout commence par l’<strong>utilisation d’identifiants uniques et propres à chaque individu</strong>, qu’ils soient utilisateurs de votre application ou collaborateurs dans le développement.</p></li>
<li><p>Veillez à <strong>imposer une authentification</strong> avant tout accès à des données personnelles, conformément aux <a href="https://www.cnil.fr/fr/mots-de-passe-des-recommandations-de-securite-minimales-pour-les-entreprises-et-les-particuliers">recommandations de la CNIL</a>.</p></li>
<li><p>Pour vous assurer que chaque personne (utilisateur ou collaborateur) ne puisse accéder qu’<strong>aux données dont il a effectivement besoin</strong>, votre système doit prévoir dès la conception des <strong>politiques de gestion d’accès aux données différenciées</strong> (lecture, écriture, suppression, etc.) suivant les personnes et les besoins. Un mécanisme de gestion des profils utilisateurs global vous permettra de regrouper différents droits en fonction d’un rôle exercé par un groupe d’utilisateurs au sein de l’application.</p></li>
<li><p>La gestion des profils utilisateurs peut s’accompagner d’<strong>un système de journalisation</strong> (c’est-à-dire un enregistrement dans des « fichiers journaux » ou « logs ») <strong>afin de tracer les activités, et détecter toutes anomalies ou évènements liés à la sécurité</strong>, comme les accès frauduleux et les utilisations abusives de données personnelles. L’utilisation de ces dispositifs ne doit en aucun cas servir à d’autres fins que celles de garantir le bon usage du système informatique et les <em>logs</em> ne doivent pas être conservés plus longtemps que nécessaire. Ces systèmes de journalisation ne doivent pas amener à stocker des données au-delà de leur durée de conservation. De manière générale, une durée de six mois est adéquate. Assurez-vous enfin que ces traces ne comportent aucune donnée sensible.</p></li>
<li><p>Vous pouvez également prévoir des audits de code ou des tests d’intrusion au sein de votre environnement de développement afin de vous <strong>assurer de la robustesse de votre système de gestion des profils</strong>.</p></li>
</ul>
<h2 id="fluidifier-la-gestion-des-profils-dhabilitation">Fluidifier la gestion des profils d’habilitation</h2>
<ul>
<li><p>Prévoyez de <strong>documenter ou automatiser les procédures de mouvement de vos collaborateurs,</strong> <strong>d’inscription et de désinscription de vos utilisateurs</strong>. Par exemple, ces procédures doivent encadrer les actions à mener lorsque les personnes ne sont plus habilitées à accéder à un local ou à une ressource informatique, ou à la fin de leur contrat.</p></li>
<li><p>La gestion de vos utilisateurs et collaborateurs implique <strong>une revue régulière des droits</strong> accordés suivant l’évolution des usages et des mouvements organisationnels au sein de votre projet. L’utilisation de services d’annuaire, comme <em>Lightweight Directory Access Protocol</em> (<em>LDAP</em>), vous aidera à suivre ces évolutions et vous permettra d’affiner vos stratégies d’accès, par exemple en attribuant des rôles suivant les profils d’usage. Cela vous permet de mieux respecter le principe de moindre privilège.</p></li>
<li><p><strong>L’utilisation de compte "suprême" (type <em>root</em>, administrateur, etc.) est à proscrire pour les opérations conventionnelles</strong>, car elle constitue la clé de voute de votre système et une cible privilégiée pour un éventuel attaquant externe. Nous vous recommandons d’y associer une politique de mot de passe fort (suite de 10 à 20 caractères ou multifacteur) et de limiter à son plus strict nécessaire le nombre de personnes ayant connaissance de celui-ci.</p></li>
<li><p><strong>Favorisez l’usage d’un gestionnaire de mots de passe au sein de votre projet</strong> et privilégiez le passage à une authentification forte lorsque c’est possible. Évitez également les comptes génériques partagés entre plusieurs personnes.</p></li>
</ul>
<p><details> <summary> <em> Les gestionnaires de mot de passe en pratique </em> </summary> <br></p>
<ul>
<li><p>Les gestionnaires de mots de passe permettent de <strong>centraliser l'ensemble des identifiants et des mots de passe</strong> dans une base de données unique. Certains d'entres permettent également de tester la robustesse des mots de passe et d'en générer automatiquement et de manière aléatoire tout en répondant aux contraintes imposées par les systèmes. Assurez-vous avant tout usage que les mots de passes conservées par le logiciel sont chiffrés et protégés par un mot de passe suffisamment robuste.</p></li>
<li><p>Le gestionnaire de mots de passe libre <a href="https://keepass.info/">KeePass</a>, dans sa en version 2.10, a obtenu la <a href="https://www.ssi.gouv.fr/administration/produits-certifies/cspn/">Certification de Sécurité de Premier Niveau</a> (CSPN) de l'ANSSI.</p></li>
<li><p>Les gestionnaires de mots de passe intégrés aux navigateurs sont particulièrement <strong>exposés aux vulnérabilités des sites</strong>, par exemple les attaques de type <a href="https://www.cert.ssi.gouv.fr/information/CERTA-2002-INF-001/">Cross Site Scripting</a> (XSS) ou <a href="https://www.cert.ssi.gouv.fr/information/CERTA-2008-INF-003/">Cross-Site Request Forgery</a> (CSRF). La fiche 18 <a href="#Fiche_n°18%c2%a0:_Se_prémunir_contre_les_attaques_informatiques">Se prémunir contre les attaques informatiques</a> illustre en détail le fonctionnement de cette attaque.</p></li>
</ul>
<p></details></p>
<h2 id="ressources-utiles">Ressources utiles</h2>
<ul>
<li>La <a href="https://www.cnil.fr/fr/la-cnil-publie-une-recommandation-relative-aux-mesures-de-journalisation">recommandation relative à la journalisation</a> de la CNIL qui délivre des conseils pour déterminer les mesures à prendre selon le type de traitement de données.</li>
</ul>
<h1 id="fiche-n9-maîtriser-vos-bibliothèques-et-vos-sdk">Fiche n°9 : Maîtriser vos bibliothèques et vos SDK</h1>
<h4 id="vous-utilisez-des-bibliothèques-kits-de-développement-sdk-en-anglais-ou-dautres-composants-logiciels-écrits-par-des-tiers-voici-quelques-conseils-pour-intégrer-ces-outils-tout-en-gardant-la-maîtrise-de-vos-développements.">Vous utilisez des bibliothèques, kits de développement (« SDK » en anglais), ou d’autres composants logiciels écrits par des tiers ? Voici quelques conseils pour intégrer ces outils tout en gardant la maîtrise de vos développements.</h4>
<h2 id="faire-un-choix-éclairé">Faire un choix éclairé</h2>
<ul>
<li><p><strong>Évaluez l’intérêt de l’ajout de chaque dépendance.</strong> Certaines briques logicielles couramment utilisées ne font que quelques lignes. Cependant chaque élément rajouté est une augmentation de la surface d’attaque de vos systèmes. Dans le cas où une seule bibliothèque propose plusieurs fonctionnalités, n’intégrez que les fonctionnalités dont vous avez effectivement besoin : en activant le minimum de fonctionnalités, vous réduisez le nombre de bugs potentiels qui pourraient survenir.</p></li>
<li><p><strong>Choisissez des logiciels, bibliothèques et SDK maintenus :</strong></p>
<ul>
<li><p>Si vous souhaitez utiliser du logiciel libre ou <em>open source</em>, essayez de choisir des projets ou des solutions avec une communauté active, des mises à jour régulières et une bonne documentation ;</p></li>
<li><p>Si vous utilisez d’autres types de solutions avec un support commercial, assurez-vous contractuellement que le code sera maintenu et mis à jour pendant toute la durée de vie de votre projet.</p></li>
</ul></li>
<li><p><strong>Prenez en compte la question de la vie privée.</strong> Certains SDK et certaines bibliothèques collectent des données personnelles depuis les applications et les sites sur lesquels ils sont intégrés. Vérifiez les engagements pris par le fournisseur de ces solutions, les directives mise en œuvre fournies. Assurez-vous enfin que l'intégration respecte les conditions suivantes :</p>
<ul>
<li><p>l’utilisateur final est informé de ces opérations de traitements ;</p></li>
<li><p>un mécanisme est prévu pour recueillir le consentement des utilisateurs lorsqu’une collecte de données non strictement nécessaires pour la fourniture du service est mis en œuvre depuis son terminal ;</p></li>
<li><p>les éventuels transferts de données hors de l’union européenne sont correctement encadrés ;</p></li>
<li><p>la relation avec le tiers est encadré par un contrat de sous-traitance conforme à l’article 28 du RGPD.</p></li>
</ul></li>
<li><p><strong>Ces obligations s'appliquent particulièrement aux « SDK » permettant <a href="https://www.cnil.fr/fr/applications-mobiles-mise-en-demeure-absence-de-consentement-geolocalisation-ciblage-publicitaire-2">d’afficher de la publicité ciblée sur les terminaux</a></strong>. Ils s'appliquent également à <strong>certains outils de sécurisation des terminaux et des sites web</strong>, tel que le système de détection d'utilisateurs reCAPTCHA de Google, qui indique dans ses conditions d’utilisation qu’en raison des traitements mise en œuvre, son usage est soumis au <a href="https://www.google.com/about/company/user-consent-policy/">consentement des utilisateurs</a>.</p></li>
<li><p><strong>Si vous utilisez des mécanismes cryptographiques, il est fortement déconseillé d’implémenter des algorithmes ou des protocoles cryptographiques vous-mêmes.</strong> Essayez plutôt de choisir des bibliothèques cryptographiques maintenues, reconnues et faciles d’utilisation.</p></li>
</ul>
<h2 id="évaluer-les-éléments-choisis">Évaluer les éléments choisis</h2>
<ul>
<li><p><strong>Lisez leur documentation et changez leur configuration par défaut.</strong> Il est important de connaître le fonctionnement de vos dépendances. Les bibliothèques et SDK tiers sont souvent fournis avec des fichiers de configuration par défaut, qui ne sont que trop rarement modifiés par manque de temps, ce qui provoque de nombreuses failles de sécurité ;</p></li>
<li><p><strong>Auditez vos bibliothèques et SDK.</strong> Savez-vous vraiment ce que font toutes les bibliothèques et SDK que vous intégrez ? Quelles sont les données qui sont envoyées à travers ces dépendances et quelles sont les destinataires de ces données ? Cet audit vous permettra de déterminer les obligations à respecter en matière de protection des données et d’établir la responsabilité des acteurs ;</p></li>
<li><p><strong>Cartographiez vos dépendances.</strong> Les bibliothèques et SDK tiers peuvent également intégrer d’autres composants : auditer leur code vous permettra de mieux cartographier toutes vos dépendances et de mieux agir si un problème affecte l’une d’elles. Il est aussi recommandé de faire des audits sécurité de vos composants tiers et d’effectuer une veille sur ceux-ci ;</p></li>
</ul>
<p><details> <summary> <em> Les outils de visualisation des dépendances des applications </em> </summary> <br></p>
<p>Les gestionnaires de dépendances intègrent des fonctionnalités de suivi et d'audit. A titre d'exemple, la commande <code>npm audit</code> affiche un rapport des vulnérabilités connues de chaque dépendance d'un projet <em>node.js</em>.</p>
<p>La visualisation des dépendances des applications compilées, ou "packagées", nécessitent des outils plus élaborés. En voici quelques exemples :</p>
<ul>
<li><p>L'<a href="https://exodus-privacy.eu.org/fr/">association Exodus Privacy</a> met librement à disposition la plateforme d'analyse des applications Android εxodus.</p></li>
<li><p>L'outil <a href="https://www.unix.com/man-page/osx/1/otool/">otool</a> liste les dépendances des bibliothèques d'applications macOS et iOS.</p></li>
<li><p>L'outil <a href="https://github.com/sverweij/dependency-cruiser">dependency-cruiser</a> affiche sous forme de graphique les dépendances de projet <em>javascript</em>.</p></li>
</ul>
<p></details> <br></p>
<ul>
<li><strong>Faites attention aux tentatives de <a href="https://fr.wikipedia.org/wiki/Typosquattage"><em>typosquattage</em></a> et autres techniques malveillantes.</strong> Vérifiez les noms des dépendances, ainsi que de leurs propres dépendances pour éviter des attaques. Ne copiez-collez pas de lignes de commandes depuis des sites inconnus.</li>
</ul>
<h2 id="maintenir-les-bibliothèques-et-sdk">Maintenir les bibliothèques et SDK</h2>
<ul>
<li><p><strong>Utilisez des systèmes de gestion de dépendances</strong> (tels que yum, apt, maven, pip, etc.) afin de maintenir une liste à jour de vos dépendances.</p></li>
<li><p><strong>Gérez les mises à jour de vos dépendances,</strong> particulièrement dans le cas de mises à jour de sécurité qui corrigent des vulnérabilités. Vous devez mettre en place une procédure documentée pour les gérer et les déployer le plus vite possible ;</p></li>
<li><p><strong>Faites attention aux versions des bibliothèques et SDK en fin de support</strong> qui ne seront plus maintenues : essayez de trouver une autre solution (choisir une nouvelle bibliothèque, renouveler un support commercial) ;</p></li>
<li><p><strong>Surveillez les statuts des projets open-source,</strong> notamment le changement de propriétaire du domaine ou du package, certaines attaques utilisant des mises à jour malicieuses de dépendances populaires.</p></li>
</ul>
<h2 id="ressources-utiles-1">Ressources utiles</h2>
<ul>
<li>La <a href="https://cwe.mitre.org">base de données des faiblesses du code CWE</a>, maintenue par l'organisme MITRE, liste les vulnérabilités que l'on peut rencontrer dans les logiciels et les dépendances.</li>
</ul>
<h1 id="fiche-n10-veiller-à-la-qualité-de-votre-code-et-sa-documentation">Fiche n°10 : Veiller à la qualité de votre code et sa documentation</h1>
<h4 id="il-est-indispensable-dadopter-au-plus-tôt-une-bonne-hygiène-décriture-de-code.-une-bonne-lisibilité-de-votre-code-permettra-de-réduire-leffort-de-maintenance-daudit-et-de-corrections-des-bogues-dans-le-temps-que-vous-vos-collaborateurs-ou-vos-futurs-contributeurs-devront-fournir.">Il est indispensable d’adopter au plus tôt une bonne hygiène d’écriture de code. Une bonne lisibilité de votre code permettra de réduire l’effort de maintenance, d’audit et de corrections des bogues dans le temps, que vous, vos collaborateurs ou vos futurs contributeurs devront fournir.</h4>
<h2 id="documentez-le-code-et-larchitecture">Documentez le code et l’architecture</h2>
<ul>
<li><p>La documentation est parfois laissée de côté au moment du développement, par manque de temps ou de visibilité sur l’ensemble du projet. Elle est pourtant <strong>cruciale pour la maintenabilité de votre projet</strong> : elle permet de comprendre globalement le fonctionnement du code, et de savoir quelles parties du code sont affectées par une modification.</p></li>
<li><p><strong>Documentez l’architecture, pas uniquement le code</strong> : vous devez être en capacité de garder une vision d’ensemble lorsque vous écrivez votre documentation et d’aider les développeuses et développeurs à comprendre de manière globale le fonctionnement de tous vos composants. En conséquence, privilégiez les schémas et des explications claires lorsque vous documentez votre projet.</p></li>
<li><p><strong>Maintenez la documentation en même temps que le code</strong> : la meilleure façon d’avoir une documentation à jour est de la modifier au fil de l’eau en même temps que le code.</p></li>
<li><p><strong>« Versionnez » la documentation avec le code</strong> : si vous utilisez un gestionnaire de code source vous pouvez pour chaque « <em>commit</em> » modifiant votre code inclure également les changements de documentation (voir notamment <a href="#Fiche_n°4%c2%a0:_Gérer_son_code_source">la fiche « Gérer son code source »</a>).</p></li>
</ul>
<p><details> <summary> <em> Les outils de documentation intégrés au code </em> </summary> <br></p>
<p>Certains systèmes de documentation utilisent le <strong>code lui-même</strong> comme support. La documentation est ainsi écrite directement dans les commentaires du programme.</p>
<p><a href="https://www.doxygen.nl/index.html">Doxygen</a>, par exemple, offre une syntaxe permettant de générer de la documentation, qui est compatible avec les langages de programmation les plus utilisés. L'exemple suivant est une classe C++ commentée suivant son paradigme :</p>
<pre><code>//! Une classe d'exemple
/*!
Description plus approfondie de la classe.
(Et n'oubliez pas de documenter sans mettre de descriptions génériques dans votre projet.)
*/
class Example
{
public:
//! Le constructeur de la classe
/*!
Description plus approfondie du constructeur.
*/
Example();
//! Le destructeur de la classe.
/*!
Description plus approfondie du destructeur.
*/
virtual ~Example();
//! Une méthode qui fait quelque chose
/*!
\param param1 un paramètre important
\param param2 un deuxième paramètre aussi important
\return le résultat qui dépend des deux paramètres et de l'état interne de l'instance
*/
int doSomething(int param1, const char *param2);
//! Une variable membre publique
/*!
Description plus approfondie de la variable membre.
*/
int attr_;
};</code></pre>
<p>Certains langages de programmation supportent également nativement l'utilisation des commentaires pour documenter du code. Par exemple, les "docstrings" en Python :</p>
<pre><code>class Example:
"""Une classe d'exemple
Description plus approfondie de la classe.
"""
def __init__(self):
"""Le constructeur de la classe
Description plus approfondie du constructeur.
"""
self.attr = None
def do_something(self, param1, param2):
"""Une méthode qui fait quelque chose
param1: un paramètre important
param2: un deuxième paramètre aussi important
return: le résultat qui dépend des deux paramètres et de l'état interne de l'instance
"""
[...]
return result
help(Example)
# affiche la documentation complète de la classe, qui est générée en partie à partir des docstrings
help(Example.do_something)
# affiche uniquement la documentation de la méthode</code></pre>
<p></details></p>
<ul>
<li><strong>Pensez à aborder la sécurité dans votre documentation</strong> : n’oubliez pas d’envisager la dimension sécurité dans la documentation utilisateur ou développeur. Vous pouvez notamment documenter les différents choix de configuration de votre application, et expliquer quels sont les réglages les plus sécurisés.</li>
</ul>
<h2 id="contrôlez-la-qualité-de-votre-code-et-de-sa-documentation">Contrôlez la qualité de votre code et de sa documentation</h2>
<ul>
<li><p>Un code de qualité passe par l’<strong>adoption de bonnes pratiques et de conventions de codage</strong> appliquées de manière cohérente sur l’ensemble de votre programme. Pour choisir votre convention de codage, le mieux est de se référer à des <a href="https://github.com/Kristories/awesome-guidelines">conventions existantes</a>. Voici quelques exemples de bonnes pratiques supplémentaires :</p>
<ul>
<li><p><strong>utiliser des noms de variables et de fonctions explicites</strong> permet de comprendre plus facilement ce qu’il se passe au premier regard ;</p></li>
<li><p><strong>correctement indenter son code</strong> permet de percevoir la structure du code plus rapidement ;</p></li>
<li><p><strong>éviter la redondance de code</strong> permet de réduire les efforts de correction qui doivent être apportés en plusieurs endroits. Un oubli est vite arrivé.</p></li>
</ul></li>
<li><p><strong>Des outils peuvent vous aider à contrôler la qualité de votre code</strong>. Une fois correctement paramétrés, ils éviteront de relire le code pour vérifier la bonne mise en place des conventions de codage. En voici quelques exemples :</p>
<ul>
<li><p>les <strong>environnements de développement intégrés</strong> (« <em>IDE</em> »), éventuellement à l’aide de greffons (« <em>plugins</em> »), peuvent être configurés pour respecter les règles d’indentation du code, les sauts de ligne entre les différentes portions de code ou encore la position des accolades et autres parenthèses ;</p></li>
<li><p>les <strong>logiciels de mesure de la qualité du code source</strong> peuvent signaler les duplications de code, le respect des règles de programmation ou des bugs potentiels.</p></li>
</ul></li>
</ul>
<p><details> <summary> <em> Les outils de mesure de la qualité d'un code </em> </summary> <br></p>
<p>Certains langages de programmation disposent d'un <strong>style de programmation standard</strong>, par exemple <a href="https://www.python.org/dev/peps/pep-0008/">PEP8</a> pour le langage Python. Des outils automatiques peuvent contrôler le respect de ces styles, par exemple <a href="https://pep8.readthedocs.io/en/release-1.7.x/intro.html">pep8.py</a> pour la PEP8. Pour les langages ne disposant pas de styles de programmation standard, différents styles ont été créés, avec des outils automatiques permettant de les vérifier, par exemple <a href="https://github.com/SonarSource/sonarqube">SonarQube</a> ou <a href="https://checkstyle.org/">checkstyle</a> pour Java.</p>
<p>Des <strong>outils de qualité de code plus généraux</strong> peuvent détecter un certain nombre de problèmes : variables non utilisées ou non définies, duplication de code, etc. Par exemple <a href="https://eslint.org">ESLint</a> pour Javascript ou <a href="https://github.com/rust-lang/rust-clippy">Clippy</a> pour Rust.</p>
<p>Enfin, des <strong>outils d'analyse statique</strong> permettent une analyse plus fine du code, afin d'évaluer son comportement sans pour autant exécuter le programme, par exemple <a href="https://spotbugs.github.io/">SpotBugs</a> pour Java ou <a href="http://frama-c.com/">Frama-C</a> pour le C. </details></p>
<h1 id="fiche-n11-tester-vos-applications">Fiche n°11 : Tester vos applications</h1>
<h4 id="tester-son-produit-permet-de-vérifier-son-bon-fonctionnement-de-sassurer-dune-bonne-expérience-utilisateur-ainsi-que-de-trouver-et-prévenir-des-défauts-avant-sa-mise-en-production.-tester-son-produit-permet-également-de-réduire-les-risques-datteinte-aux-données-personnelles.">Tester son produit permet de vérifier son bon fonctionnement, de s’assurer d’une bonne expérience utilisateur ainsi que de trouver et prévenir des défauts avant sa mise en production. Tester son produit permet également de réduire les risques d’atteinte aux données personnelles.</h4>