Repository navigation
Expand file tree
/
Copy paths-sdlc.html
More file actions
1546 lines (1541 loc) · 85.7 KB
/
Copy paths-sdlc.html
File metadata and controls
1546 lines (1541 loc) · 85.7 KB
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>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.20">
<meta name="author" content="Manual del Instructor para Cursos de Desarrollo Seguro">
<title>Guía de S-SDLC: Frameworks, Fases y Automatización DevSecOps</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.square{list-style-type:square}
ul.circle ul:not([class]),ul.disc ul:not([class]),ul.square ul:not([class]){list-style:inherit}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:first-child,.sidebarblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child,.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,td.hdlist1,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body class="book toc2 toc-left">
<div id="header">
<h1>Guía de S-SDLC: Frameworks, Fases y Automatización DevSecOps</h1>
<div class="details">
<span id="author" class="author">Manual del Instructor para Cursos de Desarrollo Seguro</span><br>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_introducción_al_ciclo_de_vida_de_desarrollo_de_software_seguro_s_sdlc">1. Introducción al Ciclo de Vida de Desarrollo de Software Seguro (S-SDLC)</a>
<ul class="sectlevel2">
<li><a href="#_el_problema_de_la_seguridad_tradicional">1.1. El Problema de la Seguridad Tradicional</a></li>
<li><a href="#_el_concepto_de_shift_left_desplazamiento_a_la_izquierda">1.2. El Concepto de "Shift-Left" (Desplazamiento a la Izquierda)</a></li>
</ul>
</li>
<li><a href="#_frameworks_de_referencia_en_la_industria">2. Frameworks de Referencia en la Industria</a>
<ul class="sectlevel2">
<li><a href="#_nist_ssdf_secure_software_development_framework_sp_800_218">2.1. NIST SSDF (Secure Software Development Framework - SP 800-218)</a></li>
<li><a href="#_owasp_samm_software_assurance_maturity_model">2.2. OWASP SAMM (Software Assurance Maturity Model)</a></li>
<li><a href="#_microsoft_sdl_security_development_lifecycle">2.3. Microsoft SDL (Security Development Lifecycle)</a></li>
</ul>
</li>
<li><a href="#_fases_del_s_sdlc">3. Fases del S-SDLC</a>
<ul class="sectlevel2">
<li><a href="#_fase_1_requisitos_y_planificación">3.1. Fase 1: Requisitos y Planificación</a></li>
<li><a href="#_ejemplos_de_casos_de_abuso_y_mal_uso_con_gherkin_fase_1">3.2. Ejemplos de Casos de Abuso y Mal Uso con Gherkin (Fase 1)</a>
<ul class="sectlevel3">
<li><a href="#_ejemplo_1_caso_de_abuso">3.2.1. Ejemplo 1: Caso de Abuso</a></li>
<li><a href="#_ejemplo_2_caso_de_mal_uso">3.2.2. Ejemplo 2: Caso de Mal Uso</a></li>
<li><a href="#_ejemplo_3_caso_de_abuso">3.2.3. Ejemplo 3: Caso de Abuso</a></li>
<li><a href="#_ejemplo_4_caso_de_mal_uso">3.2.4. Ejemplo 4: Caso de Mal Uso</a></li>
</ul>
</li>
<li><a href="#_fase_2_diseño_seguro">3.3. Fase 2: Diseño Seguro</a>
<ul class="sectlevel3">
<li><a href="#_actividades_clave">3.3.1. Actividades Clave</a></li>
<li><a href="#_modelado_de_amenazas_threat_modeling_con_stride">3.3.2. Modelado de Amenazas (Threat Modeling) con STRIDE</a></li>
<li><a href="#_definición_de_límites_de_confianza_trust_boundaries">3.3.3. Definición de Límites de Confianza (Trust Boundaries)</a></li>
<li><a href="#_el_proceso_de_diseño_seguro_en_la_práctica">3.3.4. El Proceso de Diseño Seguro en la Práctica</a></li>
<li><a href="#_quality_gate_criterios_para_la_firma_del_diseño_técnico">3.3.5. Quality Gate: Criterios para la Firma del Diseño Técnico</a></li>
<li><a href="#_resultado_del_gate">3.3.6. Resultado del Gate:</a></li>
<li><a href="#_herramientas_devsecops_para_la_fase_2_diseño_seguro">3.3.7. Herramientas DevSecOps para la Fase 2: Diseño Seguro</a></li>
<li><a href="#_1_herramientas_de_modelado_de_amenazas_automatizado_threat_modeling">3.3.8. 1. Herramientas de Modelado de Amenazas Automatizado (Threat Modeling)</a></li>
<li><a href="#_2_threat_modeling_as_code_modelado_como_código">3.3.9. 2. Threat Modeling as Code (Modelado como Código)</a></li>
<li><a href="#_3_orquestación_de_requisitos_de_seguridad_asvs_a_backlog">3.3.10. 3. Orquestación de Requisitos de Seguridad (ASVS a Backlog)</a></li>
<li><a href="#_flujo_de_trabajo_ideal_en_un_pipeline_devsecops_fase_2">3.3.11. Flujo de Trabajo Ideal en un Pipeline DevSecOps (Fase 2)</a></li>
</ul>
</li>
<li><a href="#_fase_3_desarrollo_y_codificación_segura">3.4. Fase 3: Desarrollo y Codificación Segura</a>
<ul class="sectlevel3">
<li><a href="#_requisitos_técnicos_y_prácticas_de_codificación_defensiva">3.4.1. Requisitos Técnicos y Prácticas de Codificación Defensiva</a></li>
<li><a href="#_automatización_y_herramientas_de_control_ecosistema_de_validación">3.4.2. Automatización y Herramientas de Control (Ecosistema de Validación)</a></li>
<li><a href="#_gobierno_del_sast_con_sonarqube_y_sonarlint">3.4.3. Gobierno del SAST con SonarQube y SonarLint</a></li>
<li><a href="#_matriz_de_responsabilidades_raci_de_la_fase">3.4.4. Matriz de Responsabilidades (RACI) de la Fase</a></li>
</ul>
</li>
<li><a href="#_4_fase_de_pruebas_y_verificación_qa_de_seguridad">3.5. 4. Fase de Pruebas y Verificación (QA de Seguridad)</a></li>
<li><a href="#_5_fase_de_despliegue_y_operaciones_mantenimiento">3.6. 5. Fase de Despliegue y Operaciones (Mantenimiento)</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_introducción_al_ciclo_de_vida_de_desarrollo_de_software_seguro_s_sdlc">1. Introducción al Ciclo de Vida de Desarrollo de Software Seguro (S-SDLC)</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_el_problema_de_la_seguridad_tradicional">1.1. El Problema de la Seguridad Tradicional</h3>
<div class="paragraph">
<p>En el desarrollo de software convencional, la seguridad ha sido tratada históricamente como una fase tardía, casi periférica, ejecutada justo antes del despliegue en producción mediante una auditoría de caja negra o un test de penetración (Penetration Test).</p>
</div>
</div>
<div class="sect2">
<h3 id="_el_concepto_de_shift_left_desplazamiento_a_la_izquierda">1.2. El Concepto de "Shift-Left" (Desplazamiento a la Izquierda)</h3>
<div class="paragraph">
<p>El S-SDLC se fundamenta en el principio de <strong>Shift-Left</strong>, que consiste en mover las actividades de seguridad lo más cerca posible del inicio del ciclo de vida (los requisitos y el diseño).</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Impacto Económico (Regla de Boehm modificada):</strong></p>
<div class="ulist">
<ul>
<li>
<p>Encontrar y corregir una vulnerabilidad en la fase de <strong>Requisitos</strong> cuesta $1x$.</p>
</li>
<li>
<p>Corregirla en la fase de <strong>Desarrollo</strong> cuesta entre $5x$ y $10x$.</p>
</li>
<li>
<p>Repararla en la fase de <strong>Pruebas/QA</strong> cuesta alrededor de $15x$.</p>
</li>
<li>
<p>Resolverla en <strong>Producción</strong>, tras un incidente, puede superar los $100x$ (añadiendo la pérdida de reputación, costes legales y multas).</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
<hr>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_frameworks_de_referencia_en_la_industria">2. Frameworks de Referencia en la Industria</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Para estructurar una estrategia corporativa de S-SDLC no se debe inventar la rueda. Existen tres grandes marcos de trabajo que dominan el mercado internacional:</p>
</div>
<div class="sect2">
<h3 id="_nist_ssdf_secure_software_development_framework_sp_800_218">2.1. NIST SSDF (Secure Software Development Framework - SP 800-218)</h3>
<div class="paragraph">
<p>Publicado por el Instituto Nacional de Estándares y Tecnología de EE.UU., es un marco de alto nivel de obligado cumplimiento para proveedores del gobierno estadounidense, estructurado en cuatro pilares:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><strong>Preparar la Organización (PO):</strong> Garantizar que las personas, los procesos y las herramientas están listos de forma proactiva.</p>
</li>
<li>
<p><strong>Proteger el Software (PS):</strong> Proteger todos los componentes del software frente a accesos no autorizados y alteraciones (Integridad de la Cadena de Suministro).</p>
</li>
<li>
<p><strong>Producir Software Bien Asegurado (PW):</strong> Producir software con las mínimas vulnerabilidades posibles en su release.</p>
</li>
<li>
<p><strong>Responder a Vulnerabilidades (RV):</strong> Identificar vulnerabilidades remanentes y reaccionar ante ellas de forma ágil.</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="_owasp_samm_software_assurance_maturity_model">2.2. OWASP SAMM (Software Assurance Maturity Model)</h3>
<div class="paragraph">
<p>Es un modelo prescriptivo y medible, ideal para auditorías de madurez. Evalúa a la empresa en 5 funciones de negocio, divididas en 15 prácticas de seguridad, asignando niveles de madurez del 0 al 3:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Gobernanza:</strong> Estrategia, Métricas, Cumplimiento y Educación.</p>
</li>
<li>
<p><strong>Diseño:</strong> Evaluación de Amenazas, Requisitos y Arquitectura de Seguridad.</p>
</li>
<li>
<p><strong>Implementación:</strong> Construcción, Despliegue y Defectos de Configuración.</p>
</li>
<li>
<p><strong>Verificación:</strong> Revisión de Código y Pruebas de Seguridad.</p>
</li>
<li>
<p><strong>Operaciones:</strong> Gestión de Incidentes, Entorno y Parches.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_microsoft_sdl_security_development_lifecycle">2.3. Microsoft SDL (Security Development Lifecycle)</h3>
<div class="paragraph">
<p>Uno de los pioneros de la industria. Se compone de 12 a 14 prácticas estrictas que van desde el establecimiento de requisitos de seguridad hasta la ejecución del plan de respuesta a incidentes post-lanzamiento.</p>
</div>
<hr>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fases_del_s_sdlc">3. Fases del S-SDLC</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A continuación se detallan las actividades obligatorias, entregables y criterios de paso (Quality Gates) para cada una de las fases del ciclo de vida.</p>
</div>
<div class="sect2">
<h3 id="_fase_1_requisitos_y_planificación">3.1. Fase 1: Requisitos y Planificación</h3>
<div class="paragraph">
<p>En esta fase se definen los objetivos no funcionales de seguridad junto con las historias de usuario tradicionales.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>Actividades Clave:</strong></p>
<div class="ulist">
<ul>
<li>
<p><strong>Clasificación de Datos:</strong> Identificar si el sistema manejará datos públicos, internos, confidenciales o regulados (PII, PCI-DSS, GDPR).</p>
<div class="ulist">
<ul>
<li>
<p>PII, personal identificable information</p>
</li>
<li>
<p>PCI-DSS, payment card industry data security standard</p>
</li>
<li>
<p>GDPR, general data protection regulation (RGPD)</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>BIA</strong> Análisis de Impacto en el Negocio (Business Impact Analysis)</p>
<div class="ulist">
<ul>
<li>
<p>El BIA es un proceso que permite cuantificar las consecuencias reales (financieras, operativas y legales) de una interrupción
en el servicio o de un compromiso en la seguridad de la información. En el marco del S-SDLC, es la herramienta que define el presupuesto y el nivel de rigurosidad de los controles de seguridad que se aplicarán al software.</p>
</li>
<li>
<p>Dos dimensiones:</p>
<div class="ulist">
<ul>
<li>
<p>1. Coste por Hora de Indisponibilidad</p>
<div class="ulist">
<ul>
<li>
<p>Representa las pérdidas económicas directas e indirectas que sufre la organización mientras el sistema no está operativo (caída del servicio, error en producción, ataque de Denegación de Servicio - DoS).</p>
</li>
<li>
<p><strong>Pérdidas Directas:</strong> Ventas no realizadas.</p>
</li>
<li>
<p><strong>Pérdidas Indirectas:</strong> Coste de la mano de obra ociosa (desarrolladores u operarios parados porque sus herramientas internas no funcionan), coste de recuperación de sistemas.</p>
</li>
</ul>
</div>
</li>
<li>
<p>2. Coste por Brecha de Información (Data Breach)</p>
<div class="ulist">
<ul>
<li>
<p>Representa el impacto financiero derivado de la pérdida, robo o alteración de datos confidenciales (ataque de ransomware, filtración de base de datos).</p>
</li>
<li>
<p><strong>Costes de Respuesta:</strong> Notificación a los usuarios afectados, auditoría forense digital para descubrir el vector de ataque, contratación de servicios de Relaciones Públicas para contener la crisis.</p>
</li>
<li>
<p><strong>Costes Legales y Regulatorios:</strong> Multas por incumplimiento de normativas (como el 4% de la facturación anual bajo GDPR) y demandas colectivas de clientes.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li>
<p>Métricas para el BIA:</p>
<div class="ulist">
<ul>
<li>
<p><strong>RTO (Recovery Time Objective - Objetivo de Tiempo de Recuperación):</strong> El tiempo máximo tolerable que el sistema puede estar caído antes de que el impacto en el negocio sea inasumible.</p>
<div class="ulist">
<ul>
<li>
<p>¿Cuánto tiempo podemos estar sin esta API activa? ¿2 horas o 2 minutos?</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>RPO (Recovery Point Objective - Objetivo de Punto de Recuperación):</strong> La cantidad máxima de datos (medida en tiempo) que la empresa está dispuesta a perder debido a un incidente. Define la frecuencia de los respaldos (backups).</p>
<div class="ulist">
<ul>
<li>
<p>Si la base de datos se corrompe, ¿es aceptable perder las últimas 24 horas de transacciones, o solo los últimos 5 minutos?</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li>
<p>Importancia del BIA</p>
<div class="ulist">
<ul>
<li>
<p>Previene el error de implementar una seguridad innecesaria o "quedarse corto"</p>
</li>
<li>
<p>El coste no está solo en el desarrollo sino en la infraestructura, por ejemplo el respaldo de servidores y bases de datos</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
<li>
<p><strong>Definición de Historias de Abuso (Abuse Cases):</strong> Modelar qué haría un atacante.</p>
<div class="ulist">
<ul>
<li>
<p>En el desarrollo ágil tradicional, los requisitos funcionales se expresan mediante <strong>Historias de Usuario (User Stories)</strong>, las cuales describen el comportamiento esperado del sistema desde la perspectiva de un actor legítimo que busca obtener valor.</p>
</li>
<li>
<p>En el S-SDLC, para diseñar un software resistente, el equipo debe aplicar ingeniería inversa mental mediante la creación de <strong>Historias de Abuso (Abuse Cases)</strong> y <strong>Casos de Mal Uso (Misuse Cases)</strong>.</p>
<div class="ulist">
<ul>
<li>
<p><strong>Historia de Abuso (Abuse Case):</strong> Describe una acción maliciosa en la que un <strong>actor hostil (atacante)</strong> abusa deliberadamente de las funcionalidades del sistema para violar su seguridad, robar información o causar daños. El foco está en la <strong>intención del atacante</strong>.</p>
</li>
<li>
<p><strong>Caso de Mal Uso (Misuse Case):</strong> Describe un escenario donde un <strong>usuario legítimo</strong>, de forma accidental, por ignorancia o por un error de UX (Experiencia de Usuario), utiliza el sistema de una manera para la que no fue diseñado, provocando un fallo de seguridad o de integridad de los datos.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
<col style="width: 33.3333%;">
<col style="width: 33.3334%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Elemento</th>
<th class="tableblock halign-left valign-top">Estructura Estándar</th>
<th class="tableblock halign-left valign-top">Ejemplo Práctico: Autenticación</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Historia de Usuario (Negocio)</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Como</strong> [Rol de usuario]<br>
<strong>Quiero</strong> [Realizar una acción]<br>
<strong>Para</strong> [Obtener un beneficio].</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Como</strong> usuario registrado,<br>
<strong>quiero</strong> restablecer mi contraseña mediante un enlace al correo,<br>
<strong>para</strong> recuperar el acceso a mi cuenta si la olvido.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Historia de Abuso (Ataque)</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Como</strong> [Perfil de atacante]<br>
<strong>Quiero</strong> [Explotar/Abusar de la función]<br>
<strong>Para</strong> [Lograr un objetivo malicioso].</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Como</strong> atacante externo,<br>
<strong>quiero</strong> inundar (flood) el endpoint de restablecimiento con peticiones automatizadas,<br>
<strong>para</strong> adivinar tokens por fuerza bruta o denegar el servicio al usuario legítimo.</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Historia de Mitigación (Defensa)</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Como</strong> [Sistema/Mecanismo de seguridad]<br>
<strong>Quiero</strong> [Restringir/Validar el comportamiento]<br>
<strong>Para</strong> [Neutralizar el abuso].</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Como</strong> sistema de autenticación,<br>
<strong>quiero</strong> implementar rate-limiting (máximo 3 peticiones por IP/cuenta por minuto) y tokens de un solo uso con expiración de 15 minutos,<br>
<strong>para</strong> bloquear ataques de fuerza bruta.</p></td>
</tr>
</tbody>
</table>
<div class="ulist">
<ul>
<li>
<p><strong>Quality Gate (Puerta de Calidad):</strong> Aprobación del documento de requisitos de privacidad y seguridad por el Security Champion o el equipo de AppSec.</p>
<div class="ulist">
<ul>
<li>
<p>Garantizar que ninguna funcionalidad o proyecto pase a la fase de desarrollo sin conocer sus riesgos de seguridad.</p>
</li>
<li>
<p>[Requisitos Listos] ➔ [Modelado de Amenazas / Cuestionario] ➔ [Asignación de Requisitos ASVS] ➔ [Revisión y Firma (Gate)]</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>DevSecOps</strong> en la Fase de Requisitos y Planificación</p>
<div class="ulist">
<ul>
<li>
<p>Herramientas de defición de requisitos y pruebas TDD, BDD, BDD-Security.</p>
<div class="ulist">
<ul>
<li>
<p>Test Driven Development</p>
</li>
<li>
<p>Behavior Driven Development</p>
</li>
<li>
<p>Gherkin como lenguaje para describir los casos de uso, abuso y mal uso.</p>
</li>
<li>
<p>Frameworks como Cucumber para crear los casos y ejecutarlos</p>
</li>
<li>
<p>Los casos creados pueden lanzarse en cualquier momento y son una documentación viva del proyecto</p>
</li>
</ul>
</div>
</li>
<li>
<p>Herramientas para convertir los requisitos y casos en tareas/tickets como <strong>Jira</strong>.</p>
</li>
<li>
<p>Checklist como el OWASP ASVS. Un documento detallado con un catálogo de requisitos y controles de seguiridad que utilizaremos a modo de guía.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_ejemplos_de_casos_de_abuso_y_mal_uso_con_gherkin_fase_1">3.2. Ejemplos de Casos de Abuso y Mal Uso con Gherkin (Fase 1)</h3>
<div class="paragraph">
<p>Durante la fase de definición de requisitos, se deben redactar Historias de Usuario de Seguridad (<strong>Evil User Stories</strong>) utilizando Gherkin para guiar las pruebas de seguridad automatizadas desde el inicio del ciclo.</p>
</div>
<div class="sect3">
<h4 id="_ejemplo_1_caso_de_abuso">3.2.1. Ejemplo 1: Caso de Abuso</h4>
<div class="paragraph">
<p>Un caso de abuso ocurre cuando un atacante interactúa con el sistema de forma deliberada para saltarse los controles y obtener un beneficio o causar un daño (en este caso, un ataque de fuerza bruta).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Fuerza bruta en el endpoint de autenticación
Como un atacante externo
Quiero automatizar peticiones de inicio de sesión con múltiples contraseñas
Para comprometer cuentas de usuarios legítimos sin ser detectado
Scenario: Bloqueo de cuenta por intentos fallidos consecutivos
Given que el atacante conoce el correo electrónico de una víctima ("victima@empresa.com")
And la cuenta de la víctima se encuentra actualmente activa y desbloqueada
When el atacante envía "5" peticiones de inicio de sesión consecutivas con contraseñas incorrectas
Then el sistema debe bloquear temporalmente la cuenta por "15" minutos
And debe rechazar cualquier intento posterior de inicio de sesión (incluso con la contraseña correcta)
And debe registrar un evento de auditoría de seguridad clasificado como "Alerta de Fuerza Bruta"</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_ejemplo_2_caso_de_mal_uso">3.2.2. Ejemplo 2: Caso de Mal Uso</h4>
<div class="paragraph">
<p>Un caso de mal uso ocurre cuando un usuario legítimo, por desconocimiento, negligencia o un error en el flujo, utiliza la aplicación de una manera que expone datos sensibles o debilita la seguridad.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Mal uso en la exportación de reportes financieros
Como un gestor financiero descuidado
Quiero descargar reportes con datos sensibles en equipos públicos
Para trabajar fuera de la red corporativa sin restricciones de seguridad
Scenario: Mitigación de fuga de información por descarga descuidada
Given que el usuario autenticado tiene el rol de "Gestor_Financiero"
And está accediendo a la plataforma desde una dirección IP no corporativa o desconocida
When el usuario solicita la exportación y descarga del "Reporte de Pérdidas y Ganancias del Q2"
Then el sistema debe denegar la descarga directa del archivo en formato plano (.xlsx/.csv)
And debe obligar al usuario a visualizar el reporte exclusivamente a través del visor web seguro cifrado
And debe aplicar una marca de agua dinámica con el ID del usuario y la IP sobre la pantalla</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_ejemplo_3_caso_de_abuso">3.2.3. Ejemplo 3: Caso de Abuso</h4>
<div class="paragraph">
<p>Este caso de abuso se centra en un atacante que intenta explotar una vulnerabilidad de <strong>Autorización a Nivel de Objeto Roto (BOLA/IDOR)</strong>, modificando identificadores en las peticiones para acceder a datos de otros clientes.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Abuso de identificadores en endpoint de facturación
Como un atacante autenticado en la plataforma
Quiero modificar el ID de factura en la URL de consulta
Para descargar facturas de empresas competidoras sin autorización
Scenario: Intento de acceso a recurso ajeno mediante manipulación de ID
Given que el atacante ha iniciado sesión con la cuenta "usuario_atacante" (ID de Empresa: 99)
And existe una factura legítima en el sistema con el ID "FAC-2026-0012" propiedad de la Empresa ID "55"
When el atacante envía una petición GET directa a "/api/v1/facturas/FAC-2026-0012"
Then el sistema debe interceptar la petición y validar la propiedad del recurso
And debe denegar el acceso devolviendo un código de estado HTTP "403 Forbidden" (o 404)
And debe bloquear temporalmente la sesión del "usuario_atacante" por comportamiento anómalo</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_ejemplo_4_caso_de_mal_uso">3.2.4. Ejemplo 4: Caso de Mal Uso</h4>
<div class="paragraph">
<p>Este caso de mal uso refleja a un usuario legítimo que, sin intención maliciosa, sube un archivo infectado (por ejemplo, un PDF con un virus que descargó de internet) a la plataforma corporativa, poniendo en riesgo el almacenamiento central.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-gherkin" data-lang="gherkin">Feature: Carga descuidada de archivos adjuntos infectados
Como un cliente del portal de soporte
Quiero subir una captura de pantalla o documento explicativo de mi incidencia
Para que los técnicos puedan resolver mi problema técnico rápidamente
Scenario: Mitigación de carga de malware en entorno de soporte
Given que el cliente está autenticado y se encuentra en el formulario "Crear Ticket de Soporte"
When el cliente adjunta y envía el archivo "evidencia_error.pdf" el cual contiene una carga útil de malware conocida
Then el sistema debe pausar el procesamiento del ticket en el backend
And debe someter el archivo a un análisis en cuarentena mediante el motor Antivirus/Sandbox
And debe descartar el archivo infectado notificando al usuario: "Archivo rechazado por políticas de seguridad"
And no debe permitir que el archivo sea accesible ni visible para el equipo de técnicos de soporte</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p><strong>Ventaja en el S-SDLC:</strong> Al escribir estos escenarios en Gherkin durante la Fase 1, el equipo de QA (Aseguramiento de la Calidad) puede cargarlos directamente en herramientas de automatización como <strong>Cucumber</strong> o <strong>Behave</strong> en la Fase 4 para verificar de forma automática que las mitigaciones de seguridad funcionan.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_fase_2_diseño_seguro">3.3. Fase 2: Diseño Seguro</h3>
<div class="paragraph">
<p>En esta fase se define la arquitectura técnica del sistema mitigando los riesgos estructurales antes de iniciar la codificación.</p>
</div>
<div class="sect3">
<h4 id="_actividades_clave">3.3.1. Actividades Clave</h4>
</div>
<div class="sect3">
<h4 id="_modelado_de_amenazas_threat_modeling_con_stride">3.3.2. Modelado de Amenazas (Threat Modeling) con STRIDE</h4>
<div class="paragraph">
<p>El modelado de amenazas es un ejercicio mental sobre la aplicación que está por programarse. Consiste en plantearse cuatro preguntas clave: ¿En qué estamos trabajando? ¿Qué puede salir mal? ¿Qué vamos a hacer al respecto? y ¿Hicimos un buen trabajo?</p>
</div>
<div class="paragraph">
<p>Para responder sistemáticamente a la segunda pregunta (¿Qué puede salir mal?), aplicamos el framework <strong>STRIDE</strong>, evaluando cada componente del diseño frente a estas 6 categorías de amenazas:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><strong>S - Spoofing (Suplantación de identidad):</strong> El atacante se hace pasar por un usuario legítimo, otra API o un microservicio.</p>
<div class="ulist">
<ul>
<li>
<p><strong>Enfoque de diseño:</strong> ¿Cómo autenticamos cada petición? (Ej: Implementación de JWT firmados de forma segura o mTLS entre microservicios).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>T - Tampering (Alteración de datos):</strong> Modificación no autorizada de datos en tránsito o en reposo.</p>
<div class="ulist">
<ul>
<li>
<p><strong>Enfoque de diseño:</strong> ¿Los datos tienen firmas de integridad o hashes? ¿Las URLs o parámetros del cuerpo (<em>payload</em>) pueden alterarse para acceder a recursos de otros usuarios? (Control de autorización a nivel de datos / IDOR).</p>
</li>
</ul>
</div>
</li>
<li>
<p><strong>R - Repudiation (Repudio):</strong> Un usuario realiza una acción maliciosa o crítica y el sistema no puede probar que fue él porque carece de registros.</p>