From 0a883b7cae9a2383134ce50acf6ac698e7ca480a Mon Sep 17 00:00:00 2001 From: DevEnv nis2-agile Date: Thu, 11 Jun 2026 17:43:46 +0200 Subject: [PATCH] [DOCS] Manuale d'uso prodotto NIS2 Agile (Word/.docx) v1.14.0 + generatore Manuale completo in docs/MANUALE_UTENTE_NIS2_AGILE.docx (22 capitoli: intro, onboarding, dashboard, Gap Analysis NIS2/ACN, Modello SGSI ISO 27001/17/18, rischi, incidenti, policy, supply chain, formazione, asset, audit&report, whistleblowing, normative, KB/AI, feedback, impostazioni, admin, API, glossario, riferimenti). Generato con scripts/genera-manuale-utente.py (OOXML puro, nessuna dipendenza esterna). Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/MANUALE_UTENTE_NIS2_AGILE.docx | Bin 0 -> 11910 bytes scripts/genera-manuale-utente.py | 407 ++++++++++++++++++++++++++++ 2 files changed, 407 insertions(+) create mode 100644 docs/MANUALE_UTENTE_NIS2_AGILE.docx create mode 100644 scripts/genera-manuale-utente.py diff --git a/docs/MANUALE_UTENTE_NIS2_AGILE.docx b/docs/MANUALE_UTENTE_NIS2_AGILE.docx new file mode 100644 index 0000000000000000000000000000000000000000..bb9bffa1c563bd79b189b1fd947ba8af9cd03d31 GIT binary patch literal 11910 zcmZ{q19T_d*5+f|wr#s(+qV6WZQHi(j%{{qJL%X-XZn8gee2GBXQrxF)v8+coK^d& zefBB*6lFlc(13t|pn$Amr*v&(S11X9fq+Osfq+o|9@Y8bVDD;X?`ojx>1gJn$KYXS zTbnc^Kg5I-VlZ;wDvifQ6q5AVKZoo^g=m-~XT0ox&r|B_%^?SkLQ|XI)#Bcp+1PsQ zYyrP1B6_Vi;&30t>Nv@{0YLXR=reuEF-odS9ObQeB}ibrbnZb6h|vs3zfplf6e+kE zke>Dhl1N^Wphd+up$t;RT@UP_kK!%tmf2HI6GzlfSD2q1AbajEzO0l03(nz}A7rjR zU;!&mm1V=!S^borh=b-%goJG&5^~T^oPXz$@!j9fon*My;$8+f|4)5QFLeB zAbN6YC;#|pSB*aXd4^G>5g;jOFDIZ-vt;j730c+y-0c@V@nYPKdj%;fQnzc^CZG{? ztM&+NRZ8;NH}olp3otMn@8R7fh>|StK`Z1;dHC&6^P7L> zB(-BC37@Wu0M5)nWV$%`^l<0^K^Aoy_%vx^AQR`REt@h+$+bkTk)t?f3s08hX=mev zQhKdZncBvTDo2s+XhHpvkt<2>>1*TO0YaB$hL~&bhh`9W9_{uZ!w?exb+jP)q_f#b zJ_0#uJQ>0c3?y#vuUz8+{dTQw`-ksRjzmKt;Y--Xq9*xf(XY$+gib!|PG2`4*!Adq z2f=?tUP|f5w@V5H#P<#ag#0&hcL!%vMpFk9fZgA0`d1oV>&dv_N;&_bMUPoSKLf`_ z6d2K(0Rxl9xr#u+oS$CnoyO>doq=KR^m+$I@Z7jH8tUD^ZPYNpYmB?KVnq0`{7QZ! zpPjDq+Y_q-hOv~jq!1w!D(K>&rQLlycIbPzx@wGsBCY(i@TRZ+ITqqTEAjrjxyNC* zhmUL1L}}VL+Gb3R33>&M-*At|B8KM=0wV5y0kAm9gpS|!yn>tPEAq};;xo*ZRRb+ zd+vE>VhzmuH%Ej$ zdTbAv_zD>U&!Lnm$spx}K)k5nQYUxtr8fR^*Zw7clVcco8 zUJBz&Ks(BRBUL@3o7vH8d~NLF1+R8?iBRTxorNZmWEpcDcg7 zW?Q^Q_f+Hv1A0SW`P%0Eac_6mVPg&zhX?yvqqf6sTB}0#j5_EayWC%W7PLDTXatg? z%=CDkHH^ZKHRFaBDyz=?(4XcqkVo0F=YAarEcqat)CwEzvP>v`@+fuV1GQx%5K>4U z?KR%;%E`-n{U0pqg}P2o^junuN|rTFb=r;%JW6B-=zR!drO8|@=6xrJd$22*fiN09 z72%FU?P;qiJVq?Py0@Q5WT52f+&~Kv}oOzDA19=aUKn6f> zh6|3KudVF|fPF5w5ZLnUXOuNJvJlpz=MS}fyjf8PJgWIWt^?@xAXmHC!66gmS5d#Z zq?;_D| zC8}pWey=jP^kG0z0B;C*-S5|5nM~Kmv+iQ)(%-$Mq_Xb$^p8ejPJwc9#rj?ehk`S;j`rs}pCLo5t*sn||)^F3=s=T6>-gzB`4R2iN`9ISYjogUg=N zy57Y6u+(kEy*@lNQ6G|6GjM$)*8r(IA>a!EDIUfEW==O|ImtURY+GK@uYB5wrCZ_Q z`$6unYHaoaDA>%6aurK+4Bow*JeIOgYT$6e}H}G?PN<~ z^ga1kw#WHt*7~lO{JVY?>@=qNimo|mJ%hK|Fd9obDFuuv3S_SW7Zds6__sAz$RRiw z@p)_)ge+nbW(mZrK6CsCCa+Y11~H_2niMGr?iILX5>r4pYAF;XnA8sCh~WL}pOay>jasXek3dzc7_ zI#4R{?BDpsBZ5i$9{#8j-w9s=`|=emhw(MhOwBNuGC>|^nS@~(KW@A=M`oIP4$Yf? zre}w{)wsh7-0FrRjQe_(2D#2)i9Ue&k#>5wxr_Flsr@puJ+8c6-+4%X?dwgU6u-OJ zB{1f)>3)CtkpOG6r5|+WKD>IVzt^S4IG?c@RrsP^`Esje_><~)b@nIQ@n-dR>r>we z|K^p4QI{tQZO`->4{vrGrALPZ=k0ApFCQN-xAcu60|p&WwfWmQK>wG&H=#>}fpLjF z@FB;2_*$yOIpyuhas01wj`AZ6dfhwH4hUM*&gq~!krqWzw1vzn45xQhrk}v9E8${r0#$O$~uKr;YQe- zt08h94^g-qXtr^y0a-6Pv|9+VRTuYaqr3nT1(mok4=RD?1+3q$EBDFX>~_^7JUq-W z9~1+}@PQ1p5EBLpV`WUDgL)biy|m%u$r;JB_Kj|EFqeo$58^}VN}C7ckLo4jckm4s z#UYe1)33uNVc7Yy{l`l_V9pqtQu6|a#GuuIw!+}4H1)f_-}ZzqOjridr~=nLLG3tB zMbWBI}dg`b}Ni0)0|kflIcIWv>Qzaa*0yVsKD!PrF811Y^Dgm2VMm{3PBG0 zQJ&|3*TI7pdebU;v|>GK@|rUyRH1Uq<^xZuRjOQbOdeWZGB_laD4`6@Swf?fg?LSl zhRe3B-!mwr{!rnjV!EWPljm}SJSlqK2Xz3;VM_tGNPo6Ykozi@Rss8jY4^fSST}kx z`aDB+3?inPeHrCvZh#p&>tbs{H!==-&3@<2iaR>T4+LbW4VgynK_@Ukh`mvOZ4yIq z@CKSyULn<$y}LG1U~=UJ?Mgz{bctzHIy$;uU|;1ca0CveMnM9BmgJt?yW~5q zb!Y}&^T%CVCw=BX1&@yDU2em+bS1svx)v{Vgk$H-x3H8I8|sM-miO$yhQxw*Yak{o zrC10M|2~i)^04Jn&eISlNtJ#nDq>Y`g=_xvIVOl3SeTpENZqU|oRBa_JYSTaM{JOV zt@#}T{AM!iwF{7*5K^dokxC#0X`So0JS^l!u)4C`K9*xD8@zK3+B`{Z60{~^)zK`M zkg{SEp)r+6As%+`$3mlL$;*v+^Eo&s)r2E6s1d25^LQ!xNc;LM_n+A*VzSE}&{m@6 zV(CvpLFxi<9PsEs)>(nM@sw7WESYynP0`-&Dp4k@s6>?~1oh&8f{Vm-tPbow3`2dU zZj*_+2g)+Y#AQ~&MOpNh_B(-MGAY+ZZ-pYr2C#@txLz2Pzn1X!5h4Z9rpOwwIwL zyA-o2MnIGdKfleQ5#}hSyG+8?1*WZm*+-4FDz04azg+Hp-C0+<9;q-%ntuG8ZnfUB zW#~gI6#NEt7t$3#u$tQ9tM{c$4L&Xg?#B~$Ks%5t2=*Y#?f=C9ZvZ3d^HlbKai<3`-I7z5s^LqQTM>xUJ6 z=ZJe$>}BS9>6#kHW3i``tqG5%QkX?&=eJIlNJUuPHmHwUvjgsT59Zl5x;RV1aO*Cs z6d9IFG1D$f11ur59VJ0yMC)=I&Bg(=G#Nz?1_60rS5qrPSCs@#X#8+AQ56hePN>@) zsWPAu0J1pj&Dw=LFRK;M9tT}UtMHI7U*Cyjbby=V^FWx^%<+!PhHj}h^ zXMmBtS?wIYEXa{W6jtVNW89C<@oiOjqFP!2FQU|43ayH+p-~%e5uh2g$uj_+Q^_*~ z7YsBuomL7o)>rQXoit-BVxydc<2{8ABN^88M$<$dJ6vy@zi6XMsHanO)+=;Pc@%J@i6xsm!7>Vr{th>RfX< z@*L?#RsQ4HhF|(EUJ;y_3zee2IXmRyB(|VWMd~bivxzTN7_X#f=Sx74b)>GEcDTrLCvj-Gd<~G_wjtMY|w?J<_5=|l?n;bwXH~-=RC)z)WCT*|_bJ#c9 ztMFTmqW*T4_N0eP0|2AUEn0Ix3LKXyEE0*k_O!) zQRdFYtVu*v^K5dX(8Rpr*GhNXvOJKdZb+<*I*tGd+_MoIly7kEo}GV%1t_e=N4D%X z<2v@XEE3ZEPAKh7^EPOTDR)e9?K$lh12rW&_4yM~D4bn%ZaFQQ4auT@dvE%U_kB^x z6swJfhTw;{pcb*e907pYc5eUKS)bC_jx9MU!S=08SDXqjWO6&e5KNluc3;FLRWU}p z@<9$5#~oLigBjSLdHn6{+g+AU?6?^V(oPq=OmmzXi(=q?Uyqg}y?3CoyQ~#IIefoS zzay5bhu-=3bzudvhmD!IDjM@O3jxOB3%FN^D_3*y_%Plw&leKVC`DVN5<~FGbghMbE1GTG zt1C9l8#Usk=z+bFZ2v2OJ|=W4JXluoP>y2liWIaoyS)I%MBkl{QN3o^*M2>mJSBSF zOt!lfc4vFZmyJ@P4nQPp3XT+)&T*GqWqS<*N7Fg5Fpzzt5>)LmsOll1)JHfL`mw}^ zmP_o5m2{r62L8IJ;fZ%m{h_4;@k0{%$Hd0W(BS<%8zMMPB|Bjo?OimNd;b#Zqq%Ww zu~k0qcfE8trX&}z;&tYF{)`zTR1g?U^@rJ4%foKK1YB}Br z%0wQ4xmGyZ$@14NF_8GLbN~g(ri?53nx;_}$ahttz3kyI zT-sM!dv`3g(3MwQomoR}&khLJ-&%@yqNl0~2n`k6Yccs1`NXT&5G$9Tis#i3kH4wD zH{k45_<>`*zZ9EGonyy&jelU9b@t`f=Cq*uQ^99b2ANiZco=0B>T2ObBol%dU*_T_ zY5k`;J4+Vyh+OH2JFy$qd5DB3d+uF zKeedB`DuQ6VA%nN#yI6r*o1J7Hh=;(T0`iAq{~N(5gGifgHxxv+-f&t#tkH)-{LiA zXKwZEA56_k>%JEu3=2{v3=(eo4ZG{41#7}_=$eB+?dw7S7&8nopZ10l6HmH>Ufync z^(}f@jJMlWV|q#qCi<$wlF^=K4oXM?&KNCE;{;)s>Xcvvoi1AsA_N1{wy$c7uD)$$zH3%29o+IfL3OeOIj9A?* z*?_nk7-;&p$B$eQWxBI&s+QaaVMCHr$5@@L2}uRVL_|DkURSMd&V{356{++BCb!YS ztuYY|0wmCj6axGQ%no8i?qh zot-3Ep>|$OsU_`-%J>E4I&KmK?oTz!F-uJ!((HtCA^2tlP*Lj#1ygFLNPQCodsrRv zQZ7ndTN?#)5SAG9euk`Hc?duCh)8%CW43ahKAb-!+}|fVN4o~%Ej$44CchMZIU!pq zGZALV0dBnXLh2oEAH^xUfG=i(_u9Qle0n{9@0p5&XRM7^Jf$gsn;P6tTkw zd&%sC1gQI0Y(-%Sf-%SrZTPW{rvAevY&xW6H54v!RODNP2Vd4a#r_WU^l_N5v<^D<%TKoCuP z*PM=*N!(hF*|oiRU3u+HUHF5Di_M1~37fM>4>HWV%@I3`j|DW6K9&%L+EhHp&o(qi ze;s30ihO~l_Z#dRFGLucTzZV($U=6La|(2DJiF!{pO zh`ru=R=3w6S(P!p*Huws6N}L5}LhPdX%CBjX${Ce!*AsJWbhn8B+Iyd3)BqN}TH0CmV*)bO z!;?jF#<>~}8M~#)wO^&TBHhHXTgYuOlkHT++02EBOag3VE7ln*{L&2%83Y)nLR@V4PE9aC9rF1SIi|!uoFx%=3pU zW~rh6UVArUt@%Umr%Ln;W`de|9|1z2`8t!uS7QLP@$Q3M{81;R)hp7}`SfN+ctmsv znk1_s7EkSLrB2hI#B{@~2V~bD%w`&40hi@+vUSx*9;TZqZ&qmXc6VhO#_SSt;^-Sa z%DBjZ!yrP3090f&IRcMFI!}YK>`a3EQ*PCn%!ixBGKE zN`XHFX9s+qeQRRJ=**0Wq6Dhefc10ulPwB7we9W=5xgEQik4f}h@e53Mmkq@-)qt^ zLHQbH<0D>^vXyN4PeNYHD1~e;8NE`5@!Vcc2{j)*PJ{^Te0Q| zN|I-6A0lgF24zv>NVr3<h69va<+}B`EuNUZ+KTY>U^|3Y17Kv#z8!pmTvf2%Kugdc(Vx0D%6(V7 zEBM`}cGYhqq^?D1ZLad{DLhV@2kSHRFmmmknH-9BQ?xgPo*_T84=A;z+;6uT|L7hG ztAt=U{?My;nklw1S6Onq1)LW6`Y1!h-0CW{XHw}v9xKf&n)KA)gw;Nwb&UeMtFGRH zpRlVH>f@cw@xRKM*I51^BqPOmfO!eE-yq4h4%j<+{XiOlS@-w)0K%^ ztS&OEFOe(yhF3_Wl7>Dv7~N<;K~-ixNAn8TVA}(P*e~yp2t2S+(^aXV<3?a9 zNTRCRo|x)!8prx;wi+EiZ`J47_}rH1WCjjpC@EHz+Hld;vUnD^SSBozLN|D%PJ|iw z16_b>I)kQCXP(3g$7>Fg;n785PGO?fs@>e$Vww2O|jx zr-QRm_-o7U-S+27^#!$l_#b$c!PM7FKZ{ep!sKE-iU2&C)<3UVAKSjIVK>305rMzT z$Mo%t@FTJl2=R~d2~l}|5q7aOOT=bR#?f42u!zft{ZS)L@JfC|a0>E>j2 zK!i0nQHx54*lm)i{cJYHGOm>JuV82dHpO!kdqF>60gM{*rg8_rc049LB& zO9;j5=Nr_orsT9JdcEHXp%7(37|Y7o3iK=3!R3L=MwhO?Tt$S%VY+{%a=ON?)Ekmr ze}TFiMv}W-c8~wE>{bXjzi2+~O~5Zc(jvI7Ub1h^F4${bsJxbNbgi4D7_V{ygIrTK zkGA{`Ou!SS>!4k=vG|Cs8|F)DFV_P4iEh_AL2bQ|BM9aKZtU$;Gl9PsqaFA(4EvmOV#x9q$RT2r`0Drl>G#$4_&KXmD0|&Q}UAKNJ zY11LnbjJIra`XlH!Z z>RPww+!z}hBhrJO5Jg}Xve=VrlP#2gnK^-8a)L&d_qNFaI7EXPIlOLzq)g5vhm~y_ zn`|B%K9J!g?2FgpvKm4MQybzX#__TXKX=1BY%Zzf(kt4X`;59298J@a39!RjdHtGh zQz*@A>GA~Woo{V%DfY+L0y8ZdAU{89HNV6o-%6tn8yewMsFPuJ9ZPIZo}1I^n=W{u zSBWoB;8f^k@VJHUD6=IBXm^aV2Ifevpj_h}7{d{jY>!13C$ZHTo&gEA4>6CP7t^B8 z_XxA92!>Pk*d)7fZ&L(amOwHCR=*Ucbed7T)xc>&lyse)=ITVsU?4KIo!zlm2K&+b zG}u_ZgCV+}8d>V?2t^IVnM73^wYW6nT1a=%Yj=V}wL0=9!9Cmn6ET?RmN6m33$8Zd zqZBeud&0Gg>!9`mR?%*Dr7A|g&AOdKEXKh{DhAIr201r5eONW!!42o~EqM3LV`8=cUIC+BTx9x6080jc1pkwRN~xkTHUR+wQiKKqLi`^Z$i>yu*39K!EKqCe zzI`?m(wG7G+XoDmh^DG`D!pZLXU#?@q+>tyN=&RRrPcdmGyZrIkX>8L0q9R&mzS@HuRg-68h&a^<^a$rL)P@n1tsPwl3S~R$w75Sx z6B87`rOHpk05kmqma^cs(M1@1W6Bp-=zzjgG5b&`Pzs}ghdGZx zbyX>oD9DA3STh4`3u&Hg=p=4p=+_XcOjwYX@@|v+{zL6i3w%w|EFh@ZF*}r>W9QrQ zPMbM@)a`7xU1GtsVN}!08wNQqjCQZ7aR;*bjpa6Zwx*|xpL4f zL}&tZ{=jOq$eRW8PB-)!82>E&LXiFm%k`&j2Tw}Z$HMn;>NeTSsK(z!ckU6T-9H0l zja4Qa+JKt%;>Bj8tk-co=oa2ID41oyJqUDMI5p@+{rt=@ z3PLUDvbMlHfT}rBZh34cAYuz6^8_#)W$?wAWvJ0W0Usg>3v=AB(lF zGrR_n2dz~e>We$=mihDU3EA#~@A5qMnsKI<`pVbBofLTe>~Kj&=bd8CXc5UR%RYSY zM$pJqs|AUBL^6XNR-`r4Op8a(TO!0&!qkUTx+jpe7nCE z=iTZnsZMQ-D?yQppPsjwbpxNxfS_i=Z4&Z2AkjD_SvJs7c_=LL<>|srx(SI}(jJdW zJdP&e*tj=e*hJ>oiS7p^R5L&6Ce|f(sjzM8vC)w=__*4v4ngA+Zl}Bc$__L-2u*F_ zAz!}Y6nnx-ayqdW!-0%RbMtR0mZWmzW>!fnI!dti2joV4i3*|?9eXqH2HO~=yKv!s zZG5kb%fsfe{1IsOs*BM}ja>|Ql%E*pM}GH04eQQpB?+U8U2bX5L%p=LkjyRaV1?|Y z4iY*%$tCefv%v6{bZR5GsJzWbB8$eA2)|z0s}AOrq{v&2PmI+$N6zw_JN*bsnhiZ> z*JI09A7&94#z$ApMij*%^F8n2|FiS&3y354{xv!Oui<$AWA^_hA^%Sx@V}_Y+JqUH z!GFP}5zD?vKYU;=17<$&|R6|Q&VhtTC!MA6MvOE z4P0cHT9&S!)aay$^+d$}M19Didr{#*F|g+TrdR?*qP z(S^~(!P)FzIhLEGBQwN=7Vs@S9<5-vfe@9_HUtYg5ZMrUpd&fkX=qQDx&5cdYMZA_ z0NPV(HvL97$*Wfb#W(0-@C@SADh%1uyklN3*kC342#1ug;zSh(9$p||?4ixP&3JU6 znH579X;10V(tvq$&km}MWVo50>S9sy3~LLk+%iIE6U;{2$2fKZXBf zT>mYU`g_a&FXHu|@_!DB|CVb|{I~qyL*zfj|EysD7N1i6xA;Hm*+2FF?3Dl3tJ3_p o{{PcO|Jl+%)BN8p$nTk{`%WU_piPG1@7)9uK)l5 literal 0 HcmV?d00001 diff --git a/scripts/genera-manuale-utente.py b/scripts/genera-manuale-utente.py new file mode 100644 index 0000000..6a3cc05 --- /dev/null +++ b/scripts/genera-manuale-utente.py @@ -0,0 +1,407 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""Genera il Manuale d'uso di NIS2 Agile in .docx usando solo stdlib (zipfile+XML).""" +import zipfile, re, datetime +from xml.sax.saxutils import escape + +OUT = "/projects/nis2-agile/docs/MANUALE_UTENTE_NIS2_AGILE.docx" + +# ───────────────────────────────────────────────────────────────────────── +# CONTENUTO DEL MANUALE (DSL: lista di blocchi) +# ('title', titolo, sottotitolo, riga_meta) +# ('h1'|'h2'|'h3', testo) | ('p', testo) | ('note', testo) +# ('ul', [voci]) | ('ol', [voci]) +# ('table', [intestazioni], [[riga],...]) +# ('pb',) page break +# Nel testo: **grassetto** supportato. +# ───────────────────────────────────────────────────────────────────────── +DATE = "11 giugno 2026" +C = [] +def add(*b): C.append(b) + +add('title', "NIS2 Agile", "Manuale d'uso del prodotto", + "Versione piattaforma 1.14.0 · Aggiornato all'%s" % DATE) + +# ===== INDICE (statico, i numeri di pagina non sono calcolati) ===== +add('h1', "Indice dei contenuti") +for n in ["1. Introduzione","2. Primi passi (accesso, registrazione, onboarding)", + "3. Dashboard","4. Gap Analysis NIS2 (Art. 21)","5. Gap Analysis ACN (Determinazione 164179/2025)", + "6. Modello Organizzativo SGSI (ISO 27001/27017/27018)","7. Gestione dei Rischi", + "8. Gestione degli Incidenti (Art. 23)","9. Policy e procedure","10. Supply Chain (fornitori)", + "11. Formazione","12. Asset","13. Audit & Report","14. Whistleblowing (Art. 32)", + "15. Aggiornamenti normativi","16. Knowledge Base e Assistente AI","17. Segnalazioni (feedback)", + "18. Impostazioni","19. Amministrazione","20. Integrazioni e API","21. Glossario","22. Riferimenti normativi"]: + add('p', n) +add('pb') + +# ===== 1. INTRODUZIONE ===== +add('h1', "1. Introduzione") +add('h2', "1.1 Che cos'è NIS2 Agile") +add('p', "NIS2 Agile è una piattaforma SaaS multi-tenant che supporta le aziende nel percorso di conformità alla **Direttiva (UE) 2022/2555 (NIS2)** e al suo recepimento italiano (**D.Lgs. 138/2024**), comprese le **Determinazioni dell'Agenzia per la Cybersicurezza Nazionale (ACN)**. Integra l'intelligenza artificiale (Claude) per gap analysis, generazione di policy, classificazione degli incidenti e suggerimento dei rischi.") +add('p', "Dalla versione 1.14.0 la piattaforma include anche un modulo guidato per la costruzione del **Modello Organizzativo SGSI secondo ISO/IEC 27001:2022**, con estensioni cloud ISO/IEC 27017:2015 e 27018:2019.") +add('h2', "1.2 A chi è rivolto") +add('ul', ["**PMI** che devono adeguarsi agli obblighi NIS2 con risorse limitate;", + "**Grandi imprese / Enterprise** con processi di compliance strutturati;", + "**Consulenti e CISO** che gestiscono più organizzazioni clienti tramite uno studio (consulting firm)."]) +add('h2', "1.3 Quadro normativo di riferimento") +add('table', ["Fonte","Ruolo"], + [["Direttiva (UE) 2022/2555 (NIS2)","Principi e obblighi europei di cibersicurezza"], + ["D.Lgs. 138/2024","Recepimento italiano della NIS2 (obblighi operativi)"], + ["Determinazione ACN 164179/2025","Misure di sicurezza di base, classificazione e notifica incidenti (Allegati)"], + ["ISO/IEC 27001:2022","Requisiti del Sistema di Gestione della Sicurezza delle Informazioni (best practice)"], + ["ISO/IEC 27017:2015 / 27018:2019","Controlli per servizi cloud / protezione PII in cloud (best practice)"]]) +add('note', "Disclaimer: NIS2 Agile è uno strumento di supporto operativo e pre-audit. Non costituisce consulenza legale né parere professionale vincolante, e non rilascia certificazioni ISO. Le valutazioni proposte (perimetro, applicabilità, significatività) vanno confermate con il referente compliance/legale dell'organizzazione.") + +# ===== 2. PRIMI PASSI ===== +add('pb'); add('h1', "2. Primi passi") +add('h2', "2.1 Accesso e indirizzo") +add('p', "La piattaforma è raggiungibile all'indirizzo **https://nis2.agile.software/**. L'accesso avviene con email e password (autenticazione JWT). Se la tua organizzazione usa il Single Sign-On centralizzato (AgileHub), le credenziali sono condivise tra i prodotti della suite.") +add('h2', "2.2 Registrazione") +add('ol', ["Apri la pagina di **Registrazione** e inserisci i dati richiesti (email, password conforme alla policy di sicurezza).", + "Al termine vieni indirizzato automaticamente alla procedura di **onboarding** aziendale.", + "Se possiedi un **invito/licenza** (token `inv_...`) fornito da un partner, inseriscilo per attivare l'organizzazione pre-configurata."]) +add('h2', "2.3 Recupero password") +add('p', "Dalla pagina di login usa **Password dimenticata** per ricevere un link di reset via email. Il cambio password effettuato da AgileHub si propaga automaticamente entro pochi minuti grazie al sync SSO.") +add('h2', "2.4 Onboarding dell'organizzazione") +add('p', "Il wizard di onboarding crea l'organizzazione e ne determina la classificazione NIS2. Si articola in quattro passi:") +add('ol', ["**Dati azienda** — inserimento manuale oppure precompilazione tramite **Partita IVA** (lookup automatico) o caricamento della **visura camerale** (estrazione AI dei dati).", + "**Verifica e completamento** — settore (ATECO → settore NIS2), numero dipendenti, fatturato, sede, contatti.", + "**Profilo utente** — nome, ruolo, telefono.", + "**Classificazione NIS2** — la piattaforma propone se il soggetto è **essenziale**, **importante** o **non applicabile** in base a settore e dimensione; è possibile aderire volontariamente."]) +add('note', "La classificazione (essenziale/importante) determina il perimetro applicabile in più moduli, in particolare la Gap Analysis ACN e gli obblighi sugli incidenti. Puoi rivederla in Impostazioni › Classificazione NIS2.") +add('h2', "2.5 Ruoli e permessi") +add('table', ["Ruolo","Descrizione"], + [["super_admin","Amministratore di piattaforma (accesso a tutte le organizzazioni)"], + ["org_admin","Amministratore dell'organizzazione"], + ["compliance_manager","Responsabile compliance: gestisce assessment, rischi, policy, SGSI"], + ["board_member","Organo direttivo: visione e approvazioni"], + ["auditor","Revisore: lettura e compilazione evidenze/controlli"], + ["employee","Dipendente: formazione, segnalazioni"], + ["consultant","Consulente di studio che opera su più organizzazioni clienti"]]) +add('h2', "2.6 Multi-organizzazione, lingua e aiuto") +add('ul', ["Chi appartiene a più organizzazioni (es. consulenti) può **cambiare contesto** dall'intestazione/menu.", + "L'interfaccia è disponibile in **Italiano** ed **Inglese** (selettore lingua).", + "Ogni pagina dispone di **Aiuto contestuale** (icona ?) con guida e riferimenti normativi certi."]) + +# ===== 3. DASHBOARD ===== +add('pb'); add('h1', "3. Dashboard") +add('p', "La Dashboard è la pagina iniziale dopo l'accesso e offre una visione d'insieme dello stato di conformità.") +add('ul', ["**Avanzamento implementazione misure Art. 21 NIS2** — indicatore complessivo (gauge);", + "**Scadenze imminenti** — adempimenti e revisioni in arrivo da più moduli;", + "**Attività recenti** — ultime azioni tracciate;", + "**Heatmap dei rischi** — distribuzione dei rischi su probabilità × impatto;", + "**Benchmark settoriale** (anonimizzato) — confronto con il proprio settore;", + "**Compliance Journey** — percorso guidato che indica i prossimi passi consigliati."]) + +# ===== 4. GAP ANALYSIS NIS2 ===== +add('pb'); add('h1', "4. Gap Analysis NIS2 (Art. 21)") +add('p', "Analisi di **primo livello** sulle 10 categorie di misure dell'Art. 21.2 NIS2, basata su un questionario di 80 domande (10 categorie), ciascuna collegata anche al controllo ISO 27001 corrispondente.") +add('h2', "4.1 Come si svolge") +add('ol', ["Crea un nuovo assessment: la piattaforma pre-popola tutte le domande.", + "Per ogni domanda indica lo stato: **Attuato**, **Parziale**, **Non attuato**, **Non applicabile**. Le risposte si salvano automaticamente.", + "Completa l'assessment per ottenere un **punteggio** per categoria e complessivo.", + "Avvia l'**analisi AI** per ricevere sintesi esecutiva, priorità, quick win e una roadmap di conformità."]) +add('note', "Le risposte della Gap Analysis NIS2 alimentano automaticamente il Modello SGSI (capitolo 6): il loro stato pre-popola lo Statement of Applicability ISO 27001.") + +# ===== 5. GAP ANALYSIS ACN ===== +add('pb'); add('h1', "5. Gap Analysis ACN (Determinazione 164179/2025)") +add('p', "Analisi di **secondo livello** sulle misure e i requisiti puntuali stabiliti dall'ACN, articolati secondo il **Framework Nazionale** (funzioni Governo GV, Identificazione ID, Protezione PR, Rilevamento DE, Risposta RS, Ripristino RC).") +add('table', ["Classificazione","Perimetro applicabile"], + [["Soggetto IMPORTANTE (Allegato 1)","37 misure / 87 requisiti"], + ["Soggetto ESSENZIALE (Allegato 2)","43 misure / 116 requisiti"]]) +add('ul', ["Il perimetro è filtrato automaticamente in base alla classificazione NIS2 dell'organizzazione;", + "scoring per funzione del Framework Nazionale e punteggio complessivo;", + "**piano d'azione** dei requisiti non conformi e **analisi AI** ancorata ai 203 requisiti ACN reali (nessun riferimento inventato);", + "**Catalogo requisiti** consultabile in sola lettura."]) + +# ===== 6. MODELLO SGSI ISO 27001 (NUOVO) ===== +add('pb'); add('h1', "6. Modello Organizzativo SGSI (ISO 27001/27017/27018)") +add('p', "Procedura guidata per costruire il **Sistema di Gestione della Sicurezza delle Informazioni (SGSI / ISMS)** secondo **ISO/IEC 27001:2022** (clausole 4–10) e il relativo **Statement of Applicability (SoA)** sui 93 controlli dell'Annex A. È uno strumento di supporto e pre-audit, non una certificazione.") +add('h2', "6.1 Il wizard in 6 passi") +add('table', ["Passo","Clausola ISO 27001","Contenuto"], + [["1. Contesto e Ambito","cl. 4","Scope del SGSI, contesto interno/esterno, parti interessate, confini, esclusioni motivate, attivazione estensioni cloud"], + ["2. Leadership","cl. 5","Ruoli e responsabilità con matrice RACI (Responsible, Accountable, Consulted, Informed)"], + ["3. Risk","cl. 6","Metodologia di risk assessment e obiettivi del SGSI (il registro rischi resta nel modulo Rischi)"], + ["4. Statement of Applicability","cl. 6.1.3","Applicabilità, stato e motivazione dei 93 controlli Annex A + estensioni cloud"], + ["5. Documented Information","cl. 7–8","Policy e procedure, con bozze generabili dall'AI"], + ["6. Monitoraggio e Miglioramento","cl. 9–10","Audit interni e non conformità (moduli Audit & Report e NCR/CAPA); checklist di completamento"]]) +add('h2', "6.2 SoA pre-popolato dalla Gap Analysis NIS2") +add('p', "Ogni domanda della Gap Analysis NIS2 è collegata a un controllo ISO 27001 (es. A.5.1). Per questo lo Statement of Applicability viene **pre-compilato** a partire dalle risposte NIS2 già date: i controlli con corrispondenza riportano il badge **\"da NIS2\"** e uno stato proposto (Attuato = 100%, Parziale = 50%, Non attuato = 0%). I controlli non coperti dal NIS2 (es. parte dei controlli fisici A.7) restano da compilare manualmente.") +add('note', "Il pulsante \"Ri-deriva dal NIS2\" aggiunge soltanto i controlli mancanti e non sovrascrive le modifiche manuali già inserite.") +add('h2', "6.3 Estensioni cloud (condizionali)") +add('ul', ["**ISO/IEC 27017:2015** — attivala se usi servizi cloud pubblici o sei un fornitore cloud: aggiunge 7 controlli cloud (CLD.*) al SoA;", + "**ISO/IEC 27018:2019** — attivala se tratti dati personali (PII) in cloud pubblico come responsabile: aggiunge i controlli privacy (PII.*), sinergici con il GDPR.", + "Le sezioni cloud/PII compaiono nel SoA **solo** se attivi i relativi flag nel passo 1."]) +add('h2', "6.4 Documenti e generazione AI") +add('p', "Nel passo 5 puoi generare bozze di policy e procedure (Policy SGSI, Dichiarazione di Applicabilità, controllo accessi, gestione incidenti, continuità, sicurezza fornitori). Le bozze sono prodotte dall'AI con ancoraggio alle fonti certe e richiedono **revisione umana** prima dell'approvazione.") +add('h2', "6.5 Esportazione") +add('p', "Il pulsante **Esporta SGSI** apre una versione stampabile del modello (ambito, metodologia, SoA con stato dei controlli), utile come evidenza in vista di un audit.") + +# ===== 7. RISCHI ===== +add('pb'); add('h1', "7. Gestione dei Rischi") +add('p', "Registro dei rischi con matrice **Probabilità × Impatto 5×5** e supporto AI, conforme all'Art. 21 NIS2 e alla metodologia ISO 27005.") +add('ul', ["Creazione del rischio con scala probabilità/impatto (dettagli ISO 27005);", + "**Piani di trattamento** (mitigare, accettare, trasferire, evitare) e stato di avanzamento;", + "**Suggerimento AI** dei rischi per settore e asset (dati anonimizzati);", + "Funzioni avanzate: registro quantitativo **FAIR** (calcolo ALE Monte Carlo) e dashboard **KRI**."]) + +# ===== 8. INCIDENTI ===== +add('pb'); add('h1', "8. Gestione degli Incidenti (Art. 23)") +add('p', "Gestione del ciclo di vita degli incidenti significativi e degli obblighi di notifica al CSIRT secondo l'Art. 23 e la Determinazione ACN 164179/2025.") +add('h2', "8.1 Tempistiche di notifica") +add('table', ["Adempimento","Termine"], + [["Pre-allarme (early warning)","entro 24 ore dalla conoscenza"], + ["Notifica completa","entro 72 ore dalla conoscenza"], + ["Relazione finale","entro 1 mese dalla notifica delle 72 ore"]]) +add('h2', "8.2 Funzioni") +add('ul', ["**Albero decisionale** per valutare la significatività (utenti ≥ 500, durata > 4h, cross-border, attacco cyber, danni > €100k);", + "**timeline** dell'incidente e metriche (triage, contenimento, eradicazione, ripristino);", + "invio di **early warning, notifica e relazione finale** al CSIRT;", + "**classificazione AI** (tipo IS-1..IS-4, severità) con citazione della fonte (Allegato 3 = importanti, Allegato 4 = essenziali);", + "**PIR** (Post-Incident Review) per l'apprendimento."]) + +# ===== 9. POLICY ===== +add('pb'); add('h1', "9. Policy e procedure") +add('ul', ["Creazione di policy da **template** o **generazione AI** (bozze marcate da revisionare);", + "flusso di **approvazione** e **versioning** con confronto delle versioni (diff);", + "**attestazione** di presa visione da parte del personale e relativo tracciamento."]) +add('note', "Le bozze generate dall'AI riportano un banner di avviso: vanno riviste e approvate da un responsabile prima della pubblicazione.") + +# ===== 10. SUPPLY CHAIN ===== +add('pb'); add('h1', "10. Supply Chain (fornitori)") +add('p', "Gestione della sicurezza della catena di approvvigionamento (Art. 21.2.d).") +add('ul', ["Anagrafica fornitori, categorie e **import** massivo;", + "**questionari** configurabili (categorie, template, domande) inviati ai fornitori;", + "**portale fornitore** dedicato con accesso separato via OTP/magic-link (autosalvataggio risposte);", + "**campagne** di valutazione e cruscotto del rischio fornitori (risk overview)."]) + +# ===== 11. FORMAZIONE ===== +add('pb'); add('h1', "11. Formazione") +add('p', "Gestione della formazione e dell'igiene informatica (Art. 21.2.g) e degli obblighi formativi per gli organi direttivi (Art. 20).") +add('ul', ["Catalogo **corsi** e **assegnazioni** al personale;", + "monitoraggio della **compliance formativa** e dei corsi obbligatori non completati."]) + +# ===== 12. ASSET ===== +add('pb'); add('h1', "12. Asset") +add('p', "Inventario degli asset informativi e delle dipendenze.") +add('ul', ["Anagrafica asset e **import** (CMDB/cloud);", + "**scoring di rilevanza NIS2** (0–100, criterio GV.OC-04) e classificazione dei sistemi rilevanti;", + "**mappa delle dipendenze** tra asset."]) + +# ===== 13. AUDIT & REPORT ===== +add('pb'); add('h1', "13. Audit & Report") +add('ul', ["Gestione dei **controlli di conformità** (framework NIS2 / ISO 27001) con stato ed evidenze;", + "caricamento **evidenze** e registro dei **log di audit**;", + "**mappature**: NIS2 ↔ ISO 27001 e NIST CSF 2.0; **registro dei sistemi rilevanti** (GV.OC-04);", + "**report esecutivo** stampabile ed **export CSV**;", + "**catena di integrità (hash chain SHA-256)**: ogni voce del log è concatenata alla precedente; verifica integrità ed **export certificato**."]) + +# ===== 14. WHISTLEBLOWING ===== +add('pb'); add('h1', "14. Whistleblowing (Art. 32)") +add('p', "Canale per le segnalazioni, anche anonime.") +add('ul', ["Invio segnalazione (anche **anonima**, con codice di tracciamento);", + "assegnazione, gestione e chiusura della segnalazione;", + "consultazione anonima dello stato tramite codice di tracciamento."]) + +# ===== 15. NORMATIVE ===== +add('pb'); add('h1', "15. Aggiornamenti normativi") +add('ul', ["Feed degli aggiornamenti **NIS2 / ACN / DORA**;", + "presa visione (**ACK**) tracciata per ciascun aggiornamento;", + "elenco aggiornamenti **in attesa** di presa visione e statistiche."]) + +# ===== 16. KB & AI ===== +add('pb'); add('h1', "16. Knowledge Base e Assistente AI") +add('h2', "16.1 Knowledge Base (RAG)") +add('p', "La Knowledge Base alimenta le risposte dell'AI tramite ricerca semantica (RAG). Prevede tre livelli di visibilità:") +add('table', ["Livello","Chi possiede","Chi vede"], + [["SYSTEM","Fornitore della piattaforma","Tutti gli utenti"], + ["FIRM","Studio di consulenza","Collaboratori dello studio + organizzazioni condivise"], + ["ORG","Singola organizzazione","Solo gli utenti di quella organizzazione"]]) +add('ul', ["Caricamento documenti (testo) con scelta dello scope;", + "ricerca semantica e cancellazione documenti;", + "le fonti normative certe (NIS2, D.Lgs. 138/2024, Determinazioni ACN) e i cataloghi **ISO 27001/27002/27017/27018** sono già indicizzati a livello SYSTEM."]) +add('h2', "16.2 Assistente AI") +add('p', "L'assistente risponde alle domande pescando dalla Knowledge Base e **cita sempre la fonte normativa pertinente**, senza inventare riferimenti. Le risposte sono di orientamento operativo e non sostituiscono il parere legale.") + +# ===== 17. FEEDBACK ===== +add('pb'); add('h1', "17. Segnalazioni (feedback)") +add('p', "Strumento integrato per segnalare bug o suggerimenti di UX. Le segnalazioni vengono classificate dall'AI e, una volta risolte, l'esito può essere comunicato ai membri dell'organizzazione. Ogni segnalazione cattura automaticamente la **versione del prodotto** e la **superficie** (web/mobile) per facilitare la diagnosi.") + +# ===== 18. IMPOSTAZIONI ===== +add('pb'); add('h1', "18. Impostazioni") +add('ul', ["**Organizzazione** — dati, classificazione NIS2;", + "**Profilo** — dati personali, cambio password, preferenze;", + "**Membri** — invito e gestione degli utenti e dei ruoli;", + "**Sessioni** — gestione dei dispositivi collegati (multi-device) e revoca;", + "**Branding** (white-label per studi) — personalizzazione per lo studio di consulenza."]) + +# ===== 19. AMMINISTRAZIONE ===== +add('pb'); add('h1', "19. Amministrazione") +add('p', "Area riservata al ruolo **super_admin**: gestione delle organizzazioni, degli utenti e statistiche di piattaforma.") + +# ===== 20. INTEGRAZIONI E API ===== +add('pb'); add('h1', "20. Integrazioni e API") +add('ul', ["**Services API** (autenticazione tramite API Key con scope) per integrazioni esterne, es. GRC/231: gap-analysis, misure, incidenti, formazione, scadenze e snapshot completo;", + "**Webhook** con firma HMAC-SHA256 e retry, per notifiche verso sistemi terzi;", + "**Licenze/inviti B2B** per provisioning di organizzazioni da parte di partner;", + "**SSO** centralizzato della suite AgileHub (sincronizzazione password)."]) + +# ===== 21. GLOSSARIO ===== +add('pb'); add('h1', "21. Glossario") +add('table', ["Termine","Significato"], + [["NIS2","Direttiva (UE) 2022/2555 sulla cibersicurezza"], + ["ACN","Agenzia per la Cybersicurezza Nazionale"], + ["SGSI / ISMS","Sistema di Gestione della Sicurezza delle Informazioni (ISO 27001)"], + ["SoA","Statement of Applicability: dichiarazione di applicabilità dei controlli"], + ["Annex A","Elenco dei 93 controlli di sicurezza di ISO/IEC 27001:2022"], + ["RACI","Matrice di responsabilità: Responsible, Accountable, Consulted, Informed"], + ["CSIRT","Computer Security Incident Response Team (autorità di notifica)"], + ["PIR","Post-Incident Review (revisione post-incidente)"], + ["RAG","Retrieval-Augmented Generation: AI con recupero da knowledge base"], + ["PII","Personally Identifiable Information (dati personali)"], + ["Soggetto essenziale / importante","Categorie NIS2 che determinano gli obblighi applicabili"]]) + +# ===== 22. RIFERIMENTI NORMATIVI ===== +add('pb'); add('h1', "22. Riferimenti normativi") +add('ul', ["Direttiva (UE) 2022/2555 (NIS2);", + "Direttiva (UE) 2022/2557 (CER);", + "D.Lgs. 4 settembre 2024, n. 138;", + "Determinazione ACN n. 164179 del 14/04/2025 (misure di base, classificazione e notifica incidenti, Allegati);", + "Determinazione ACN n. 333017/2025 (piattaforma ACN, designazione rappresentanti);", + "ISO/IEC 27001:2022, 27002:2022, 27017:2015, 27018:2019 (best practice, non vincolanti)."]) +add('note', "Questo manuale descrive le funzionalità della piattaforma NIS2 Agile alla versione 1.14.0. Le schermate e le voci di menu possono variare con gli aggiornamenti. Per l'aiuto contestuale usa l'icona ? presente in ogni pagina.") + +# ───────────────────────────────────────────────────────────────────────── +# EMITTER OOXML +# ───────────────────────────────────────────────────────────────────────── +def runs(text): + """Converte **bold** in run WordprocessingML.""" + out = [] + for i, part in enumerate(re.split(r'\*\*', text)): + if part == '': + continue + bold = (i % 2 == 1) + rpr = '' if bold else '' + out.append('%s%s' % (rpr, escape(part))) + return ''.join(out) or '' + +def para(text, style=None): + ppr = '' % style if style else '' + return '%s%s' % (ppr, runs(text)) + +def listitem(text, numid): + return ('' + '%s' % (numid, runs(text))) + +def cell(text, header=False): + shd = '' if header else '' + t = ('**%s**' % text) if header else text + # nelle intestazioni il testo bianco + if header: + r = '%s' % escape(text) + else: + r = runs(text) + return ('%s%s' % (shd, r)) + +def table(headers, rows): + borders = ('' + ''.join( + '' % s + for s in ['top','left','bottom','right','insideH','insideV']) + '') + tblpr = '%s' % borders + out = ['', tblpr] + out.append('' + ''.join(cell(h, True) for h in headers) + '') + for row in rows: + out.append('' + ''.join(cell(c) for c in row) + '') + out.append('') + out.append('') # spacing after table + return ''.join(out) + +def title_block(t, sub, meta): + return (para(t, 'Title') + para(sub, 'Subtitle') + para(meta, 'Meta')) + +body = [] +for b in C: + k = b[0] + if k == 'title': body.append(title_block(b[1], b[2], b[3])) + elif k == 'h1': body.append(para(b[1], 'Heading1')) + elif k == 'h2': body.append(para(b[1], 'Heading2')) + elif k == 'h3': body.append(para(b[1], 'Heading3')) + elif k == 'p': body.append(para(b[1])) + elif k == 'note': body.append(para(b[1], 'Note')) + elif k == 'ul': body.append(''.join(listitem(x, 1) for x in b[1])) + elif k == 'ol': body.append(''.join(listitem(x, 2) for x in b[1])) + elif k == 'table': body.append(table(b[1], b[2])) + elif k == 'pb': body.append('') + +SECT = ('' + '' + '') + +document = ('' + '' + '' + ''.join(body) + SECT + '') + +STYLES = ('' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '') + +NUMBERING = ('' + '' + '' + '' + '' + '' + '') + +CONTENT_TYPES = ('' + '' + '' + '' + '' + '' + '' + '' + '') + +RELS = ('' + '' + '' + '' + '') + +DOC_RELS = ('' + '' + '' + '' + '') + +CORE = ('' + '' + 'Manuale d\'uso NIS2 AgileNIS2 Agile' + 'NIS2 Agile' + '2026-06-11T00:00:00Z' + '2026-06-11T00:00:00Z' + '') + +with zipfile.ZipFile(OUT, 'w', zipfile.ZIP_DEFLATED) as z: + z.writestr('[Content_Types].xml', CONTENT_TYPES) + z.writestr('_rels/.rels', RELS) + z.writestr('word/document.xml', document) + z.writestr('word/styles.xml', STYLES) + z.writestr('word/numbering.xml', NUMBERING) + z.writestr('word/_rels/document.xml.rels', DOC_RELS) + z.writestr('docProps/core.xml', CORE) + +print("OK ->", OUT) +print("blocchi:", len(C))