From 36a8a28390ef04d2d54f07dda883e08b8025515d Mon Sep 17 00:00:00 2001 From: Sergio Garcia Date: Mon, 18 Mar 2024 14:30:18 +0100 Subject: [PATCH 01/46] feat(dashboards): add prowler dashboards --- .gitignore | 4 + dashboard/.nvmrc | 1 + dashboard/MITRE_ATTACK.png | Bin 0 -> 9576 bytes dashboard/README.md | 16 + dashboard/app.py | 169 ++ dashboard/assets/favicon.ico | Bin 0 -> 15406 bytes dashboard/assets/images/icons/compliance.svg | 4 + dashboard/assets/images/icons/docs.png | Bin 0 -> 734 bytes dashboard/assets/images/icons/help-black.png | Bin 0 -> 441 bytes dashboard/assets/images/icons/help.png | Bin 0 -> 934 bytes dashboard/assets/images/icons/overview.svg | 4 + .../assets/images/providers/aws_provider.png | Bin 0 -> 10544 bytes .../images/providers/azure_provider.png | Bin 0 -> 6141 bytes .../assets/images/providers/gcp_provider.png | Bin 0 -> 251077 bytes .../assets/images/providers/k8s_provider.png | Bin 0 -> 15559 bytes dashboard/assets/logo.png | Bin 0 -> 11087 bytes dashboard/common_methods.py | 43 + ...it_manager_control_tower_guardrails_aws.py | 286 ++++ ...oundational_security_best_practices_aws.py | 286 ++++ ...tected_framework_reliability_pillar_aws.py | 284 ++++ ...chitected_framework_security_pillar_aws.py | 283 ++++ dashboard/compliance/cis_1_4_aws.py | 291 ++++ dashboard/compliance/cis_1_5_aws.py | 291 ++++ dashboard/compliance/cis_2_0_aws.py | 291 ++++ dashboard/compliance/cis_2_0_gcp.py | 296 ++++ dashboard/compliance/cisa_aws.py | 286 ++++ dashboard/compliance/ens_rd2022_aws.py | 282 ++++ .../compliance/fedramp_low_revision_4_aws.py | 297 ++++ .../fedramp_moderate_revision_4_aws.py | 297 ++++ dashboard/compliance/ffiec_aws.py | 297 ++++ dashboard/compliance/gdpr_aws.py | 286 ++++ .../compliance/gxp_21_cfr_part_11_aws.py | 297 ++++ dashboard/compliance/gxp_eu_annex_11_aws.py | 286 ++++ dashboard/compliance/hipaa_aws.py | 297 ++++ dashboard/compliance/iso27001_2013_aws.py | 305 ++++ dashboard/compliance/mitre_attack_aws.py | 286 ++++ .../compliance/nist_800_171_revision_2_aws.py | 297 ++++ .../compliance/nist_800_53_revision_4_aws.py | 297 ++++ .../compliance/nist_800_53_revision_5_aws.py | 297 ++++ dashboard/compliance/pci_3_2_1_aws.py | 162 ++ .../rbi_cyber_security_framework_aws.py | 167 ++ dashboard/compliance/soc2_aws.py | 306 ++++ dashboard/package-lock.json | 1419 ++++++++++++++++ dashboard/package.json | 18 + dashboard/pages/compliance.py | 696 ++++++++ dashboard/pages/overview.py | 1449 +++++++++++++++++ dashboard/requirements.txt | 64 + dashboard/src/input.css | 179 ++ dashboard/tailwind.config.js | 90 + 49 files changed, 11206 insertions(+) create mode 100644 dashboard/.nvmrc create mode 100644 dashboard/MITRE_ATTACK.png create mode 100644 dashboard/README.md create mode 100644 dashboard/app.py create mode 100644 dashboard/assets/favicon.ico create mode 100644 dashboard/assets/images/icons/compliance.svg create mode 100644 dashboard/assets/images/icons/docs.png create mode 100644 dashboard/assets/images/icons/help-black.png create mode 100644 dashboard/assets/images/icons/help.png create mode 100644 dashboard/assets/images/icons/overview.svg create mode 100644 dashboard/assets/images/providers/aws_provider.png create mode 100644 dashboard/assets/images/providers/azure_provider.png create mode 100644 dashboard/assets/images/providers/gcp_provider.png create mode 100644 dashboard/assets/images/providers/k8s_provider.png create mode 100644 dashboard/assets/logo.png create mode 100644 dashboard/common_methods.py create mode 100644 dashboard/compliance/aws_audit_manager_control_tower_guardrails_aws.py create mode 100644 dashboard/compliance/aws_foundational_security_best_practices_aws.py create mode 100644 dashboard/compliance/aws_well_architected_framework_reliability_pillar_aws.py create mode 100644 dashboard/compliance/aws_well_architected_framework_security_pillar_aws.py create mode 100644 dashboard/compliance/cis_1_4_aws.py create mode 100644 dashboard/compliance/cis_1_5_aws.py create mode 100644 dashboard/compliance/cis_2_0_aws.py create mode 100644 dashboard/compliance/cis_2_0_gcp.py create mode 100644 dashboard/compliance/cisa_aws.py create mode 100644 dashboard/compliance/ens_rd2022_aws.py create mode 100644 dashboard/compliance/fedramp_low_revision_4_aws.py create mode 100644 dashboard/compliance/fedramp_moderate_revision_4_aws.py create mode 100644 dashboard/compliance/ffiec_aws.py create mode 100644 dashboard/compliance/gdpr_aws.py create mode 100644 dashboard/compliance/gxp_21_cfr_part_11_aws.py create mode 100644 dashboard/compliance/gxp_eu_annex_11_aws.py create mode 100644 dashboard/compliance/hipaa_aws.py create mode 100644 dashboard/compliance/iso27001_2013_aws.py create mode 100644 dashboard/compliance/mitre_attack_aws.py create mode 100644 dashboard/compliance/nist_800_171_revision_2_aws.py create mode 100644 dashboard/compliance/nist_800_53_revision_4_aws.py create mode 100644 dashboard/compliance/nist_800_53_revision_5_aws.py create mode 100644 dashboard/compliance/pci_3_2_1_aws.py create mode 100644 dashboard/compliance/rbi_cyber_security_framework_aws.py create mode 100644 dashboard/compliance/soc2_aws.py create mode 100644 dashboard/package-lock.json create mode 100644 dashboard/package.json create mode 100644 dashboard/pages/compliance.py create mode 100644 dashboard/pages/overview.py create mode 100644 dashboard/requirements.txt create mode 100644 dashboard/src/input.css create mode 100644 dashboard/tailwind.config.js diff --git a/.gitignore b/.gitignore index 1d9de043a6..79ed367965 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ venv/ build/ dist/ *.egg-info/ +*/__pycache__/*.pyc # Session Session.vim @@ -51,3 +52,6 @@ junit-reports/ .coverage* .coverage coverage* + +# Node +node_modules diff --git a/dashboard/.nvmrc b/dashboard/.nvmrc new file mode 100644 index 0000000000..a77793ecc5 --- /dev/null +++ b/dashboard/.nvmrc @@ -0,0 +1 @@ +lts/hydrogen diff --git a/dashboard/MITRE_ATTACK.png b/dashboard/MITRE_ATTACK.png new file mode 100644 index 0000000000000000000000000000000000000000..4b08a3e41ffe778409026fc38ba3751935517691 GIT binary patch literal 9576 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 Okrb5^ss3sZ_ v.18). + + ii. Run ```npm install``` to install the node modules. + + iii. Run ```npm run dev``` to start the watcher. + +* Run ```python app.py``` to start the Dash application. + +In the compliance page, we are taking the information about each compliance from the output folder. If you choose the mitre_attack compliance the app is failing because csv from both compliance are not in a correct format: +* Example: + + ![MITRE_ATTACK file format](MITRE_ATTACK.png) diff --git a/dashboard/app.py b/dashboard/app.py new file mode 100644 index 0000000000..4f9c5b0a2c --- /dev/null +++ b/dashboard/app.py @@ -0,0 +1,169 @@ +# Importing Packages +import warnings + +import dash +import dash_bootstrap_components as dbc +from dash import dcc, html +from dash.dependencies import Input, Output + +warnings.filterwarnings("ignore") + + +############################################################################# +""" + DASH BOARD SETTINGS +""" +############################################################################# +# Initialize the app - incorporate css +app = dash.Dash( + __name__, + external_stylesheets=[dbc.themes.DARKLY], + use_pages=True, + suppress_callback_exceptions=True, +) +app.title = "Prowler Dashboard" + +##################################################################### +""" + LOGO +""" +##################################################################### +prowler_logo = html.Img(src="assets/logo.png", alt="Prowler Logo") + +menu_icons = { + "overview": "/assets/images/icons/overview.svg", + "compliance": "/assets/images/icons/compliance.svg", +} + + +# Function to generate navigation links +def generate_nav_links(current_path): + nav_links = [] + for page in dash.page_registry.values(): + # Gets the icon URL based on the page name + icon_url = menu_icons.get(page["name"].lower()) + is_active = ( + " bg-prowler-stone-950 border-r-4 border-solid border-prowler-lime" + if current_path == page["relative_path"] + else "" + ) + link_class = f"block hover:bg-prowler-stone-950 hover:border-r-4 hover:border-solid hover:border-prowler-lime{is_active}" + + link_content = html.Span( + [ + html.Img(src=icon_url, className="w-5"), + html.Span(page["name"], className="font-medium text-base leading-6"), + ], + className="flex justify-center lg:justify-normal items-center gap-x-3 py-2 px-3", + ) + + nav_link = html.Li( + dcc.Link(link_content, href=page["relative_path"], className=link_class) + ) + nav_links.append(nav_link) + return nav_links + + +def generate_help_menu(): + help_links = [ + { + "title": "Help", + "url": "https://github.com/prowler-cloud/prowler/issues", + "icon": "/assets/images/icons/help.png", + }, + { + "title": "Docs", + "url": "https://docs.prowler.com", + "icon": "/assets/images/icons/docs.png", + }, + ] + + link_class = "block hover:bg-prowler-stone-950 hover:border-r-4 hover:border-solid hover:border-prowler-lime" + + menu_items = [] + for link in help_links: + menu_item = html.Li( + html.A( + html.Span( + [ + html.Img(src=link["icon"], className="w-5"), + html.Span( + link["title"], className="font-medium text-base leading-6" + ), + ], + className="flex items-center gap-x-3 py-2 px-3", + ), + href=link["url"], + target="_blank", + className=link_class, + ) + ) + menu_items.append(menu_item) + + return menu_items + + +# Layout +app.layout = html.Div( + [ + dcc.Location(id="url", refresh=False), + html.Link(rel="icon", href="assets/favicon.ico"), + # Placeholder for dynamic navigation bar + html.Div( + [ + html.Div(id="navigation-bar", className="bg-prowler-stone-900"), + html.Div( + [ + dash.page_container, + ], + id="content_select", + className="bg-prowler-white w-full col-span-11 h-screen mx-auto overflow-y-scroll no-scrollbar px-10 py-7", + ), + ], + className="grid custom-grid 2xl:custom-grid-large h-screen", + ), + ], + className="h-screen mx-auto", +) + + +# Callback to update navigation bar +@app.callback(Output("navigation-bar", "children"), [Input("url", "pathname")]) +def update_nav_bar(pathname): + return html.Div( + [ + html.Div([prowler_logo], className="mb-8 px-3"), + html.H6( + "Dashboards", + className="px-3 text-prowler-stone-500 text-sm opacity-90 font-regular mb-2", + ), + html.Nav( + [html.Ul(generate_nav_links(pathname), className="")], + className="flex flex-col gap-y-6", + ), + html.A( + [ + html.Span( + [ + html.Img(src="assets/favicon.ico", className="w-5"), + "Subscribe to prowler SaaS", + ], + className="flex items-center gap-x-3", + ), + ], + href="https://prowler.com/", + target="_blank", + className="block mt-300 px-3 py-3 uppercase text-xs hover:bg-prowler-stone-950 hover:border-r-4 hover:border-solid hover:border-prowler-lime", + ), + html.Nav( + [html.Ul(generate_help_menu(), className="")], + className="flex flex-col gap-y-6 mt-auto", + ), + ], + className="flex flex-col bg-prowler-stone-900 py-7 h-full", + ) + + +# Running App +if __name__ == "__main__": + app.run_server(debug=True, port=11666) diff --git a/dashboard/assets/favicon.ico b/dashboard/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..025105c8c7e2a95c334f5cec7ccae8e883180a79 GIT binary patch literal 15406 zcmeI3e`p(39Khe4KT)t__~XxrGRG!vBCN@pAD3Jb5Crj$PH5M(uKCdR;{L+PcmrS?fq`lPq^PhKPtV_lF`vW!gIb7_>5qt8Lfk_u2$XZSU^gzIX5LecuJ4U1&FIYC`a7LOu5*bOa$}GOhpKzXzeu;Mn2A<@5Ux`sN9Q z_Ja(lfX4c9_|Uz$`NSzV&;H@&*pKN_;we&xE+O$2=;Ly|>Esj7li1j#4|bSqD3!WT zsg3{Zv)IKY>{|5Q923)`PYZ0X7JXaBzhoZj{K=m6M-hf0BvH0%zcu5>mLVUuWdqnT z5&2X?9m(laQ_)qAz`#h|y2$EJMxj5LzOA*9ynoQAOWVg&)<5t&`Q#zB{vBUMKiW=L zJTA74=Gi+NEA-!jdD!=3OC}hS>pv;mdYu#J852|rsyIJ23V8%zp1KKh-Za##hhsV@ zA@wl174;f4&&+R_cQK5=zeEo87RfX>`>(Lj9Mj*LZrx30ja+&={~`y?CHu)Ol4(f! zFUO*d%p#ezoPRh!^U7rGAu_AVrRDsu^+PG~hH{H!l1lu;H9AOURk^ex{~U8&xkWNb zMgDnqmdvVhX(j%}IZ3%iGRb=I@46gcHTSp8na_3naP<6%_pM(9;7PwaMM?Wz#W-#r zXv5$iA3fiN;kjhlF&_HhK)UrotrTkfTho4Q9}i(iE>h4sH)-)tO+>IWAOA#447B=p z<>Pl@z4fA62Ce>``4~J`Gpb`y75^ObOHJF)v3Kri|0U+*tCv6S0T3I zcDFR}iL`-~jL2cwoAP9|8(+I%xT2x$9!MgT3 z&9TGoD~SMIO73%C4nDpU^NgE=1$prV%-2hmT+v#NfM;((zCBF~z3tvY-=mv#cGB;y z_$zIJe!1-tl12Jz?}44fypctUztRrqi(kF4f082DgW2dq&+m%(*Y~1kp*_b)_L21D zuGl8vhkPzGLtp9jRCIU3CkcP~+U6+X)YChGU1T8Thc+xjW$Tz9y9M?Z8o3Q zf&B;WXTiGV7x(vtM5w{9EdpxiAGm(&I{vUHj%}me3(aTRr_E=N7aQZKGRWTNi%u9j`BYFqI2`N97~W>6r)6m470<;+#Br$y?}oQa+OEBy{D^g)#6i zJBx|a>geRP4B*GGXS}4>vz{URg*b*B#)uy8AQ{CE?>qkH;$qLrj|ege!}vL7-ovr4 zlhMgb8^&K^7HNTr$`g@E7{%`{F?Zbp^DY^kytJYGT>bJxo_-P5%n|vBl1Ug9f8ZD2 zEq#rQPF~tT{%LRF{7}@Dpz&>boZ(~8~7X6Uqe(n@)#)(seE<$Pt3vl zm}4#3z%fg@)sWmY{6E1Dxr7^VZxQ$B6j#uhwT}9KZyspBW;u5}WBI%@+A`94kQ(o5 W(sR8_+CL5XMg$rWXheWC0{;Q8j#G>P literal 0 HcmV?d00001 diff --git a/dashboard/assets/images/icons/compliance.svg b/dashboard/assets/images/icons/compliance.svg new file mode 100644 index 0000000000..e70ebda28c --- /dev/null +++ b/dashboard/assets/images/icons/compliance.svg @@ -0,0 +1,4 @@ + diff --git a/dashboard/assets/images/icons/docs.png b/dashboard/assets/images/icons/docs.png new file mode 100644 index 0000000000000000000000000000000000000000..f01d2ba594d9d61f23ef15cad7b26ca2eb952c1a GIT binary patch literal 734 zcmV<40wMj0P)@~0drDELIAGL9O(c600d`2O+f$vv5yP4v6Chnm<`eidQ8x;fwMt3fKC7#lul5XAdCaQR)1>JVse%( z$ImWs{_etoEy*9xPftP+b#!!ebi8E*wZwWIeUnm7gb>3D-NH1L(|*5ymv^%j`Q>ss zv2E)I9Y*N7-bvmKi(Wpy?nb4^mAZ%&3pQ8b49OgA46l2?&_d|c1)?U*VdZ(X-PF=<&QuF%OB z<~+nNsj|32EKFMEi^~Umc`)h!PIn`YV?RxkVDGX@iI57B_lVR5m7o)sQk)7wsxp<9 zRIPlP{tEW8>Kam0VxUM|%@wQ(M&oGH2KnwkYiP;u#6X#Ng`wK5^PJ*}*5tXx6|KlO zA+Bg#o_qQuo5=G9H@bF>$aCcQV4#=& z3wzo$H97NOm2XpA!6sive7k#%F7cUd$1#H~=eL`w!y>-hy#~8+W{bt*WHcI;?krg% zkB2E~|LID#RKZR))0c+5UaxdVsbG;;Q9^D0x>IQ^$M<1N8`S0tj*cgO1GcSO_AdFK Ql>h($07*qoM6N<$g83d!^8f$< literal 0 HcmV?d00001 diff --git a/dashboard/assets/images/icons/help-black.png b/dashboard/assets/images/icons/help-black.png new file mode 100644 index 0000000000000000000000000000000000000000..0912b13d23814e6b8751df71af07cd22e8f93f52 GIT binary patch literal 441 zcmV;q0Y?6bP)lgw z*wO)WwSC?KKJ!4QzVXP~tHXC<`D9$vE0u~?6(q5uYda2KM?3kWYMyr{t!1b>>4Ip| z<2`VJZwn02vwEjJc}*AiDG>SrEUS0dlbgE0Spf7CSX1AuXSn*hcNFlEdS-wJLw**k z)g|@Z8}rlH!)1-83tat0@SY1?3Ap|)G~ literal 0 HcmV?d00001 diff --git a/dashboard/assets/images/icons/help.png b/dashboard/assets/images/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..99bb669fe2b6b4213311cbcda2183014fe79b9fa GIT binary patch literal 934 zcmV;X16lluP)@~0drDELIAGL9O(c600d`2O+f$vv5yPFK?vrx5MfvEv_tHe|6_1X=dySSc9@q1xQ0l!_Y-5%2H&BO%0u zYEnxa3nI$SvrP4H8C3NZf}$*=@4oL3$Pp)Tut_u$|lHg%L_0fb${Za=mljDe4)!`W%$K!Uh*}Q?s zZ&U$K?C{X$JS=D1Yo!*%QN~vJIR#X^W*Lh{NXR1U!dS2^{ z46p_F_CE1grNLBYJ#Dl?*fklDQjYW2n9w<_{XCz~hRY9fbGvEZBGVlfR1 z?5l z1e|Q&FVZv($$cp&oD=g61tny@e8UnQJt zB^Q#%WrEUFJ>iHru=)F8YvS_oA3Qiu1pLj{5EIuCvtwKQ1%?lBH54O$6951J07*qo IM6N<$f