diff --git a/assets/js/0817c5ed.39369c6a.js b/assets/js/0817c5ed.39369c6a.js
new file mode 100644
index 0000000..beedd55
--- /dev/null
+++ b/assets/js/0817c5ed.39369c6a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8880],{363:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(4848),n=r(8453);const i={},c="Resources",o={id:"TheHive/thehive-resources",title:"Resources",description:"TheHIve",source:"@site/docs/TheHive/thehive-resources.mdx",sourceDirName:"TheHive",slug:"/TheHive/thehive-resources",permalink:"/docs/TheHive/thehive-resources",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cortex Neurons",permalink:"/docs/TheHive/cortex-neurons"}},h={},l=[{value:"TheHIve",id:"thehive",level:2},{value:"Resources",id:"resources-1",level:3},{value:"Cortex",id:"cortex",level:2},{value:"Resources",id:"resources-2",level:3}];function a(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"resources",children:"Resources"}),"\n",(0,s.jsx)(t.h2,{id:"thehive",children:"TheHIve"}),"\n",(0,s.jsx)(t.h3,{id:"resources-1",children:"Resources"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.strangebee.com/thehive/setup/",children:"TheHive5 documentation"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-delete-index.html",children:"Elasticsearch 7 documentation & cURL calls"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://cassandra.apache.org/doc/latest/",children:"Cassandra documentation"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"cortex",children:"Cortex"}),"\n",(0,s.jsx)(t.h3,{id:"resources-2",children:"Resources"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.thehive-project.org/cortex/",children:"Cortex documentation"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://thehive-project.github.io/Cortex-Analyzers/",children:"Cortex Neurons documentation"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/TheHive-Project/Cortex-Analyzers/",children:"Cortex analyzers Github"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/TheHive-Project/Cortex-Analyzers/tree/master/utils/docker",children:"Cortex Neurons docker utils"})}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>o});var s=r(6540);const n={},i=s.createContext(n);function c(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0817c5ed.443619a5.js b/assets/js/0817c5ed.443619a5.js
deleted file mode 100644
index ebf121f..0000000
--- a/assets/js/0817c5ed.443619a5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8880],{363:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=r(4848),n=r(8453);const i={},c="Resources",o={id:"TheHive/thehive-resources",title:"Resources",description:"TheHIve",source:"@site/docs/TheHive/thehive-resources.mdx",sourceDirName:"TheHive",slug:"/TheHive/thehive-resources",permalink:"/docs/TheHive/thehive-resources",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cortex Neurons",permalink:"/docs/TheHive/cortex-neurons"}},h={},l=[{value:"TheHIve",id:"thehive",level:2},{value:"Resources",id:"resources-1",level:3},{value:"Cortex",id:"cortex",level:2},{value:"Resources",id:"resources-2",level:3}];function a(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h1,{id:"resources",children:"Resources"}),"\n",(0,s.jsx)(t.h2,{id:"thehive",children:"TheHIve"}),"\n",(0,s.jsx)(t.h3,{id:"resources-1",children:"Resources"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.strangebee.com/thehive/setup/",children:"TheHive5 documentation"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-delete-index.html",children:"Elasticsearch 7 documentation & cURL calls"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://cassandra.apache.org/doc/latest/",children:"Cassandra documentation"})}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"cortex",children:"Cortex"}),"\n",(0,s.jsx)(t.h3,{id:"resources-2",children:"Resources"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.thehive-project.org/cortex/",children:"Cortex documentation"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://thehive-project.github.io/Cortex-Analyzers/",children:"Cortex Neurons documentation"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/TheHive-Project/Cortex-Analyzers/",children:"Cortex analyzers Github"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://github.com/TheHive-Project/Cortex-Analyzers/tree/master/utils/docker",children:"Cortex Neurons docker utils"})}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>c,x:()=>o});var s=r(6540);const n={},i=s.createContext(n);function c(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1365e388.d8e53f27.js b/assets/js/1365e388.d8e53f27.js
deleted file mode 100644
index 4ed9f5e..0000000
--- a/assets/js/1365e388.d8e53f27.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6344],{4321:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=t(4848),i=t(8453);const s={},o="Infrastructure as Code",a={id:"Engineering/IaC",title:"Infrastructure as Code",description:"Summary",source:"@site/docs/Engineering/IaC.md",sourceDirName:"Engineering",slug:"/Engineering/IaC",permalink:"/docs/Engineering/IaC",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Disaster Recovery Plan",permalink:"/docs/Engineering/DRP"},next:{title:"Port-forwarding to localhost",permalink:"/docs/GCP/Identity-Aware Proxy/port-forwarding"}},c={},l=[{value:"Summary",id:"summary",level:2},{value:"Tools",id:"tools",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"infrastructure-as-code",children:"Infrastructure as Code"}),"\n",(0,r.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Used for provisioning and managing cloud resources"}),"\n",(0,r.jsx)(n.li,{children:"Ex : Creating and provisioning a VM"}),"\n",(0,r.jsx)(n.li,{children:"Referring to all APIs used to deploy infrastructure"}),"\n",(0,r.jsx)(n.li,{children:"Declarative statements : the yaml configuration is a picture of the desired stage. Unlike CLI commands which are imperative and tells what to do : We can focus on how the infrastructure should be."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tools",children:"Tools"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://www.terraform.io/",children:"Hashicorp Terraform"}),", which is multi API / multi-cloud with an open-source core."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(6540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1365e388.f55fecc1.js b/assets/js/1365e388.f55fecc1.js
new file mode 100644
index 0000000..d6a37dc
--- /dev/null
+++ b/assets/js/1365e388.f55fecc1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6344],{4321:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=t(4848),i=t(8453);const s={},o="Infrastructure as Code",a={id:"Engineering/IaC",title:"Infrastructure as Code",description:"Summary",source:"@site/docs/Engineering/IaC.md",sourceDirName:"Engineering",slug:"/Engineering/IaC",permalink:"/docs/Engineering/IaC",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Disaster Recovery Plan",permalink:"/docs/Engineering/DRP"},next:{title:"Port-forwarding to localhost",permalink:"/docs/GCP/Identity-Aware Proxy/port-forwarding"}},c={},l=[{value:"Summary",id:"summary",level:2},{value:"Tools",id:"tools",level:2}];function u(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"infrastructure-as-code",children:"Infrastructure as Code"}),"\n",(0,r.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Used for provisioning and managing cloud resources"}),"\n",(0,r.jsx)(n.li,{children:"Ex : Creating and provisioning a VM"}),"\n",(0,r.jsx)(n.li,{children:"Referring to all APIs used to deploy infrastructure"}),"\n",(0,r.jsx)(n.li,{children:"Declarative statements : the yaml configuration is a picture of the desired stage. Unlike CLI commands which are imperative and tells what to do : We can focus on how the infrastructure should be."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tools",children:"Tools"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://www.terraform.io/",children:"Hashicorp Terraform"}),", which is multi API / multi-cloud with an open-source core."]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(6540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1df93b7f.9331a07a.js b/assets/js/1df93b7f.716d924a.js
similarity index 98%
rename from assets/js/1df93b7f.9331a07a.js
rename to assets/js/1df93b7f.716d924a.js
index 6df0c6f..6a9faa7 100644
--- a/assets/js/1df93b7f.9331a07a.js
+++ b/assets/js/1df93b7f.716d924a.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4583],{1075:(e,i,n)=>{n.r(i),n.d(i,{default:()=>v});var s=n(6540),t=n(53),a=n(8774),r=n(4586),c=n(8789);const l={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var o=n(4848);const d=[];function h(e){let{title:i,Svg:n,description:s}=e;return(0,o.jsxs)("div",{className:(0,t.A)("col col--4"),children:[(0,o.jsx)("div",{className:"text--center",children:(0,o.jsx)(n,{className:l.featureSvg,role:"img"})}),(0,o.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,o.jsx)("h3",{children:i}),(0,o.jsx)("p",{children:s})]})]})}function u(){return(0,o.jsx)("section",{className:l.features,children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:d.map(((e,i)=>(0,o.jsx)(h,{...e},i)))})})})}var m=n(3914),p=n(6188),g=n(1312);const x=[{company:"IMT Nord Europe",position:"Engineering Diploma in Information Technology",date:"Sep 2013- July 2019 ",desc:{1:"General engineering, plenty of maths, physics, electronics, computer science.",2:"Specialization in Cybersecurity and Big Data",3:"Had the chance to have internships and work experiences in Czech Republic, Malaysia, China."}},{company:"Shanghai Jiao Tong University",position:"Exchange Graduate",date:"Jan 2018 - July 2018 ",desc:{1:"Security engineering : Cryptography, Block-cipher design, Cryptoanalysis & attacks",2:"Web search & Mining : Information retrieval",3:"Big Data Security : Secure multi-party computation",4:"Machine Learning : supervised learning, unsupervised learning, learning theory, probabilistic graphical models"}},{company:"SANS Institute",position:"Attendee - Cybersecurity masterclasses & certification",date:"Sep 2022 | July 2023",desc:{1:"MGT551 - Building & Leading Security Operations Center (Sep 2022). Resulted in GIAC Security Operations Manager certification 4 months later (Jan 2023) as well as GIAC Advisory Board member.",2:"SEC599 - Defeating Advanced Adversaries - Purple Team Tactics & Kill Chain Defenses (August 2023). Resulted in GIAC Defending Advanced Threats certification in December 2023."}},{company:"Decathlon Digital",position:"SOC Practice Lead",date:"Jan 2019 - till now ",desc:{1:"Started in 2019 - Joined a brand new security operations team in 'trial' period, a team of two.\n\n Set up of SIRP, SIEM, security detections & remediations. Really started embracing automation since we were so few.",2:"2020 - I start my cloud security journey. CSPM technical implementation & design at global scale.",3:"2021 - As a SOC Technical Leader, designing & setting up SOC tooling with an automation-friendly mindset, also ended up managing two amazing teammates to fulfill this purpose. Designed & built SOC cloud infrastructure.",4:"Aug 2022 - Designing overall SOC approach, strategy, processes, tools & metrics with an automation-driven mindset. Increasing its efficiency & aligning SOC use-cases with threat intelligence & business needs. Internal team of five."}}];const y=function(){const[e,i]=(0,s.useState)(0),{company:n,position:t,date:a,desc:r}=x[e];return(0,o.jsxs)("section",{className:"experience",children:[(0,o.jsx)("h2",{className:"experience-title",children:(0,o.jsx)(g.A,{children:"Experience"})}),(0,o.jsx)("div",{className:"underline"}),(0,o.jsxs)("div",{className:"experiences-center",children:[(0,o.jsx)("div",{className:"btn-container",children:x.map(((n,s)=>(0,o.jsx)("button",{onClick:()=>i(s),className:`experience-btn ${s===e&&"active-btn"}`,children:n.company},s)))}),(0,o.jsxs)("article",{className:"experience-info",children:[(0,o.jsx)("h3",{children:t}),(0,o.jsx)("h4",{children:n}),(0,o.jsx)("p",{className:"experience-date",children:a}),Object.keys(r).map(((e,i)=>(0,o.jsxs)("div",{className:"experience-desc",children:[(0,o.jsx)(m.g,{icon:p.UHg,className:"experience-icon"}),(0,o.jsx)("p",{children:r[e]})]},i)))]})]})]})};var j=n(7875);const f={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function b(){const{siteConfig:e}=(0,r.A)();return(0,o.jsx)("header",{className:(0,t.A)(f.heroBanner),children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)("img",{src:"https://github.com/nusantara-self.png",style:{width:280,borderRadius:"50%"}}),(0,o.jsx)("h1",{className:"hero__title",children:e.title}),(0,o.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,o.jsx)("div",{className:f.buttons,children:(0,o.jsx)(a.A,{className:"button button--secondary button--lg",to:"/blog/hello-world",children:"Discover my blog \u2192"})}),(0,o.jsxs)("div",{className:"heroBanner",children:[(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)("a",{href:"https://linkedin.com/in/bloumefabien",children:(0,o.jsx)(m.g,{icon:j.IAJ,size:"3x"})}),(0,o.jsx)("a",{style:{marginLeft:"4%"},href:"https://medium.com/@fabienbloume",children:(0,o.jsx)(m.g,{icon:j.T03,size:"3x"})})]})]})})}function v(){const{siteConfig:e}=(0,r.A)();return(0,o.jsxs)(c.A,{title:"About me",description:"Tech, cybersecurity, travel, life, exploration, journey",children:[(0,o.jsx)(b,{}),(0,o.jsxs)("main",{children:[(0,o.jsx)(u,{}),(0,o.jsx)(y,{})]})]})}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4583],{1075:(e,i,n)=>{n.r(i),n.d(i,{default:()=>v});var s=n(6540),t=n(53),a=n(8774),r=n(4586),c=n(8789);const l={features:"features_t9lD",featureSvg:"featureSvg_GfXr"};var o=n(4848);const d=[];function h(e){let{title:i,Svg:n,description:s}=e;return(0,o.jsxs)("div",{className:(0,t.A)("col col--4"),children:[(0,o.jsx)("div",{className:"text--center",children:(0,o.jsx)(n,{className:l.featureSvg,role:"img"})}),(0,o.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,o.jsx)("h3",{children:i}),(0,o.jsx)("p",{children:s})]})]})}function u(){return(0,o.jsx)("section",{className:l.features,children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:d.map(((e,i)=>(0,o.jsx)(h,{...e},i)))})})})}var m=n(3914),p=n(6188),g=n(1312);const x=[{company:"IMT Nord Europe",position:"Engineering Diploma in Information Technology",date:"Sep 2013- July 2019 ",desc:{1:"General engineering, plenty of maths, physics, electronics, computer science.",2:"Specialization in Cybersecurity and Big Data",3:"Had the chance to have internships and work experiences in Czech Republic, Malaysia, China."}},{company:"Shanghai Jiao Tong University",position:"Exchange Graduate",date:"Jan 2018 - July 2018 ",desc:{1:"Security engineering : Cryptography, Block-cipher design, Cryptoanalysis & attacks",2:"Web search & Mining : Information retrieval",3:"Big Data Security : Secure multi-party computation",4:"Machine Learning : supervised learning, unsupervised learning, learning theory, probabilistic graphical models"}},{company:"SANS Institute",position:"Attendee - Cybersecurity masterclasses & certification",date:"Sep 2022 | July 2023",desc:{1:"MGT551 - Building & Leading Security Operations Center (Sep 2022). Resulted in GIAC Security Operations Manager certification 4 months later (Jan 2023) as well as GIAC Advisory Board member.",2:"SEC599 - Defeating Advanced Adversaries - Purple Team Tactics & Kill Chain Defenses (August 2023). Resulted in GIAC Defending Advanced Threats certification in December 2023."}},{company:"Decathlon Digital",position:"SOC Practice Lead",date:"Jan 2019 - till now ",desc:{1:"Started in 2019 - Joined a brand new security operations team in 'trial' period, a team of two.\n\n Set up of SIRP, SIEM, security detections & remediations. Really started embracing automation since we were so few.",2:"2020 - I start my cloud security journey. CSPM technical implementation & design at global scale.",3:"2021 - As a SOC Technical Leader, designing & setting up SOC tooling with an automation-friendly mindset, also ended up managing two amazing teammates to fulfill this purpose. Designed & built SOC cloud infrastructure.",4:"Aug 2022 - Designing overall SOC approach, strategy, processes, tools & metrics with an automation-driven mindset. Increasing its efficiency & aligning SOC use-cases with threat intelligence & business needs. Internal team of five."}}];const y=function(){const[e,i]=(0,s.useState)(0),{company:n,position:t,date:a,desc:r}=x[e];return(0,o.jsxs)("section",{className:"experience",children:[(0,o.jsx)("h2",{className:"experience-title",children:(0,o.jsx)(g.A,{children:"Experience"})}),(0,o.jsx)("div",{className:"underline"}),(0,o.jsxs)("div",{className:"experiences-center",children:[(0,o.jsx)("div",{className:"btn-container",children:x.map(((n,s)=>(0,o.jsx)("button",{onClick:()=>i(s),className:`experience-btn ${s===e&&"active-btn"}`,children:n.company},s)))}),(0,o.jsxs)("article",{className:"experience-info",children:[(0,o.jsx)("h3",{children:t}),(0,o.jsx)("h4",{children:n}),(0,o.jsx)("p",{className:"experience-date",children:a}),Object.keys(r).map(((e,i)=>(0,o.jsxs)("div",{className:"experience-desc",children:[(0,o.jsx)(m.g,{icon:p.UHg,className:"experience-icon"}),(0,o.jsx)("p",{children:r[e]})]},i)))]})]})]})};var j=n(7875);const f={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function b(){const{siteConfig:e}=(0,r.A)();return(0,o.jsx)("header",{className:(0,t.A)(f.heroBanner),children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)("img",{src:"https://github.com/nusantara-self.png",style:{width:280,borderRadius:"50%"}}),(0,o.jsx)("h1",{className:"hero__title",children:e.title}),(0,o.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,o.jsx)("div",{className:f.buttons,children:(0,o.jsx)(a.A,{className:"button button--secondary button--lg",to:"/blog/hello-world",children:"Discover my blog \u2192"})}),(0,o.jsxs)("div",{className:"heroBanner",children:[(0,o.jsx)("br",{}),(0,o.jsx)("br",{}),(0,o.jsx)("a",{href:"https://linkedin.com/in/fabienbloume",children:(0,o.jsx)(m.g,{icon:j.IAJ,size:"3x"})}),(0,o.jsx)("a",{style:{marginLeft:"4%"},href:"https://medium.com/@fabienbloume",children:(0,o.jsx)(m.g,{icon:j.T03,size:"3x"})})]})]})})}function v(){const{siteConfig:e}=(0,r.A)();return(0,o.jsxs)(c.A,{title:"About me",description:"Tech, cybersecurity, travel, life, exploration, journey",children:[(0,o.jsx)(b,{}),(0,o.jsxs)("main",{children:[(0,o.jsx)(u,{}),(0,o.jsx)(y,{})]})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/5b48c0f7.452eca36.js b/assets/js/5b48c0f7.452eca36.js
new file mode 100644
index 0000000..a38442d
--- /dev/null
+++ b/assets/js/5b48c0f7.452eca36.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4386],{7957:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>_,contentTitle:()=>a,default:()=>S,frontMatter:()=>o,metadata:()=>E,toc:()=>l});var t=s(4848),r=s(8453);const o={},a="Shuffle",E={id:"Shuffle",title:"Shuffle",description:"Resources",source:"@site/docs/Shuffle.mdx",sourceDirName:".",slug:"/Shuffle",permalink:"/docs/Shuffle",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Resources",permalink:"/docs/Security Operations/secops-resources"},next:{title:"Cortex Neurons",permalink:"/docs/TheHive/cortex-neurons"}},_={},l=[{value:"Resources",id:"resources",level:2},{value:"Scripts",id:"scripts",level:2},{value:"Updating Shuffle",id:"updating-shuffle",level:3},{value:"Configuration",id:"configuration",level:2},{value:"Frontend / Backend / DB / "Manager"",id:"frontend--backend--db--manager",level:3},{value:"Worker / Orborus",id:"worker--orborus",level:3},{value:"Issues",id:"issues",level:2},{value:"App malfunctioning",id:"app-malfunctioning",level:3},{value:"Delete the docker image",id:"delete-the-docker-image",level:4}];function i(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"shuffle",children:"Shuffle"}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://shuffler.io/docs/configuration",children:"Shuffle documentation"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"scripts",children:"Scripts"}),"\n",(0,t.jsx)(n.h3,{id:"updating-shuffle",children:"Updating Shuffle"}),"\n",(0,t.jsx)(n.p,{children:"Valid for both Manager & Worker servers."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="shuffle-update.sh"',children:"cd /opt/Shuffle\ndocker-compose down\ngit pull\ndocker-compose pull\ndocker-compose up -d --remove-orphans\ndocker pull frikky/shuffle:app_sdk\ndocker pull ghcr.io/shuffle/shuffle-worker:latest\n"})}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n.h3,{id:"frontend--backend--db--manager",children:'Frontend / Backend / DB / "Manager"'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="Shuffle/docker-compose.yml"',children:'version: \'3\'\nservices:\n frontend:\n #build: ./frontend\n image: ghcr.io/shuffle/shuffle-frontend:latest\n container_name: shuffle-frontend\n hostname: shuffle-frontend\n ports:\n - "${FRONTEND_PORT}:80"\n - "${FRONTEND_PORT_HTTPS}:443"\n networks:\n - shuffle\n environment:\n - BACKEND_HOSTNAME=${BACKEND_HOSTNAME}\n restart: unless-stopped\n depends_on:\n - backend\n backend:\n #build: ./backend\n image: ghcr.io/shuffle/shuffle-backend:latest\n container_name: shuffle-backend\n hostname: ${BACKEND_HOSTNAME}\n # Here for debugging:\n ports:\n - "${BACKEND_PORT}:5001"\n networks:\n - shuffle\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - ${SHUFFLE_APP_HOTLOAD_LOCATION}:/shuffle-apps\n - ${SHUFFLE_FILE_LOCATION}:/shuffle-files\n #- ${SHUFFLE_OPENSEARCH_CERTIFICATE_FILE}:/shuffle-files/es_certificate\n env_file: .env\n environment:\n - SHUFFLE_APP_HOTLOAD_FOLDER=/shuffle-apps\n - SHUFFLE_FILE_LOCATION=/shuffle-files\n restart: unless-stopped\n depends_on:\n - opensearch #Not necessary because dependancy is handled within the backend itself instead\n #- database\n opensearch:\n image: opensearchproject/opensearch:2\n hostname: shuffle-opensearch\n container_name: shuffle-opensearch\n environment:\n - bootstrap.memory_lock=true\n - "OPENSEARCH_JAVA_OPTS=-Xms4096m -Xmx4096m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM\n - cluster.routing.allocation.disk.threshold_enabled=false\n - cluster.name=shuffle-cluster\n - node.name=shuffle-opensearch\n - discovery.seed_hosts=shuffle-opensearch\n - cluster.initial_master_nodes=shuffle-opensearch\n - node.store.allow_mmap=false\n ulimits:\n memlock:\n soft: -1\n hard: -1\n nofile:\n soft: 65536 \n hard: 65536\n volumes:\n - ${DB_LOCATION}:/usr/share/opensearch/data:rw\n ports:\n - 9200:9200\n networks:\n - shuffle\n restart: unless-stopped\nnetworks:\n shuffle:\n driver: bridge\n #driver: overlay \n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="Shuffle/.env"',children:'# Default execution environment for workers\nORG_ID=Shuffle\nENVIRONMENT_NAME=Shuffle\n\n\n# Remote github config for first load\nSHUFFLE_DOWNLOAD_WORKFLOW_LOCATION=\nSHUFFLE_DOWNLOAD_WORKFLOW_USERNAME=\nSHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD=\nSHUFFLE_DOWNLOAD_WORKFLOW_BRANCH=\n\nSHUFFLE_APP_DOWNLOAD_LOCATION=https://github.com/nusantara-self/Shuffle-apps\nSHUFFLE_DOWNLOAD_AUTH_USERNAME=\nSHUFFLE_DOWNLOAD_AUTH_PASSWORD=\nSHUFFLE_DOWNLOAD_AUTH_BRANCH=\nSHUFFLE_APP_FORCE_UPDATE=false\nSSO_REDIRECT_URL=https://your-shuffle-domain-name.com\n\n\n# User config for first load. Username & PW: min length 3\nSHUFFLE_DEFAULT_USERNAME=\nSHUFFLE_DEFAULT_PASSWORD=\nSHUFFLE_DEFAULT_APIKEY=\n\n# Local location of your app directory. Can\'t use ~/\n# Files will get better at some point. Right now: local saving.\nSHUFFLE_APP_HOTLOAD_FOLDER=./shuffle-apps\nSHUFFLE_APP_HOTLOAD_LOCATION=./shuffle-apps\nSHUFFLE_FILE_LOCATION=./shuffle-files\n\n# Encryption modifier. This HAS to be set to encrypt any authentication being used in Shuffle. This is put together with other relevant values to ensure multiple parts are needed to decrypt. \n# If this key is lost or changed, you will have to reauthenticate all apps.\nSHUFFLE_ENCRYPTION_MODIFIER=\n\n# Other configs\nBASE_URL=http://shuffle-backend:5001 \nBACKEND_HOSTNAME=shuffle-backend\nBACKEND_PORT=5001\nFRONTEND_PORT=3001\nFRONTEND_PORT_HTTPS=3443\n\n# CHANGE THIS IF YOU WANT GOOD LOCAL EXECUTIONS:\nOUTER_HOSTNAME=shuffle-backend\nDB_LOCATION=./shuffle-database\nDOCKER_API_VERSION=1.40\n\n# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps.\n# PS: It will skip proxy for \nHTTP_PROXY=\nHTTPS_PROXY=\nSHUFFLE_PASS_WORKER_PROXY=TRUE\nSHUFFLE_PASS_APP_PROXY=FALSE\nTZ=Europe/Amsterdam \t\t\t\t\t# Timezone-handler in Orborus, Worker and Apps\nORBORUS_CONTAINER_NAME=\t\t\t\t# Used to FIND the containername. cgroup v2: issue 501\n\nSHUFFLE_BASE_IMAGE_NAME=shuffle\nSHUFFLE_BASE_IMAGE_REGISTRY=ghcr.io\nSHUFFLE_BASE_IMAGE_TAG_SUFFIX="-1.1.0"\n\n# Used for auto-cleanup of containers. REALLY important at scale.\nSHUFFLE_CONTAINER_AUTO_CLEANUP=true\nSHUFFLE_ELASTIC=true\nSHUFFLE_LOGS_DISABLED=false\nSHUFFLE_CHAT_DISABLED=false\nSHUFFLE_RERUN_SCHEDULE=300\n\n# DATABASE CONFIGURATIONS\nDATASTORE_EMULATOR_HOST=shuffle-database:8000\n#SHUFFLE_OPENSEARCH_URL=http://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_URL=https://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_USERNAME=admin\nSHUFFLE_OPENSEARCH_PASSWORD=admin\nSHUFFLE_OPENSEARCH_CERTIFICATE_FILE=\nSHUFFLE_OPENSEARCH_APIKEY=\nSHUFFLE_OPENSEARCH_CLOUDID=\nSHUFFLE_OPENSEARCH_PROXY=\nSHUFFLE_OPENSEARCH_INDEX_PREFIX=\nSHUFFLE_OPENSEARCH_SKIPSSL_VERIFY=true\n\n'})}),"\n",(0,t.jsx)(n.h3,{id:"worker--orborus",children:"Worker / Orborus"}),"\n",(0,t.jsx)(n.p,{children:"On a separate server"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="Shuffle/docker-compose.yml"',children:"version: '3'\nservices:\n orborus:\n #build: ./functions/onprem/orborus\n image: ghcr.io/shuffle/shuffle-orborus:latest\n container_name: shuffle-orborus\n hostname: shuffle-orborus\n networks:\n - shuffle\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n environment:\n - SHUFFLE_WORKER_VERSION=latest\n - SHUFFLE_APP_SDK_VERSION=latest\n - ORG_ID=${ENVIRONMENT_NAME}\n - ENVIRONMENT_NAME=${ENVIRONMENT_NAME}\n - BASE_URL=http://MANAGER-IP:5001\n - DOCKER_API_VERSION=1.40\n - SHUFFLE_BASE_IMAGE_NAME=${SHUFFLE_BASE_IMAGE_NAME}\n - SHUFFLE_BASE_IMAGE_REGISTRY=${SHUFFLE_BASE_IMAGE_REGISTRY}\n - SHUFFLE_BASE_IMAGE_TAG_SUFFIX=${SHUFFLE_BASE_IMAGE_TAG_SUFFIX}\n - HTTP_PROXY=${HTTP_PROXY}\n - HTTPS_PROXY=${HTTPS_PROXY}\n - SHUFFLE_PASS_WORKER_PROXY=${SHUFFLE_PASS_WORKER_PROXY}\n - SHUFFLE_PASS_APP_PROXY=${SHUFFLE_PASS_APP_PROXY}\n - SHUFFLE_ORBORUS_EXECUTION_TIMEOUT=550\n - SHUFFLE_ORBORUS_EXECUTION_CONCURRENCY=25\n - CLEANUP=true\n restart: unless-stopped\nnetworks:\n shuffle:\n driver: bridge\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Example of Shuffle/.env"',children:'# Default execution environment for workers\nORG_ID=Shuffle\nENVIRONMENT_NAME=OrborusPROD\n\n\n# Remote github config for first load\nSHUFFLE_DOWNLOAD_WORKFLOW_LOCATION=\nSHUFFLE_DOWNLOAD_WORKFLOW_USERNAME=\nSHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD=\nSHUFFLE_DOWNLOAD_WORKFLOW_BRANCH=\n\nSHUFFLE_APP_DOWNLOAD_LOCATION=https://github.com/shuffle/python-apps\nSHUFFLE_DOWNLOAD_AUTH_USERNAME=\nSHUFFLE_DOWNLOAD_AUTH_PASSWORD=\nSHUFFLE_DOWNLOAD_AUTH_BRANCH=\nSHUFFLE_APP_FORCE_UPDATE=false\n\n# User config for first load. Username & PW: min length 3\nSHUFFLE_DEFAULT_USERNAME=\nSHUFFLE_DEFAULT_PASSWORD=\nSHUFFLE_DEFAULT_APIKEY=\n\n# Local location of your app directory. Can\'t use ~/\n# Files will get better at some point. Right now: local saving.\nSHUFFLE_APP_HOTLOAD_FOLDER=./shuffle-apps\nSHUFFLE_APP_HOTLOAD_LOCATION=./shuffle-apps\nSHUFFLE_FILE_LOCATION=./shuffle-files\n\n# Encryption modifier. This HAS to be set to encrypt any authentication being used in Shuffle. This is put together with other relevant values to ensure multiple parts are needed to decrypt. \n# If this key is lost or changed, you will have to reauthenticate all apps.\nSHUFFLE_ENCRYPTION_MODIFIER=\n\n# Other configs\nBASE_URL=http://shuffle-backend:5001 \nBACKEND_HOSTNAME=shuffle-backend\nBACKEND_PORT=5001\nFRONTEND_PORT=3001\nFRONTEND_PORT_HTTPS=3443\n\n# CHANGE THIS IF YOU WANT GOOD LOCAL EXECUTIONS:\nOUTER_HOSTNAME=shuffle-backend\nDB_LOCATION=./shuffle-database\nDOCKER_API_VERSION=1.40\n\n# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps.\n# PS: It will skip proxy for \nHTTP_PROXY=\nHTTPS_PROXY=\nSHUFFLE_PASS_WORKER_PROXY=TRUE\nSHUFFLE_PASS_APP_PROXY=FALSE\nTZ=Europe/Amsterdam \t\t\t\t\t# Timezone-handler in Orborus, Worker and Apps\nORBORUS_CONTAINER_NAME=\t\t\t\t# Used to FIND the containername. cgroup v2: issue 501\n\nSHUFFLE_BASE_IMAGE_NAME=shuffle\nSHUFFLE_BASE_IMAGE_REGISTRY=ghcr.io\nSHUFFLE_BASE_IMAGE_TAG_SUFFIX="-1.1.0"\n\n# Used for auto-cleanup of containers. REALLY important at scale.\nSHUFFLE_CONTAINER_AUTO_CLEANUP=true\nSHUFFLE_ELASTIC=true\nSHUFFLE_LOGS_DISABLED=false\n\n# Cleans up any containers related to Shuffle that have been up for more than 600 seconds.\nSHUFFLE_ORBORUS_EXECUTION_TIMEOUT=500\n\n# Decides the max amount of workflows to concurrenly run. Defaults to 10.\n# Example math: 10 workflows * WITH 10 apps / second = 110 containers per second.\n# We recommend starting with 10 and going higher as need be.\nSHUFFLE_ORBORUS_EXECUTION_CONCURRENCY=30\n\n# DATABASE CONFIGURATIONS\nDATASTORE_EMULATOR_HOST=shuffle-database:8000\n#SHUFFLE_OPENSEARCH_URL=http://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_URL=https://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_USERNAME=admin\nSHUFFLE_OPENSEARCH_PASSWORD=admin\nSHUFFLE_OPENSEARCH_CERTIFICATE_FILE=\nSHUFFLE_OPENSEARCH_APIKEY=\nSHUFFLE_OPENSEARCH_CLOUDID=\nSHUFFLE_OPENSEARCH_PROXY=\nSHUFFLE_OPENSEARCH_INDEX_PREFIX=\nSHUFFLE_OPENSEARCH_SKIPSSL_VERIFY=true\n\n'})}),"\n",(0,t.jsx)(n.h2,{id:"issues",children:"Issues"}),"\n",(0,t.jsx)(n.h3,{id:"app-malfunctioning",children:"App malfunctioning"}),"\n",(0,t.jsxs)(n.p,{children:["When an application is not working as expected, a few actions may need to be taken. ",(0,t.jsx)(n.em,{children:"(incomplete listing)"})]}),"\n",(0,t.jsx)(n.h4,{id:"delete-the-docker-image",children:"Delete the docker image"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker image ls\ndocker rmi frikky/shuffle:exampleapp_1.0.1\n"})})]})}function S(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>E});var t=s(6540);const r={},o=t.createContext(r);function a(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function E(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/5b48c0f7.c243247a.js b/assets/js/5b48c0f7.c243247a.js
deleted file mode 100644
index baf8b5b..0000000
--- a/assets/js/5b48c0f7.c243247a.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4386],{7957:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>_,contentTitle:()=>a,default:()=>S,frontMatter:()=>o,metadata:()=>E,toc:()=>l});var t=s(4848),r=s(8453);const o={},a="Shuffle",E={id:"Shuffle",title:"Shuffle",description:"Resources",source:"@site/docs/Shuffle.mdx",sourceDirName:".",slug:"/Shuffle",permalink:"/docs/Shuffle",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Resources",permalink:"/docs/Security Operations/secops-resources"},next:{title:"Cortex Neurons",permalink:"/docs/TheHive/cortex-neurons"}},_={},l=[{value:"Resources",id:"resources",level:2},{value:"Scripts",id:"scripts",level:2},{value:"Updating Shuffle",id:"updating-shuffle",level:3},{value:"Configuration",id:"configuration",level:2},{value:"Frontend / Backend / DB / "Manager"",id:"frontend--backend--db--manager",level:3},{value:"Worker / Orborus",id:"worker--orborus",level:3},{value:"Issues",id:"issues",level:2},{value:"App malfunctioning",id:"app-malfunctioning",level:3},{value:"Delete the docker image",id:"delete-the-docker-image",level:4}];function i(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"shuffle",children:"Shuffle"}),"\n",(0,t.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://shuffler.io/docs/configuration",children:"Shuffle documentation"})}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"scripts",children:"Scripts"}),"\n",(0,t.jsx)(n.h3,{id:"updating-shuffle",children:"Updating Shuffle"}),"\n",(0,t.jsx)(n.p,{children:"Valid for both Manager & Worker servers."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="shuffle-update.sh"',children:"cd /opt/Shuffle\ndocker-compose down\ngit pull\ndocker-compose pull\ndocker-compose up -d --remove-orphans\ndocker pull frikky/shuffle:app_sdk\ndocker pull ghcr.io/shuffle/shuffle-worker:latest\n"})}),"\n",(0,t.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsx)(n.h3,{id:"frontend--backend--db--manager",children:'Frontend / Backend / DB / "Manager"'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="Shuffle/docker-compose.yml"',children:'version: \'3\'\nservices:\n frontend:\n #build: ./frontend\n image: ghcr.io/shuffle/shuffle-frontend:latest\n container_name: shuffle-frontend\n hostname: shuffle-frontend\n ports:\n - "${FRONTEND_PORT}:80"\n - "${FRONTEND_PORT_HTTPS}:443"\n networks:\n - shuffle\n environment:\n - BACKEND_HOSTNAME=${BACKEND_HOSTNAME}\n restart: unless-stopped\n depends_on:\n - backend\n backend:\n #build: ./backend\n image: ghcr.io/shuffle/shuffle-backend:latest\n container_name: shuffle-backend\n hostname: ${BACKEND_HOSTNAME}\n # Here for debugging:\n ports:\n - "${BACKEND_PORT}:5001"\n networks:\n - shuffle\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n - ${SHUFFLE_APP_HOTLOAD_LOCATION}:/shuffle-apps\n - ${SHUFFLE_FILE_LOCATION}:/shuffle-files\n #- ${SHUFFLE_OPENSEARCH_CERTIFICATE_FILE}:/shuffle-files/es_certificate\n env_file: .env\n environment:\n - SHUFFLE_APP_HOTLOAD_FOLDER=/shuffle-apps\n - SHUFFLE_FILE_LOCATION=/shuffle-files\n restart: unless-stopped\n depends_on:\n - opensearch #Not necessary because dependancy is handled within the backend itself instead\n #- database\n opensearch:\n image: opensearchproject/opensearch:2\n hostname: shuffle-opensearch\n container_name: shuffle-opensearch\n environment:\n - bootstrap.memory_lock=true\n - "OPENSEARCH_JAVA_OPTS=-Xms4096m -Xmx4096m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM\n - cluster.routing.allocation.disk.threshold_enabled=false\n - cluster.name=shuffle-cluster\n - node.name=shuffle-opensearch\n - discovery.seed_hosts=shuffle-opensearch\n - cluster.initial_master_nodes=shuffle-opensearch\n - node.store.allow_mmap=false\n ulimits:\n memlock:\n soft: -1\n hard: -1\n nofile:\n soft: 65536 \n hard: 65536\n volumes:\n - ${DB_LOCATION}:/usr/share/opensearch/data:rw\n ports:\n - 9200:9200\n networks:\n - shuffle\n restart: unless-stopped\nnetworks:\n shuffle:\n driver: bridge\n #driver: overlay \n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="Shuffle/.env"',children:'# Default execution environment for workers\nORG_ID=Shuffle\nENVIRONMENT_NAME=Shuffle\n\n\n# Remote github config for first load\nSHUFFLE_DOWNLOAD_WORKFLOW_LOCATION=\nSHUFFLE_DOWNLOAD_WORKFLOW_USERNAME=\nSHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD=\nSHUFFLE_DOWNLOAD_WORKFLOW_BRANCH=\n\nSHUFFLE_APP_DOWNLOAD_LOCATION=https://github.com/nusantara-self/Shuffle-apps\nSHUFFLE_DOWNLOAD_AUTH_USERNAME=\nSHUFFLE_DOWNLOAD_AUTH_PASSWORD=\nSHUFFLE_DOWNLOAD_AUTH_BRANCH=\nSHUFFLE_APP_FORCE_UPDATE=false\nSSO_REDIRECT_URL=https://your-shuffle-domain-name.com\n\n\n# User config for first load. Username & PW: min length 3\nSHUFFLE_DEFAULT_USERNAME=\nSHUFFLE_DEFAULT_PASSWORD=\nSHUFFLE_DEFAULT_APIKEY=\n\n# Local location of your app directory. Can\'t use ~/\n# Files will get better at some point. Right now: local saving.\nSHUFFLE_APP_HOTLOAD_FOLDER=./shuffle-apps\nSHUFFLE_APP_HOTLOAD_LOCATION=./shuffle-apps\nSHUFFLE_FILE_LOCATION=./shuffle-files\n\n# Encryption modifier. This HAS to be set to encrypt any authentication being used in Shuffle. This is put together with other relevant values to ensure multiple parts are needed to decrypt. \n# If this key is lost or changed, you will have to reauthenticate all apps.\nSHUFFLE_ENCRYPTION_MODIFIER=\n\n# Other configs\nBASE_URL=http://shuffle-backend:5001 \nBACKEND_HOSTNAME=shuffle-backend\nBACKEND_PORT=5001\nFRONTEND_PORT=3001\nFRONTEND_PORT_HTTPS=3443\n\n# CHANGE THIS IF YOU WANT GOOD LOCAL EXECUTIONS:\nOUTER_HOSTNAME=shuffle-backend\nDB_LOCATION=./shuffle-database\nDOCKER_API_VERSION=1.40\n\n# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps.\n# PS: It will skip proxy for \nHTTP_PROXY=\nHTTPS_PROXY=\nSHUFFLE_PASS_WORKER_PROXY=TRUE\nSHUFFLE_PASS_APP_PROXY=FALSE\nTZ=Europe/Amsterdam \t\t\t\t\t# Timezone-handler in Orborus, Worker and Apps\nORBORUS_CONTAINER_NAME=\t\t\t\t# Used to FIND the containername. cgroup v2: issue 501\n\nSHUFFLE_BASE_IMAGE_NAME=shuffle\nSHUFFLE_BASE_IMAGE_REGISTRY=ghcr.io\nSHUFFLE_BASE_IMAGE_TAG_SUFFIX="-1.1.0"\n\n# Used for auto-cleanup of containers. REALLY important at scale.\nSHUFFLE_CONTAINER_AUTO_CLEANUP=true\nSHUFFLE_ELASTIC=true\nSHUFFLE_LOGS_DISABLED=false\nSHUFFLE_CHAT_DISABLED=false\nSHUFFLE_RERUN_SCHEDULE=300\n\n# DATABASE CONFIGURATIONS\nDATASTORE_EMULATOR_HOST=shuffle-database:8000\n#SHUFFLE_OPENSEARCH_URL=http://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_URL=https://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_USERNAME=admin\nSHUFFLE_OPENSEARCH_PASSWORD=admin\nSHUFFLE_OPENSEARCH_CERTIFICATE_FILE=\nSHUFFLE_OPENSEARCH_APIKEY=\nSHUFFLE_OPENSEARCH_CLOUDID=\nSHUFFLE_OPENSEARCH_PROXY=\nSHUFFLE_OPENSEARCH_INDEX_PREFIX=\nSHUFFLE_OPENSEARCH_SKIPSSL_VERIFY=true\n\n'})}),"\n",(0,t.jsx)(n.h3,{id:"worker--orborus",children:"Worker / Orborus"}),"\n",(0,t.jsx)(n.p,{children:"On a separate server"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",metastring:'title="Shuffle/docker-compose.yml"',children:"version: '3'\nservices:\n orborus:\n #build: ./functions/onprem/orborus\n image: ghcr.io/shuffle/shuffle-orborus:latest\n container_name: shuffle-orborus\n hostname: shuffle-orborus\n networks:\n - shuffle\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n environment:\n - SHUFFLE_WORKER_VERSION=latest\n - SHUFFLE_APP_SDK_VERSION=latest\n - ORG_ID=${ENVIRONMENT_NAME}\n - ENVIRONMENT_NAME=${ENVIRONMENT_NAME}\n - BASE_URL=http://MANAGER-IP:5001\n - DOCKER_API_VERSION=1.40\n - SHUFFLE_BASE_IMAGE_NAME=${SHUFFLE_BASE_IMAGE_NAME}\n - SHUFFLE_BASE_IMAGE_REGISTRY=${SHUFFLE_BASE_IMAGE_REGISTRY}\n - SHUFFLE_BASE_IMAGE_TAG_SUFFIX=${SHUFFLE_BASE_IMAGE_TAG_SUFFIX}\n - HTTP_PROXY=${HTTP_PROXY}\n - HTTPS_PROXY=${HTTPS_PROXY}\n - SHUFFLE_PASS_WORKER_PROXY=${SHUFFLE_PASS_WORKER_PROXY}\n - SHUFFLE_PASS_APP_PROXY=${SHUFFLE_PASS_APP_PROXY}\n - SHUFFLE_ORBORUS_EXECUTION_TIMEOUT=550\n - SHUFFLE_ORBORUS_EXECUTION_CONCURRENCY=25\n - CLEANUP=true\n restart: unless-stopped\nnetworks:\n shuffle:\n driver: bridge\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Example of Shuffle/.env"',children:'# Default execution environment for workers\nORG_ID=Shuffle\nENVIRONMENT_NAME=OrborusPROD\n\n\n# Remote github config for first load\nSHUFFLE_DOWNLOAD_WORKFLOW_LOCATION=\nSHUFFLE_DOWNLOAD_WORKFLOW_USERNAME=\nSHUFFLE_DOWNLOAD_WORKFLOW_PASSWORD=\nSHUFFLE_DOWNLOAD_WORKFLOW_BRANCH=\n\nSHUFFLE_APP_DOWNLOAD_LOCATION=https://github.com/shuffle/python-apps\nSHUFFLE_DOWNLOAD_AUTH_USERNAME=\nSHUFFLE_DOWNLOAD_AUTH_PASSWORD=\nSHUFFLE_DOWNLOAD_AUTH_BRANCH=\nSHUFFLE_APP_FORCE_UPDATE=false\n\n# User config for first load. Username & PW: min length 3\nSHUFFLE_DEFAULT_USERNAME=\nSHUFFLE_DEFAULT_PASSWORD=\nSHUFFLE_DEFAULT_APIKEY=\n\n# Local location of your app directory. Can\'t use ~/\n# Files will get better at some point. Right now: local saving.\nSHUFFLE_APP_HOTLOAD_FOLDER=./shuffle-apps\nSHUFFLE_APP_HOTLOAD_LOCATION=./shuffle-apps\nSHUFFLE_FILE_LOCATION=./shuffle-files\n\n# Encryption modifier. This HAS to be set to encrypt any authentication being used in Shuffle. This is put together with other relevant values to ensure multiple parts are needed to decrypt. \n# If this key is lost or changed, you will have to reauthenticate all apps.\nSHUFFLE_ENCRYPTION_MODIFIER=\n\n# Other configs\nBASE_URL=http://shuffle-backend:5001 \nBACKEND_HOSTNAME=shuffle-backend\nBACKEND_PORT=5001\nFRONTEND_PORT=3001\nFRONTEND_PORT_HTTPS=3443\n\n# CHANGE THIS IF YOU WANT GOOD LOCAL EXECUTIONS:\nOUTER_HOSTNAME=shuffle-backend\nDB_LOCATION=./shuffle-database\nDOCKER_API_VERSION=1.40\n\n# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps.\n# PS: It will skip proxy for \nHTTP_PROXY=\nHTTPS_PROXY=\nSHUFFLE_PASS_WORKER_PROXY=TRUE\nSHUFFLE_PASS_APP_PROXY=FALSE\nTZ=Europe/Amsterdam \t\t\t\t\t# Timezone-handler in Orborus, Worker and Apps\nORBORUS_CONTAINER_NAME=\t\t\t\t# Used to FIND the containername. cgroup v2: issue 501\n\nSHUFFLE_BASE_IMAGE_NAME=shuffle\nSHUFFLE_BASE_IMAGE_REGISTRY=ghcr.io\nSHUFFLE_BASE_IMAGE_TAG_SUFFIX="-1.1.0"\n\n# Used for auto-cleanup of containers. REALLY important at scale.\nSHUFFLE_CONTAINER_AUTO_CLEANUP=true\nSHUFFLE_ELASTIC=true\nSHUFFLE_LOGS_DISABLED=false\n\n# Cleans up any containers related to Shuffle that have been up for more than 600 seconds.\nSHUFFLE_ORBORUS_EXECUTION_TIMEOUT=500\n\n# Decides the max amount of workflows to concurrenly run. Defaults to 10.\n# Example math: 10 workflows * WITH 10 apps / second = 110 containers per second.\n# We recommend starting with 10 and going higher as need be.\nSHUFFLE_ORBORUS_EXECUTION_CONCURRENCY=30\n\n# DATABASE CONFIGURATIONS\nDATASTORE_EMULATOR_HOST=shuffle-database:8000\n#SHUFFLE_OPENSEARCH_URL=http://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_URL=https://shuffle-opensearch:9200\nSHUFFLE_OPENSEARCH_USERNAME=admin\nSHUFFLE_OPENSEARCH_PASSWORD=admin\nSHUFFLE_OPENSEARCH_CERTIFICATE_FILE=\nSHUFFLE_OPENSEARCH_APIKEY=\nSHUFFLE_OPENSEARCH_CLOUDID=\nSHUFFLE_OPENSEARCH_PROXY=\nSHUFFLE_OPENSEARCH_INDEX_PREFIX=\nSHUFFLE_OPENSEARCH_SKIPSSL_VERIFY=true\n\n'})}),"\n",(0,t.jsx)(n.h2,{id:"issues",children:"Issues"}),"\n",(0,t.jsx)(n.h3,{id:"app-malfunctioning",children:"App malfunctioning"}),"\n",(0,t.jsxs)(n.p,{children:["When an application is not working as expected, a few actions may need to be taken. ",(0,t.jsx)(n.em,{children:"(incomplete listing)"})]}),"\n",(0,t.jsx)(n.h4,{id:"delete-the-docker-image",children:"Delete the docker image"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker image ls\ndocker rmi frikky/shuffle:exampleapp_1.0.1\n"})})]})}function S(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>E});var t=s(6540);const r={},o=t.createContext(r);function a(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function E(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7dd8714f.85901922.js b/assets/js/7dd8714f.85901922.js
deleted file mode 100644
index d8eea9e..0000000
--- a/assets/js/7dd8714f.85901922.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[804],{7130:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>d,contentTitle:()=>n,default:()=>o,frontMatter:()=>c,metadata:()=>h,toc:()=>l});var s=r(4848),i=r(8453);const c={},n="Resources",h={id:"Security Operations/secops-resources",title:"Resources",description:"MITRE Frameworks",source:"@site/docs/Security Operations/secops-resources.md",sourceDirName:"Security Operations",slug:"/Security Operations/secops-resources",permalink:"/docs/Security Operations/secops-resources",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Hi!",permalink:"/docs/GCP/Terraform/init"},next:{title:"Shuffle",permalink:"/docs/Shuffle"}},d={},l=[{value:"MITRE Frameworks",id:"mitre-frameworks",level:2},{value:"MITRE ATT&CK-related",id:"mitre-attck-related",level:2},{value:"CTI",id:"cti",level:3},{value:"Detection / Hunting / Blue Teams",id:"detection--hunting--blue-teams",level:3},{value:"Prevention / Purple-Red Teams / Testing of Controls",id:"prevention--purple-red-teams--testing-of-controls",level:3},{value:"Unclassified",id:"unclassified",level:3}];function a(t){const e={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.h1,{id:"resources",children:"Resources"}),"\n",(0,s.jsx)(e.h2,{id:"mitre-frameworks",children:"MITRE Frameworks"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://attack.mitre.org/",children:"MITRE ATT&CK"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://d3fend.mitre.org/",children:"MITRE D3FEND"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://engage.mitre.org",children:"MITRE ENGAGE"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://atlas.mitre.org/",children:"MITRE ATLAS"})}),"\n"]}),"\n",(0,s.jsx)(e.h2,{id:"mitre-attck-related",children:"MITRE ATT&CK-related"}),"\n",(0,s.jsx)(e.h3,{id:"cti",children:"CTI"}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Name"}),(0,s.jsx)(e.th,{children:"Link"}),(0,s.jsx)(e.th,{children:"Owner"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Navigator"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://mitre.github.io/attack-navigator/enterprise/",children:"https://mitre.github.io/attack-navigator/enterprise/"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"CAR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://car.mitre.org/wiki/Main_Page",children:"https://car.mitre.org/wiki/Main_Page"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"AMITT"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/misinfosecproject/amitt_framework",children:"https://github.com/misinfosecproject/amitt_framework"})}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"MISP"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://www.misp-project.org",children:"https://www.misp-project.org"})}),(0,s.jsx)(e.td,{children:"MISP Project"})]})]})]}),"\n",(0,s.jsx)(e.h3,{id:"detection--hunting--blue-teams",children:"Detection / Hunting / Blue Teams"}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Name"}),(0,s.jsx)(e.th,{children:"Link"}),(0,s.jsx)(e.th,{children:"Owner"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SIGMA"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/Neo23x0/sigma",children:"https://github.com/Neo23x0/sigma"})}),(0,s.jsx)(e.td,{children:"Florian Roth / Thomas Patzke"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SIGMA Rules"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/Neo23x0/sigma/tree/master/rules",children:"https://github.com/Neo23x0/sigma/tree/master/rules"})}),(0,s.jsx)(e.td,{children:"Florian Roth"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"OSCD Community"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://oscd.community",children:"https://oscd.community"})}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"BZAR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mitre-attack/bzar",children:"https://github.com/mitre-attack/bzar"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SIGMA Editor"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://tdm.socprime.com/sigma/generate/",children:"https://tdm.socprime.com/sigma/generate/"})}),(0,s.jsx)(e.td,{children:"SOCPRIME"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"UNCODER"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://uncoder.io/",children:"https://uncoder.io/"})}),(0,s.jsx)(e.td,{children:"SOCPRIME"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Threathunter Playbook"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/Cyb3rWard0g/ThreatHunter-Playbook",children:"https://github.com/Cyb3rWard0g/ThreatHunter-Playbook"})}),(0,s.jsx)(e.td,{children:"Roberto Rodriguez"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ThreatHunting App"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/olafhartong/ThreatHunting",children:"https://github.com/olafhartong/ThreatHunting"})}),(0,s.jsx)(e.td,{children:"Olaf Hartong"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Atomic Threat Coverage"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/atc-project/atomic-threat-coverage",children:"https://github.com/atc-project/atomic-threat-coverage"})}),(0,s.jsx)(e.td,{children:"ATC Project"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"RE&CT"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://atc-project.github.io/atc-react/",children:"https://atc-project.github.io/atc-react/"})}),(0,s.jsx)(e.td,{children:"ATC Project"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"DETT&CT"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/rabobank-cdc/DeTTECT",children:"https://github.com/rabobank-cdc/DeTTECT"})}),(0,s.jsx)(e.td,{children:"Marcus Bakker / Ruben Bouwman"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"attack2jira"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mvelazc0/attack2jira",children:"https://github.com/mvelazc0/attack2jira"})}),(0,s.jsx)(e.td,{children:"Mauricio Velazco"})]})]})]}),"\n",(0,s.jsx)(e.h3,{id:"prevention--purple-red-teams--testing-of-controls",children:"Prevention / Purple-Red Teams / Testing of Controls"}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Name"}),(0,s.jsx)(e.th,{children:"Link"}),(0,s.jsx)(e.th,{children:"Owner"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"CALDERA"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mitre/caldera",children:"https://github.com/mitre/caldera"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Atomic Red Team"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/redcanaryco/atomic-red-team",children:"https://github.com/redcanaryco/atomic-red-team"})}),(0,s.jsx)(e.td,{children:"Red Canary"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SPLUNK ATTACK Range"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/splunk/attack_range",children:"https://github.com/splunk/attack_range"})}),(0,s.jsx)(e.td,{children:"SPLUNK"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"MORDOR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://mordordatasets.com/introduction.html",children:"https://mordordatasets.com/introduction.html"})}),(0,s.jsx)(e.td,{children:"Roberto Rodriguez"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"PurpleSharp"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mvelazc0/PurpleSharp",children:"https://github.com/mvelazc0/PurpleSharp"})}),(0,s.jsx)(e.td,{children:"Mauricio Velazco"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"VECTR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/SecurityRiskAdvisors/VECTR",children:"https://github.com/SecurityRiskAdvisors/VECTR"})}),(0,s.jsx)(e.td,{children:"Security Risk Advisors"})]})]})]}),"\n",(0,s.jsx)(e.h3,{id:"unclassified",children:"Unclassified"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://github.com/infosecn1nja/awesome-mitre-attack/blob/master/README.md",children:"https://github.com/infosecn1nja/awesome-mitre-attack/blob/master/README.md"})}),"\n"]})]})}function o(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(a,{...t})}):a(t)}},8453:(t,e,r)=>{r.d(e,{R:()=>n,x:()=>h});var s=r(6540);const i={},c=s.createContext(i);function n(t){const e=s.useContext(c);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function h(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:n(t.components),s.createElement(c.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/7dd8714f.da385007.js b/assets/js/7dd8714f.da385007.js
new file mode 100644
index 0000000..63a33d2
--- /dev/null
+++ b/assets/js/7dd8714f.da385007.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[804],{7130:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>d,contentTitle:()=>n,default:()=>o,frontMatter:()=>c,metadata:()=>h,toc:()=>l});var s=r(4848),i=r(8453);const c={},n="Resources",h={id:"Security Operations/secops-resources",title:"Resources",description:"MITRE Frameworks",source:"@site/docs/Security Operations/secops-resources.md",sourceDirName:"Security Operations",slug:"/Security Operations/secops-resources",permalink:"/docs/Security Operations/secops-resources",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Hi!",permalink:"/docs/GCP/Terraform/init"},next:{title:"Shuffle",permalink:"/docs/Shuffle"}},d={},l=[{value:"MITRE Frameworks",id:"mitre-frameworks",level:2},{value:"MITRE ATT&CK-related",id:"mitre-attck-related",level:2},{value:"CTI",id:"cti",level:3},{value:"Detection / Hunting / Blue Teams",id:"detection--hunting--blue-teams",level:3},{value:"Prevention / Purple-Red Teams / Testing of Controls",id:"prevention--purple-red-teams--testing-of-controls",level:3},{value:"Unclassified",id:"unclassified",level:3}];function a(t){const e={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.h1,{id:"resources",children:"Resources"}),"\n",(0,s.jsx)(e.h2,{id:"mitre-frameworks",children:"MITRE Frameworks"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://attack.mitre.org/",children:"MITRE ATT&CK"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://d3fend.mitre.org/",children:"MITRE D3FEND"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://engage.mitre.org",children:"MITRE ENGAGE"})}),"\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://atlas.mitre.org/",children:"MITRE ATLAS"})}),"\n"]}),"\n",(0,s.jsx)(e.h2,{id:"mitre-attck-related",children:"MITRE ATT&CK-related"}),"\n",(0,s.jsx)(e.h3,{id:"cti",children:"CTI"}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Name"}),(0,s.jsx)(e.th,{children:"Link"}),(0,s.jsx)(e.th,{children:"Owner"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Navigator"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://mitre.github.io/attack-navigator/enterprise/",children:"https://mitre.github.io/attack-navigator/enterprise/"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"CAR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://car.mitre.org/wiki/Main_Page",children:"https://car.mitre.org/wiki/Main_Page"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"AMITT"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/misinfosecproject/amitt_framework",children:"https://github.com/misinfosecproject/amitt_framework"})}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"MISP"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://www.misp-project.org",children:"https://www.misp-project.org"})}),(0,s.jsx)(e.td,{children:"MISP Project"})]})]})]}),"\n",(0,s.jsx)(e.h3,{id:"detection--hunting--blue-teams",children:"Detection / Hunting / Blue Teams"}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Name"}),(0,s.jsx)(e.th,{children:"Link"}),(0,s.jsx)(e.th,{children:"Owner"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SIGMA"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/Neo23x0/sigma",children:"https://github.com/Neo23x0/sigma"})}),(0,s.jsx)(e.td,{children:"Florian Roth / Thomas Patzke"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SIGMA Rules"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/Neo23x0/sigma/tree/master/rules",children:"https://github.com/Neo23x0/sigma/tree/master/rules"})}),(0,s.jsx)(e.td,{children:"Florian Roth"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"OSCD Community"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://oscd.community",children:"https://oscd.community"})}),(0,s.jsx)(e.td,{})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"BZAR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mitre-attack/bzar",children:"https://github.com/mitre-attack/bzar"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SIGMA Editor"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://tdm.socprime.com/sigma/generate/",children:"https://tdm.socprime.com/sigma/generate/"})}),(0,s.jsx)(e.td,{children:"SOCPRIME"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"UNCODER"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://uncoder.io/",children:"https://uncoder.io/"})}),(0,s.jsx)(e.td,{children:"SOCPRIME"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Threathunter Playbook"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/Cyb3rWard0g/ThreatHunter-Playbook",children:"https://github.com/Cyb3rWard0g/ThreatHunter-Playbook"})}),(0,s.jsx)(e.td,{children:"Roberto Rodriguez"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"ThreatHunting App"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/olafhartong/ThreatHunting",children:"https://github.com/olafhartong/ThreatHunting"})}),(0,s.jsx)(e.td,{children:"Olaf Hartong"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Atomic Threat Coverage"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/atc-project/atomic-threat-coverage",children:"https://github.com/atc-project/atomic-threat-coverage"})}),(0,s.jsx)(e.td,{children:"ATC Project"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"RE&CT"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://atc-project.github.io/atc-react/",children:"https://atc-project.github.io/atc-react/"})}),(0,s.jsx)(e.td,{children:"ATC Project"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"DETT&CT"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/rabobank-cdc/DeTTECT",children:"https://github.com/rabobank-cdc/DeTTECT"})}),(0,s.jsx)(e.td,{children:"Marcus Bakker / Ruben Bouwman"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"attack2jira"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mvelazc0/attack2jira",children:"https://github.com/mvelazc0/attack2jira"})}),(0,s.jsx)(e.td,{children:"Mauricio Velazco"})]})]})]}),"\n",(0,s.jsx)(e.h3,{id:"prevention--purple-red-teams--testing-of-controls",children:"Prevention / Purple-Red Teams / Testing of Controls"}),"\n",(0,s.jsxs)(e.table,{children:[(0,s.jsx)(e.thead,{children:(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.th,{children:"Name"}),(0,s.jsx)(e.th,{children:"Link"}),(0,s.jsx)(e.th,{children:"Owner"})]})}),(0,s.jsxs)(e.tbody,{children:[(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"CALDERA"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mitre/caldera",children:"https://github.com/mitre/caldera"})}),(0,s.jsx)(e.td,{children:"MITRE"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"Atomic Red Team"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/redcanaryco/atomic-red-team",children:"https://github.com/redcanaryco/atomic-red-team"})}),(0,s.jsx)(e.td,{children:"Red Canary"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"SPLUNK ATTACK Range"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/splunk/attack_range",children:"https://github.com/splunk/attack_range"})}),(0,s.jsx)(e.td,{children:"SPLUNK"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"MORDOR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://mordordatasets.com/introduction.html",children:"https://mordordatasets.com/introduction.html"})}),(0,s.jsx)(e.td,{children:"Roberto Rodriguez"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"PurpleSharp"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/mvelazc0/PurpleSharp",children:"https://github.com/mvelazc0/PurpleSharp"})}),(0,s.jsx)(e.td,{children:"Mauricio Velazco"})]}),(0,s.jsxs)(e.tr,{children:[(0,s.jsx)(e.td,{children:"VECTR"}),(0,s.jsx)(e.td,{children:(0,s.jsx)(e.a,{href:"https://github.com/SecurityRiskAdvisors/VECTR",children:"https://github.com/SecurityRiskAdvisors/VECTR"})}),(0,s.jsx)(e.td,{children:"Security Risk Advisors"})]})]})]}),"\n",(0,s.jsx)(e.h3,{id:"unclassified",children:"Unclassified"}),"\n",(0,s.jsxs)(e.ul,{children:["\n",(0,s.jsx)(e.li,{children:(0,s.jsx)(e.a,{href:"https://github.com/infosecn1nja/awesome-mitre-attack/blob/master/README.md",children:"https://github.com/infosecn1nja/awesome-mitre-attack/blob/master/README.md"})}),"\n"]})]})}function o(t={}){const{wrapper:e}={...(0,i.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(a,{...t})}):a(t)}},8453:(t,e,r)=>{r.d(e,{R:()=>n,x:()=>h});var s=r(6540);const i={},c=s.createContext(i);function n(t){const e=s.useContext(c);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function h(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:n(t.components),s.createElement(c.Provider,{value:e},t.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8037d0b1.0dc03b60.js b/assets/js/8037d0b1.0dc03b60.js
new file mode 100644
index 0000000..f528999
--- /dev/null
+++ b/assets/js/8037d0b1.0dc03b60.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1218],{9832:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var n=r(4848),a=r(8453),o=r(1470),l=r(9365);const s={},u="Port-forwarding to localhost",i={id:"GCP/Identity-Aware Proxy/port-forwarding",title:"Port-forwarding to localhost",description:"Install the gcloud CLI",source:"@site/docs/GCP/Identity-Aware Proxy/port-forwarding.md",sourceDirName:"GCP/Identity-Aware Proxy",slug:"/GCP/Identity-Aware Proxy/port-forwarding",permalink:"/docs/GCP/Identity-Aware Proxy/port-forwarding",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Infrastructure as Code",permalink:"/docs/Engineering/IaC"},next:{title:"Remote SSH an IAP-secured server using a terminal or VSCode",permalink:"/docs/GCP/Identity-Aware Proxy/remote-ssh-iap"}},c={},d=[{value:"Install the gcloud CLI",id:"install-the-gcloud-cli",level:2},{value:"Authentication with the CLI",id:"gcloud-auth",level:2},{value:"Port-forwarding your application port to your localhost",id:"port-forwarding-your-application-port-to-your-localhost",level:2}];function h(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"port-forwarding-to-localhost",children:"Port-forwarding to localhost"}),"\n","\n","\n",(0,n.jsx)(t.h2,{id:"install-the-gcloud-cli",children:"Install the gcloud CLI"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"https://cloud.google.com/sdk/docs/install#linux",children:"Official documentation"})}),"\n",(0,n.jsx)(t.h2,{id:"gcloud-auth",children:"Authentication with the CLI"}),"\n",(0,n.jsxs)(t.p,{children:["Before each session you may launch, make sure to be ",(0,n.jsx)(t.strong,{children:"authenticated with your gcloud account"})," within the CLI"]}),"\n",(0,n.jsxs)(o.A,{groupId:"operating-systems",children:[(0,n.jsx)(l.A,{value:"Linux/mac",label:"Standard",children:(0,n.jsx)("pre",{children:"gcloud auth login"})}),(0,n.jsx)(l.A,{value:"WSL",label:"WSL",children:(0,n.jsx)("pre",{children:"gcloud auth login --no-launch-browser"})})]}),"\n",(0,n.jsx)(t.h2,{id:"port-forwarding-your-application-port-to-your-localhost",children:"Port-forwarding your application port to your localhost"}),"\n",(0,n.jsx)(t.p,{children:"If for instance, I am testing the great vectr purple team's app on a cloud-based instance. The frontend will be by default running on localhost:8501. As a result, I'll able to redirect such traffic to my local machine thanks to this command."}),"\n",(0,n.jsx)("pre",{children:"gcloud compute start-iap-tunnel vectr-test-instance 8501 --local-host-port=localhost:8501"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"https://cloud.google.com/solutions/connecting-securely#:~:text=or%20SOCKS%20proxy.-,Port%20forwarding%20over%20SSH,host%20over%20an%20SSH%20connection.&text=LOCAL_PORT%20%3Alocalhost%3A%20REMOTE_PORT-,Replace%20the%20following%3A,your%20Google%20Cloud%20project%20ID.",children:"Official documentation"})})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>l});r(6540);var n=r(8215);const a={tabItem:"tabItem_Ymn6"};var o=r(4848);function l(e){let{children:t,hidden:r,className:l}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.A)(a.tabItem,l),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>I});var n=r(6540),a=r(8215),o=r(3104),l=r(6347),s=r(205),u=r(7485),i=r(1682),c=r(9466);function d(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}(r);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const a=(0,l.W6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,u.aZ)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:a}=e,o=h(e),[l,u]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,d]=f({queryString:r,groupId:a}),[m,g]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Dv)(r);return[a,(0,n.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:a}),b=(()=>{const e=i??m;return p({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{b&&u(b)}),[b]);return{selectedValue:l,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);u(e),d(e),g(e)}),[d,g,o]),tabValues:o}}var g=r(2303);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function y(e){let{className:t,block:r,selectedValue:n,selectValue:l,tabValues:s}=e;const u=[],{blockElementScrollPositionUntilNextRender:i}=(0,o.a_)(),c=e=>{const t=e.currentTarget,r=u.indexOf(t),a=s[r].value;a!==n&&(i(t),l(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":r},t),children:s.map((e=>{let{value:t,label:r,attributes:o}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>u.push(e),onKeyDown:d,onClick:c,...o,className:(0,a.A)("tabs__item",b.tabItem,o?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function w(e){let{lazy:t,children:r,selectedValue:a}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==a})))})}function x(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(y,{...e,...t}),(0,v.jsx)(w,{...e,...t})]})}function I(e){const t=(0,g.A)();return(0,v.jsx)(x,{...e,children:d(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>l,x:()=>s});var n=r(6540);const a={},o=n.createContext(a);function l(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/8037d0b1.b0f4a353.js b/assets/js/8037d0b1.b0f4a353.js
deleted file mode 100644
index 1301f51..0000000
--- a/assets/js/8037d0b1.b0f4a353.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1218],{9832:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>d});var n=r(4848),a=r(8453),o=r(1470),l=r(9365);const s={},u="Port-forwarding to localhost",i={id:"GCP/Identity-Aware Proxy/port-forwarding",title:"Port-forwarding to localhost",description:"Install the gcloud CLI",source:"@site/docs/GCP/Identity-Aware Proxy/port-forwarding.md",sourceDirName:"GCP/Identity-Aware Proxy",slug:"/GCP/Identity-Aware Proxy/port-forwarding",permalink:"/docs/GCP/Identity-Aware Proxy/port-forwarding",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Infrastructure as Code",permalink:"/docs/Engineering/IaC"},next:{title:"Remote SSH an IAP-secured server using a terminal or VSCode",permalink:"/docs/GCP/Identity-Aware Proxy/remote-ssh-iap"}},c={},d=[{value:"Install the gcloud CLI",id:"install-the-gcloud-cli",level:2},{value:"Authentication with the CLI",id:"gcloud-auth",level:2},{value:"Port-forwarding your application port to your localhost",id:"port-forwarding-your-application-port-to-your-localhost",level:2}];function h(e){const t={a:"a",h1:"h1",h2:"h2",p:"p",strong:"strong",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"port-forwarding-to-localhost",children:"Port-forwarding to localhost"}),"\n","\n","\n",(0,n.jsx)(t.h2,{id:"install-the-gcloud-cli",children:"Install the gcloud CLI"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"https://cloud.google.com/sdk/docs/install#linux",children:"Official documentation"})}),"\n",(0,n.jsx)(t.h2,{id:"gcloud-auth",children:"Authentication with the CLI"}),"\n",(0,n.jsxs)(t.p,{children:["Before each session you may launch, make sure to be ",(0,n.jsx)(t.strong,{children:"authenticated with your gcloud account"})," within the CLI"]}),"\n",(0,n.jsxs)(o.A,{groupId:"operating-systems",children:[(0,n.jsx)(l.A,{value:"Linux/mac",label:"Standard",children:(0,n.jsx)("pre",{children:"gcloud auth login"})}),(0,n.jsx)(l.A,{value:"WSL",label:"WSL",children:(0,n.jsx)("pre",{children:"gcloud auth login --no-launch-browser"})})]}),"\n",(0,n.jsx)(t.h2,{id:"port-forwarding-your-application-port-to-your-localhost",children:"Port-forwarding your application port to your localhost"}),"\n",(0,n.jsx)(t.p,{children:"If for instance, I am testing the great vectr purple team's app on a cloud-based instance. The frontend will be by default running on localhost:8501. As a result, I'll able to redirect such traffic to my local machine thanks to this command."}),"\n",(0,n.jsx)("pre",{children:"gcloud compute start-iap-tunnel vectr-test-instance 8501 --local-host-port=localhost:8501"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"https://cloud.google.com/solutions/connecting-securely#:~:text=or%20SOCKS%20proxy.-,Port%20forwarding%20over%20SSH,host%20over%20an%20SSH%20connection.&text=LOCAL_PORT%20%3Alocalhost%3A%20REMOTE_PORT-,Replace%20the%20following%3A,your%20Google%20Cloud%20project%20ID.",children:"Official documentation"})})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},9365:(e,t,r)=>{r.d(t,{A:()=>l});r(6540);var n=r(8215);const a={tabItem:"tabItem_Ymn6"};var o=r(4848);function l(e){let{children:t,hidden:r,className:l}=e;return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.A)(a.tabItem,l),hidden:r,children:t})}},1470:(e,t,r)=>{r.d(t,{A:()=>I});var n=r(6540),a=r(8215),o=r(3104),l=r(6347),s=r(205),u=r(7485),i=r(1682),c=r(9466);function d(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return d(e).map((e=>{let{props:{value:t,label:r,attributes:n,default:a}}=e;return{value:t,label:r,attributes:n,default:a}}))}(r);return function(e){const t=(0,i.X)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function p(e){let{value:t,tabValues:r}=e;return r.some((e=>e.value===t))}function f(e){let{queryString:t=!1,groupId:r}=e;const a=(0,l.W6)(),o=function(e){let{queryString:t=!1,groupId:r}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:t,groupId:r});return[(0,u.aZ)(o),(0,n.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(a.location.search);t.set(o,e),a.replace({...a.location,search:t.toString()})}),[o,a])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:a}=e,o=h(e),[l,u]=(0,n.useState)((()=>function(e){let{defaultValue:t,tabValues:r}=e;if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(t){if(!p({value:t,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${r.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=r.find((e=>e.default))??r[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[i,d]=f({queryString:r,groupId:a}),[m,b]=function(e){let{groupId:t}=e;const r=function(e){return e?`docusaurus.tab.${e}`:null}(t),[a,o]=(0,c.Dv)(r);return[a,(0,n.useCallback)((e=>{r&&o.set(e)}),[r,o])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:o})?e:null})();(0,s.A)((()=>{g&&u(g)}),[g]);return{selectedValue:l,selectValue:(0,n.useCallback)((e=>{if(!p({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);u(e),d(e),b(e)}),[d,b,o]),tabValues:o}}var b=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function y(e){let{className:t,block:r,selectedValue:n,selectValue:l,tabValues:s}=e;const u=[],{blockElementScrollPositionUntilNextRender:i}=(0,o.a_)(),c=e=>{const t=e.currentTarget,r=u.indexOf(t),a=s[r].value;a!==n&&(i(t),l(a))},d=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=u.indexOf(e.currentTarget)+1;t=u[r]??u[0];break}case"ArrowLeft":{const r=u.indexOf(e.currentTarget)-1;t=u[r]??u[u.length-1];break}}t?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":r},t),children:s.map((e=>{let{value:t,label:r,attributes:o}=e;return(0,v.jsx)("li",{role:"tab",tabIndex:n===t?0:-1,"aria-selected":n===t,ref:e=>u.push(e),onKeyDown:d,onClick:c,...o,className:(0,a.A)("tabs__item",g.tabItem,o?.className,{"tabs__item--active":n===t}),children:r??t},t)}))})}function w(e){let{lazy:t,children:r,selectedValue:a}=e;const o=(Array.isArray(r)?r:[r]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===a));return e?(0,n.cloneElement)(e,{className:"margin-top--md"}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==a})))})}function x(e){const t=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...e,...t}),(0,v.jsx)(w,{...e,...t})]})}function I(e){const t=(0,b.A)();return(0,v.jsx)(x,{...e,children:d(e.children)},String(t))}},8453:(e,t,r)=>{r.d(t,{R:()=>l,x:()=>s});var n=r(6540);const a={},o=n.createContext(a);function l(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/961cf1dd.1bfe320b.js b/assets/js/961cf1dd.1bfe320b.js
new file mode 100644
index 0000000..c8e02db
--- /dev/null
+++ b/assets/js/961cf1dd.1bfe320b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2805],{610:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=o(4848),r=o(8453);const s={},i="Cortex Neurons",c={id:"TheHive/cortex-neurons",title:"Cortex Neurons",description:"Introduction",source:"@site/docs/TheHive/cortex-neurons.md",sourceDirName:"TheHive",slug:"/TheHive/cortex-neurons",permalink:"/docs/TheHive/cortex-neurons",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Shuffle",permalink:"/docs/Shuffle"},next:{title:"Resources",permalink:"/docs/TheHive/thehive-resources"}},l={},a=[{value:"Introduction",id:"introduction",level:2},{value:"Build & Test cortex-neurons",id:"build--test-cortex-neurons",level:2},{value:"Build my Cortex Neuron locally from Dockerfile",id:"build-my-cortex-neuron-locally-from-dockerfile",level:3},{value:"Test the local neuron",id:"test-the-local-neuron",level:3},{value:"Test remote existing cortex-neurons (on MacOS Apple Silicon)",id:"test-remote-existing-cortex-neurons-on-macos-apple-silicon",level:3},{value:"Debug remote existing cortex-neuron from command-line",id:"debug-remote-existing-cortex-neuron-from-command-line",level:3}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cortex-neurons",children:"Cortex Neurons"}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["As stated in the ",(0,t.jsx)(n.a,{href:"https://thehive-project.github.io/Cortex-Analyzers/",children:"Cortex Neurons documentation"})]}),"\n",(0,t.jsx)(n.h2,{id:"build--test-cortex-neurons",children:"Build & Test cortex-neurons"}),"\n",(0,t.jsx)(n.h3,{id:"build-my-cortex-neuron-locally-from-dockerfile",children:"Build my Cortex Neuron locally from Dockerfile"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker build -t myneuron:latest .\n"})}),"\n",(0,t.jsx)(n.h3,{id:"test-the-local-neuron",children:"Test the local neuron"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run --rm -v ${PWD}:/job myneuron:latest\n"})}),"\n",(0,t.jsx)(n.h3,{id:"test-remote-existing-cortex-neurons-on-macos-apple-silicon",children:"Test remote existing cortex-neurons (on MacOS Apple Silicon)"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run --rm --platform=linux/amd64 -v ${PWD}:/job cortexneurons/dshield_lookup:devel\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"Make sure to have a ./input/input.json file configured locally. If the cortex neuron runs successfully, an output.json should appear in output folder."})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="input/input.json"',children:'{\n "data":"185.162.131.25",\n "tlp":0,\n "parameters":{\n \n },\n "dataType":"ip",\n "config":{\n "jobTimeout":30,\n "service":"",\n "url":"",\n "api_key":"",\n "proxy_http":"",\n "proxy":{\n "http":"",\n "https":""\n },\n "max_tlp":2,\n "max_pap":2,\n "check_tlp":true,\n "check_pap":true,\n "proxy_https":"",\n "cacerts":"",\n "auto_extract_artifacts":false,\n "jobCache":10\n },\n "pap":2,\n "message":"1"\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"debug-remote-existing-cortex-neuron-from-command-line",children:"Debug remote existing cortex-neuron from command-line"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run -ti --platform linux/amd64 --name=mylocalneuron --rm --entrypoint /bin/bash cortexneurons/falconsandbox:devel\n"})}),"\n",(0,t.jsx)(n.p,{children:"Upon new changes, to create an image if needed (better build from scratch, not recommended):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker commit mylocalneuron mylocalneuron:latest\n"})})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/961cf1dd.4d0d1e11.js b/assets/js/961cf1dd.4d0d1e11.js
deleted file mode 100644
index 6221647..0000000
--- a/assets/js/961cf1dd.4d0d1e11.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2805],{610:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=o(4848),r=o(8453);const s={},i="Cortex Neurons",c={id:"TheHive/cortex-neurons",title:"Cortex Neurons",description:"Introduction",source:"@site/docs/TheHive/cortex-neurons.md",sourceDirName:"TheHive",slug:"/TheHive/cortex-neurons",permalink:"/docs/TheHive/cortex-neurons",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Shuffle",permalink:"/docs/Shuffle"},next:{title:"Resources",permalink:"/docs/TheHive/thehive-resources"}},l={},a=[{value:"Introduction",id:"introduction",level:2},{value:"Build & Test cortex-neurons",id:"build--test-cortex-neurons",level:2},{value:"Build my Cortex Neuron locally from Dockerfile",id:"build-my-cortex-neuron-locally-from-dockerfile",level:3},{value:"Test the local neuron",id:"test-the-local-neuron",level:3},{value:"Test remote existing cortex-neurons (on MacOS Apple Silicon)",id:"test-remote-existing-cortex-neurons-on-macos-apple-silicon",level:3},{value:"Debug remote existing cortex-neuron from command-line",id:"debug-remote-existing-cortex-neuron-from-command-line",level:3}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"cortex-neurons",children:"Cortex Neurons"}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["As stated in the ",(0,t.jsx)(n.a,{href:"https://thehive-project.github.io/Cortex-Analyzers/",children:"Cortex Neurons documentation"})]}),"\n",(0,t.jsx)(n.h2,{id:"build--test-cortex-neurons",children:"Build & Test cortex-neurons"}),"\n",(0,t.jsx)(n.h3,{id:"build-my-cortex-neuron-locally-from-dockerfile",children:"Build my Cortex Neuron locally from Dockerfile"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker build -t myneuron:latest .\n"})}),"\n",(0,t.jsx)(n.h3,{id:"test-the-local-neuron",children:"Test the local neuron"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run --rm -v ${PWD}:/job myneuron:latest\n"})}),"\n",(0,t.jsx)(n.h3,{id:"test-remote-existing-cortex-neurons-on-macos-apple-silicon",children:"Test remote existing cortex-neurons (on MacOS Apple Silicon)"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run --rm --platform=linux/amd64 -v ${PWD}:/job cortexneurons/dshield_lookup:devel\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"Make sure to have a ./input/input.json file configured locally. If the cortex neuron runs successfully, an output.json should appear in output folder."})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",metastring:'title="input/input.json"',children:'{\n "data":"185.162.131.25",\n "tlp":0,\n "parameters":{\n \n },\n "dataType":"ip",\n "config":{\n "jobTimeout":30,\n "service":"",\n "url":"",\n "api_key":"",\n "proxy_http":"",\n "proxy":{\n "http":"",\n "https":""\n },\n "max_tlp":2,\n "max_pap":2,\n "check_tlp":true,\n "check_pap":true,\n "proxy_https":"",\n "cacerts":"",\n "auto_extract_artifacts":false,\n "jobCache":10\n },\n "pap":2,\n "message":"1"\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"debug-remote-existing-cortex-neuron-from-command-line",children:"Debug remote existing cortex-neuron from command-line"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker run -ti --platform linux/amd64 --name=mylocalneuron --rm --entrypoint /bin/bash cortexneurons/falconsandbox:devel\n"})}),"\n",(0,t.jsx)(n.p,{children:"Upon new changes, to create an image if needed (better build from scratch, not recommended):"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker commit mylocalneuron mylocalneuron:latest\n"})})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(6540);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/996f5af2.0c47acc4.js b/assets/js/996f5af2.0c47acc4.js
deleted file mode 100644
index ac05a26..0000000
--- a/assets/js/996f5af2.0c47acc4.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5307],{2939:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=i(4848),s=i(8453);const r={},l="SOC2",c={id:"Compliance/SOC2",title:"SOC2",description:"Introduction",source:"@site/docs/Compliance/SOC2.mdx",sourceDirName:"Compliance",slug:"/Compliance/SOC2",permalink:"/docs/Compliance/SOC2",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Welcome",permalink:"/docs/welcome"},next:{title:"Configuration Management",permalink:"/docs/Engineering/ConfigurationManagement"}},o={},a=[{value:"Introduction",id:"introduction",level:2},{value:"Available assessments",id:"available-assessments",level:3},{value:"Report types",id:"report-types",level:3},{value:"Type 1 Report",id:"type-1-report",level:4},{value:"Type 2 Report",id:"type-2-report",level:4},{value:"Benefits of Being Certified",id:"benefits-of-being-certified",level:3},{value:"Example",id:"example",level:3},{value:"Common criterias (CC)",id:"common-criterias-cc",level:2},{value:"CC1 - Control Environment",id:"cc1---control-environment",level:3},{value:"CC2 - Communication & Information",id:"cc2---communication--information",level:3},{value:"CC3 - Risk Assessment",id:"cc3---risk-assessment",level:3},{value:"CC4 - Monitoring Activities",id:"cc4---monitoring-activities",level:3},{value:"CC5 - Control Activities",id:"cc5---control-activities",level:3},{value:"CC6 - Logical & Physical Access",id:"cc6---logical--physical-access",level:3},{value:"CC7 - System Operations",id:"cc7---system-operations",level:3},{value:"CC8 - Change management",id:"cc8---change-management",level:3},{value:"CC9 - Risk Mitigation",id:"cc9---risk-mitigation",level:3},{value:"Additional criterias (AC)",id:"additional-criterias-ac",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"soc2",children:"SOC2"}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://us.aicpa.org/interestareas/frc/assuranceadvisoryservices/aicpasoc2report",children:"SOC2"})," is an assessment program ran by the ",(0,t.jsx)(n.a,{href:"https://www.aicpa-cima.com/",children:"AICPA"})]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"SOC"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Focus"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Restricted Use"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Report Content"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SOC1"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Internal Controls for financial reporting"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Restricted Use, Stakeholders require NDA"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Specific detail on controls relevant to financial reporting"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SOC2"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Internal Controls for Security, Availability, Confidentiality, Process Integrity, Privacy"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Restricted Use, Stakeholders require NDA"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:'Specific detail on each controls for the "Trust Criteria" in scope.'})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SOC2"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Internal Controls for Security, Availability, Confidentiality, Process Integrity, Privacy"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Can be shared publicly unrestricted"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"General description"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"available-assessments",children:"Available assessments"}),"\n",(0,t.jsx)(n.p,{children:"There is three different SOC assessments :"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"SOC for Service Organizations : Internal report on controls provided by the organization allowing users to assess risks."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"SOC for Cybersecurity : Reporting framework allowing organizations communicate effectiveness of cybersecurity risk management."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"SOC for Supply Chain : Internal controls report of controls for producing, manufacturing or distribution of goods."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"report-types",children:"Report types"}),"\n",(0,t.jsx)(n.h4,{id:"type-1-report",children:"Type 1 Report"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Focus on control design"}),"\n",(0,t.jsx)(n.li,{children:"Shorter time to undertake assessment"}),"\n",(0,t.jsx)(n.li,{children:"Can be undertaken prior to Type 2"}),"\n",(0,t.jsx)(n.li,{children:"Costs less than Type 2 report"}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"type-2-report",children:"Type 2 Report"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Focus on operational effectiveness"}),"\n",(0,t.jsx)(n.li,{children:"Longer time to undertake assessment"}),"\n",(0,t.jsx)(n.li,{children:"Must have at least 6 months evidence"}),"\n",(0,t.jsx)(n.li,{children:"Costs more than Type 1 report"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"benefits-of-being-certified",children:"Benefits of Being Certified"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Customer demand"}),"\n",(0,t.jsx)(n.li,{children:"Independent security assurance"}),"\n",(0,t.jsx)(n.li,{children:"Competitive advantage"}),"\n",(0,t.jsx)(n.li,{children:"Regulatory compliance"}),"\n",(0,t.jsx)(n.li,{children:"Feedback on operational effectiveness"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"https://aws.amazon.com/fr/compliance/soc-faqs/",children:"AWS SOC Compliance"})}),"\n",(0,t.jsx)(n.h1,{id:"soc-trust-criterias",children:"SOC Trust Criterias"}),"\n",(0,t.jsxs)(n.p,{children:["The first 5 Common Criterias come from the ",(0,t.jsx)(n.a,{href:"https://www.coso.org/SitePages/Home.aspx",children:"COSO framework"})," which represents 17 principles.\nThe 4 other Common Criterias (which are all mandatories) are SOC2 specific.\nAdditionally, Additional Criterias can be covered if chosen by the company requesting the audit."]}),"\n",(0,t.jsx)(n.h2,{id:"common-criterias-cc",children:"Common criterias (CC)"}),"\n",(0,t.jsx)(n.h3,{id:"cc1---control-environment",children:"CC1 - Control Environment"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC1.1 - Demonstrate commitment to integrity & ethical values"}),"\n",(0,t.jsx)(n.li,{children:"CC1.2 - Exercise oversight of internal controls"}),"\n",(0,t.jsx)(n.li,{children:"CC1.3 - Establish structures & responsibility to meet objectives"}),"\n",(0,t.jsx)(n.li,{children:"CC1.4 - Demonstrate commitment to competence"}),"\n",(0,t.jsx)(n.li,{children:"CC1.5 - Enforce accountability"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc2---communication--information",children:"CC2 - Communication & Information"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC2.1 - Use quality information to support controls"}),"\n",(0,t.jsx)(n.li,{children:"CC2.2 - Communicate internally regarding controls"}),"\n",(0,t.jsx)(n.li,{children:"CC2.3 - Communicate externally regarding controls"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc3---risk-assessment",children:"CC3 - Risk Assessment"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC3.1 - Specify clear objectives"}),"\n",(0,t.jsx)(n.li,{children:"CC3.2 - Identify and assess risk"}),"\n",(0,t.jsx)(n.li,{children:"CC3.3 - Consider fraud risk"}),"\n",(0,t.jsx)(n.li,{children:"CC3.4 - Identify and assess significant change"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc4---monitoring-activities",children:"CC4 - Monitoring Activities"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC4.1 - Evaluate components of internal controls"}),"\n",(0,t.jsx)(n.li,{children:"CC4.2 - Communicate deficiencies in a timely manner"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc5---control-activities",children:"CC5 - Control Activities"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC5.1 - Select control activities to mitigate risk"}),"\n",(0,t.jsx)(n.li,{children:"CC5.2 - Select general controls over technology"}),"\n",(0,t.jsx)(n.li,{children:"CC5.3 - Deploy controls through policies"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc6---logical--physical-access",children:"CC6 - Logical & Physical Access"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC6.1 - Protect information assets with logical access security controls"}),"\n",(0,t.jsx)(n.li,{children:"CC6.2 - Authorize users before granting access, remove promptly"}),"\n",(0,t.jsx)(n.li,{children:"CC6.3 - Apply least privilege and segregation of duties"}),"\n",(0,t.jsx)(n.li,{children:"CC6.4 - Restrict physical access to authorized personnel"}),"\n",(0,t.jsx)(n.li,{children:"CC6.5 - Remove sensitive data before relaxing physical controls"}),"\n",(0,t.jsx)(n.li,{children:"CC6.6 - Implement logical access security measures"}),"\n",(0,t.jsx)(n.li,{children:"\u0421\u04216.7 - Restrict removal of information and protect in transit"}),"\n",(0,t.jsx)(n.li,{children:"CC6.8 - Protect against installation of malicious software"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc7---system-operations",children:"CC7 - System Operations"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC7.1 - Identify changes in configuration and vulnerabilities"}),"\n",(0,t.jsx)(n.li,{children:"CC7.2 - Monitor system for anomalies"}),"\n",(0,t.jsx)(n.li,{children:"CC7.3 - Evaluate Security incidents"}),"\n",(0,t.jsx)(n.li,{children:"CC7.4 - Respond to security incidents using a defined plan"}),"\n",(0,t.jsx)(n.li,{children:"CC7.5 - Identify and implement activities to recover from incidents"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc8---change-management",children:"CC8 - Change management"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC8.1 - Authorize, design, test, approves changes to meet objectives"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc9---risk-mitigation",children:"CC9 - Risk Mitigation"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC9.1- Identify and selects risk mitigation activities."}),"\n",(0,t.jsx)(n.li,{children:"CC9.2 - Assess and manage risk from vendors/partners"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"additional-criterias-ac",children:"Additional criterias (AC)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Availability"}),"\n",(0,t.jsx)(n.li,{children:"Confidentiality"}),"\n",(0,t.jsx)(n.li,{children:"Process Integrity"}),"\n",(0,t.jsx)(n.li,{children:"Privacy"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/996f5af2.8fff4797.js b/assets/js/996f5af2.8fff4797.js
new file mode 100644
index 0000000..ecacbf5
--- /dev/null
+++ b/assets/js/996f5af2.8fff4797.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5307],{2939:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var t=i(4848),s=i(8453);const r={},l="SOC2",c={id:"Compliance/SOC2",title:"SOC2",description:"Introduction",source:"@site/docs/Compliance/SOC2.mdx",sourceDirName:"Compliance",slug:"/Compliance/SOC2",permalink:"/docs/Compliance/SOC2",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Welcome",permalink:"/docs/welcome"},next:{title:"Configuration Management",permalink:"/docs/Engineering/ConfigurationManagement"}},o={},a=[{value:"Introduction",id:"introduction",level:2},{value:"Available assessments",id:"available-assessments",level:3},{value:"Report types",id:"report-types",level:3},{value:"Type 1 Report",id:"type-1-report",level:4},{value:"Type 2 Report",id:"type-2-report",level:4},{value:"Benefits of Being Certified",id:"benefits-of-being-certified",level:3},{value:"Example",id:"example",level:3},{value:"Common criterias (CC)",id:"common-criterias-cc",level:2},{value:"CC1 - Control Environment",id:"cc1---control-environment",level:3},{value:"CC2 - Communication & Information",id:"cc2---communication--information",level:3},{value:"CC3 - Risk Assessment",id:"cc3---risk-assessment",level:3},{value:"CC4 - Monitoring Activities",id:"cc4---monitoring-activities",level:3},{value:"CC5 - Control Activities",id:"cc5---control-activities",level:3},{value:"CC6 - Logical & Physical Access",id:"cc6---logical--physical-access",level:3},{value:"CC7 - System Operations",id:"cc7---system-operations",level:3},{value:"CC8 - Change management",id:"cc8---change-management",level:3},{value:"CC9 - Risk Mitigation",id:"cc9---risk-mitigation",level:3},{value:"Additional criterias (AC)",id:"additional-criterias-ac",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"soc2",children:"SOC2"}),"\n",(0,t.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://us.aicpa.org/interestareas/frc/assuranceadvisoryservices/aicpasoc2report",children:"SOC2"})," is an assessment program ran by the ",(0,t.jsx)(n.a,{href:"https://www.aicpa-cima.com/",children:"AICPA"})]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"SOC"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Focus"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Restricted Use"}),(0,t.jsx)(n.th,{style:{textAlign:"center"},children:"Report Content"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SOC1"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Internal Controls for financial reporting"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Restricted Use, Stakeholders require NDA"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Specific detail on controls relevant to financial reporting"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SOC2"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Internal Controls for Security, Availability, Confidentiality, Process Integrity, Privacy"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Restricted Use, Stakeholders require NDA"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:'Specific detail on each controls for the "Trust Criteria" in scope.'})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"SOC2"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Internal Controls for Security, Availability, Confidentiality, Process Integrity, Privacy"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"Can be shared publicly unrestricted"}),(0,t.jsx)(n.td,{style:{textAlign:"center"},children:"General description"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"available-assessments",children:"Available assessments"}),"\n",(0,t.jsx)(n.p,{children:"There is three different SOC assessments :"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"SOC for Service Organizations : Internal report on controls provided by the organization allowing users to assess risks."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"SOC for Cybersecurity : Reporting framework allowing organizations communicate effectiveness of cybersecurity risk management."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"SOC for Supply Chain : Internal controls report of controls for producing, manufacturing or distribution of goods."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"report-types",children:"Report types"}),"\n",(0,t.jsx)(n.h4,{id:"type-1-report",children:"Type 1 Report"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Focus on control design"}),"\n",(0,t.jsx)(n.li,{children:"Shorter time to undertake assessment"}),"\n",(0,t.jsx)(n.li,{children:"Can be undertaken prior to Type 2"}),"\n",(0,t.jsx)(n.li,{children:"Costs less than Type 2 report"}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"type-2-report",children:"Type 2 Report"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Focus on operational effectiveness"}),"\n",(0,t.jsx)(n.li,{children:"Longer time to undertake assessment"}),"\n",(0,t.jsx)(n.li,{children:"Must have at least 6 months evidence"}),"\n",(0,t.jsx)(n.li,{children:"Costs more than Type 1 report"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"benefits-of-being-certified",children:"Benefits of Being Certified"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Customer demand"}),"\n",(0,t.jsx)(n.li,{children:"Independent security assurance"}),"\n",(0,t.jsx)(n.li,{children:"Competitive advantage"}),"\n",(0,t.jsx)(n.li,{children:"Regulatory compliance"}),"\n",(0,t.jsx)(n.li,{children:"Feedback on operational effectiveness"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"example",children:"Example"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.a,{href:"https://aws.amazon.com/fr/compliance/soc-faqs/",children:"AWS SOC Compliance"})}),"\n",(0,t.jsx)(n.h1,{id:"soc-trust-criterias",children:"SOC Trust Criterias"}),"\n",(0,t.jsxs)(n.p,{children:["The first 5 Common Criterias come from the ",(0,t.jsx)(n.a,{href:"https://www.coso.org/SitePages/Home.aspx",children:"COSO framework"})," which represents 17 principles.\nThe 4 other Common Criterias (which are all mandatories) are SOC2 specific.\nAdditionally, Additional Criterias can be covered if chosen by the company requesting the audit."]}),"\n",(0,t.jsx)(n.h2,{id:"common-criterias-cc",children:"Common criterias (CC)"}),"\n",(0,t.jsx)(n.h3,{id:"cc1---control-environment",children:"CC1 - Control Environment"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC1.1 - Demonstrate commitment to integrity & ethical values"}),"\n",(0,t.jsx)(n.li,{children:"CC1.2 - Exercise oversight of internal controls"}),"\n",(0,t.jsx)(n.li,{children:"CC1.3 - Establish structures & responsibility to meet objectives"}),"\n",(0,t.jsx)(n.li,{children:"CC1.4 - Demonstrate commitment to competence"}),"\n",(0,t.jsx)(n.li,{children:"CC1.5 - Enforce accountability"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc2---communication--information",children:"CC2 - Communication & Information"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC2.1 - Use quality information to support controls"}),"\n",(0,t.jsx)(n.li,{children:"CC2.2 - Communicate internally regarding controls"}),"\n",(0,t.jsx)(n.li,{children:"CC2.3 - Communicate externally regarding controls"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc3---risk-assessment",children:"CC3 - Risk Assessment"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC3.1 - Specify clear objectives"}),"\n",(0,t.jsx)(n.li,{children:"CC3.2 - Identify and assess risk"}),"\n",(0,t.jsx)(n.li,{children:"CC3.3 - Consider fraud risk"}),"\n",(0,t.jsx)(n.li,{children:"CC3.4 - Identify and assess significant change"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc4---monitoring-activities",children:"CC4 - Monitoring Activities"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC4.1 - Evaluate components of internal controls"}),"\n",(0,t.jsx)(n.li,{children:"CC4.2 - Communicate deficiencies in a timely manner"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc5---control-activities",children:"CC5 - Control Activities"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC5.1 - Select control activities to mitigate risk"}),"\n",(0,t.jsx)(n.li,{children:"CC5.2 - Select general controls over technology"}),"\n",(0,t.jsx)(n.li,{children:"CC5.3 - Deploy controls through policies"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc6---logical--physical-access",children:"CC6 - Logical & Physical Access"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC6.1 - Protect information assets with logical access security controls"}),"\n",(0,t.jsx)(n.li,{children:"CC6.2 - Authorize users before granting access, remove promptly"}),"\n",(0,t.jsx)(n.li,{children:"CC6.3 - Apply least privilege and segregation of duties"}),"\n",(0,t.jsx)(n.li,{children:"CC6.4 - Restrict physical access to authorized personnel"}),"\n",(0,t.jsx)(n.li,{children:"CC6.5 - Remove sensitive data before relaxing physical controls"}),"\n",(0,t.jsx)(n.li,{children:"CC6.6 - Implement logical access security measures"}),"\n",(0,t.jsx)(n.li,{children:"\u0421\u04216.7 - Restrict removal of information and protect in transit"}),"\n",(0,t.jsx)(n.li,{children:"CC6.8 - Protect against installation of malicious software"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc7---system-operations",children:"CC7 - System Operations"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC7.1 - Identify changes in configuration and vulnerabilities"}),"\n",(0,t.jsx)(n.li,{children:"CC7.2 - Monitor system for anomalies"}),"\n",(0,t.jsx)(n.li,{children:"CC7.3 - Evaluate Security incidents"}),"\n",(0,t.jsx)(n.li,{children:"CC7.4 - Respond to security incidents using a defined plan"}),"\n",(0,t.jsx)(n.li,{children:"CC7.5 - Identify and implement activities to recover from incidents"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc8---change-management",children:"CC8 - Change management"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC8.1 - Authorize, design, test, approves changes to meet objectives"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"cc9---risk-mitigation",children:"CC9 - Risk Mitigation"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"CC9.1- Identify and selects risk mitigation activities."}),"\n",(0,t.jsx)(n.li,{children:"CC9.2 - Assess and manage risk from vendors/partners"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"additional-criterias-ac",children:"Additional criterias (AC)"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Availability"}),"\n",(0,t.jsx)(n.li,{children:"Confidentiality"}),"\n",(0,t.jsx)(n.li,{children:"Process Integrity"}),"\n",(0,t.jsx)(n.li,{children:"Privacy"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>c});var t=i(6540);const s={},r=t.createContext(s);function l(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9a0a0f1d.34992ff3.js b/assets/js/9a0a0f1d.34992ff3.js
deleted file mode 100644
index 46365ae..0000000
--- a/assets/js/9a0a0f1d.34992ff3.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3393],{2219:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),a=t(8453);const s={},r="Configuration Management",o={id:"Engineering/ConfigurationManagement",title:"Configuration Management",description:"Summary",source:"@site/docs/Engineering/ConfigurationManagement.md",sourceDirName:"Engineering",slug:"/Engineering/ConfigurationManagement",permalink:"/docs/Engineering/ConfigurationManagement",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SOC2",permalink:"/docs/Compliance/SOC2"},next:{title:"Disaster Recovery Plan",permalink:"/docs/Engineering/DRP"}},d={},c=[{value:"Summary",id:"summary",level:2},{value:"Tools",id:"tools",level:2},{value:"OS Hardening",id:"os-hardening",level:2},{value:"Basic Debian 11 hardening example",id:"basic-debian-11-hardening-example",level:3}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"configuration-management",children:"Configuration Management"}),"\n",(0,i.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Used for virtual machine OS-level configuration"}),"\n",(0,i.jsx)(n.li,{children:"Ex: Configuring the internals of the VMs"}),"\n",(0,i.jsx)(n.li,{children:"Referring to package configuration & software maintenance"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"tools",children:"Tools"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Puppet ",(0,i.jsx)(n.em,{children:"(might be covered here later on)"})]}),"\n",(0,i.jsx)(n.li,{children:"Ansible"}),"\n",(0,i.jsx)(n.li,{children:"Chef"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"os-hardening",children:"OS Hardening"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://github.com/ovh/debian-cis/tree/master",children:"OVH Debian CIS OS Hardening helper"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-debian-11-hardening-example",children:"Basic Debian 11 hardening example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/ovh/debian-cis.git && cd debian-cis\ncp debian/default /etc/default/cis-hardening\nsed -i "s#CIS_ROOT_DIR=.*#CIS_ROOT_DIR=\'$(pwd)\'#" /etc/default/cis-hardening\nbin/hardening.sh --audit-all\nbin/hardening.sh --audit --set-hardening-level 2\nbin/hardening.sh --apply\n\n## Optional / for reference\nsed -i "s/status=.+/status=enabled/" etc/conf.d/*audit*.cfg\nsed -i "s/status=.+/status=enabled/" etc/conf.d/*kernel*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/*audit*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/*kernel*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/4.1.*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/4.1.15_record_sudo_usage.cfg \nsed -i "s/status=enabled/status=disabled/g" etc/conf.d/4.1.17_freeze_auditd_conf.cfg\nbin/hardening.sh --apply\n\n## 5.1.8 CIS\nrm /etc/cron.deny\ntouch /etc/cron.allow\nchmod 600 /etc/cron.allow\nchown root:root /etc/cron.allow\ntouch /etc/at.allow\nchmod 600 /etc/at.allow\nchown root:root /etc/at.allow\n## 5.2.1\nchmod 600 /etc/ssh/sshd_config\n'})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(6540);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9a0a0f1d.da664b9d.js b/assets/js/9a0a0f1d.da664b9d.js
new file mode 100644
index 0000000..6af5d5f
--- /dev/null
+++ b/assets/js/9a0a0f1d.da664b9d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3393],{2219:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),a=t(8453);const s={},r="Configuration Management",o={id:"Engineering/ConfigurationManagement",title:"Configuration Management",description:"Summary",source:"@site/docs/Engineering/ConfigurationManagement.md",sourceDirName:"Engineering",slug:"/Engineering/ConfigurationManagement",permalink:"/docs/Engineering/ConfigurationManagement",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"SOC2",permalink:"/docs/Compliance/SOC2"},next:{title:"Disaster Recovery Plan",permalink:"/docs/Engineering/DRP"}},d={},c=[{value:"Summary",id:"summary",level:2},{value:"Tools",id:"tools",level:2},{value:"OS Hardening",id:"os-hardening",level:2},{value:"Basic Debian 11 hardening example",id:"basic-debian-11-hardening-example",level:3}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",li:"li",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"configuration-management",children:"Configuration Management"}),"\n",(0,i.jsx)(n.h2,{id:"summary",children:"Summary"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Used for virtual machine OS-level configuration"}),"\n",(0,i.jsx)(n.li,{children:"Ex: Configuring the internals of the VMs"}),"\n",(0,i.jsx)(n.li,{children:"Referring to package configuration & software maintenance"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"tools",children:"Tools"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Puppet ",(0,i.jsx)(n.em,{children:"(might be covered here later on)"})]}),"\n",(0,i.jsx)(n.li,{children:"Ansible"}),"\n",(0,i.jsx)(n.li,{children:"Chef"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"os-hardening",children:"OS Hardening"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://github.com/ovh/debian-cis/tree/master",children:"OVH Debian CIS OS Hardening helper"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"basic-debian-11-hardening-example",children:"Basic Debian 11 hardening example"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'git clone https://github.com/ovh/debian-cis.git && cd debian-cis\ncp debian/default /etc/default/cis-hardening\nsed -i "s#CIS_ROOT_DIR=.*#CIS_ROOT_DIR=\'$(pwd)\'#" /etc/default/cis-hardening\nbin/hardening.sh --audit-all\nbin/hardening.sh --audit --set-hardening-level 2\nbin/hardening.sh --apply\n\n## Optional / for reference\nsed -i "s/status=.+/status=enabled/" etc/conf.d/*audit*.cfg\nsed -i "s/status=.+/status=enabled/" etc/conf.d/*kernel*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/*audit*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/*kernel*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/4.1.*.cfg\nsed -i "s/status=disabled/status=enabled/g" etc/conf.d/4.1.15_record_sudo_usage.cfg \nsed -i "s/status=enabled/status=disabled/g" etc/conf.d/4.1.17_freeze_auditd_conf.cfg\nbin/hardening.sh --apply\n\n## 5.1.8 CIS\nrm /etc/cron.deny\ntouch /etc/cron.allow\nchmod 600 /etc/cron.allow\nchown root:root /etc/cron.allow\ntouch /etc/at.allow\nchmod 600 /etc/at.allow\nchown root:root /etc/at.allow\n## 5.2.1\nchmod 600 /etc/ssh/sshd_config\n'})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(6540);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9b629586.03d0fcfd.js b/assets/js/9b629586.03d0fcfd.js
new file mode 100644
index 0000000..fca22d1
--- /dev/null
+++ b/assets/js/9b629586.03d0fcfd.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9218],{7552:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=t(4848),i=t(8453);const s={},o="Disaster Recovery Plan",c={id:"Engineering/DRP",title:"Disaster Recovery Plan",description:"Resources",source:"@site/docs/Engineering/DRP.md",sourceDirName:"Engineering",slug:"/Engineering/DRP",permalink:"/docs/Engineering/DRP",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Configuration Management",permalink:"/docs/Engineering/ConfigurationManagement"},next:{title:"Infrastructure as Code",permalink:"/docs/Engineering/IaC"}},a={},l=[{value:"Resources",id:"resources",level:2}];function u(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"disaster-recovery-plan",children:"Disaster Recovery Plan"}),"\n",(0,r.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://c4model.com",children:"C4 Model for software engineering"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://googlecloudcheatsheet.withgoogle.com/architecture",children:"GCP Architecture diagram"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://cloud.google.com/architecture/dr-scenarios-planning-guide",children:"GCP DRP guide"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://cloud.google.com/architecture/disaster-recovery",children:"Architecting disaster recovery for cloud infrastructure outages"})}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/9b629586.2d7465cd.js b/assets/js/9b629586.2d7465cd.js
deleted file mode 100644
index 06acad0..0000000
--- a/assets/js/9b629586.2d7465cd.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9218],{7552:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>l});var r=t(4848),i=t(8453);const s={},o="Disaster Recovery Plan",c={id:"Engineering/DRP",title:"Disaster Recovery Plan",description:"Resources",source:"@site/docs/Engineering/DRP.md",sourceDirName:"Engineering",slug:"/Engineering/DRP",permalink:"/docs/Engineering/DRP",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Configuration Management",permalink:"/docs/Engineering/ConfigurationManagement"},next:{title:"Infrastructure as Code",permalink:"/docs/Engineering/IaC"}},a={},l=[{value:"Resources",id:"resources",level:2}];function d(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h1,{id:"disaster-recovery-plan",children:"Disaster Recovery Plan"}),"\n",(0,r.jsx)(n.h2,{id:"resources",children:"Resources"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://c4model.com",children:"C4 Model for software engineering"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://googlecloudcheatsheet.withgoogle.com/architecture",children:"GCP Architecture diagram"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://cloud.google.com/architecture/dr-scenarios-planning-guide",children:"GCP DRP guide"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://cloud.google.com/architecture/disaster-recovery",children:"Architecting disaster recovery for cloud infrastructure outages"})}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var r=t(6540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b38cbf7d.14a191b8.js b/assets/js/b38cbf7d.14a191b8.js
deleted file mode 100644
index cc68bef..0000000
--- a/assets/js/b38cbf7d.14a191b8.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4e3],{2140:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var n=r(4848),o=r(8453);const s={},i="Hi!",a={id:"GCP/Terraform/init",title:"Hi!",description:"Some content for terraforming a GCP infrastructure is coming soon!",source:"@site/docs/GCP/Terraform/init.md",sourceDirName:"GCP/Terraform",slug:"/GCP/Terraform/init",permalink:"/docs/GCP/Terraform/init",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Remote SSH an IAP-secured server using a terminal or VSCode",permalink:"/docs/GCP/Identity-Aware Proxy/remote-ssh-iap"},next:{title:"Resources",permalink:"/docs/Security Operations/secops-resources"}},c={},u=[];function m(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"hi",children:"Hi!"}),"\n",(0,n.jsx)(t.p,{children:"Some content for terraforming a GCP infrastructure is coming soon!"})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>a});var n=r(6540);const o={},s=n.createContext(o);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/b38cbf7d.6479eb61.js b/assets/js/b38cbf7d.6479eb61.js
new file mode 100644
index 0000000..b914421
--- /dev/null
+++ b/assets/js/b38cbf7d.6479eb61.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4e3],{2140:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var n=r(4848),o=r(8453);const s={},i="Hi!",a={id:"GCP/Terraform/init",title:"Hi!",description:"Some content for terraforming a GCP infrastructure is coming soon!",source:"@site/docs/GCP/Terraform/init.md",sourceDirName:"GCP/Terraform",slug:"/GCP/Terraform/init",permalink:"/docs/GCP/Terraform/init",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Remote SSH an IAP-secured server using a terminal or VSCode",permalink:"/docs/GCP/Identity-Aware Proxy/remote-ssh-iap"},next:{title:"Resources",permalink:"/docs/Security Operations/secops-resources"}},c={},u=[];function m(e){const t={h1:"h1",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"hi",children:"Hi!"}),"\n",(0,n.jsx)(t.p,{children:"Some content for terraforming a GCP infrastructure is coming soon!"})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>a});var n=r(6540);const o={},s=n.createContext(o);function i(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c37619b8.4036d2e2.js b/assets/js/c37619b8.4036d2e2.js
deleted file mode 100644
index a3159a7..0000000
--- a/assets/js/c37619b8.4036d2e2.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3186],{4411:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>u,toc:()=>d});var o=t(4848),r=t(8453),s=t(1470),i=t(9365);const a={},l="Remote SSH an IAP-secured server using a terminal or VSCode",u={id:"GCP/Identity-Aware Proxy/remote-ssh-iap",title:"Remote SSH an IAP-secured server using a terminal or VSCode",description:"Getting started",source:"@site/docs/GCP/Identity-Aware Proxy/remote-ssh-iap.md",sourceDirName:"GCP/Identity-Aware Proxy",slug:"/GCP/Identity-Aware Proxy/remote-ssh-iap",permalink:"/docs/GCP/Identity-Aware Proxy/remote-ssh-iap",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Port-forwarding to localhost",permalink:"/docs/GCP/Identity-Aware Proxy/port-forwarding"},next:{title:"Hi!",permalink:"/docs/GCP/Terraform/init"}},c={},d=[{value:"Getting started",id:"getting-started",level:2},{value:"Install the gcloud CLI",id:"install-the-gcloud-cli",level:3},{value:"Authentication with the CLI",id:"gcloud-auth",level:3},{value:"Using a standard terminal",id:"using-a-standard-terminal",level:2},{value:"Using VSCode Remote Explorer",id:"using-vscode-remote-explorer",level:2},{value:"CLI Authentication",id:"cli-authentication",level:3},{value:"SSH tunnel dry run",id:"ssh-tunnel-dry-run",level:3},{value:"Updating your ~/.ssh/config",id:"updating-your-sshconfig",level:3},{value:"Connect to Host on VSCode",id:"connect-to-host-on-vscode",level:3},{value:"Troubleshoot",id:"troubleshoot",level:2},{value:"SSH issues with WSL & VScode on Windows",id:"ssh-issues-with-wsl--vscode-on-windows",level:3}];function h(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"remote-ssh-an-iap-secured-server-using-a-terminal-or-vscode",children:"Remote SSH an IAP-secured server using a terminal or VSCode"}),"\n","\n","\n",(0,o.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,o.jsx)(n.h3,{id:"install-the-gcloud-cli",children:"Install the gcloud CLI"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://cloud.google.com/sdk/docs/install#linux",children:"Official documentation"})}),"\n",(0,o.jsx)(n.h3,{id:"gcloud-auth",children:"Authentication with the CLI"}),"\n",(0,o.jsxs)(n.p,{children:["Before each session you may launch, make sure to be ",(0,o.jsx)(n.strong,{children:"authenticated with your gcloud account"})," within the CLI"]}),"\n",(0,o.jsxs)(s.A,{groupId:"operating-systems",children:[(0,o.jsx)(i.A,{value:"Linux/mac",label:"Standard",children:(0,o.jsx)("pre",{children:"gcloud auth login"})}),(0,o.jsx)(i.A,{value:"WSL",label:"WSL",children:(0,o.jsx)("pre",{children:"gcloud auth login --no-launch-browser"})})]}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"using-a-standard-terminal",children:"Using a standard terminal"}),"\n",(0,o.jsxs)(n.p,{children:["Very straightforward, make sure to be authenticated and run the following command :\n",(0,o.jsx)("pre",{children:"gcloud compute ssh my-instance --tunnel-through-iap "})]}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"using-vscode-remote-explorer",children:"Using VSCode Remote Explorer"}),"\n",(0,o.jsx)(n.h3,{id:"cli-authentication",children:"CLI Authentication"}),"\n",(0,o.jsxs)(n.p,{children:["As usual, make sure to be authenticated : ",(0,o.jsx)(n.a,{href:"#gcloud-auth",children:"gcloud authentication"})]}),"\n",(0,o.jsx)(n.h3,{id:"ssh-tunnel-dry-run",children:"SSH tunnel dry run"}),"\n",(0,o.jsxs)(n.p,{children:["Then, make sure to ",(0,o.jsx)(n.strong,{children:"dry run ssh tunnel"})," to your instance :"]}),"\n",(0,o.jsx)("pre",{children:"gcloud compute ssh my-instance --tunnel-through-iap --dry-run"}),"\n",(0,o.jsx)(n.p,{children:"You should get a response similar to that one :"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'/usr/bin/ssh -t -i /Users/YOURNAME/.ssh/google_compute_engine \n-o CheckHostIP=no \n-o HashKnownHosts=no -o HostKeyAlias=compute.XXXX -o IdentitiesOnly=yes \n-o StrictHostKeyChecking=yes \n-o UserKnownHostsFile=/Users/YOURNAME/.ssh/google_compute_known_hosts \n-o ProxyCommand="/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 -S /Applications/google-cloud-sdk/lib/gcloud.py compute start-iap-tunnel my-instance %p --listen-on-stdin --project=my-project --zone=my-zone --verbosity=warning" \n-o ProxyUseFdpass=no YOURNAME@compute.XXXX\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Now, what we are going to do is to ",(0,o.jsx)(n.strong,{children:"copy the ProxyCommand"})," out of it, which contains the info we need :\n",(0,o.jsx)(n.code,{children:"/Library/Frameworks/Python [....] -verbosity=warning"})]}),"\n",(0,o.jsx)(n.h3,{id:"updating-your-sshconfig",children:"Updating your ~/.ssh/config"}),"\n",(0,o.jsx)(n.p,{children:"Now, using VScode, let's have a look at our ssh config file :"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"CMD + shift + P"})}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Remote-SSH : Open SSH configuration file"})}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Into this file, add the following content and make sure to ",(0,o.jsx)(n.strong,{children:"replace the full ProxyCommand"})," by the way copied ealier :"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host my-instance-name\n HostName my-instance-name\n IdentityFile /Users/YOURNAME/.ssh/google_compute_engine\n CheckHostIP no\n HashKnownHosts no\n HostKeyAlias my-instance-name\n IdentitiesOnly yes\n StrictHostKeyChecking yes\n UserKnownHostsFile /Users/YOURNAME/.ssh/google_compute_known_hosts\n ProxyCommand /Library/Frameworks/Python [....] -verbosity=warning\n ProxyUseFdpass no\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.em,{children:"Host, HostName & HostKeyAlias"})," can all be replaced by whatever value you wish.\nDo not forget ",(0,o.jsx)(n.em,{children:"setting the right UserKnownHostsFile"})," directory as well as pasting the ",(0,o.jsx)(n.em,{children:"full ProxyCommand content"})]})}),"\n",(0,o.jsx)(n.h3,{id:"connect-to-host-on-vscode",children:"Connect to Host on VSCode"}),"\n",(0,o.jsx)(n.p,{children:"Now, you should be able to remote SSH your IAP-secured instance directly on VScode."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"CMD + shift + P"})}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Remote-SSH : Connect to Host"})}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Pick your new entry ",(0,o.jsx)(n.strong,{children:"'my-instance-name'"}),", which should appear"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"You can now use File Explorer tab to go to whatever folder you wish and edit files directly in VSCode. Saving you ton of time if you are not an avid vim programmer."}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsxs)(n.p,{children:["There might be a few additional steps on a ",(0,o.jsx)(n.strong,{children:"Windows"})," environment where you use ",(0,o.jsx)(n.em,{children:(0,o.jsx)(n.strong,{children:"Windows Subsystem for Linux"})}),". By default, VSCode does not use the WSL's ssh, which is a problem. See ",(0,o.jsx)(n.a,{href:"#troubleshoot",children:"Troubleshoot"})," below."]})}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"troubleshoot",children:"Troubleshoot"}),"\n",(0,o.jsx)(n.h3,{id:"ssh-issues-with-wsl--vscode-on-windows",children:"SSH issues with WSL & VScode on Windows"}),"\n",(0,o.jsx)(n.p,{children:"Coming later"})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>i});t(6540);var o=t(8215);const r={tabItem:"tabItem_Ymn6"};var s=t(4848);function i(e){let{children:n,hidden:t,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,i),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>j});var o=t(6540),r=t(8215),s=t(3104),i=t(6347),a=t(205),l=t(7485),u=t(1682),c=t(9466);function d(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:r}}=e;return{value:n,label:t,attributes:o,default:r}}))}(t);return function(e){const n=(0,u.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const r=(0,i.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=h(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[u,d]=p({queryString:t,groupId:r}),[g,x]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,c.Dv)(t);return[r,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),y=(()=>{const e=u??g;return m({value:e,tabValues:s})?e:null})();(0,a.A)((()=>{y&&l(y)}),[y]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),x(e)}),[d,x,s]),tabValues:s}}var x=t(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=t(4848);function b(e){let{className:n,block:t,selectedValue:o,selectValue:i,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,s.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),r=a[t].value;r!==o&&(u(n),i(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:a.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>l.push(e),onKeyDown:d,onClick:c,...s,className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function v(e){let{lazy:n,children:t,selectedValue:r}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function w(e){const n=g(e);return(0,f.jsxs)("div",{className:(0,r.A)("tabs-container",y.tabList),children:[(0,f.jsx)(b,{...e,...n}),(0,f.jsx)(v,{...e,...n})]})}function j(e){const n=(0,x.A)();return(0,f.jsx)(w,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/c37619b8.da7b6d17.js b/assets/js/c37619b8.da7b6d17.js
new file mode 100644
index 0000000..f3b4ac2
--- /dev/null
+++ b/assets/js/c37619b8.da7b6d17.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[3186],{4411:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>a,metadata:()=>u,toc:()=>d});var o=t(4848),r=t(8453),s=t(1470),i=t(9365);const a={},l="Remote SSH an IAP-secured server using a terminal or VSCode",u={id:"GCP/Identity-Aware Proxy/remote-ssh-iap",title:"Remote SSH an IAP-secured server using a terminal or VSCode",description:"Getting started",source:"@site/docs/GCP/Identity-Aware Proxy/remote-ssh-iap.md",sourceDirName:"GCP/Identity-Aware Proxy",slug:"/GCP/Identity-Aware Proxy/remote-ssh-iap",permalink:"/docs/GCP/Identity-Aware Proxy/remote-ssh-iap",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Port-forwarding to localhost",permalink:"/docs/GCP/Identity-Aware Proxy/port-forwarding"},next:{title:"Hi!",permalink:"/docs/GCP/Terraform/init"}},c={},d=[{value:"Getting started",id:"getting-started",level:2},{value:"Install the gcloud CLI",id:"install-the-gcloud-cli",level:3},{value:"Authentication with the CLI",id:"gcloud-auth",level:3},{value:"Using a standard terminal",id:"using-a-standard-terminal",level:2},{value:"Using VSCode Remote Explorer",id:"using-vscode-remote-explorer",level:2},{value:"CLI Authentication",id:"cli-authentication",level:3},{value:"SSH tunnel dry run",id:"ssh-tunnel-dry-run",level:3},{value:"Updating your ~/.ssh/config",id:"updating-your-sshconfig",level:3},{value:"Connect to Host on VSCode",id:"connect-to-host-on-vscode",level:3},{value:"Troubleshoot",id:"troubleshoot",level:2},{value:"SSH issues with WSL & VScode on Windows",id:"ssh-issues-with-wsl--vscode-on-windows",level:3}];function h(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",hr:"hr",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"remote-ssh-an-iap-secured-server-using-a-terminal-or-vscode",children:"Remote SSH an IAP-secured server using a terminal or VSCode"}),"\n","\n","\n",(0,o.jsx)(n.h2,{id:"getting-started",children:"Getting started"}),"\n",(0,o.jsx)(n.h3,{id:"install-the-gcloud-cli",children:"Install the gcloud CLI"}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://cloud.google.com/sdk/docs/install#linux",children:"Official documentation"})}),"\n",(0,o.jsx)(n.h3,{id:"gcloud-auth",children:"Authentication with the CLI"}),"\n",(0,o.jsxs)(n.p,{children:["Before each session you may launch, make sure to be ",(0,o.jsx)(n.strong,{children:"authenticated with your gcloud account"})," within the CLI"]}),"\n",(0,o.jsxs)(s.A,{groupId:"operating-systems",children:[(0,o.jsx)(i.A,{value:"Linux/mac",label:"Standard",children:(0,o.jsx)("pre",{children:"gcloud auth login"})}),(0,o.jsx)(i.A,{value:"WSL",label:"WSL",children:(0,o.jsx)("pre",{children:"gcloud auth login --no-launch-browser"})})]}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"using-a-standard-terminal",children:"Using a standard terminal"}),"\n",(0,o.jsxs)(n.p,{children:["Very straightforward, make sure to be authenticated and run the following command :\n",(0,o.jsx)("pre",{children:"gcloud compute ssh my-instance --tunnel-through-iap "})]}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"using-vscode-remote-explorer",children:"Using VSCode Remote Explorer"}),"\n",(0,o.jsx)(n.h3,{id:"cli-authentication",children:"CLI Authentication"}),"\n",(0,o.jsxs)(n.p,{children:["As usual, make sure to be authenticated : ",(0,o.jsx)(n.a,{href:"#gcloud-auth",children:"gcloud authentication"})]}),"\n",(0,o.jsx)(n.h3,{id:"ssh-tunnel-dry-run",children:"SSH tunnel dry run"}),"\n",(0,o.jsxs)(n.p,{children:["Then, make sure to ",(0,o.jsx)(n.strong,{children:"dry run ssh tunnel"})," to your instance :"]}),"\n",(0,o.jsx)("pre",{children:"gcloud compute ssh my-instance --tunnel-through-iap --dry-run"}),"\n",(0,o.jsx)(n.p,{children:"You should get a response similar to that one :"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'/usr/bin/ssh -t -i /Users/YOURNAME/.ssh/google_compute_engine \n-o CheckHostIP=no \n-o HashKnownHosts=no -o HostKeyAlias=compute.XXXX -o IdentitiesOnly=yes \n-o StrictHostKeyChecking=yes \n-o UserKnownHostsFile=/Users/YOURNAME/.ssh/google_compute_known_hosts \n-o ProxyCommand="/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 -S /Applications/google-cloud-sdk/lib/gcloud.py compute start-iap-tunnel my-instance %p --listen-on-stdin --project=my-project --zone=my-zone --verbosity=warning" \n-o ProxyUseFdpass=no YOURNAME@compute.XXXX\n'})}),"\n",(0,o.jsxs)(n.p,{children:["Now, what we are going to do is to ",(0,o.jsx)(n.strong,{children:"copy the ProxyCommand"})," out of it, which contains the info we need :\n",(0,o.jsx)(n.code,{children:"/Library/Frameworks/Python [....] -verbosity=warning"})]}),"\n",(0,o.jsx)(n.h3,{id:"updating-your-sshconfig",children:"Updating your ~/.ssh/config"}),"\n",(0,o.jsx)(n.p,{children:"Now, using VScode, let's have a look at our ssh config file :"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"CMD + shift + P"})}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Remote-SSH : Open SSH configuration file"})}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Into this file, add the following content and make sure to ",(0,o.jsx)(n.strong,{children:"replace the full ProxyCommand"})," by the way copied ealier :"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"Host my-instance-name\n HostName my-instance-name\n IdentityFile /Users/YOURNAME/.ssh/google_compute_engine\n CheckHostIP no\n HashKnownHosts no\n HostKeyAlias my-instance-name\n IdentitiesOnly yes\n StrictHostKeyChecking yes\n UserKnownHostsFile /Users/YOURNAME/.ssh/google_compute_known_hosts\n ProxyCommand /Library/Frameworks/Python [....] -verbosity=warning\n ProxyUseFdpass no\n"})}),"\n",(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.em,{children:"Host, HostName & HostKeyAlias"})," can all be replaced by whatever value you wish.\nDo not forget ",(0,o.jsx)(n.em,{children:"setting the right UserKnownHostsFile"})," directory as well as pasting the ",(0,o.jsx)(n.em,{children:"full ProxyCommand content"})]})}),"\n",(0,o.jsx)(n.h3,{id:"connect-to-host-on-vscode",children:"Connect to Host on VSCode"}),"\n",(0,o.jsx)(n.p,{children:"Now, you should be able to remote SSH your IAP-secured instance directly on VScode."}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"CMD + shift + P"})}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.strong,{children:"Remote-SSH : Connect to Host"})}),"\n"]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsxs)(n.p,{children:["Pick your new entry ",(0,o.jsx)(n.strong,{children:"'my-instance-name'"}),", which should appear"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"You can now use File Explorer tab to go to whatever folder you wish and edit files directly in VSCode. Saving you ton of time if you are not an avid vim programmer."}),"\n",(0,o.jsx)(n.admonition,{type:"caution",children:(0,o.jsxs)(n.p,{children:["There might be a few additional steps on a ",(0,o.jsx)(n.strong,{children:"Windows"})," environment where you use ",(0,o.jsx)(n.em,{children:(0,o.jsx)(n.strong,{children:"Windows Subsystem for Linux"})}),". By default, VSCode does not use the WSL's ssh, which is a problem. See ",(0,o.jsx)(n.a,{href:"#troubleshoot",children:"Troubleshoot"})," below."]})}),"\n",(0,o.jsx)(n.hr,{}),"\n",(0,o.jsx)(n.h2,{id:"troubleshoot",children:"Troubleshoot"}),"\n",(0,o.jsx)(n.h3,{id:"ssh-issues-with-wsl--vscode-on-windows",children:"SSH issues with WSL & VScode on Windows"}),"\n",(0,o.jsx)(n.p,{children:"Coming later"})]})}function m(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},9365:(e,n,t)=>{t.d(n,{A:()=>i});t(6540);var o=t(8215);const r={tabItem:"tabItem_Ymn6"};var s=t(4848);function i(e){let{children:n,hidden:t,className:i}=e;return(0,s.jsx)("div",{role:"tabpanel",className:(0,o.A)(r.tabItem,i),hidden:t,children:n})}},1470:(e,n,t)=>{t.d(n,{A:()=>j});var o=t(6540),r=t(8215),s=t(3104),i=t(6347),a=t(205),l=t(7485),u=t(1682),c=t(9466);function d(e){return o.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:n,children:t}=e;return(0,o.useMemo)((()=>{const e=n??function(e){return d(e).map((e=>{let{props:{value:n,label:t,attributes:o,default:r}}=e;return{value:n,label:t,attributes:o,default:r}}))}(t);return function(e){const n=(0,u.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function p(e){let{queryString:n=!1,groupId:t}=e;const r=(0,i.W6)(),s=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,l.aZ)(s),(0,o.useCallback)((e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})}),[s,r])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,s=h(e),[i,l]=(0,o.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const o=t.find((e=>e.default))??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:s}))),[u,d]=p({queryString:t,groupId:r}),[g,x]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[r,s]=(0,c.Dv)(t);return[r,(0,o.useCallback)((e=>{t&&s.set(e)}),[t,s])]}({groupId:r}),y=(()=>{const e=u??g;return m({value:e,tabValues:s})?e:null})();(0,a.A)((()=>{y&&l(y)}),[y]);return{selectedValue:i,selectValue:(0,o.useCallback)((e=>{if(!m({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),x(e)}),[d,x,s]),tabValues:s}}var x=t(2303);const y={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=t(4848);function b(e){let{className:n,block:t,selectedValue:o,selectValue:i,tabValues:a}=e;const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,s.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),r=a[t].value;r!==o&&(u(n),i(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=l.indexOf(e.currentTarget)+1;n=l[t]??l[0];break}case"ArrowLeft":{const t=l.indexOf(e.currentTarget)-1;n=l[t]??l[l.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},n),children:a.map((e=>{let{value:n,label:t,attributes:s}=e;return(0,f.jsx)("li",{role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,ref:e=>l.push(e),onKeyDown:d,onClick:c,...s,className:(0,r.A)("tabs__item",y.tabItem,s?.className,{"tabs__item--active":o===n}),children:t??n},n)}))})}function v(e){let{lazy:n,children:t,selectedValue:r}=e;const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=s.find((e=>e.props.value===r));return e?(0,o.cloneElement)(e,{className:"margin-top--md"}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:s.map(((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==r})))})}function w(e){const n=g(e);return(0,f.jsxs)("div",{className:(0,r.A)("tabs-container",y.tabList),children:[(0,f.jsx)(b,{...e,...n}),(0,f.jsx)(v,{...e,...n})]})}function j(e){const n=(0,x.A)();return(0,f.jsx)(w,{...e,children:d(e.children)},String(n))}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(6540);const r={},s=o.createContext(r);function i(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ebfee794.3d845930.js b/assets/js/ebfee794.3d845930.js
deleted file mode 100644
index a6b84be..0000000
--- a/assets/js/ebfee794.3d845930.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2005],{3414:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=t(4848),i=t(8453);const s={sidebar_position:0},l="Welcome",c={id:"welcome",title:"Welcome",description:"Welcome to the documentation space.",source:"@site/docs/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/docs/welcome",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1708326742,formattedLastUpdatedAt:"Feb 19, 2024",sidebarPosition:0,frontMatter:{sidebar_position:0},sidebar:"tutorialSidebar",next:{title:"SOC2",permalink:"/docs/Compliance/SOC2"}},r={},d=[{value:"Sections coming soon",id:"sections-coming-soon",level:3},{value:"Blog posts subjects to be covered",id:"blog-posts-subjects-to-be-covered",level:3}];function a(e){const n={admonition:"admonition",em:"em",h1:"h1",h3:"h3",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"welcome",children:"Welcome"}),"\n",(0,o.jsx)(n.p,{children:"Welcome to the documentation space."}),"\n",(0,o.jsx)(n.h3,{id:"sections-coming-soon",children:"Sections coming soon"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Cloud Service Providers : AWS, GCP \u2601\ufe0f"}),"\n",(0,o.jsx)(n.li,{children:"TheHive \ud83d\udc1d"}),"\n",(0,o.jsx)(n.li,{children:"Shuffle \ud83d\udd00"}),"\n",(0,o.jsxs)(n.li,{children:["Splunk \ud83e\udeb5 ",(0,o.jsx)(n.em,{children:"(log pun intended)"})]}),"\n",(0,o.jsx)(n.li,{children:"Python \ud83d\udc0d"}),"\n",(0,o.jsx)(n.li,{children:"VSCode \ud83d\udcbb"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"blog-posts-subjects-to-be-covered",children:"Blog posts subjects to be covered"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Security Operations Center"}),"\n",(0,o.jsx)(n.li,{children:"Security Operations Automation"}),"\n",(0,o.jsx)(n.li,{children:"Identity-Aware Proxy"}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{title:"Note to self",type:"note",children:(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Stay hydrated! \ud83d\udca6"}),"\n",(0,o.jsx)(n.li,{children:"Easy with the all-nighters \ud83d\ude34"}),"\n",(0,o.jsx)(n.li,{children:"You hold the keys to the path you'll walk down \u26f0"}),"\n"]})})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>c});var o=t(6540);const i={},s=o.createContext(i);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ebfee794.ddf14924.js b/assets/js/ebfee794.ddf14924.js
new file mode 100644
index 0000000..1831862
--- /dev/null
+++ b/assets/js/ebfee794.ddf14924.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2005],{3414:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var o=t(4848),i=t(8453);const s={sidebar_position:0},l="Welcome",c={id:"welcome",title:"Welcome",description:"Welcome to the documentation space.",source:"@site/docs/welcome.md",sourceDirName:".",slug:"/welcome",permalink:"/docs/welcome",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1719914884,formattedLastUpdatedAt:"Jul 2, 2024",sidebarPosition:0,frontMatter:{sidebar_position:0},sidebar:"tutorialSidebar",next:{title:"SOC2",permalink:"/docs/Compliance/SOC2"}},r={},d=[{value:"Sections coming soon",id:"sections-coming-soon",level:3},{value:"Blog posts subjects to be covered",id:"blog-posts-subjects-to-be-covered",level:3}];function a(e){const n={admonition:"admonition",em:"em",h1:"h1",h3:"h3",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"welcome",children:"Welcome"}),"\n",(0,o.jsx)(n.p,{children:"Welcome to the documentation space."}),"\n",(0,o.jsx)(n.h3,{id:"sections-coming-soon",children:"Sections coming soon"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Cloud Service Providers : AWS, GCP \u2601\ufe0f"}),"\n",(0,o.jsx)(n.li,{children:"TheHive \ud83d\udc1d"}),"\n",(0,o.jsx)(n.li,{children:"Shuffle \ud83d\udd00"}),"\n",(0,o.jsxs)(n.li,{children:["Splunk \ud83e\udeb5 ",(0,o.jsx)(n.em,{children:"(log pun intended)"})]}),"\n",(0,o.jsx)(n.li,{children:"Python \ud83d\udc0d"}),"\n",(0,o.jsx)(n.li,{children:"VSCode \ud83d\udcbb"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"blog-posts-subjects-to-be-covered",children:"Blog posts subjects to be covered"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Security Operations Center"}),"\n",(0,o.jsx)(n.li,{children:"Security Operations Automation"}),"\n",(0,o.jsx)(n.li,{children:"Identity-Aware Proxy"}),"\n"]}),"\n",(0,o.jsx)(n.admonition,{title:"Note to self",type:"note",children:(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Stay hydrated! \ud83d\udca6"}),"\n",(0,o.jsx)(n.li,{children:"Easy with the all-nighters \ud83d\ude34"}),"\n",(0,o.jsx)(n.li,{children:"You hold the keys to the path you'll walk down \u26f0"}),"\n"]})})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>c});var o=t(6540);const i={},s=o.createContext(i);function l(e){const n=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.cc5f53f2.js b/assets/js/runtime~main.ac5ce6e8.js
similarity index 82%
rename from assets/js/runtime~main.cc5f53f2.js
rename to assets/js/runtime~main.ac5ce6e8.js
index 7c0ff4d..da78b33 100644
--- a/assets/js/runtime~main.cc5f53f2.js
+++ b/assets/js/runtime~main.ac5ce6e8.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,r,t,c,d={},o={};function f(e){var a=o[e];if(void 0!==a)return a.exports;var r=o[e]={id:e,loaded:!1,exports:{}};return d[e].call(r.exports,r,r.exports,f),r.loaded=!0,r.exports}f.m=d,f.c=o,e=[],f.O=(a,r,t,c)=>{if(!r){var d=1/0;for(i=0;i=c)&&Object.keys(f.O).every((e=>f.O[e](r[l])))?r.splice(l--,1):(o=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[r,t,c]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var c=Object.create(null);f.r(c);var d={};a=a||[null,r({}),r([]),r(r)];for(var o=2&t&&e;"object"==typeof o&&!~a.indexOf(o);o=r(o))Object.getOwnPropertyNames(o).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,f.d(c,d),c},f.d=(e,a)=>{for(var r in a)f.o(a,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,r)=>(f.f[r](e,a),a)),[])),f.u=e=>"assets/js/"+({804:"7dd8714f",1218:"8037d0b1",1991:"b2b675dd",2005:"ebfee794",2042:"reactPlayerTwitch",2434:"5ad2500b",2711:"9e4087bc",2805:"961cf1dd",3186:"c37619b8",3249:"ccc49370",3392:"reactPlayerVidyard",3393:"9a0a0f1d",3671:"41d37d98",4e3:"b38cbf7d",4134:"393be207",4386:"5b48c0f7",4583:"1df93b7f",4813:"6875c492",4923:"a5e00c02",5307:"996f5af2",5894:"b2f554cd",6061:"1f391b9e",6173:"reactPlayerVimeo",6328:"reactPlayerDailyMotion",6344:"1365e388",6353:"reactPlayerPreview",6463:"reactPlayerKaltura",6887:"reactPlayerFacebook",7023:"9d09d54c",7098:"a7bd4aaa",7284:"d2c8aa9a",7458:"reactPlayerFilePlayer",7472:"814f3328",7570:"reactPlayerMixcloud",7627:"reactPlayerStreamable",7643:"a6aa9e1f",8209:"01a85c17",8211:"843ef7c4",8401:"17896441",8446:"reactPlayerYouTube",8581:"935f2afb",8880:"0817c5ed",9048:"a94703ab",9218:"9b629586",9267:"a7023ddc",9340:"reactPlayerWistia",9425:"20417f73",9647:"5e95c892",9979:"reactPlayerSoundCloud"}[e]||e)+"."+{804:"85901922",1218:"b0f4a353",1991:"1f36a942",2005:"3d845930",2042:"a665823a",2237:"30f974a5",2434:"e206c883",2711:"d4701eaa",2805:"4d0d1e11",3186:"4036d2e2",3249:"0422c987",3392:"b7d2f5f7",3393:"34992ff3",3671:"d2c9612d",4e3:"14a191b8",4132:"185d2d78",4134:"7b95467f",4386:"c243247a",4583:"9331a07a",4813:"6425f445",4923:"aea3236c",5307:"0c47acc4",5533:"3684102d",5894:"02ff2493",5923:"284d5197",6061:"e719d1cd",6173:"666e1510",6328:"201a091c",6344:"d8e53f27",6353:"51575468",6463:"b4e69bb5",6887:"c08f1b60",7023:"b7a543ce",7098:"ad7f231a",7284:"69f24718",7458:"1a26df48",7472:"7318fa57",7570:"576cd1a6",7627:"2876126e",7643:"7d1c99f3",8209:"a59cfdeb",8211:"0cb0336c",8401:"b236b53d",8446:"39fc7ab9",8581:"3593d4ca",8747:"014d786c",8880:"443619a5",9048:"29a07037",9218:"2d7465cd",9267:"5165082b",9340:"c152af9a",9425:"7d8cb90e",9647:"8110b3ef",9979:"e0da7116"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},c="my-website:",f.l=(e,a,r,d)=>{if(t[e])t[e].push(a);else{var o,l;if(void 0!==r)for(var b=document.getElementsByTagName("script"),i=0;i{o.onerror=o.onload=null,clearTimeout(s);var c=t[e];if(delete t[e],o.parentNode&&o.parentNode.removeChild(o),c&&c.forEach((e=>e(r))),a)return a(r)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=u.bind(null,o.onerror),o.onload=u.bind(null,o.onload),l&&document.head.appendChild(o)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"8401","7dd8714f":"804","8037d0b1":"1218",b2b675dd:"1991",ebfee794:"2005",reactPlayerTwitch:"2042","5ad2500b":"2434","9e4087bc":"2711","961cf1dd":"2805",c37619b8:"3186",ccc49370:"3249",reactPlayerVidyard:"3392","9a0a0f1d":"3393","41d37d98":"3671",b38cbf7d:"4000","393be207":"4134","5b48c0f7":"4386","1df93b7f":"4583","6875c492":"4813",a5e00c02:"4923","996f5af2":"5307",b2f554cd:"5894","1f391b9e":"6061",reactPlayerVimeo:"6173",reactPlayerDailyMotion:"6328","1365e388":"6344",reactPlayerPreview:"6353",reactPlayerKaltura:"6463",reactPlayerFacebook:"6887","9d09d54c":"7023",a7bd4aaa:"7098",d2c8aa9a:"7284",reactPlayerFilePlayer:"7458","814f3328":"7472",reactPlayerMixcloud:"7570",reactPlayerStreamable:"7627",a6aa9e1f:"7643","01a85c17":"8209","843ef7c4":"8211",reactPlayerYouTube:"8446","935f2afb":"8581","0817c5ed":"8880",a94703ab:"9048","9b629586":"9218",a7023ddc:"9267",reactPlayerWistia:"9340","20417f73":"9425","5e95c892":"9647",reactPlayerSoundCloud:"9979"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,r)=>{var t=f.o(e,a)?e[a]:void 0;if(0!==t)if(t)r.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((r,c)=>t=e[a]=[r,c]));r.push(t[2]=c);var d=f.p+f.u(a),o=new Error;f.l(d,(r=>{if(f.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var c=r&&("load"===r.type?"missing":r.type),d=r&&r.target&&r.target.src;o.message="Loading chunk "+a+" failed.\n("+c+": "+d+")",o.name="ChunkLoadError",o.type=c,o.request=d,t[1](o)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,r)=>{var t,c,d=r[0],o=r[1],l=r[2],b=0;if(d.some((a=>0!==e[a]))){for(t in o)f.o(o,t)&&(f.m[t]=o[t]);if(l)var i=l(f)}for(a&&a(r);b{"use strict";var e,a,r,t,c,d={},o={};function f(e){var a=o[e];if(void 0!==a)return a.exports;var r=o[e]={id:e,loaded:!1,exports:{}};return d[e].call(r.exports,r,r.exports,f),r.loaded=!0,r.exports}f.m=d,f.c=o,e=[],f.O=(a,r,t,c)=>{if(!r){var d=1/0;for(b=0;b=c)&&Object.keys(f.O).every((e=>f.O[e](r[l])))?r.splice(l--,1):(o=!1,c0&&e[b-1][2]>c;b--)e[b]=e[b-1];e[b]=[r,t,c]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var c=Object.create(null);f.r(c);var d={};a=a||[null,r({}),r([]),r(r)];for(var o=2&t&&e;"object"==typeof o&&!~a.indexOf(o);o=r(o))Object.getOwnPropertyNames(o).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,f.d(c,d),c},f.d=(e,a)=>{for(var r in a)f.o(a,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,r)=>(f.f[r](e,a),a)),[])),f.u=e=>"assets/js/"+({804:"7dd8714f",1218:"8037d0b1",1991:"b2b675dd",2005:"ebfee794",2042:"reactPlayerTwitch",2434:"5ad2500b",2711:"9e4087bc",2805:"961cf1dd",3186:"c37619b8",3249:"ccc49370",3392:"reactPlayerVidyard",3393:"9a0a0f1d",3671:"41d37d98",4e3:"b38cbf7d",4134:"393be207",4386:"5b48c0f7",4583:"1df93b7f",4813:"6875c492",4923:"a5e00c02",5307:"996f5af2",5894:"b2f554cd",6061:"1f391b9e",6173:"reactPlayerVimeo",6328:"reactPlayerDailyMotion",6344:"1365e388",6353:"reactPlayerPreview",6463:"reactPlayerKaltura",6887:"reactPlayerFacebook",7023:"9d09d54c",7098:"a7bd4aaa",7284:"d2c8aa9a",7458:"reactPlayerFilePlayer",7472:"814f3328",7570:"reactPlayerMixcloud",7627:"reactPlayerStreamable",7643:"a6aa9e1f",8209:"01a85c17",8211:"843ef7c4",8401:"17896441",8446:"reactPlayerYouTube",8581:"935f2afb",8880:"0817c5ed",9048:"a94703ab",9218:"9b629586",9267:"a7023ddc",9340:"reactPlayerWistia",9425:"20417f73",9647:"5e95c892",9979:"reactPlayerSoundCloud"}[e]||e)+"."+{804:"da385007",1218:"0dc03b60",1991:"1f36a942",2005:"ddf14924",2042:"a665823a",2237:"30f974a5",2434:"e206c883",2711:"d4701eaa",2805:"1bfe320b",3186:"da7b6d17",3249:"0422c987",3392:"b7d2f5f7",3393:"da664b9d",3671:"d2c9612d",4e3:"6479eb61",4132:"185d2d78",4134:"7b95467f",4386:"452eca36",4583:"716d924a",4813:"6425f445",4923:"aea3236c",5307:"8fff4797",5533:"3684102d",5894:"02ff2493",5923:"284d5197",6061:"e719d1cd",6173:"666e1510",6328:"201a091c",6344:"f55fecc1",6353:"51575468",6463:"b4e69bb5",6887:"c08f1b60",7023:"b7a543ce",7098:"ad7f231a",7284:"69f24718",7458:"1a26df48",7472:"7318fa57",7570:"576cd1a6",7627:"2876126e",7643:"7d1c99f3",8209:"a59cfdeb",8211:"0cb0336c",8401:"b236b53d",8446:"39fc7ab9",8581:"3593d4ca",8747:"014d786c",8880:"39369c6a",9048:"29a07037",9218:"03d0fcfd",9267:"5165082b",9340:"c152af9a",9425:"7d8cb90e",9647:"8110b3ef",9979:"e0da7116"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},c="my-website:",f.l=(e,a,r,d)=>{if(t[e])t[e].push(a);else{var o,l;if(void 0!==r)for(var i=document.getElementsByTagName("script"),b=0;b{o.onerror=o.onload=null,clearTimeout(s);var c=t[e];if(delete t[e],o.parentNode&&o.parentNode.removeChild(o),c&&c.forEach((e=>e(r))),a)return a(r)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=u.bind(null,o.onerror),o.onload=u.bind(null,o.onload),l&&document.head.appendChild(o)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"8401","7dd8714f":"804","8037d0b1":"1218",b2b675dd:"1991",ebfee794:"2005",reactPlayerTwitch:"2042","5ad2500b":"2434","9e4087bc":"2711","961cf1dd":"2805",c37619b8:"3186",ccc49370:"3249",reactPlayerVidyard:"3392","9a0a0f1d":"3393","41d37d98":"3671",b38cbf7d:"4000","393be207":"4134","5b48c0f7":"4386","1df93b7f":"4583","6875c492":"4813",a5e00c02:"4923","996f5af2":"5307",b2f554cd:"5894","1f391b9e":"6061",reactPlayerVimeo:"6173",reactPlayerDailyMotion:"6328","1365e388":"6344",reactPlayerPreview:"6353",reactPlayerKaltura:"6463",reactPlayerFacebook:"6887","9d09d54c":"7023",a7bd4aaa:"7098",d2c8aa9a:"7284",reactPlayerFilePlayer:"7458","814f3328":"7472",reactPlayerMixcloud:"7570",reactPlayerStreamable:"7627",a6aa9e1f:"7643","01a85c17":"8209","843ef7c4":"8211",reactPlayerYouTube:"8446","935f2afb":"8581","0817c5ed":"8880",a94703ab:"9048","9b629586":"9218",a7023ddc:"9267",reactPlayerWistia:"9340","20417f73":"9425","5e95c892":"9647",reactPlayerSoundCloud:"9979"}[e]||e,f.p+f.u(e)},(()=>{var e={5354:0,1869:0};f.f.j=(a,r)=>{var t=f.o(e,a)?e[a]:void 0;if(0!==t)if(t)r.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((r,c)=>t=e[a]=[r,c]));r.push(t[2]=c);var d=f.p+f.u(a),o=new Error;f.l(d,(r=>{if(f.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var c=r&&("load"===r.type?"missing":r.type),d=r&&r.target&&r.target.src;o.message="Loading chunk "+a+" failed.\n("+c+": "+d+")",o.name="ChunkLoadError",o.type=c,o.request=d,t[1](o)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,r)=>{var t,c,d=r[0],o=r[1],l=r[2],i=0;if(d.some((a=>0!==e[a]))){for(t in o)f.o(o,t)&&(f.m[t]=o[t]);if(l)var b=l(f)}for(a&&a(r);i
-
+
diff --git a/blog/archive.html b/blog/archive.html
index afabd9c..7cb9b89 100644
--- a/blog/archive.html
+++ b/blog/archive.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/hello-world.html b/blog/hello-world.html
index 32b08c7..17cac5c 100644
--- a/blog/hello-world.html
+++ b/blog/hello-world.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags.html b/blog/tags.html
index 5f76918..3f0e843 100644
--- a/blog/tags.html
+++ b/blog/tags.html
@@ -10,7 +10,7 @@
-
+
diff --git a/blog/tags/introduction.html b/blog/tags/introduction.html
index 8c44124..6250407 100644
--- a/blog/tags/introduction.html
+++ b/blog/tags/introduction.html
@@ -10,7 +10,7 @@
-
+
diff --git a/docs/Compliance/SOC2.html b/docs/Compliance/SOC2.html
index a6ab009..f709b50 100644
--- a/docs/Compliance/SOC2.html
+++ b/docs/Compliance/SOC2.html
@@ -10,7 +10,7 @@
-
+
@@ -127,6 +127,6 @@